From 3f6c283e9a4c3b73d8f7f77f7f777becfec9423b Mon Sep 17 00:00:00 2001
From: whb <17803890193@163.com>
Date: Thu, 29 Aug 2024 13:22:07 +0800
Subject: [PATCH] first commit
---
DataRoom/README.md | 42 ------
.../dataroom/core/config/bean/FileConfig.java | 2 +
.../biz/component/dao/DataRoomBizUserDao.java | 15 +++
.../component/entity/BizComponentUser.java | 45 +++++++
.../service/impl/BizComponentServiceImpl.java | 6 +-
.../service/impl/PermissionServiceImpl.java | 96 ++++++++++++++
.../controller/DataRoomPageController.java | 6 +-
.../module/manage/dto/DataRoomPageDTO.java | 3 +
.../module/manage/dto/DataRoomSearchDTO.java | 2 +
.../service/impl/DataRoomPageServiceImpl.java | 120 ++++++++++++++----
.../controller/PageTemplateController.java | 4 +-
.../type/controller/TypeController.java | 12 +-
.../core/module/type/dto/TypeDTO.java | 2 +
.../module/type/service/ITypeService.java | 2 +-
.../type/service/impl/TypeServiceImpl.java | 45 ++++++-
.../permission/DataRoomPermissionClient.java | 18 ++-
.../IDataRoomPermissionService.java | 4 +-
.../src/main/resources/application.yml | 18 ++-
null/cover/bigScreen_3PRTYchPNc.png | Bin 0 -> 12999 bytes
null/cover/bigScreen_50m2Ltmc4b.png | Bin 0 -> 19884 bytes
null/cover/bigScreen_F9GUhaJI4B.png | Bin 0 -> 18779 bytes
null/cover/bigScreen_FkqW0EsjzT.png | Bin 0 -> 14353 bytes
null/cover/bigScreen_J4nJfu9HoA.png | Bin 0 -> 24429 bytes
null/cover/bigScreen_NWhNLwik8G.png | Bin 0 -> 12999 bytes
null/cover/bigScreen_W9hQXZdi67.png | Bin 0 -> 33287 bytes
null/cover/bigScreen_bMYGsd3CrQ.png | Bin 0 -> 12999 bytes
null/cover/bigScreen_iIshef08PY.png | Bin 0 -> 12999 bytes
null/cover/component_Kc7kysD29H.png | Bin 0 -> 5367 bytes
28 files changed, 356 insertions(+), 86 deletions(-)
create mode 100644 DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/DataRoomBizUserDao.java
create mode 100644 DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentUser.java
create mode 100644 DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/PermissionServiceImpl.java
create mode 100644 null/cover/bigScreen_3PRTYchPNc.png
create mode 100644 null/cover/bigScreen_50m2Ltmc4b.png
create mode 100644 null/cover/bigScreen_F9GUhaJI4B.png
create mode 100644 null/cover/bigScreen_FkqW0EsjzT.png
create mode 100644 null/cover/bigScreen_J4nJfu9HoA.png
create mode 100644 null/cover/bigScreen_NWhNLwik8G.png
create mode 100644 null/cover/bigScreen_W9hQXZdi67.png
create mode 100644 null/cover/bigScreen_bMYGsd3CrQ.png
create mode 100644 null/cover/bigScreen_iIshef08PY.png
create mode 100644 null/cover/component_Kc7kysD29H.png
diff --git a/DataRoom/README.md b/DataRoom/README.md
index de942ff5..e69de29b 100644
--- a/DataRoom/README.md
+++ b/DataRoom/README.md
@@ -1,42 +0,0 @@
-## 📚简介
-
-🔥DataRoom是一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器,具备大屏目录管理、大屏设计、大屏预览能力,支持MySQL、Oracle、PostgreSQL、JSON、HTTP、Groovy等数据集接入,使用简单,完全免费,代码开源。
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------------
-
-## 效果图
-
-#### 管理页
-
-
-#### 设计器
-
-
-## 快速开始
-
-快速开始
-
-## 演示DEMO
-
- http://gcpaas.gccloud.com/bigScreen
-
-## 联系我们
-
-
-
-
-
-
-
-
-## License
-
-Apache License 2.0
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java
index 8da947f1..6e660bd6 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/config/bean/FileConfig.java
@@ -18,6 +18,8 @@ public class FileConfig {
* 文件地址前缀
*/
private String urlPrefix;
+
+ private String img;
/**
* 允许的上传文件后缀类型
*/
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/DataRoomBizUserDao.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/DataRoomBizUserDao.java
new file mode 100644
index 00000000..88c6fda0
--- /dev/null
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dao/DataRoomBizUserDao.java
@@ -0,0 +1,15 @@
+package com.gccloud.dataroom.core.module.biz.component.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 11:39
+ */
+@Mapper
+public interface DataRoomBizUserDao extends BaseMapper {
+}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentUser.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentUser.java
new file mode 100644
index 00000000..5306f83d
--- /dev/null
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/entity/BizComponentUser.java
@@ -0,0 +1,45 @@
+package com.gccloud.dataroom.core.module.biz.component.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.common.entity.SuperEntity;
+import com.gccloud.dataroom.core.constant.PageDesignConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 17803
+ * @date 2024-08-23 11:13
+ */
+@Data
+@TableName(value = "big_screen_page_permission")
+@ApiModel
+public class BizComponentUser extends SuperEntity implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(notes = "业务组件中文名称")
+ private String userId;
+
+ @ApiModelProperty(notes = "业务组件编码,页面唯一标识符")
+ @TableField(updateStrategy = FieldStrategy.NEVER)
+ private String code;
+
+ @ApiModelProperty(notes = "父节点编码/所属分组编码")
+ private String parentCode;
+
+ @ApiModelProperty(notes = "排序")
+ private Integer orderNum;
+
+ /**
+ * 参考:{@link PageDesignConstant.Type}
+ */
+ @ApiModelProperty(notes = "页面类型")
+ private String type;
+
+
+}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java
index 4fd0b0e7..20e79035 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java
@@ -48,7 +48,7 @@ public class BizComponentServiceImpl extends ServiceImpl page = this.page(searchDTO, queryWrapper);
List list = page.getList();
- String urlPrefix = bigScreenConfig.getFile().getUrlPrefix();
+ String urlPrefix = bigScreenConfig.getFile().getBasePath();
if (!urlPrefix.endsWith("/")) {
urlPrefix += "/";
}
@@ -67,7 +67,7 @@ public class BizComponentServiceImpl extends ServiceImpl list = this.list(queryWrapper);
- String urlPrefix = bigScreenConfig.getFile().getUrlPrefix();
+ String urlPrefix = bigScreenConfig.getFile().getBasePath();
if (!urlPrefix.endsWith("/")) {
urlPrefix += "/";
}
@@ -92,7 +92,7 @@ public class BizComponentServiceImpl extends ServiceImpl getUserDataRoomCodeList() {
+ // 模拟获取当前用户有权限的大屏code列表,需要根据实际情况自行实现
+ return Lists.newArrayList("bigScreen_auPP6DkIIn", "bigScreen_auPxxDkIIn", "bigScreen_auPP6Dkxxn");
+ }
+
+ @Override
+ public boolean verifyDataPermission(HttpServletRequest request, String pageCode) {
+ return false;
+ }
+
+
+ /**
+ * 在大屏分页查询时会调用,可在该方法中根据用户标识到关联表中查询出用户有权限的大屏编码列表,
+ * 然后根据该列表将入参的大屏编码列表过滤,只保留有权限的部分
+ */
+
+ @Override
+ public List filterByPermission(List allCode, String userId,String type) {
+
+// LambdaQueryWrapper newQueryWrapper = new LambdaQueryWrapper<>();
+// newQueryWrapper.eq()
+
+ //
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ //用户ID
+ queryWrapper.eq(BizComponentUser::getUserId,userId);
+ //单独授权码
+ queryWrapper.select(BizComponentUser::getCode);
+ //页面类型
+ queryWrapper.in(BizComponentUser::getType, type);
+ //根据创建时间排序
+ queryWrapper.orderByDesc(BizComponentUser::getCreateDate);
+
+
+
+ List bizComponentUserList = userDao.selectList(queryWrapper);
+ List codeList = bizComponentUserList.stream().map(item -> item.getCode()).collect(Collectors.toList());
+
+ if (CollectionUtils.isEmpty(codeList))
+ {
+ //拷贝三个默认图形
+ List arrayList = new ArrayList<>();
+ arrayList.add("bigScreen_mrayOVaVLN");
+ arrayList.add("bigScreen_1Z7KtlBQjM");
+ arrayList.add("bigScreen_31aDDWOXhH");
+
+ for (String code : arrayList) {
+ PageEntity bigScreenPage = bigScreenPageService.getByCode(code);
+ String newCode = bigScreenPageService.copy(bigScreenPage);
+ BizComponentUser bizComponentUser = new BizComponentUser();
+ bizComponentUser.setType("bigScreen");
+ bizComponentUser.setUserId(userId);
+ bizComponentUser.setCode(newCode);
+ userDao.insert(bizComponentUser);
+ codeList.add(newCode);
+ }
+ }
+
+ return codeList;
+ }
+}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/controller/DataRoomPageController.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/controller/DataRoomPageController.java
index c46122bc..270af908 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/controller/DataRoomPageController.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/controller/DataRoomPageController.java
@@ -29,6 +29,7 @@ import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import java.io.File;
import java.util.List;
/**
@@ -71,6 +72,7 @@ public class DataRoomPageController {
@GetMapping("/page")
@ApiOperation(value = "大屏/组件分页列表", position = 10, produces = MediaType.APPLICATION_JSON_VALUE)
public MixinsResp> page(DataRoomSearchDTO searchDTO) {
+
PageVO page = bigScreenPageService.getByCategory(searchDTO);
MixinsResp> resp = new MixinsResp>().setData(page);
resp.setCode(DataRoomConst.Response.Code.SUCCESS);
@@ -149,7 +151,9 @@ public class DataRoomPageController {
public R> getBgList() {
List staticFileList = Webjars.BIG_SCREEN_BG;
List bgList = Lists.newArrayList();
- String urlPrefix = bigScreenConfig.getFile().getUrlPrefix() + "bigScreenBg/";
+
+
+ String urlPrefix = bigScreenConfig.getFile().getImg() + File.separator+ "bigScreenBg/";
for (String fileName : staticFileList) {
StaticFileVO fileVO = new StaticFileVO();
fileVO.setUrl(urlPrefix + fileName);
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java
index 5a47715e..5ec6928f 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java
@@ -27,6 +27,9 @@ public class DataRoomPageDTO extends BasePageDTO {
@ApiModelProperty(notes = "主键id")
private String id;
+ @ApiModelProperty(notes = "用户id")
+ private String userId;
+
@NotBlank(message = "名称不能为空", groups = {Update.class, Insert.class})
@ApiModelProperty(notes = "大屏名称")
private String name;
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomSearchDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomSearchDTO.java
index b1456ee3..f99d0acc 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomSearchDTO.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomSearchDTO.java
@@ -19,4 +19,6 @@ public class DataRoomSearchDTO extends SearchDTO {
* 类型
*/
private String type;
+
+ private String userId;
}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/service/impl/DataRoomPageServiceImpl.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/service/impl/DataRoomPageServiceImpl.java
index 323557b8..ddac0e63 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/service/impl/DataRoomPageServiceImpl.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/service/impl/DataRoomPageServiceImpl.java
@@ -7,6 +7,8 @@ import com.gccloud.dataroom.core.constant.PageDesignConstant;
import com.gccloud.dataroom.core.module.basic.dao.DataRoomPageDao;
import com.gccloud.dataroom.core.module.basic.entity.PageEntity;
import com.gccloud.dataroom.core.module.basic.entity.PagePreviewEntity;
+import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizUserDao;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser;
import com.gccloud.dataroom.core.module.chart.bean.Chart;
import com.gccloud.dataroom.core.module.chart.bean.Linkage;
import com.gccloud.dataroom.core.module.chart.components.datasource.DataSetDataSource;
@@ -35,16 +37,15 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.tomcat.util.http.fileupload.FileItem;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.annotation.Resource;
import java.io.*;
-import java.util.Base64;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -75,6 +76,9 @@ public class DataRoomPageServiceImpl extends ServiceImpl chartList = bigScreenPageDTO.getChartList();
@@ -111,6 +123,15 @@ public class DataRoomPageServiceImpl extends ServiceImpl getByCategory(DataRoomSearchDTO searchDTO) {
+// if (StringUtils.isBlank(searchDTO.getType())) {
+// throw new GlobalException("类型不能为空");
+// }
+// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+// queryWrapper.like(StringUtils.isNotBlank(searchDTO.getSearchKey()), PageEntity::getName, searchDTO.getSearchKey());
+// if (StringUtils.isNotBlank(searchDTO.getParentCode())) {
+// queryWrapper.eq(PageEntity::getParentCode, searchDTO.getParentCode());
+// }
+// queryWrapper.eq(PageEntity::getType, searchDTO.getType());
+// queryWrapper.select(PageEntity::getCode);
+// List idEntityList = this.list(queryWrapper);
+// if (idEntityList == null || idEntityList.isEmpty()) {
+// PageVO pageVO = new PageVO<>();
+// pageVO.setList(Lists.newArrayList());
+// return pageVO;
+// }
+// List codeList = idEntityList.stream().map(PageEntity::getCode).collect(Collectors.toList());
+// List filterByPermission = permissionClient.filterByPermission(codeList);
+// if (filterByPermission == null || filterByPermission.isEmpty()) {
+// PageVO pageVO = new PageVO<>();
+// pageVO.setList(Lists.newArrayList());
+// return pageVO;
+// }
+// LambdaQueryWrapper reQueryWrapper = new LambdaQueryWrapper<>();
+// if (idEntityList.size() == filterByPermission.size()) {
+// // 说明没有过滤掉任何一个, 按照原来的条件查询
+// reQueryWrapper = queryWrapper;
+// } else {
+// // 说明过滤掉了一些, 按照过滤后的编码查询
+// reQueryWrapper.in(PageEntity::getCode, filterByPermission);
+// }
+// reQueryWrapper.select(PageEntity::getId, PageEntity::getAppCode, PageEntity::getCode, PageEntity::getName, PageEntity::getParentCode, PageEntity::getOrderNum, PageEntity::getCoverPicture, PageEntity::getUpdateDate);
+// // 优先序号升序,其次创建时间降序
+// reQueryWrapper.orderByAsc(PageEntity::getOrderNum);
+// reQueryWrapper.orderByDesc(PageEntity::getCreateDate);
+// PageVO page = this.page(searchDTO, reQueryWrapper);
+// List list = page.getList();
+// if (list == null || list.isEmpty()) {
+// return page;
+// }
+// String urlPrefix = bigScreenConfig.getFile().getBasePath();
+// if (!urlPrefix.endsWith("/")) {
+// urlPrefix += "/";
+// }
+// for (PageEntity pageEntity : list) {
+// String coverPicture = pageEntity.getCoverPicture();
+// if (StringUtils.isBlank(coverPicture)) {
+// continue;
+// }
+// if (coverPicture.startsWith("/")) {
+// coverPicture = coverPicture.substring(1);
+// }
+// pageEntity.setCoverPicture(urlPrefix + PathUtils.normalizePath(coverPicture));
+// }
+// return page;
+// }
+
@Override
public PageVO getByCategory(DataRoomSearchDTO searchDTO) {
if (StringUtils.isBlank(searchDTO.getType())) {
throw new GlobalException("类型不能为空");
}
+ // 使用,分割type
+ List types = Lists.newArrayList(searchDTO.getType().split(","));
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(searchDTO.getSearchKey()), PageEntity::getName, searchDTO.getSearchKey());
if (StringUtils.isNotBlank(searchDTO.getParentCode())) {
queryWrapper.eq(PageEntity::getParentCode, searchDTO.getParentCode());
}
- queryWrapper.eq(PageEntity::getType, searchDTO.getType());
+ queryWrapper.in(PageEntity::getType, types);
+ //查询code code和userId关联
queryWrapper.select(PageEntity::getCode);
List idEntityList = this.list(queryWrapper);
if (idEntityList == null || idEntityList.isEmpty()) {
@@ -227,12 +310,15 @@ public class DataRoomPageServiceImpl extends ServiceImpl codeList = idEntityList.stream().map(PageEntity::getCode).collect(Collectors.toList());
- List filterByPermission = permissionClient.filterByPermission(codeList);
+ List filterByPermission = permissionClient.filterByPermission(codeList,searchDTO.getUserId(),searchDTO.getType());
if (filterByPermission == null || filterByPermission.isEmpty()) {
PageVO pageVO = new PageVO<>();
pageVO.setList(Lists.newArrayList());
return pageVO;
}
+
+
+
LambdaQueryWrapper reQueryWrapper = new LambdaQueryWrapper<>();
if (idEntityList.size() == filterByPermission.size()) {
// 说明没有过滤掉任何一个, 按照原来的条件查询
@@ -241,29 +327,13 @@ public class DataRoomPageServiceImpl extends ServiceImpl page = this.page(searchDTO, reQueryWrapper);
List list = page.getList();
- if (list == null || list.isEmpty()) {
- return page;
- }
- String urlPrefix = bigScreenConfig.getFile().getUrlPrefix();
- if (!urlPrefix.endsWith("/")) {
- urlPrefix += "/";
- }
- for (PageEntity pageEntity : list) {
- String coverPicture = pageEntity.getCoverPicture();
- if (StringUtils.isBlank(coverPicture)) {
- continue;
- }
- if (coverPicture.startsWith("/")) {
- coverPicture = coverPicture.substring(1);
- }
- pageEntity.setCoverPicture(urlPrefix + PathUtils.normalizePath(coverPicture));
- }
return page;
}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/controller/PageTemplateController.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/controller/PageTemplateController.java
index 26dbf2c4..fc1e25ef 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/controller/PageTemplateController.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/controller/PageTemplateController.java
@@ -53,7 +53,7 @@ public class PageTemplateController extends SuperController {
PageVO pageVO = BeanConvertUtils.convertPage(page, PageTemplateVO.class, (source, target) -> {
// 如果缩略图的不是http开头的,那么就拼接上当前服务后端地址
if (target.getThumbnail() != null && !target.getThumbnail().startsWith("http")) {
- target.setThumbnail(bigScreenConfig.getFile().getUrlPrefix() + target.getThumbnail());
+ target.setThumbnail(bigScreenConfig.getFile().getBasePath() + target.getThumbnail());
}
});
return success(pageVO);
@@ -72,7 +72,7 @@ public class PageTemplateController extends SuperController {
List voList = BeanConvertUtils.convert(list, PageTemplateVO.class, (source, target) -> {
// 如果缩略图的不是http开头的,那么就拼接上当前服务后端地址
if (target.getThumbnail() != null && !target.getThumbnail().startsWith("http")) {
- target.setThumbnail(bigScreenConfig.getFile().getUrlPrefix() + target.getThumbnail());
+ target.setThumbnail(bigScreenConfig.getFile().getBasePath() + target.getThumbnail());
}
});
return success(voList);
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/controller/TypeController.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/controller/TypeController.java
index 5214181c..299badf9 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/controller/TypeController.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/controller/TypeController.java
@@ -13,6 +13,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -34,10 +35,15 @@ public class TypeController {
private ITypeService typeService;
- @GetMapping("/list/{type}")
+ @GetMapping("/list")
@ApiOperation(value = "分类列表", position = 10, produces = MediaType.APPLICATION_JSON_VALUE)
- public R> list(@PathVariable("type") String type) {
- List entityList = typeService.listByType(type);
+ public R> list(String type,String userId) {
+ if (!StringUtils.hasText(userId))
+ {
+ throw new RuntimeException("userId不能空");
+ }
+
+ List entityList = typeService.listByType(type,userId);
List typeVOList = BeanConvertUtils.convert(entityList, TypeVO.class);
return R.success(typeVOList);
}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java
index 98e70029..a3287df7 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java
@@ -38,5 +38,7 @@ public class TypeDTO {
@ApiModelProperty(notes = "排序")
private Integer orderNum;
+ @ApiModelProperty(notes = "用户ID")
+ private String userId;
}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/ITypeService.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/ITypeService.java
index cd9928ae..abc3f51b 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/ITypeService.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/ITypeService.java
@@ -38,7 +38,7 @@ public interface ITypeService extends ISuperService {
* @param type
* @return
*/
- List listByType(String type);
+ List listByType(String type,String userId);
/**
* code查重
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java
index 85e7075e..9ade5215 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java
@@ -2,6 +2,8 @@ package com.gccloud.dataroom.core.module.type.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizUserDao;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser;
import com.gccloud.dataroom.core.module.type.dao.DataRoomTypeDao;
import com.gccloud.dataroom.core.module.type.dto.TypeDTO;
import com.gccloud.dataroom.core.module.type.entity.TypeEntity;
@@ -12,9 +14,11 @@ import com.gccloud.common.utils.BeanConvertUtils;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
+import java.util.stream.Collectors;
/**
* @author hongyang
@@ -25,11 +29,15 @@ import java.util.List;
@Service("dataRoomTypeService")
public class TypeServiceImpl extends ServiceImpl implements ITypeService {
+ @Autowired
+ private DataRoomBizUserDao userDao;
+
@Override
public String add(TypeDTO typeDTO) {
TypeEntity entity = BeanConvertUtils.convert(typeDTO, TypeEntity.class);
+ String code = null;
if (StringUtils.isBlank(entity.getCode())) {
- String code = CodeGenerateUtils.generate(typeDTO.getType());
+ code = CodeGenerateUtils.generate(typeDTO.getType());
while (this.checkCodeRepeat(null, typeDTO.getType(), code)) {
code = CodeGenerateUtils.generate(typeDTO.getType());
}
@@ -43,6 +51,14 @@ public class TypeServiceImpl extends ServiceImpl im
throw new GlobalException("分组名称已存在");
}
this.save(entity);
+
+
+ BizComponentUser bizComponentUser = new BizComponentUser();
+ bizComponentUser.setUserId(typeDTO.getUserId());
+ bizComponentUser.setCode(code);
+ bizComponentUser.setType(typeDTO.getType());
+ userDao.insert(bizComponentUser);
+
return entity.getId();
}
@@ -60,16 +76,41 @@ public class TypeServiceImpl extends ServiceImpl im
if (StringUtils.isBlank(id)) {
return;
}
+ TypeEntity byId = this.getById(id);
+
this.removeById(id);
+ //根据ID查询code 和type,然后删除
+
+ String type = byId.getType();
+ String code = byId.getCode();
+
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(BizComponentUser::getType,type);
+ lambdaQueryWrapper.eq(BizComponentUser::getCode,code);
+
+ userDao.delete(lambdaQueryWrapper);
+
+
}
@Override
- public List listByType(String type) {
+ public List listByType(String type,String userId) {
if (StringUtils.isBlank(type)) {
return Lists.newArrayList();
}
+
+ //获取所有code
+ LambdaQueryWrapper userLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ userLambdaQueryWrapper.eq(BizComponentUser::getUserId,userId);
+ userLambdaQueryWrapper.eq(BizComponentUser::getType,type);
+ List bizComponentUserList = userDao.selectList(userLambdaQueryWrapper);
+ List codeList = bizComponentUserList.stream().map(code -> code.getCode()).collect(Collectors.toList());
+
+
+
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TypeEntity::getType, type);
+ queryWrapper.in(TypeEntity::getCode,codeList);
queryWrapper.orderByAsc(TypeEntity::getOrderNum);
queryWrapper.orderByDesc(TypeEntity::getCreateDate);
return this.list(queryWrapper);
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/DataRoomPermissionClient.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/DataRoomPermissionClient.java
index fd75bcc7..28e1e425 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/DataRoomPermissionClient.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/DataRoomPermissionClient.java
@@ -1,9 +1,16 @@
package com.gccloud.dataroom.core.permission;
+import com.gccloud.dataroom.core.module.basic.entity.PageEntity;
+import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizUserDao;
+import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser;
+import com.gccloud.dataroom.core.module.manage.service.IDataRoomPageService;
+import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -36,16 +43,21 @@ public class DataRoomPermissionClient {
/**
* 根据权限过滤
* @param allCode 全部的大屏code
- * @return 当前用户有权限的大屏code
+ * @return 当限前用户有权的大屏code
*/
- public List filterByPermission(List allCode) {
+ public List filterByPermission(List allCode,String userId,String type) {
if (permissionService != null) {
- return permissionService.filterByPermission(allCode);
+ return permissionService.filterByPermission(allCode,userId,type);
}
return allCode;
}
+ private List getUserDataRoomCodeList() {
+ // 模拟获取当前用户有权限的大屏code列表,需要根据实际情况自行实现
+ return Lists.newArrayList("bigScreen_auPP6DkIIn", "bigScreen_auPxxDkIIn", "bigScreen_auPP6Dkxxn");
+ }
+
}
diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/IDataRoomPermissionService.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/IDataRoomPermissionService.java
index c226eb88..bfcd0237 100644
--- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/IDataRoomPermissionService.java
+++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/permission/IDataRoomPermissionService.java
@@ -24,8 +24,6 @@ public interface IDataRoomPermissionService {
* @param allCode 全部的大屏code
* @return 当前用户有权限的大屏code
*/
- default List filterByPermission(List allCode) {
- return allCode;
- }
+ List filterByPermission(List allCode,String userId,String type) ;
}
diff --git a/DataRoom/dataroom-server/src/main/resources/application.yml b/DataRoom/dataroom-server/src/main/resources/application.yml
index 8819574b..ce9877d3 100644
--- a/DataRoom/dataroom-server/src/main/resources/application.yml
+++ b/DataRoom/dataroom-server/src/main/resources/application.yml
@@ -8,6 +8,10 @@ server:
spring:
profiles:
active: dev
+ servlet:
+ multipart:
+ max-file-size: 500MB
+ max-request-size: 500MB
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
@@ -29,7 +33,12 @@ spring:
web:
resources:
static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:${gc.starter.file.basePath}
-
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driverClassName: com.p6spy.engine.spy.P6SpyDriver
+ url: jdbc:p6spy:mysql://118.31.7.2:3306/dashboard?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
+ username: root
+ password: sztzjy2017
mybatis-plus:
# mybatis plus xml配置文件扫描,多个通过分号隔开
@@ -40,3 +49,10 @@ mybatis-plus:
db-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"唯一ID";
id-type: AUTO
+gc:
+ starter:
+ file:
+ basePath: /usr/local/tianzeProject/largeScreen/uploadFile/img
+ img: http://118.31.7.2:96/file
+
+
diff --git a/null/cover/bigScreen_3PRTYchPNc.png b/null/cover/bigScreen_3PRTYchPNc.png
new file mode 100644
index 0000000000000000000000000000000000000000..b92f5e2a751862ec5e6d53c705c79fe63e2a2c5a
GIT binary patch
literal 12999
zcmeIwPiPZC6bA5bvXNG)*u@A6p+wWeLWx8{+rvUhgDES5B`UOvNd7gKHVvCt4_P@|c
z;qxgk1*HHb7xWjk=_QjlX3`f^-i33Wi48~##(~9B)lW}PMP}!&Mh3PzZ;TsN
zZZ5k9ytoS-ZFX~`4dBon;Q705u4_`x_?h-{LFohY^T7AVz`;4-@O$9Ewf3BJea;q<
zsj!@DNvZk6Ylu9dwce}mw!-O
zTfJASuQZ-*zivEfK3%DA=(o+UJ6h|9ucZ5_w}0uDSwxM+V(uAtIgwayt=HFE|J?LT
z*n`1|ftsaGAYd!YR{9N&wEwl;FKv(eBpn)7Jvn(W#mfA#J*~YRl
ziPb=(=OsQ+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+
cfC3bt00k&O0SZun0u-PC1t{qHVvCt554qI
zFD0N}3dKthiXeEC_NwTi;6Xu<8ZX5|k0L@P2r|A&kTgmJ@82vt^Y+c#nb{w!xAhJN
zFDAVtlme7o(4W<|mq^^2OkGZTmoBs>wjix12Fw*JerjSoJT-kid|;>bhM7xe%Ox{*
zX|nG34`y}XeY8u>zta7=d^sxxU*#V5Wpg=fP~u>r6+0%*v|`u9cPpie)J&S#znV%&
zoRioo?29w|;%vz`^;M~H=VtGiy-YJF9>^E3U6HX*?hwjIVFKgk`{h~M{A1w!9$-Ca
z=Q3-+<~`t8y`3Ab0f(1?jkoPw+oY8C)6M02qz}x@0NrP3Q&Lo6rcbFC_n)U
zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ
NKmiK;Eik4({sN7Rx1j(4
literal 0
HcmV?d00001
diff --git a/null/cover/bigScreen_F9GUhaJI4B.png b/null/cover/bigScreen_F9GUhaJI4B.png
new file mode 100644
index 0000000000000000000000000000000000000000..6424405b11ddfe3eeabc5cc5c939c0bde0ba7e87
GIT binary patch
literal 18779
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
TBmfCO0+0YC@Vg?gL*D&wdS${)
literal 0
HcmV?d00001
diff --git a/null/cover/bigScreen_J4nJfu9HoA.png b/null/cover/bigScreen_J4nJfu9HoA.png
new file mode 100644
index 0000000000000000000000000000000000000000..73ca95be3cdcfd18cfab4a8b908aa216274503aa
GIT binary patch
literal 24429
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
Gb^bql7~6^f
literal 0
HcmV?d00001
diff --git a/null/cover/bigScreen_NWhNLwik8G.png b/null/cover/bigScreen_NWhNLwik8G.png
new file mode 100644
index 0000000000000000000000000000000000000000..b92f5e2a751862ec5e6d53c705c79fe63e2a2c5a
GIT binary patch
literal 12999
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