From 69f13908ec0d0f3b50ccedd7edcd4a3dc7337c87 Mon Sep 17 00:00:00 2001 From: whb <17803890193@163.com> Date: Fri, 30 Aug 2024 18:09:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A4=A7=E5=B1=8F=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=94=A8=E6=88=B7=E9=9A=94=E7=A6=BB=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=8C=E6=90=9C=E7=B4=A2,=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=AF=81=E4=B9=A6=EF=BC=8C=E5=92=8C=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E8=AF=81=E4=B9=A6=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BizComponentController.java | 57 +++++++++++++++++- .../biz/component/dto/BizComponentDTO.java | 3 + .../component/dto/BizComponentSearchDTO.java | 3 + .../service/impl/BizComponentServiceImpl.java | 40 ++++++++++++ .../controller/DataRoomFileController.java | 16 +++++ .../core/module/file/dto/FileSearchDTO.java | 2 + .../service/impl/DataRoomFileServiceImpl.java | 6 ++ .../controller/DataRoomPageController.java | 20 +++++- .../service/impl/DataRoomPageServiceImpl.java | 1 + .../type/service/impl/TypeServiceImpl.java | 6 +- .../src/main/resources/application.yml | 12 +++- .../src/main/resources/pfx-password.txt | 1 + .../src/main/resources/szyx.sztzjy.com.pfx | Bin 0 -> 4645 bytes 13 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 DataRoom/dataroom-server/src/main/resources/pfx-password.txt create mode 100644 DataRoom/dataroom-server/src/main/resources/szyx.sztzjy.com.pfx diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java index 511ddf8f..e52ac50d 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java @@ -1,17 +1,26 @@ package com.gccloud.dataroom.core.module.biz.component.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.gccloud.common.exception.GlobalException; import com.gccloud.common.permission.ApiPermission; import com.gccloud.common.utils.BeanConvertUtils; +import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizComponentDao; +import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizUserDao; import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentDTO; import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentSearchDTO; import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity; +import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser; import com.gccloud.dataroom.core.module.biz.component.service.IBizComponentService; import com.gccloud.common.vo.PageVO; import com.gccloud.common.vo.R; +import com.gccloud.dataroom.core.module.file.dao.DataRoomFileDao; +import com.gccloud.dataroom.core.module.file.entity.DataRoomFileEntity; import com.gccloud.dataroom.core.permission.Permission; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -41,16 +50,38 @@ public class BizComponentController { @ApiImplicitParam(name = "name", value = "名称模糊查询", paramType = "query", dataType = "string") }) public R> getPage(@ApiParam(name = "查询", value = "传入查询的业务条件", required = true) BizComponentSearchDTO searchDTO) { + + if (!StringUtils.hasText(searchDTO.getUserId())) + { + throw new GlobalException("用户Id不能为空"); + } + PageVO page = bizComponentService.getPage(searchDTO); return R.success(page); } + @Autowired + private DataRoomBizUserDao userDao; @ApiPermission(permissions = {Permission.Component.ADD}) @PostMapping("/add") @ApiOperation(value = "新增", notes = "新增", produces = MediaType.APPLICATION_JSON_VALUE) public R add(@ApiParam(name = "新增", value = "传入新增的业务条件", required = true) @RequestBody BizComponentDTO dto) { + + if (!StringUtils.hasText(dto.getUserId())) + { + throw new GlobalException("用户Id不能为空"); + } + + BizComponentEntity entity = BeanConvertUtils.convert(dto, BizComponentEntity.class); String code = bizComponentService.add(entity); + + //将这个code加入用户的权限 + BizComponentUser bizComponentUser = new BizComponentUser(); + bizComponentUser.setCode(code); + bizComponentUser.setUserId(dto.getUserId()); + + userDao.insert(bizComponentUser); return R.success(code); } @@ -65,17 +96,39 @@ public class BizComponentController { } @ApiPermission(permissions = {Permission.Component.ADD}) - @PostMapping("/copy/{code}") + @PostMapping("/copy") @ApiOperation(value = "复制", notes = "复制", produces = MediaType.APPLICATION_JSON_VALUE) - public R copy( @PathVariable String code) { + public R copy( String code,String userId) { + if (!StringUtils.hasText(userId)) + { + throw new GlobalException("用户Id不能为空"); + } + String newCode = bizComponentService.copy(code); + + //将这个code加入用户的权限 + BizComponentUser bizComponentUser = new BizComponentUser(); + bizComponentUser.setCode(code); + bizComponentUser.setUserId(userId); + + userDao.insert(bizComponentUser); + return R.success(newCode); } +@Autowired +private DataRoomBizComponentDao dataRoomBizComponentDao; + @ApiPermission(permissions = {Permission.Component.DELETE}) @PostMapping("/delete/{id}") @ApiOperation(value = "删除", notes = "删除", produces = MediaType.APPLICATION_JSON_VALUE) public R delete(@ApiParam(name = "删除", value = "传入删除的业务条件", required = true) @PathVariable String id) { + //判断type是否为1 + BizComponentEntity bizComponentEntity = dataRoomBizComponentDao.selectById(id); + if ("1".equals(bizComponentEntity.getType())){ + throw new GlobalException("系统文件,请勿删除!"); + } + bizComponentService.delete(id); return R.success(); } diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java index 0ce65a72..f2d3bcdb 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java @@ -46,4 +46,7 @@ public class BizComponentDTO { @ApiModelProperty(notes = "模块编码") private String moduleCode; + @ApiModelProperty(notes = "用户ID") + private String userId; + } diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java index 80ec2981..403ad769 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentSearchDTO.java @@ -17,4 +17,7 @@ public class BizComponentSearchDTO extends SearchDTO { @ApiModelProperty(value = "名称") private String name; + @ApiModelProperty(value = "用户ID") + private String userId; + } 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 20e79035..ba2fbb39 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 @@ -1,11 +1,14 @@ package com.gccloud.dataroom.core.module.biz.component.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gccloud.dataroom.core.config.DataRoomConfig; import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizComponentDao; +import com.gccloud.dataroom.core.module.biz.component.dao.DataRoomBizUserDao; import com.gccloud.dataroom.core.module.biz.component.dto.BizComponentSearchDTO; import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentEntity; +import com.gccloud.dataroom.core.module.biz.component.entity.BizComponentUser; import com.gccloud.dataroom.core.module.biz.component.service.IBizComponentService; import com.gccloud.dataroom.core.module.file.entity.DataRoomFileEntity; import com.gccloud.dataroom.core.module.file.service.IDataRoomOssService; @@ -17,12 +20,16 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.*; +import java.util.ArrayList; import java.util.Base64; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * @author hongyang @@ -39,13 +46,46 @@ public class BizComponentServiceImpl extends ServiceImpl getPage(BizComponentSearchDTO searchDTO) { + + final List collect ; + LambdaQueryWrapper userQueryWrapper = new LambdaQueryWrapper<>(); + userQueryWrapper.select(BizComponentUser::getCode); + userQueryWrapper.eq(BizComponentUser::getUserId,searchDTO.getUserId()); + List bizComponentUserList = userDao.selectList(userQueryWrapper); + // 使用三元运算符处理空情况 + collect = bizComponentUserList.isEmpty() ? + Collections.emptyList() : + bizComponentUserList.stream().map(BizComponentUser::getCode).collect(Collectors.toList()); + + + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(StringUtils.isNotBlank(searchDTO.getName()), BizComponentEntity::getName, searchDTO.getName()); queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getType()), BizComponentEntity::getType, searchDTO.getType()); queryWrapper.orderByAsc(BizComponentEntity::getOrderNum); +// queryWrapper.in(BizComponentEntity::getCode,collect); + + // 添加 AND 查询条件,既要 getCode 符合条件,又要 getType 为 "1" +// queryWrapper.and(wrapper -> +// wrapper.in(BizComponentEntity::getCode, collect) +// .eq(BizComponentEntity::getType, "1") +// ); + + // 添加 OR 查询条件,查询既符合 getCode 条件的数据,也符合 getType 为 "1" 的数据 + queryWrapper.and(wrapper -> wrapper + .in(BizComponentEntity::getCode, collect) + .or() + .eq(BizComponentEntity::getType, "1") + ); + queryWrapper.orderByDesc(BizComponentEntity::getCreateDate); + PageVO page = this.page(searchDTO, queryWrapper); List list = page.getList(); String urlPrefix = bigScreenConfig.getFile().getBasePath(); diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/controller/DataRoomFileController.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/controller/DataRoomFileController.java index a337398c..5c4c950d 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/controller/DataRoomFileController.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/controller/DataRoomFileController.java @@ -1,6 +1,8 @@ package com.gccloud.dataroom.core.module.file.controller; +import com.gccloud.common.exception.GlobalException; import com.gccloud.common.permission.ApiPermission; +import com.gccloud.dataroom.core.module.file.dao.DataRoomFileDao; import com.gccloud.dataroom.core.module.file.dto.FileSearchDTO; import com.gccloud.dataroom.core.module.file.entity.DataRoomFileEntity; import com.gccloud.dataroom.core.module.file.service.IDataRoomFileService; @@ -38,6 +40,9 @@ public class DataRoomFileController extends SuperController { @Resource private IDataRoomFileService fileService; + @Resource + private DataRoomFileDao dataRoomFileDao; + @ApiPermission(permissions = {Permission.File.VIEW}) @GetMapping(value = {"", "/"}) @ApiOperation(value = "列表", position = 10, notes = "分页查询文件", produces = MediaType.APPLICATION_JSON_VALUE) @@ -47,6 +52,12 @@ public class DataRoomFileController extends SuperController { @ApiImplicitParam(name = "searchKey", value = "查询条件", paramType = "query", dataType = "string") }) public R> getPage(@ApiParam(name = "查询", value = "传入查询的业务条件", required = true) FileSearchDTO searchDTO) { + + if (!org.springframework.util.StringUtils.hasText(searchDTO.getUserId())) + { + throw new GlobalException("用户Id不能为空"); + } + PageVO page = fileService.getPage(searchDTO); PageVO pageVO = BeanConvertUtils.convertPage(page, DataRoomFileVO.class); return R.success(pageVO); @@ -88,6 +99,11 @@ public class DataRoomFileController extends SuperController { @PostMapping("/delete/{id}") @ApiOperation(value = "删除", notes = "删除", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public R delete(@PathVariable("id") String id) { + //删除之前判断是否为内置 + DataRoomFileEntity dataRoomFileEntity = dataRoomFileDao.selectById(id); + if ("999999999".equals(dataRoomFileEntity.getUserName())){ + throw new GlobalException("系统文件,请勿删除!"); + } sysOssService.delete(id); return R.success(true); } diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/dto/FileSearchDTO.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/dto/FileSearchDTO.java index 1dd94dc7..925836c5 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/dto/FileSearchDTO.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/dto/FileSearchDTO.java @@ -24,5 +24,7 @@ public class FileSearchDTO extends SearchDTO { */ private List extensionList; + private String userId; + } diff --git a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java index 1b415cd3..6577ea9d 100644 --- a/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java +++ b/DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java @@ -31,9 +31,15 @@ public class DataRoomFileServiceImpl extends ServiceImpl queryWrapper = QueryWrapperUtils.wrapperLike(new LambdaQueryWrapper(), searchDTO.getSearchKey(), DataRoomFileEntity::getOriginalName); queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getModule()), DataRoomFileEntity::getModule, searchDTO.getModule()); queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getExtension()), DataRoomFileEntity::getExtension, searchDTO.getExtension()); + queryWrapper.eq(DataRoomFileEntity::getUserName, searchDTO.getUserId()).or(query->query.eq(DataRoomFileEntity::getUserName,"999999999")); if (searchDTO.getExtensionList() != null && searchDTO.getExtensionList().size() > 0) { queryWrapper.in(DataRoomFileEntity::getExtension, searchDTO.getExtensionList()); } + + if (org.springframework.util.StringUtils.hasText(searchDTO.getSearchKey())) { + queryWrapper.like(DataRoomFileEntity::getOriginalName, searchDTO.getSearchKey()); + } + queryWrapper.orderByDesc(DataRoomFileEntity::getCreateDate); return page(searchDTO, queryWrapper); } 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 a3e7e763..898cfe8a 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 @@ -125,14 +125,30 @@ public class DataRoomPageController { } @ApiPermission(permissions = {Permission.DataRoom.ADD}) - @PostMapping("/copy/{code}") + @PostMapping("/copy") @ApiOperation(value = "复制大屏/组件", position = 50, produces = MediaType.APPLICATION_JSON_VALUE) - public R copy(@PathVariable String code) { + public R copy(String code,String userId) { + + if (!StringUtils.hasText(userId)) + { + throw new GlobalException("用户Id不能为空"); + } + PageEntity bigScreenPage = bigScreenPageService.getByCode(code); if (bigScreenPage == null) { throw new GlobalException("大屏页不存在"); } String newCode = bigScreenPageService.copy(bigScreenPage); + + //将这个code加入用户的权限 + BizComponentUser bizComponentUser = new BizComponentUser(); + bizComponentUser.setCode(newCode); + bizComponentUser.setUserId(userId); + bizComponentUser.setType(bigScreenPage.getType()); + + userDao.insert(bizComponentUser); + + return R.success(newCode); } 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 89f08e11..5e821873 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 @@ -440,6 +440,7 @@ public class DataRoomPageServiceImpl extends ServiceImpl im //获取所有code LambdaQueryWrapper userLambdaQueryWrapper = new LambdaQueryWrapper<>(); userLambdaQueryWrapper.eq(BizComponentUser::getUserId,userId); - userLambdaQueryWrapper.eq(BizComponentUser::getType,type); + ArrayList stringArrayList = new ArrayList<>(1024); + stringArrayList.add("bizComponentCatalog"); + stringArrayList.add(type); + userLambdaQueryWrapper.in(BizComponentUser::getType,stringArrayList); List bizComponentUserList = userDao.selectList(userLambdaQueryWrapper); List codeList = bizComponentUserList.stream().map(code -> code.getCode()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(codeList)) diff --git a/DataRoom/dataroom-server/src/main/resources/application.yml b/DataRoom/dataroom-server/src/main/resources/application.yml index ce9877d3..41fc8cbe 100644 --- a/DataRoom/dataroom-server/src/main/resources/application.yml +++ b/DataRoom/dataroom-server/src/main/resources/application.yml @@ -3,6 +3,12 @@ server: port: 8081 servlet: context-path: /bigScreenServer + ssl: + key-store: classpath:szyx.sztzjy.com.pfx + key-store-password: u15a19un + key-store-type: PKCS12 + enabled: true + client-auth: none # spring环境配置 spring: @@ -36,9 +42,9 @@ spring: 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 + url: jdbc:p6spy:mysql://120.79.54.255:3306/dashboard?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true username: root - password: sztzjy2017 + password: Sztzjy506 mybatis-plus: # mybatis plus xml配置文件扫描,多个通过分号隔开 @@ -53,6 +59,6 @@ gc: starter: file: basePath: /usr/local/tianzeProject/largeScreen/uploadFile/img - img: http://118.31.7.2:96/file + img: http://120.79.54.255:96/file diff --git a/DataRoom/dataroom-server/src/main/resources/pfx-password.txt b/DataRoom/dataroom-server/src/main/resources/pfx-password.txt new file mode 100644 index 00000000..3ce7e388 --- /dev/null +++ b/DataRoom/dataroom-server/src/main/resources/pfx-password.txt @@ -0,0 +1 @@ +u15a19un \ No newline at end of file diff --git a/DataRoom/dataroom-server/src/main/resources/szyx.sztzjy.com.pfx b/DataRoom/dataroom-server/src/main/resources/szyx.sztzjy.com.pfx new file mode 100644 index 0000000000000000000000000000000000000000..d5ee3b23a3a90b44afdbd24a62ce21f7b3a8a717 GIT binary patch literal 4645 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 PH}1lfHuwa1;d%c8UM9wD literal 0 HcmV?d00001