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等数据集接入,使用简单,完全免费,代码开源。 - -

- GitHub Repo stars - GitHub forks - GitHub license - npm - Maven Central - Company -

-------------------------------------------------------------------------------- - -## 效果图 - -#### 管理页 -logo - -#### 设计器 -logo - -## 快速开始 - -快速开始 - -## 演示DEMO - - http://gcpaas.gccloud.com/bigScreen - -## 联系我们 -Email - -QQ群 - -

- logo -

- -## 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 zcmeHN30RZI)}DY%wZ#@8Zm1wAJ1VjX1eZ$0B|tHRpb*d?M3F_pCZIs8wIQImQW6Bb zK@;+!P(+9U5iOu11VoGw0;mX)B_LQ9i$eY{l2mW6?S20H_qo>p$>hm5XU>^9bLO2n z=bM>C(j<8TzS^>J^G1L`0Dyo$K+=wA+PqSGkVF3OvCBvP=#;U`# zI%$&Dm(s*Z8YQJ8!}f>4b-t0(WY=vQV0t%9>yzH2iSN-q`^nP!NpKxhU_iLEFKLom z{Dp524h!d>!QX`-6l?zfO{y zK=rdJtEa~+Bea2%DneNmA*lfK;k71B^0C6XGGdC-R9J-i3SOH^%F3V3P@bYZSqCmo znSD}KZPyZ0GZ)v;EA^|^Z^MS1&cF3QoBZum^;7@QF@O3sap@r3dfr>L@9UK+n*vLg zsKVVT!AbcyDMCqgwyCn(lJ(lFTtXzx;0su!q^hh6)`DMs3Y7hM)sZ=+_I!1F=cR8v zN+&Y=m+zB+OWu0CQ?4Pi(h8rj{Q7xKz2h;c2Hw$8eC+O6lWK1M63?dK@JNwEyI*-s zPT8up$k|AlR5!q?xa1d|!71N|?keR!rfDXmsr2W*x%+1Q@7sK}32&* zY^-+szFr^7A!ECF3mvN%i53+Vft|Ep4nDlI#*GJ5;@?}!ACa8ZGJV|BTl{)!!a=)m zEJ;nh_HJ4T=M7`cX??TfHuoNPf%~(d{Ubf)=&(w>k-*FqOV(L2Sg?T1f-%p@mrlE9gZSU4dolm2kPUk%m?oCQ06;T;D?#B z$~@&zXO%A+$~S_Re^+7DzK?lhQwJ+22_?!{V41w}dEe{uyZ^bqf7{_7RRF-~`)>dK z-hq2to<{E|DSor+#D8&W{Tct=bzYUPag zRSY|1g^r9r?d*}^DVJ&J89PIyo%$eN&Vlopvhkj}=9QA$U-rd?_hcWJyquA!+Iok2 z=B#Yt!ZTuPyeoU6xiivdn8$@EJ(S^6Jh3J?pi;w#6TIe7LG_v&i}O7VWtg10mYb5% zpZvvV?@i^j?LDWBhd0@|bhV6^9f*oy=$X`R9*P|pOo_e#s_nJ~WUwa(J)Paf9&Z?l ziq4>Bwyq_e+#>^RO2wVk!;ue?h0YHauaj0q{ybC|8UD(5+5S=!LTl{&O_S|E{uAM0 zH%F%=8EIfdVpK$iv|rQ$Q~REo&S@tu=bM^$3M`!UZsyG=7wgiPsSre@=Nv2XTLPvI zhV!i$ery_DpO#)Wv1@7w!Njh0@w_R&ID7W^WpMehw-47c_x7f{!)`vwDr(p5G(|P6 ze7QW09{n5(%P&m{f@@$J8f|`>Cd%MG)vvv<={++WAtXa9?X0U<1)z0}&M|T{ehLO@(OfHk%imhIAW;{cxLR{^{ zqwN(8_({dqCWClgnbpNF8^lBYP!a-j*SI&-9b3RSO>jVXYiY^-pTK!Ol?`c6BuDz^-NTRTK}xoEB(DkTM5J zBlUfCuOy&{d_3cNS;CI)J>&OZb~7rl1Pc;PU>lVYSCkwScSi!SXS}_3bR**WvV@s~ z67cBu0$pi)FBiM0xP?!QQo)xIHtw&S>z_<_+EGfoUyU!Yu`Y1-q_J}C8(1b@HC?_r zf^<~|$)t9>)Y0kD9RilLX8l?FN@%3wj$YfsUs<`11&vG2Bh~?Lm9ECYOjD`0!~P>Bnzim7tNvY}K6tuo{ONP!VW;?8a`j(mz_mC0GfOsu*091D4#90i z%nE9|w$)1G=c<(63l4GKCCMYfy`v!$P0tA9*YYHw#&pqmZ2ww8Szha%*Q*yq*P{gMN0Z zRU`Vw%VppjFePs&v*HlaX$aHOkswMw@6;eSm~!cpa^|i5kuq zHNV;)FCK{hfCo&1cz!ZV*r5~;mc?C|(CLEkW6tesC{AtQ(+_~t!@bVDaewO;mHhy5 zbPqfRc=YK_VYgkg@0$r)Lo0Sxs?@CVP!n< zuo`6%ejrsw!9fURv8qmGJ?z_WHN&x}91GW)_t#Ze;q2g0{zAVqV?o}+6!_)Qu?2ob z%<%4BOBpjv?-GXcd5do#Y%xLGpR!X9_)~8p_~SM$gbExIGlmQe>3Gd0{C4KlHRYsd zJ^@W1XLkRk*RG#i=*C2%wsqjxgsEm!XpU^}x%8Ct2?RQhTXKr7x3tpqie)`Ud~9aE zl|QG1E&)z=kM9whE{u8r@W=-Zt@TfjoSob_?3@kXOZGHwb?E=$#~gx*X7OV582FHv zz-QTv5pF>U(#XT)iJ{68#SnrBb?eciC&?Ux?uP{ zS8T;cdLP|}|NH^Jwejhh_z(5-F?b(9YB~-Q#j)BA($fs+5doBB52lze0e0*zg90^7 zbkWOz%KMy2wch}f=F>7=~HNUKZOrsq;X^IlVaba$^EGoGCh0)+Y4mcXJbEsFp zz36!GM!SPcp2KlUXBr$=Xr!a(;a$>E=Ju!AD}j9K&dS!i*2kEx5A``UV95P=Kg#uj z{Hz}jG>|xTo~dhvGb-?TKr7cAtwv@utl6}Vs1F5)4=I)L5Irw0Y8GW)K$Q}PvPK$) zemD^?mB`*(d})W0WfR5$JkRD)LQp>+r}UA#@@fiSF%!N1q;qZYgy ziy>EfWm9^d=%nI9gReF}$kUn3v^M=gSq~Z*swcSOD1}I@t*#}m?!1-}m(v`$7k_dx zJF)ctT3+F_nEu>%bt0@k3KCI-Ygp;L8x8xmT>o|nVUjrZSCtQxH<&xdwd|-?Q#HGi z8zn41a=kxrBy9(-W5!Gw5%d?8Kj;6zOl6W(_xZXMSsRLk1v!UnMUVFuUi4abB6pJ5 z_($bthBli586Lkj{L`m&V>amnkdJ2Ei8vd7T0)`T0(gibOya3)cHq4O9KvW z`#xqT)=U-SVhU3G3%_MvCq#(2tuD4^4yZaTHCy0%$MrBAKscwZ-q5ayMXU@$_)`-X zObfJ+N~A!0g!36Bx~2HFG9?mwxL|d9OJk_7D~Yw+!L4n(1XS!V61NKH8gNxHjyN3h z_TA*8w>+Q4VH)d9ogOEN!)xa}nnvRFtP9J4j=+7=Jey$@s9W4r9h$T z>X7Ez?-Vx>)bWIH$9p2WUwWFh>OA-|Rn5D;FkNH2;FLGU2P&1W*n~689Gps>w8A zN_t^MUpk`3;3%WD`e8lUp8^rrVoc^3*U#NoV!=~ysls4w^|~LrO45}jGwDAF1iUHMZmNMQ>1-OASJ`SHyoG5igRoZY(!#FXLupz72);) zWKddzws1k0ggL5X-2zX$323iM<02(sxRFv-ZEC9%Y%YEt3Pv4!ui976HDc;zXtR&y zxjv=`psyWw=Vs`=+BDs<#;++a++GM3Ga!gsdeA1(oy#;zJ4p!VYnWBW7*cwKrptFO zatkSR&rM~d7qQdx(H^?tO`=?OE*B!|1oU+rgZ~qPEGIB|EyFIEyUAp+z%Dq1!qK>! z7HP=rh`rQkS^LoSTRAx@S;ev4cqwXc%@*`1Zc0>wP%~;&>CV zjxq49{Y&e3uf!n_j;BiyvADb1!qLNrl(#zo26Apbg~5lq=!QbP1cdQZBEmzrwq7Tw zqg9J(tu;I@om({glFVJ_wxYJZk9(|uoDKOmdzM)U3(=-2CU>By=a;qA6GwH2=Pt+L zsu)Bc3lCS88s>!ocb^5aF+a3w4>zOV)-Jj*vDxHw{q_E4Eiwx$;Qa~gb`Ffy1%fh;7KPU#vNjF?OS;fbZa)0yD5OE&r);jViZHi zx7T^K7W52T-_(VF#i0q!sz~IJ^!tH-GUej6H}ab^bwF)AR0kzW46;?tS;( z_j~XA5_y+=5NtkbV`l?UC;(8%1?0o1E;}nLuVW5W8#~hBRYMa%L}@Po!7NU=gYBW6 zF0O7nHw>=MP}sbE*rAI4J%Yqte5{BLfY|6gKEE}*(btddgE-6~_pWdxIZ~_|qO19@ z>iP5R8@pU`lHeT3=WD=6N2Ux%d z;1SIj>;(j{U)~F>fIb$di__HC)z&pK)Za_=wIrIE5l^|$?R=Bt)4orNPvm9)ICei< z*i*<$Y?3$k%q+;|@{D^(Ba@H4mP-{uP=-cEL{nm%pK>Nu@_07xT1EGjzQ6kjr#nN)l?J(gRD*q@Ou;Je5Qu)z#HC5|3nm*s##41Cqd}N$M?q&5O751qtaitpF|Cdr3Hk zu@R}o`fyl5+gPqXi4rW*^E@F3e{}W1pK1Hre3_<-`#v^#^T??OQyQnjFHI0qnhdK) z7ZR!~%iM=tcKRjE(mfXjgT_a|lta{$Y zJLyZJ9PZ|Fxka4RS7J_M6Ht6^KV13bN3p3yO{~?@dZ{RgY<{(Lsng^IA0JjN>}l@_vy^=WnKp=Rm1(%hroX}9kb){t@<>SU#H8s*OJPO>kOJw>Jg zGeT2tOmfx(nN4}}trulqHVe2#g}PG~8}hK+0_)iw6EDB9(09xEtfy9uW_z8F_zp{Te*{;kclO3PZgqe9!Cm&(14RW*X5tiXvZGsZ zg0)BfS#sn=$2NR-4*yt&#d0steIzA!{mrI?cF)F7({jmi&23e29uw6igsG_#;^6Yt zqyuGReXTXptnu0H8e*5~82_Wejb;t*lXb5sQK?mG)^j{YCg+v3yowe51#UX?)|VOq zPtSJ*ypn@#Vz%PvM*W}MeB)OBKoHdFL-Ui*f=) z)wgQ$vTD^M%tOZGKSm~EIx6<`4m2&{Yvz zo#04z(zxYO>)GGU%^$gL`%RT*RPiuF6h^tTQgGygOL^3@+rj;{Am zOD!|eR6K*hno@mTEHjokN}Nk6B|0?+u^V$kn=fv6x1i(L)23vTLKDJ$%N>dxLHz^G z_@USBj->H^w%+<_Ha(I>rnOnTsPL=cFU&=c z_#HR5U~-Dt^aEk9AN4eh7cC_}3Bi`l9XTGjT~IY(du46x#JdAZ=OT+Mk&k6Gxq!u+ zjm91OmBY6gPD3^|mqp#u7}*Lh#*;dZKO+Z`_?Sw`wr?{^hba7uqAsaS7MnNi!#RGc zX}%OcR`*U+r!8C83fRAz%~G4bnvb?t->)2Yuf3B|bk3NbFiXmqfr$WS0^ z5}N0(T*c1+kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2e 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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 X8u+AvPa627flnIv|3?GDvn~G*>jn1Q literal 0 HcmV?d00001 diff --git a/null/cover/bigScreen_bMYGsd3CrQ.png b/null/cover/bigScreen_bMYGsd3CrQ.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{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{L<94H5lLFV)WQ>m;S9_;swjK1?cJS*=|u}CbFR&x!b zx;Nidb>N$?M$Uci`gkG}ql8Q9oi-g#mvxbLCCl1SI$GAI(sS8#mU4!bw%>$x5JoSK|bXDL%RZcL=!zNWd3x*HjUF^GQkep-`FZvnm6fVNukMK^$h zC7`uX@pa~b$BV#+FBM;fNjhRjO68n1IwmH7s~zCcDA4>BXc#NSXsB^F4~5)xuW4#Y zOdk%`Qv_kS+r8~=hPT7(>oWXiJYe?pnDZm!R(x$?V|`^Ix18U< zILhx9_Lg(U@^j(mwUl!6kcMCK;