Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

liu.shiyi 1 an în urmă
părinte
comite
e7d43bfb2e
61 a modificat fișierele cu 1942 adăugiri și 224 ștergeri
  1. 3 7
      DataRoom/dataroom-core/pom.xml
  2. 0 6
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/PageEntity.java
  3. 6 3
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/service/IBasePageService.java
  4. 8 4
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java
  5. 49 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java
  6. 2 1
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java
  7. 6 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Chart.java
  8. 0 3
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java
  9. 5 2
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java
  10. 3 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapDTO.java
  11. 3 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/dto/PageTemplateDTO.java
  12. 3 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java
  13. 4 2
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java
  14. 10 5
      DataRoom/dataroom-server/pom.xml
  15. 7 4
      DataRoom/dataroom-server/src/main/java/com/gccloud/DataRoomApplication.java
  16. 3 2
      DataRoom/dataroom-server/src/main/java/com/gccloud/dataroom/config/CorsBeanConfig.java
  17. 45 0
      DataRoom/dataroom-server/src/main/java/com/gccloud/dataroom/config/SwaggerBootstrapConfig.java
  18. 7 1
      DataRoom/dataroom-server/src/main/resources/application.yml
  19. 0 4
      DataRoom/doc/init.sql
  20. 7 1
      DataRoom/doc/update.sql
  21. 15 39
      DataRoom/pom.xml
  22. 16 3
      data-room-ui/packages/BasicComponents/IndexCard/index.vue
  23. 26 1
      data-room-ui/packages/BasicComponents/IndexCard/setting.vue
  24. 10 7
      data-room-ui/packages/BasicComponents/IndexCard/settingConfig.js
  25. 156 0
      data-room-ui/packages/BasicComponents/IndexCard2/index.vue
  26. 239 0
      data-room-ui/packages/BasicComponents/IndexCard2/setting.vue
  27. 64 0
      data-room-ui/packages/BasicComponents/IndexCard2/settingConfig.js
  28. 26 8
      data-room-ui/packages/BasicComponents/IndicatorCard/index.vue
  29. 26 1
      data-room-ui/packages/BasicComponents/IndicatorCard/setting.vue
  30. 6 3
      data-room-ui/packages/BasicComponents/IndicatorCard/settingConfig.js
  31. 146 0
      data-room-ui/packages/BasicComponents/IndicatorCard2/index.vue
  32. 212 0
      data-room-ui/packages/BasicComponents/IndicatorCard2/setting.vue
  33. 61 0
      data-room-ui/packages/BasicComponents/IndicatorCard2/settingConfig.js
  34. 2 2
      data-room-ui/packages/BasicComponents/ThemeSelect/index.vue
  35. 16 16
      data-room-ui/packages/BigScreenDesign/DataViewDialog/index.vue
  36. 3 3
      data-room-ui/packages/BigScreenDesign/PageDesignTop.vue
  37. 348 0
      data-room-ui/packages/BigScreenDesign/RightSetting/EchartsCustomSetting.vue
  38. 74 0
      data-room-ui/packages/BigScreenDesign/RightSetting/RotateSetting.vue
  39. 5 1
      data-room-ui/packages/BigScreenDesign/RightSetting/index.vue
  40. 20 0
      data-room-ui/packages/BigScreenList/EditForm.vue
  41. 0 13
      data-room-ui/packages/BigScreenManagement/addDialog.vue
  42. 6 6
      data-room-ui/packages/BigScreenRun/index.vue
  43. 1 0
      data-room-ui/packages/BizComponent/index.vue
  44. 53 4
      data-room-ui/packages/ComponentList/EditForm.vue
  45. 1 1
      data-room-ui/packages/ComponentList/index.vue
  46. 86 25
      data-room-ui/packages/DataSetManagement/src/CustomEditForm.vue
  47. 1 0
      data-room-ui/packages/DataSetManagement/src/ScriptEditForm.vue
  48. 6 5
      data-room-ui/packages/DataSetManagement/src/StoredProcedureEditForm.vue
  49. 3 0
      data-room-ui/packages/Echarts/echartList.js
  50. 37 1
      data-room-ui/packages/EchartsRender/index.vue
  51. 33 15
      data-room-ui/packages/MapDataManagement/src/index.vue
  52. 9 9
      data-room-ui/packages/Render/index.vue
  53. BIN
      data-room-ui/packages/assets/images/cardImg/card.png
  54. BIN
      data-room-ui/packages/assets/images/cardImg/card2.png
  55. BIN
      data-room-ui/packages/assets/images/cardImg/indcard2.png
  56. BIN
      data-room-ui/packages/assets/images/cardImg/indicard.png
  57. 7 7
      data-room-ui/packages/assets/style/common/index.scss
  58. 15 2
      data-room-ui/packages/assets/style/settingWrap.scss
  59. 3 0
      data-room-ui/packages/js/api/bigScreenApi.js
  60. 4 1
      data-room-ui/packages/js/config/basicComponentsConfig.js
  61. 35 6
      data-room-ui/packages/js/utils/getComponentConfig.js

+ 3 - 7
DataRoom/dataroom-core/pom.xml

@@ -6,14 +6,14 @@
     <parent>
         <groupId>com.gccloud</groupId>
         <artifactId>dataroom</artifactId>
-        <version>1.0.1.2023092701.Alpha</version>
+        <version>1.0.1.2023100901.Alpha</version>
     </parent>
 
     <artifactId>dataroom-core</artifactId>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
@@ -24,10 +24,6 @@
             <artifactId>dataset-core</artifactId>
             <version>${dataset.core.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>

+ 0 - 6
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/entity/PageEntity.java

@@ -44,12 +44,6 @@ public class PageEntity extends SuperEntity implements Serializable {
     @ApiModelProperty(notes = "大屏首页封面")
     private String coverPicture;
 
-    @ApiModelProperty(notes = "页面图标")
-    private String icon;
-
-    @ApiModelProperty(notes = "图标颜色")
-    private String iconColor;
-
     @ApiModelProperty(notes = "具体组件配置、JSON格式")
     @TableField(typeHandler = BasePageDTOTypeHandler.class)
     private BasePageDTO config;

+ 6 - 3
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/basic/service/IBasePageService.java

@@ -71,11 +71,12 @@ public interface IBasePageService extends ISuperService<PageEntity> {
     default boolean checkNameRepeat(PageEntity entity) {
         AssertUtils.isTrue(StringUtils.isNotBlank(entity.getName()), "名称不能为空");
         LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(PageEntity::getId);
         queryWrapper.eq(StringUtils.isNotBlank(entity.getAppCode()), PageEntity::getAppCode, entity.getAppCode())
                 .eq(PageEntity::getName, entity.getName())
                 .eq(PageEntity::getType, entity.getType())
                 .ne(StringUtils.isNotBlank(entity.getId()), PageEntity::getId, entity.getId());
-        return getBaseMapper().selectCount(queryWrapper) > 0;
+        return getBaseMapper().selectList(queryWrapper).size() > 0;
     }
 
     /**
@@ -89,11 +90,12 @@ public interface IBasePageService extends ISuperService<PageEntity> {
     default boolean checkNameRepeat(String appCode, String name, String id, String type) {
         AssertUtils.isTrue(StringUtils.isNotBlank(name), "名称不能为空");
         LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(PageEntity::getId);
         queryWrapper.eq(StringUtils.isNotBlank(appCode), PageEntity::getAppCode, appCode)
                 .eq(PageEntity::getName, name)
                 .eq(PageEntity::getType, type)
                 .ne(StringUtils.isNotBlank(id), PageEntity::getId, id);
-        return getBaseMapper().selectCount(queryWrapper) > 0;
+        return getBaseMapper().selectList(queryWrapper).size() > 0;
     }
 
 
@@ -105,11 +107,12 @@ public interface IBasePageService extends ISuperService<PageEntity> {
     default boolean checkCodeRepeat(PageEntity entity) {
         AssertUtils.isTrue(StringUtils.isNotBlank(entity.getCode()), "编码不能为空");
         LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(PageEntity::getId);
         queryWrapper.eq(StringUtils.isNotBlank(entity.getAppCode()), PageEntity::getAppCode, entity.getAppCode())
                 .eq(PageEntity::getCode, entity.getCode())
                 .eq(PageEntity::getType, entity.getType())
                 .ne(StringUtils.isNotBlank(entity.getId()), PageEntity::getId, entity.getId());
-        return getBaseMapper().selectCount(queryWrapper) > 0;
+        return getBaseMapper().selectList(queryWrapper).size() > 0;
     }
 
 }

+ 8 - 4
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/controller/BizComponentController.java

@@ -1,6 +1,8 @@
 package com.gccloud.dataroom.core.module.biz.component.controller;
 
 import com.gccloud.common.permission.ApiPermission;
+import com.gccloud.common.utils.BeanConvertUtils;
+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.service.IBizComponentService;
@@ -46,7 +48,8 @@ public class BizComponentController {
     @ApiPermission(permissions = {Permission.Component.ADD})
     @PostMapping("/add")
     @ApiOperation(value = "新增", notes = "新增", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<String> add(@ApiParam(name = "新增", value = "传入新增的业务条件", required = true) @RequestBody BizComponentEntity entity) {
+    public R<String> add(@ApiParam(name = "新增", value = "传入新增的业务条件", required = true) @RequestBody BizComponentDTO dto) {
+        BizComponentEntity entity = BeanConvertUtils.convert(dto, BizComponentEntity.class);
         String code = bizComponentService.add(entity);
         return R.success(code);
     }
@@ -55,7 +58,8 @@ public class BizComponentController {
     @ApiPermission(permissions = {Permission.Component.UPDATE})
     @PostMapping("/update")
     @ApiOperation(value = "修改", notes = "修改", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<Void> update(@ApiParam(name = "修改", value = "传入修改的业务条件", required = true) @RequestBody BizComponentEntity entity) {
+    public R<Void> update(@ApiParam(name = "修改", value = "传入修改的业务条件", required = true) @RequestBody BizComponentDTO dto) {
+        BizComponentEntity entity = BeanConvertUtils.convert(dto, BizComponentEntity.class);
         bizComponentService.update(entity);
         return R.success();
     }
@@ -87,8 +91,8 @@ public class BizComponentController {
     @ApiPermission(permissions = {Permission.Component.VIEW})
     @PostMapping("/name/repeat")
     @ApiOperation(value = "名称查重", notes = "名称查重", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<Boolean> nameRepeat(@RequestBody BizComponentEntity entity) {
-        return R.success(bizComponentService.checkName(entity.getId(), entity.getName()));
+    public R<Boolean> nameRepeat(@RequestBody BizComponentDTO dto) {
+        return R.success(bizComponentService.checkName(dto.getId(), dto.getName()));
     }
 
 }

+ 49 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/dto/BizComponentDTO.java

@@ -0,0 +1,49 @@
+package com.gccloud.dataroom.core.module.biz.component.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.gccloud.common.utils.EmptyAsNullDeserializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/6/5 11:41
+ */
+@Data
+public class BizComponentDTO {
+
+    @JsonDeserialize(using = EmptyAsNullDeserializer.class)
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @ApiModelProperty(notes = "业务组件中文名称")
+    private String name;
+
+    @ApiModelProperty(notes = "业务组件编码,页面唯一标识符")
+    @TableField(updateStrategy = FieldStrategy.NEVER)
+    private String code;
+
+    @ApiModelProperty(notes = "业务组件所属分组")
+    private String type;
+
+    @ApiModelProperty(notes = "组件封面")
+    private String coverPicture;
+
+    @ApiModelProperty(notes = "vue组件内容")
+    private String vueContent;
+
+    @ApiModelProperty(notes = "组件配置内容")
+    private String settingContent;
+
+    @ApiModelProperty(notes = "备注")
+    private String remark;
+
+    @ApiModelProperty(notes = "排序")
+    private Integer orderNum;
+
+    @ApiModelProperty(notes = "模块编码")
+    private String moduleCode;
+}

+ 2 - 1
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/biz/component/service/impl/BizComponentServiceImpl.java

@@ -248,10 +248,11 @@ public class BizComponentServiceImpl extends ServiceImpl<DataRoomBizComponentDao
     @Override
     public boolean checkName(String id, String name) {
         LambdaQueryWrapper<BizComponentEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(BizComponentEntity::getId);
         queryWrapper.eq(BizComponentEntity::getName, name);
         if (StringUtils.isNotBlank(id)) {
             queryWrapper.ne(BizComponentEntity::getId, id);
         }
-        return this.count(queryWrapper) > 0;
+        return this.list(queryWrapper).size() > 0;
     }
 }

+ 6 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/bean/Chart.java

@@ -88,4 +88,10 @@ public class Chart {
     @ApiModelProperty(notes = "边框配置")
     private Map<String, Object> border;
 
+    @ApiModelProperty(notes = "计算表达式")
+    private String expression;
+
+    @ApiModelProperty(notes = "表达式关联的组件的code集合")
+    private List<String> expressionCodes;
+
 }

+ 0 - 3
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/file/service/impl/DataRoomFileServiceImpl.java

@@ -32,9 +32,6 @@ public class DataRoomFileServiceImpl extends ServiceImpl<DataRoomFileDao, DataRo
         queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getModule()), DataRoomFileEntity::getModule, searchDTO.getModule());
         queryWrapper.eq(StringUtils.isNotBlank(searchDTO.getExtension()), DataRoomFileEntity::getExtension, searchDTO.getExtension());
         queryWrapper.orderByDesc(DataRoomFileEntity::getCreateDate);
-        Map<String, String> aliasMap = Maps.newHashMap();
-        aliasMap.put("space", "size");
-        QueryWrapperUtils.wrapperSort(null, DataRoomFileEntity.class, queryWrapper, searchDTO, aliasMap, DataRoomFileEntity::getOriginalName, DataRoomFileEntity::getCreateDate, DataRoomFileEntity::getSize, DataRoomFileEntity::getDownloadCount);
         return page(searchDTO, queryWrapper);
     }
 

+ 5 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/manage/dto/DataRoomPageDTO.java

@@ -1,10 +1,12 @@
 package com.gccloud.dataroom.core.module.manage.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.gccloud.common.utils.EmptyAsNullDeserializer;
+import com.gccloud.common.validator.group.Insert;
+import com.gccloud.common.validator.group.Update;
 import com.gccloud.dataroom.core.constant.PageDesignConstant;
 import com.gccloud.dataroom.core.module.basic.dto.BasePageDTO;
 import com.gccloud.dataroom.core.module.chart.bean.Chart;
-import com.gccloud.common.validator.group.Insert;
-import com.gccloud.common.validator.group.Update;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -20,6 +22,7 @@ import java.util.List;
 @Data
 public class DataRoomPageDTO extends BasePageDTO {
 
+    @JsonDeserialize(using = EmptyAsNullDeserializer.class)
     @NotBlank(message = "id不能为空", groups = Update.class)
     @ApiModelProperty(notes = "主键id")
     private String id;

+ 3 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapDTO.java

@@ -1,5 +1,7 @@
 package com.gccloud.dataroom.core.module.map.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.gccloud.common.utils.EmptyAsNullDeserializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -11,6 +13,7 @@ import lombok.Data;
 @Data
 public class DataRoomMapDTO {
 
+    @JsonDeserialize(using = EmptyAsNullDeserializer.class)
     @ApiModelProperty(notes = "主键")
     private String id;
 

+ 3 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/template/dto/PageTemplateDTO.java

@@ -1,5 +1,7 @@
 package com.gccloud.dataroom.core.module.template.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.gccloud.common.utils.EmptyAsNullDeserializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -11,6 +13,7 @@ import lombok.Data;
 @Data
 public class PageTemplateDTO {
 
+    @JsonDeserialize(using = EmptyAsNullDeserializer.class)
     @ApiModelProperty(notes = "主键")
     private String id;
 

+ 3 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/dto/TypeDTO.java

@@ -1,5 +1,7 @@
 package com.gccloud.dataroom.core.module.type.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.gccloud.common.utils.EmptyAsNullDeserializer;
 import com.gccloud.dataroom.core.constant.PageDesignConstant;
 import com.gccloud.common.validator.group.Insert;
 import com.gccloud.common.validator.group.Update;
@@ -17,6 +19,7 @@ import javax.validation.constraints.NotBlank;
 public class TypeDTO {
 
     @ApiModelProperty(notes = "主键")
+    @JsonDeserialize(using = EmptyAsNullDeserializer.class)
     @NotBlank(message = "id不能为空", groups = Update.class)
     private String id;
 

+ 4 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/type/service/impl/TypeServiceImpl.java

@@ -79,18 +79,20 @@ public class TypeServiceImpl extends ServiceImpl<DataRoomTypeDao, TypeEntity> im
     @Override
     public boolean checkCodeRepeat(String id, String type, String code) {
         LambdaQueryWrapper<TypeEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(TypeEntity::getId);
         queryWrapper.eq(TypeEntity::getType, type);
         queryWrapper.eq(TypeEntity::getCode, code);
         queryWrapper.ne(StringUtils.isNotBlank(id), TypeEntity::getId, id);
-        return this.count(queryWrapper) > 0;
+        return this.list(queryWrapper).size() > 0;
     }
 
     @Override
     public boolean checkNameRepeat(String id, String type, String name) {
         LambdaQueryWrapper<TypeEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(TypeEntity::getId);
         queryWrapper.eq(TypeEntity::getName, name);
         queryWrapper.eq(TypeEntity::getType, type);
         queryWrapper.ne(StringUtils.isNotBlank(id), TypeEntity::getId, id);
-        return this.count(queryWrapper) > 0;
+        return this.list(queryWrapper).size() > 0;
     }
 }

+ 10 - 5
DataRoom/dataroom-server/pom.xml

@@ -6,18 +6,20 @@
     <parent>
         <groupId>com.gccloud</groupId>
         <artifactId>dataroom</artifactId>
-        <version>1.0.1.2023092701.Alpha</version>
+        <version>1.0.1.2023100901.Alpha</version>
     </parent>
 
     <artifactId>dataroom-server</artifactId>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <!--    版本发布时,跳过该模块    -->
         <maven.deploy.skip>true</maven.deploy.skip>
     </properties>
 
+
     <dependencies>
         <!--h2database-->
         <dependency>
@@ -29,7 +31,7 @@
         <dependency>
             <groupId>com.gccloud</groupId>
             <artifactId>dataroom-core</artifactId>
-            <version>1.0.1.2023092701.Alpha</version>
+            <version>${project.parent.version}</version>
         </dependency>
 
         <dependency>
@@ -51,7 +53,6 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
-            <version>2.3.12.RELEASE</version>
         </dependency>
     </dependencies>
 
@@ -65,6 +66,7 @@
                     <plugin>
                         <groupId>org.springframework.boot</groupId>
                         <artifactId>spring-boot-maven-plugin</artifactId>
+                        <version>2.7.16</version>
                         <!--下面的代码可以将依赖的第三方jar包通过maven插件打入工程的lib中-->
                         <executions>
                             <execution>
@@ -82,16 +84,19 @@
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
+                        <version>2.22.2</version>
                         <configuration>
                             <skipTests>true</skipTests>
                         </configuration>
                     </plugin>
                     <plugin>
                         <artifactId>maven-compiler-plugin</artifactId>
+                        <version>3.8.1</version>
                     </plugin>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-source-plugin</artifactId>
+                        <version>3.2.1</version>
                         <executions>
                             <execution>
                                 <phase>package</phase>

+ 7 - 4
DataRoom/dataroom-server/src/main/java/com/gccloud/DataRoomApplication.java

@@ -1,6 +1,7 @@
 package com.gccloud;
 
-import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.gccloud.common.constant.CommonConst;
 import com.gccloud.dataroom.core.constant.DataRoomConst;
 import com.gccloud.dataset.constant.DatasetConstant;
@@ -28,10 +29,12 @@ public class DataRoomApplication {
     /**
      * 分页插件
      *
-     * @return
+     * @return PaginationInterceptor
      */
     @Bean
-    public PaginationInterceptor paginationInterceptor() {
-        return new PaginationInterceptor();
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        return interceptor;
     }
 }

+ 3 - 2
DataRoom/dataroom-server/src/main/java/com/gccloud/dataroom/config/CorsBeanConfig.java

@@ -22,7 +22,8 @@ public class CorsBeanConfig implements WebMvcConfigurer {
         Cors cors = new Cors();
         CorsRegistration corsRegistration = registry.addMapping(cors.getMapping());
         corsRegistration
-                .allowedOrigins(cors.getAllowedOrigins().toArray(new String[cors.getAllowedOrigins().size()]))
+                // change 由allowedOrigins改为allowedOriginPatterns,springboot新版本中allowedOrigins不允许设置*,只能设置具体的域名
+                .allowedOriginPatterns(cors.getAllowedOrigins().toArray(new String[cors.getAllowedOrigins().size()]))
                 .allowCredentials(cors.getAllowCredentials())
                 .allowedMethods(cors.getAllowedMethods().toArray(new String[cors.getAllowedMethods().size()]))
                 .maxAge(cors.getMaxAge());
@@ -34,4 +35,4 @@ public class CorsBeanConfig implements WebMvcConfigurer {
             corsRegistration.exposedHeaders(exposedHeaders.toArray(new String[exposedHeaders.size()]));
         }
     }
-}
+}

+ 45 - 0
DataRoom/dataroom-server/src/main/java/com/gccloud/dataroom/config/SwaggerBootstrapConfig.java

@@ -6,12 +6,17 @@ import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrap
 import com.google.common.base.Predicates;
 import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.lang.NonNull;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ReflectionUtils;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
@@ -20,9 +25,12 @@ import springfox.documentation.service.ApiInfo;
 import springfox.documentation.service.ResponseMessage;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
+import java.lang.reflect.Field;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Swagger2
@@ -81,4 +89,41 @@ public class SwaggerBootstrapConfig implements WebMvcConfigurer {
         registry.addResourceHandler("doc.html")
                 .addResourceLocations("classpath:/META-INF/resources/");
     }
+
+    // NOTE 解决springfox与springboot新版本不兼容问题
+    @Bean
+    public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
+        return new BeanPostProcessor() {
+
+            @Override
+            public Object postProcessAfterInitialization(@NonNull  Object bean, @NonNull String beanName) throws BeansException {
+                if (bean instanceof WebMvcRequestHandlerProvider ) {
+                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
+                }
+                return bean;
+            }
+
+            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
+                List<T> copy = mappings.stream()
+                        .filter(mapping -> mapping.getPatternParser() == null)
+                        .collect(Collectors.toList());
+                mappings.clear();
+                mappings.addAll(copy);
+            }
+
+            @SuppressWarnings("unchecked")
+            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
+                try {
+                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
+                    assert field != null;
+                    field.setAccessible(true);
+                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
+                } catch (IllegalArgumentException | IllegalAccessException e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+        };
+    }
+
+
 }

+ 7 - 1
DataRoom/dataroom-server/src/main/resources/application.yml

@@ -17,6 +17,7 @@ spring:
       # 字符串转允许List,否则导致 @RequestBody List<T> list 类型无法解析
       ACCEPT_SINGLE_VALUE_AS_ARRAY: true
   resources:
+    # 自springboot 2.5.5之后,该属性已经被废弃,使用web.resources.static-locations代替
     static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:${gc.starter.file.basePath}
   # 静态资源配置
   mvc:
@@ -26,6 +27,11 @@ spring:
     view:
       prefix: classpath:/static/
       suffix: .html
+    pathmatch:
+      matching-strategy: ANT_PATH_MATCHER
+  web:
+    resources:
+      static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:${gc.starter.file.basePath}
 
 mybatis-plus:
   # mybatis plus xml配置文件扫描,多个通过分号隔开
@@ -35,4 +41,4 @@ mybatis-plus:
   global-config:
     db-config:
       #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"唯一ID";
-      id-type: 0
+      id-type: AUTO

+ 0 - 4
DataRoom/doc/init.sql

@@ -29,15 +29,11 @@ CREATE TABLE `big_screen_page`
     `name`        varchar(100) NOT NULL DEFAULT '' COMMENT '页面中文名称',
     `code`        varchar(255) NOT NULL DEFAULT '' COMMENT '页面编码,页面唯一标识符',
     `cover_picture`        varchar(255) NOT NULL DEFAULT '' COMMENT '封面图片文件路径',
-    `icon`        varchar(100) NOT NULL DEFAULT '' COMMENT '页面图标',
-    `icon_color`  varchar(100) NOT NULL DEFAULT '' COMMENT '图标颜色',
     `type`        varchar(100) NOT NULL DEFAULT 'custom' COMMENT '页面类型',
-    `layout`      varchar(255) NOT NULL DEFAULT '' COMMENT '组件布局,记录组件的相对位置和顺序',
     `config`      longtext COMMENT '页面配置',
     `parent_code` varchar(255) NOT NULL DEFAULT '' COMMENT '父级目录编码',
     `order_num`   bigint(64)   NOT NULL DEFAULT '0' COMMENT '排序',
     `remark`      varchar(100) NOT NULL DEFAULT '' COMMENT '备忘',
-    `model_code`  varchar(255) NOT NULL DEFAULT '' COMMENT '模型编码',
     `app_code`    varchar(255) NOT NULL DEFAULT '' COMMENT '所属应用编码',
     `update_date` timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
     `create_date` timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

+ 7 - 1
DataRoom/doc/update.sql

@@ -143,4 +143,10 @@ CREATE TABLE `big_screen_page_preview`
     `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     PRIMARY KEY (`id`)
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8mb4 COMMENT ='页面预览缓存表,每日定时删除';
+  DEFAULT CHARSET = utf8mb4 COMMENT ='页面预览缓存表,每日定时删除';
+
+# 20231009 移除大屏页面表中的冗余字段
+alter table big_screen_page drop column icon;
+alter table big_screen_page drop column icon_color;
+alter table big_screen_page drop column layout;
+alter table big_screen_page drop column model_code;

+ 15 - 39
DataRoom/pom.xml

@@ -3,18 +3,12 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.3.12.RELEASE</version>
-        <relativePath/>
-    </parent>
-
     <groupId>com.gccloud</groupId>
     <artifactId>dataroom</artifactId>
-    <version>1.0.1.2023092701.Alpha</version>
+    <version>1.0.1.2023100901.Alpha</version>
 
     <packaging>pom</packaging>
+    <name>dataroom</name>
     <description>基于G2Plot、Echarts的大屏设计服务端,具备设计、预览能力,支持MySQL、Oracle、PostgreSQL、Groovy等数据集接入
     </description>
     <url>https://github.com/gcpaas/DataRoom</url>
@@ -26,7 +20,16 @@
             <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
         </license>
     </licenses>
-
+    <scm>
+        <url>https://github.com/gcpaas/DataRoom</url>
+    </scm>
+    <developers>
+        <developer>
+            <id>gcpaas</id>
+            <name>gcpaas</name>
+            <email>tech@ustcinfo.com</email>
+        </developer>
+    </developers>
     <modules>
         <module>dataroom-core</module>
         <module>dataroom-server</module>
@@ -36,42 +39,15 @@
         <java.version>1.8</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
-        <swagger.annotations.version>1.5.20</swagger.annotations.version>
-        <swagger.bootstrap.version>1.9.6</swagger.bootstrap.version>
+        <spring-boot.version>2.7.16</spring-boot.version>
         <swagger.version>2.9.2</swagger.version>
         <swagger-models.version>1.5.21</swagger-models.version>
-        <mybatis.plus.version>3.3.2</mybatis.plus.version>
-        <mybatis.version>3.5.6</mybatis.version>
-        <mybatis-spring.version>2.0.6</mybatis-spring.version>
-        <commons-lang3.version>3.10</commons-lang3.version>
-        <commons-collections4.version>4.1</commons-collections4.version>
-        <commons-collections.version>3.2.2</commons-collections.version>
-        <hanlp.version>portable-1.7.8</hanlp.version>
-        <hutool.version>5.3.1</hutool.version>
-        <guava.version>20.0</guava.version>
         <jackson.version.core>2.13.3</jackson.version.core>
         <json.version>20220320</json.version>
-        <druid.version>1.2.11</druid.version>
-        <p6spy.version>3.9.0</p6spy.version>
-        <oracle-database.version>12.2.0.1</oracle-database.version>
-        <mysql.version>5.1.49</mysql.version>
-        <postgresql.version>42.3.3</postgresql.version>
-        <clickhouse.version>0.3.2</clickhouse.version>
-        <commons-io.version>2.2</commons-io.version>
-        <okhttp3.version>4.9.1</okhttp3.version>
-        <dataset.core.version>1.0.1.2023092201.Alpha</dataset.core.version>
+        <dataset.core.version>1.0.1.2023100901.Alpha</dataset.core.version>
+        <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
     </properties>
 
-    <dependencies>
-        <!-- excel解析  -->
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>easyexcel</artifactId>
-            <version>2.2.5</version>
-        </dependency>
-    </dependencies>
-
     <dependencyManagement>
         <dependencies>
             <dependency>

+ 16 - 3
data-room-ui/packages/BasicComponents/IndexCard/index.vue

@@ -36,7 +36,17 @@
             'font-weight':customize.firstWeight,
             'margin-bottom':customize.lineDistance +'px'
           }"
-        >{{ optionData}}</span>
+        >
+        {{ optionData}}
+        <span
+        :style="{
+            'margin-left':'10px',
+            'font-size': customize.unitSize + 'px',
+            color:customize.unitColor,
+          }">
+          {{unit}}
+        </span>
+        </span>
         <span
           :style="{
             'font-size': customize.secondSize + 'px',
@@ -76,11 +86,14 @@ export default {
   mounted () {
   },
   computed: {
+     unit(){
+      return this.config?.customize.unit || ''
+    },
     option () {
       return this.config?.option
     },
     optionData () {
-      return this.option?.data || 0
+      return this.option?.data || 80
     },
     customize () {
       return this.config?.customize
@@ -98,7 +111,7 @@ export default {
           dataList = data.data[config.dataSource.dimensionField]
         }
       }else{
-        dataList=0
+        dataList=80
       }
       config.option = {
         ...config.option,

+ 26 - 1
data-room-ui/packages/BasicComponents/IndexCard/setting.vue

@@ -16,7 +16,7 @@
         <SettingTitle>标题</SettingTitle>
         <el-form-item
           class="lc-field-body"
-          label="轮播表名称"
+          label="指标卡名称"
         >
           <el-input
             v-model="config.title"
@@ -77,6 +77,31 @@
             >
             </el-input>
           </el-form-item>
+          <el-form-item
+            label="单位"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.unit"
+              clearable
+              placeholder="请输入单位"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体大小">
+            <el-input-number
+              v-model="config.customize.unitSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入单位字体大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体颜色">
+            <ColorPicker
+              v-model="config.customize.unitColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
           <el-form-item label-width="100px" label="左右间距">
             <el-input-number
               v-model="config.customize.distance"

+ 10 - 7
data-room-ui/packages/BasicComponents/IndexCard/settingConfig.js

@@ -42,18 +42,21 @@ const customConfig = {
     src: 'http://60.174.249.206:11080/upload/webDesign/uiSucai/dir/icon/icon_top6.png',
     borderRadius: 0,
     borderWidth: 0,
-    lineDistance: 25,
+    lineDistance: 6,
     borderColor: '',
-    bgColor: '',
+    bgColor: 'rgba(0, 122, 255, 0.07)',
     distance: 30,
-    imgSize: 110,
-    firstSize: 50,
-    firstColor: '#ffffff',
+    imgSize: 80,
+    firstSize: 64,
+    firstColor: '#007aff',
     firstWeight: 500,
-    secondSize: 50,
+    secondSize: 21,
     secondColor: '#ffffff',
     secondWeight: 500,
-    secondLine: '装机处理及时率'
+    secondLine: '装机处理及时率',
+    unit: '',
+    unitSize: 32,
+    unitColor:'#fff'
   }
 }
 export const dataConfig = {

+ 156 - 0
data-room-ui/packages/BasicComponents/IndexCard2/index.vue

@@ -0,0 +1,156 @@
+<template>
+  <div
+    :class="`bs-indexCard`"
+    style="width: 100%;height: 100%;position: relative;"
+  >
+    <div
+      :style="{
+        'background-color':customize.bgColor,
+        'border-radius':customize.borderRadius + 'px',
+        border:`${customize.borderWidth}px solid ${customize.borderColor}`,
+      }"
+      class="content"
+    >
+      <div
+        :style="{
+          'margin-right':customize.distance + 'px'
+        }"
+        class="content-left"
+      >
+        <el-image
+          :style="{
+            width: customize.imgSize + 'px',
+            height: customize.imgSize + 'px',
+          }"
+          :src="customize.src"
+          fit="contain"
+        />
+      </div>
+      <div class="content-right">
+        <span
+          class="content-right-first"
+          :style="{
+            'font-size': customize.firstSize + 'px',
+            'height':customize.firstSize + 'px',
+            color:customize.firstColor,
+            'font-weight':customize.firstWeight,
+            'margin-bottom':customize.lineDistance +'px'
+          }"
+        >{{ customize.secondLine }}</span>
+        <span
+          :style="{
+            'font-size': customize.secondSize + 'px',
+            'height':customize.secondSize + 'px',
+            color:customize.secondColor,
+            'font-weight':customize.secondWeight,
+          }"
+          class="content-right-second"
+        >
+        {{ optionData}}
+        <span
+        :style="{
+             'margin-left':'10px',
+            'font-size': customize.unitSize + 'px',
+            color:customize.unitColor,
+          }">
+          {{unit}}
+        </span>
+        </span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import commonMixins from 'data-room-ui/js/mixins/commonMixins'
+import paramsMixins from 'data-room-ui/js/mixins/paramsMixins'
+import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
+export default {
+  name: 'Card',
+  components: {},
+  mixins: [paramsMixins, commonMixins, linkageMixins],
+  props: {
+    // 卡片的属性
+    config: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      customClass: {}
+    }
+  },
+  watch: {},
+  mounted () {
+  },
+  computed: {
+    unit(){
+      return this.config?.customize.unit || ''
+    },
+    option () {
+      return this.config?.option
+    },
+    optionData () {
+      return this.option?.data || 80
+    },
+    customize () {
+      return this.config?.customize
+    },
+  },
+  methods: {
+    dataFormatting (config, data) {
+      let dataList = ''
+      if(data.success){
+        if (data.data instanceof Array) {
+          dataList = config.dataSource.dimensionField
+            ? data.data[0][config.dataSource.dimensionField]
+            : data.data[0].value
+        } else {
+          dataList = data.data[config.dataSource.dimensionField]
+        }
+      }else{
+        dataList=80
+      }
+      config.option = {
+        ...config.option,
+        data: dataList
+      }
+      return config
+    }
+   }
+}
+</script>
+
+<style lang="scss" scoped>
+.content{
+  display: flex;
+  flex-direction: row;
+  height: 100%;
+  width: 100%;
+  // background-color: aliceblue;
+  justify-content: center;
+  .content-left{
+    display: flex;
+    flex-direction: row;
+    height: 100%;
+    align-items: center;
+  }
+  .content-right{
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+    justify-content: center;
+  }
+  .content-right-first{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    padding-bottom: 5px;
+  }
+  .content-right-second{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+  }
+}
+</style>

+ 239 - 0
data-room-ui/packages/BasicComponents/IndexCard2/setting.vue

@@ -0,0 +1,239 @@
+<template>
+  <div class="bs-setting-wrap">
+    <el-form
+      ref="form"
+      :model="config"
+      class="setting-body bs-el-form"
+      label-position="left"
+      label-width="90px"
+    >
+      <el-form
+        :model="config.customize"
+        class="setting-body bs-el-form"
+        label-position="left"
+        label-width="90px"
+      >
+        <SettingTitle>标题</SettingTitle>
+        <el-form-item
+          class="lc-field-body"
+          label="指标卡名称"
+        >
+          <el-input
+            v-model="config.title"
+            clearable
+          />
+        </el-form-item>
+        <SettingTitle>位置</SettingTitle>
+        <div class="lc-field-body">
+          <PosWhSetting :config="config" />
+        </div>
+         <!-- <SettingTitle v-if="config.border">边框</SettingTitle>
+          <div class="lc-field-body">
+            <BorderSetting
+              v-if="config.border"
+              label-width="100px"
+              :config="config.border"
+              :bigTitle='config.title'
+            />
+          </div> -->
+        <SettingTitle>基础</SettingTitle>
+        <div class="lc-field-body">
+          <el-form-item label-width="100px" label="背景色">
+            <ColorPicker
+              v-model="config.customize.bgColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框颜色">
+            <ColorPicker
+              v-model="config.customize.borderColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框粗细">
+            <el-input-number
+              v-model="config.customize.borderWidth"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入粗细"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框圆角">
+            <el-input-number
+              v-model="config.customize.borderRadius"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入圆角值"
+            />
+          </el-form-item>
+          <el-form-item
+            label="图标链接"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.src"
+              clearable
+              placeholder="请输入链接"
+            >
+            </el-input>
+          </el-form-item>
+           <el-form-item
+            label="单位"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.unit"
+              clearable
+              placeholder="请输入单位"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体大小">
+            <el-input-number
+              v-model="config.customize.unitSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入单位字体大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体颜色">
+            <ColorPicker
+              v-model="config.customize.unitColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="左右间距">
+            <el-input-number
+              v-model="config.customize.distance"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入左右间距"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="上下间距">
+            <el-input-number
+              v-model="config.customize.lineDistance"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入上下间距"
+            />
+          </el-form-item>
+           <el-form-item label-width="100px" label="图标大小">
+            <el-input-number
+              v-model="config.customize.imgSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入图标大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行文字大小">
+            <el-input-number
+              v-model="config.customize.firstSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行文字大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行字体颜色">
+            <ColorPicker
+              v-model="config.customize.firstColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行字体粗细">
+            <el-input-number
+              v-model="config.customize.firstWeight"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行字体粗细"
+            />
+          </el-form-item>
+          <el-form-item
+            label="第二行文字内容"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.secondLine"
+              clearable
+              placeholder="请输入第二行文字内容"
+            />
+          </el-form-item>
+           <el-form-item label-width="100px" label="第二行文字大小">
+            <el-input-number
+              v-model="config.customize.secondSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行字体粗细"
+            />
+          </el-form-item>
+           <el-form-item label-width="100px" label="第二行字体颜色">
+            <ColorPicker
+              v-model="config.customize.secondColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="第二行字体粗细">
+            <el-input-number
+              v-model="config.customize.secondWeight"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入第二行字体粗细"
+            />
+          </el-form-item>
+        </div>
+      </el-form>
+    </el-form>
+  </div>
+</template>
+<script>
+import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
+import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
+import BorderSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderSetting.vue'
+import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
+export default {
+  name: 'BarSetting',
+  components: {
+    ColorPicker,
+    PosWhSetting,
+    SettingTitle,
+    BorderSetting
+  },
+  data () {
+    return {
+      // 预设主题色
+      predefineThemeColors: [
+        '#007aff',
+        '#1aa97b',
+        '#ff4d53',
+        '#1890FF',
+        '#DF0E1B',
+        '#0086CC',
+        '#2B74CF',
+        '#00BC9D',
+        '#ED7D32'
+      ]
+    }
+  },
+  computed: {
+    config: {
+      get () {
+        return this.$store.state.bigScreen.activeItemConfig
+      },
+      set (val) {
+        this.$store.state.bigScreen.activeItemConfig = val
+      }
+    }
+  },
+  watch: {},
+  mounted () {
+  },
+  methods: {
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.lc-field-body {
+  padding: 12px 16px;
+}
+</style>

+ 64 - 0
data-room-ui/packages/BasicComponents/IndexCard2/settingConfig.js

@@ -0,0 +1,64 @@
+import { commonConfig, displayOption } from 'data-room-ui/js/config'
+
+export const settingConfig = {
+  padding: [30, 30, 30, 60],
+  legend: false,
+  isGroup: true,
+  header: [],
+  columnWidth: [],
+  align: [],
+  data: 0,
+  // 设置面板属性的显隐
+  displayOption: {
+    ...displayOption,
+    params: {
+      enable: false
+    },
+    headerField: {
+      enable: false
+    },
+    metricField: {
+      // 指标
+      label: '指标',
+      enable: false,
+      multiple: false // 是否多选
+    },
+    dimensionField: {
+      // 表格列
+      label: '展示字段', // 维度/查询字段
+      enable: true,
+      multiple: false // 是否多选
+    }
+  }
+}
+const customConfig = {
+  type: 'indexCard2',
+  root: {
+    version: '2023071001',
+    contribution: false,
+    loading: false
+  },
+  customize: {
+    src: 'http://60.174.249.206:11080/upload/webDesign/uiSucai/dir/icon/icon_top6.png',
+    borderRadius: 0,
+    borderWidth: 0,
+    lineDistance: 6,
+    borderColor: '',
+    bgColor: 'rgba(0, 122, 255, 0.07)',
+    distance: 30,
+    imgSize: 80,
+    firstSize: 21,
+    firstColor: '#ffffff',
+    firstWeight: 500,
+    secondSize: 64,
+    secondColor: '#007aff',
+    secondWeight: 500,
+    secondLine: '装机处理及时率',
+    unit: '',
+    unitSize: 32,
+    unitColor:'#fff'
+  }
+}
+export const dataConfig = {
+  ...commonConfig(customConfig)
+}

+ 26 - 8
data-room-ui/packages/BasicComponents/IndicatorCard/index.vue

@@ -13,15 +13,28 @@
     >
       <div
         class="content-right-first"
+        :style="{
+          'height': customize.firstSize + 'px',
+        }"
+      >
+        <span
         :style="{
           'font-size': customize.firstSize + 'px',
-          'height':customize.firstSize + 'px',
           color:customize.firstColor,
           'font-weight':customize.firstWeight,
           'margin-bottom':customize.lineDistance +'px'
         }"
-      >
-        {{ optionData }}
+        >{{ optionData }}</span>
+        <span
+        :style="{
+             'margin-left':'10px',
+            'font-size': customize.unitSize + 'px',
+            'line-height':customize.unitSize + 'px',
+            color:customize.unitColor,
+            'margin-bottom':customize.lineDistance +'px'
+          }">
+          {{unit}}
+        </span>
       </div>
       <div
         :style="{
@@ -63,11 +76,14 @@ export default {
     // this.chartInit()
   },
   computed: {
+    unit(){
+      return this.config?.customize.unit || ''
+    },
     option () {
       return this.config?.option
     },
     optionData () {
-      return this.option?.data || 0
+      return this.option?.data || 80
     },
     customize () {
       return this.config?.customize
@@ -96,7 +112,7 @@ export default {
           dataList = data.data[config.dataSource.dimensionField]
         }
       }else{
-        dataList=0
+        dataList=80
       }
       config.option = {
         ...config.option,
@@ -117,9 +133,11 @@ export default {
   text-align: center;
   justify-content: center;
   .content-right-first{
-    width: 100%;
-    text-align: center;
-    padding-bottom: 5px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    // width: 100%;
+    // text-align: center;
   }
   .content-right-second{
     width: 100%;

+ 26 - 1
data-room-ui/packages/BasicComponents/IndicatorCard/setting.vue

@@ -16,7 +16,7 @@
         <SettingTitle>标题</SettingTitle>
         <el-form-item
           class="lc-field-body"
-          label="轮播表名称"
+          label="指标卡名称"
         >
           <el-input
             v-model="config.title"
@@ -66,6 +66,31 @@
               label="请输入圆角值"
             />
           </el-form-item>
+          <el-form-item
+            label="单位"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.unit"
+              clearable
+              placeholder="请输入单位"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体大小">
+            <el-input-number
+              v-model="config.customize.unitSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入单位字体大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体颜色">
+            <ColorPicker
+              v-model="config.customize.unitColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
           <el-form-item label-width="100px" label="上下间距">
             <el-input-number
               v-model="config.customize.lineDistance"

+ 6 - 3
data-room-ui/packages/BasicComponents/IndicatorCard/settingConfig.js

@@ -43,14 +43,17 @@ const customConfig = {
     borderWidth: 0,
     lineDistance: 25,
     borderColor: '',
-    bgColor: '',
+    bgColor: 'rgba(0, 122, 255, 1)',
     firstSize: 50,
     firstColor: '#ffffff',
     firstWeight: 500,
-    secondSize: 50,
+    secondSize: 32,
     secondColor: '#ffffff',
     secondWeight: 500,
-    secondLine: '装机处理及时率'
+    secondLine: '装机处理及时率',
+    unit: '',
+    unitSize: 32,
+    unitColor:'#fff'
   }
 }
 export const dataConfig = {

+ 146 - 0
data-room-ui/packages/BasicComponents/IndicatorCard2/index.vue

@@ -0,0 +1,146 @@
+<template>
+  <div
+    :class="`bs-indexCard`"
+    style="width: 100%;height: 100%;position: relative;"
+  >
+    <div
+      :style="{
+        'background-color':customize.bgColor,
+        'border-radius':customize.borderRadius + 'px',
+        border:`${customize.borderWidth}px solid ${customize.borderColor}`,
+      }"
+      class="content"
+    >
+      <div
+        class="content-right-first"
+        :style="{
+          'font-size': customize.firstSize + 'px',
+          'height':customize.firstSize + 'px',
+          color:customize.firstColor,
+          'font-weight':customize.firstWeight,
+          'margin-bottom':customize.lineDistance +'px'
+        }"
+      >
+      {{ customize.secondLine }}
+      </div>
+      <div
+        :style="{
+          'height': customize.secondSize + 'px',
+        }"
+        class="content-right-second"
+      >
+      <span
+      :style="{
+          'font-size': customize.secondSize + 'px',
+          color:customize.secondColor,
+          'font-weight':customize.secondWeight,
+        }">
+        {{ optionData }}
+      </span>
+        <span
+        :style="{
+             'margin-left':'10px',
+            'font-size': customize.unitSize + 'px',
+            'line-height':customize.unitSize + 'px',
+            color:customize.unitColor,
+          }">
+          {{unit}}
+        </span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import commonMixins from 'data-room-ui/js/mixins/commonMixins'
+import paramsMixins from 'data-room-ui/js/mixins/paramsMixins'
+import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
+
+export default {
+  name: 'Card',
+  components: {},
+  mixins: [paramsMixins, commonMixins, linkageMixins],
+  props: {
+    // 卡片的属性
+    config: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      customClass: {}
+    }
+  },
+  watch: {},
+  mounted () {
+    // this.chartInit()
+  },
+  computed: {
+     unit(){
+      return this.config?.customize.unit || ''
+    },
+    option () {
+      return this.config?.option
+    },
+    optionData () {
+      return this.option?.data || 80
+    },
+    customize () {
+      return this.config?.customize
+    },
+    // tableData () {
+    //   let dataList = ''
+    //   if (this.optionData instanceof Array && this.optionData.length > 0) {
+    //     dataList = this.option?.yField
+    //       ? this.optionData[0][this.option.yField]
+    //       : this.optionData[0]?.value
+    //   } else {
+    //     dataList = this.optionData ? this.optionData[this.option.yField] : ''
+    //   }
+    //   return dataList
+    // }
+  },
+  methods: {
+    dataFormatting (config, data) {
+      let dataList = ''
+      if(data.success){
+        if (data.data instanceof Array) {
+          dataList = config.dataSource.dimensionField
+            ? data.data[0][config.dataSource.dimensionField]
+            : data.data[0].value
+        } else {
+          dataList = data.data[config.dataSource.dimensionField]
+        }
+      }else{
+        dataList=0
+      }
+      config.option = {
+        ...config.option,
+        data: dataList
+      }
+      return config
+    }
+   }
+}
+</script>
+
+<style lang="scss" scoped>
+.content{
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  width: 100%;
+  text-align: center;
+  justify-content: center;
+  .content-right-first{
+    width: 100%;
+    text-align: center;
+    padding-bottom: 5px;
+  }
+  .content-right-second{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+}
+</style>

+ 212 - 0
data-room-ui/packages/BasicComponents/IndicatorCard2/setting.vue

@@ -0,0 +1,212 @@
+<template>
+  <div class="bs-setting-wrap">
+    <el-form
+      ref="form"
+      :model="config"
+      class="setting-body bs-el-form"
+      label-position="left"
+      label-width="90px"
+    >
+      <el-form
+        :model="config.customize"
+        class="setting-body bs-el-form"
+        label-position="left"
+        label-width="90px"
+      >
+        <SettingTitle>标题</SettingTitle>
+        <el-form-item
+          class="lc-field-body"
+          label="指标卡名称"
+        >
+          <el-input
+            v-model="config.title"
+            clearable
+          />
+        </el-form-item>
+        <SettingTitle>位置</SettingTitle>
+        <div class="lc-field-body">
+          <PosWhSetting :config="config" />
+        </div>
+         <!-- <SettingTitle v-if="config.border">边框</SettingTitle>
+          <div class="lc-field-body">
+            <BorderSetting
+              v-if="config.border"
+              label-width="100px"
+              :config="config.border"
+              :bigTitle='config.title'
+            />
+          </div> -->
+        <SettingTitle>基础</SettingTitle>
+        <div class="lc-field-body">
+          <el-form-item label-width="100px" label="背景色">
+            <ColorPicker
+              v-model="config.customize.bgColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框颜色">
+            <ColorPicker
+              v-model="config.customize.borderColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框粗细">
+            <el-input-number
+              v-model="config.customize.borderWidth"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入粗细"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="边框圆角">
+            <el-input-number
+              v-model="config.customize.borderRadius"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入圆角值"
+            />
+          </el-form-item>
+          <el-form-item
+            label="单位"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.unit"
+              clearable
+              placeholder="请输入单位"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体大小">
+            <el-input-number
+              v-model="config.customize.unitSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入单位字体大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="单位字体颜色">
+            <ColorPicker
+              v-model="config.customize.unitColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="上下间距">
+            <el-input-number
+              v-model="config.customize.lineDistance"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入上下间距"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行文字大小">
+            <el-input-number
+              v-model="config.customize.firstSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行文字大小"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行字体颜色">
+            <ColorPicker
+              v-model="config.customize.firstColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="首行字体粗细">
+            <el-input-number
+              v-model="config.customize.firstWeight"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行字体粗细"
+            />
+          </el-form-item>
+          <el-form-item
+            label="第二行文字内容"
+            label-width="100px"
+          >
+            <el-input
+              v-model="config.customize.secondLine"
+              clearable
+              placeholder="请输入第二行文字内容"
+            />
+          </el-form-item>
+           <el-form-item label-width="100px" label="第二行文字大小">
+            <el-input-number
+              v-model="config.customize.secondSize"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入首行字体粗细"
+            />
+          </el-form-item>
+           <el-form-item label-width="100px" label="第二行字体颜色">
+            <ColorPicker
+              v-model="config.customize.secondColor"
+              :predefine="predefineThemeColors"
+            />
+          </el-form-item>
+          <el-form-item label-width="100px" label="第二行字体粗细">
+            <el-input-number
+              v-model="config.customize.secondWeight"
+              :precision="0"
+              class="bs-el-input-number"
+              label="请输入第二行字体粗细"
+            />
+          </el-form-item>
+        </div>
+      </el-form>
+    </el-form>
+  </div>
+</template>
+<script>
+import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
+import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
+import BorderSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderSetting.vue'
+import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
+export default {
+  name: 'BarSetting',
+  components: {
+    ColorPicker,
+    PosWhSetting,
+    SettingTitle,
+    BorderSetting
+  },
+  data () {
+    return {
+      // 预设主题色
+      predefineThemeColors: [
+        '#007aff',
+        '#1aa97b',
+        '#ff4d53',
+        '#1890FF',
+        '#DF0E1B',
+        '#0086CC',
+        '#2B74CF',
+        '#00BC9D',
+        '#ED7D32'
+      ]
+    }
+  },
+  computed: {
+    config: {
+      get () {
+        return this.$store.state.bigScreen.activeItemConfig
+      },
+      set (val) {
+        this.$store.state.bigScreen.activeItemConfig = val
+      }
+    }
+  },
+  watch: {},
+  mounted () {
+  },
+  methods: {
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.lc-field-body {
+  padding: 12px 16px;
+}
+</style>

+ 61 - 0
data-room-ui/packages/BasicComponents/IndicatorCard2/settingConfig.js

@@ -0,0 +1,61 @@
+import { commonConfig, displayOption } from 'data-room-ui/js/config'
+
+export const settingConfig = {
+  padding: [30, 30, 30, 60],
+  legend: false,
+  isGroup: true,
+  header: [],
+  columnWidth: [],
+  align: [],
+  data: 0,
+  // 设置面板属性的显隐
+  displayOption: {
+    ...displayOption,
+    params: {
+      enable: false
+    },
+    headerField: {
+      enable: false
+    },
+    metricField: {
+      // 指标
+      label: '指标',
+      enable: false,
+      multiple: false // 是否多选
+    },
+    dimensionField: {
+      // 表格列
+      label: '展示字段', // 维度/查询字段
+      enable: true,
+      multiple: false // 是否多选
+    }
+  }
+}
+const customConfig = {
+  type: 'indicatorCard2',
+  root: {
+    version: '2023071001',
+    contribution: false,
+    loading: false
+  },
+  customize: {
+    borderRadius: 0,
+    borderWidth: 0,
+    lineDistance: 25,
+    borderColor: '',
+    bgColor: 'rgba(0, 122, 255, 1)',
+    firstSize: 32,
+    firstColor: '#ffffff',
+    firstWeight: 500,
+    secondSize: 50,
+    secondColor: '#ffffff',
+    secondWeight: 500,
+    secondLine: '装机处理及时率',
+    unit: '',
+    unitSize: 32,
+    unitColor:'#fff'
+  }
+}
+export const dataConfig = {
+  ...commonConfig(customConfig)
+}

+ 2 - 2
data-room-ui/packages/BasicComponents/ThemeSelect/index.vue

@@ -113,7 +113,7 @@ export default {
 .theme-dropdown-menu{
   background-color: var(--bs-background-2)!important;
   border: 1px solid var(--bs-border-1);
-  /deep/ .popper__arrow{
+  ::v-deep  .popper__arrow{
     //background-color: var(--bs-background-2)!important;
     background-color: transparent!important;
     border-bottom-color:transparent!important;
@@ -121,7 +121,7 @@ export default {
       border-bottom-color: var(--bs-background-2)!important;
     }
   }
-  /deep/ .el-dropdown-menu__item{
+  ::v-deep  .el-dropdown-menu__item{
     background-color: var(--bs-background-2)!important;
     color: rgb(188, 201, 212)!important;
     &:hover {

+ 16 - 16
data-room-ui/packages/BigScreenDesign/DataViewDialog/index.vue

@@ -17,8 +17,8 @@
       <div class="table-box">
         <el-table
           ref="table"
-          max-height="500"
           v-loading="loading"
+          max-height="500"
           class="bs-table bs-el-table fixed-header-table"
           :data="dataList"
         >
@@ -219,7 +219,7 @@ export default {
 
 <style lang="scss" scoped>
 .bs-data-view-dialog{
-  /deep/.el-dialog__body{
+  ::v-deep .el-dialog__body{
     background-color: var(--bs-background-2) !important;
     overflow: hidden;
     max-height: 540px!important;
@@ -236,62 +236,62 @@ export default {
       overflow-y: hidden;
     }
   }
-  /deep/ .el-table__body-wrapper{
+  ::v-deep  .el-table__body-wrapper{
     min-height: 200px !important;
   }
- .el-table th.el-table__cell.is-leaf, .el-table /deep/td.el-table__cell{
+ .el-table th.el-table__cell.is-leaf, .el-table ::v-deep td.el-table__cell{
     border-bottom:none;
   }
-  /deep/.el-loading-mask{
+  ::v-deep .el-loading-mask{
     background-color: var(--bs-background-2) !important;
   }
-  .el-table /deep/thead{
+  .el-table ::v-deep thead{
     color: var(--bs-el-title);
   }
-  .bs-el-table /deep/td.el-table__cell{
+  .bs-el-table ::v-deep td.el-table__cell{
     color: #bcc9d4;
   }
-  .el-table--scrollable-y /deep/.el-table__body-wrapper{
+  .el-table--scrollable-y ::v-deep .el-table__body-wrapper{
     overflow: auto!important;
   }
   /* 修改滚动条的样式 */
-  /deep/.el-dialog__body::-webkit-scrollbar {
+  ::v-deep .el-dialog__body::-webkit-scrollbar {
     width: 8px; /* 滚动条宽度 */
   }
 
- /deep/.el-dialog__body::-webkit-scrollbar-thumb {
+ ::v-deep .el-dialog__body::-webkit-scrollbar-thumb {
     background-color: #888; /* 滚动条拖动块颜色 */
     height: 6px;
     border-radius: 5px;
   }
 
-  /deep/.el-dialog__body::-webkit-scrollbar-track {
+  ::v-deep .el-dialog__body::-webkit-scrollbar-track {
     background-color: transparent; /* 滚动条轨道颜色 */
   }
 
   /* 鼠标悬停在滚动条上时的样式 */
-  /deep/.el-dialog__body::-webkit-scrollbar-thumb:hover {
+  ::v-deep .el-dialog__body::-webkit-scrollbar-thumb:hover {
     background-color: #555;
   }
 }
 /* 自定义滚动条样式 */
-/deep/.el-table__body-wrapper::-webkit-scrollbar {
+::v-deep .el-table__body-wrapper::-webkit-scrollbar {
   width: 6px; /* 滚动条宽度 */
   height: 6px;
 }
 
-/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb {
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb {
   background-color: #888; /* 滚动条拖动块颜色 */
   height: 100px;
   border-radius: 5px;
 }
 
-/deep/.el-table__body-wrapper::-webkit-scrollbar-track {
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-track {
   background-color: transparent; /* 滚动条轨道颜色 */
 }
 
 /* 鼠标悬停在滚动条上时的样式 */
-/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
+::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
   background-color: #555;
   cursor: pointer;
 }

+ 3 - 3
data-room-ui/packages/BigScreenDesign/PageDesignTop.vue

@@ -664,11 +664,11 @@ export default {
   .theme-switch {
     margin-right: 10px;
 
-    /deep/.el-switch__label {
+    ::v-deep .el-switch__label {
       color: #bcc9d4 !important;
     }
 
-    /deep/.el-switch__label.is-active {
+    ::v-deep .el-switch__label.is-active {
       color: var(--bs-el-color-primary) !important;
     }
   }
@@ -685,7 +685,7 @@ export default {
   background-color: var(--bs-background-2) !important;
   border: 1px solid var(--bs-border-1);
 
-  /deep/ .el-dropdown-menu__item {
+  ::v-deep  .el-dropdown-menu__item {
     background-color: var(--bs-background-2) !important;
 
     &:hover {

+ 348 - 0
data-room-ui/packages/BigScreenDesign/RightSetting/EchartsCustomSetting.vue

@@ -0,0 +1,348 @@
+<template>
+  <div class="bs-setting-wrap">
+    <el-form
+      ref="form"
+      :model="config"
+      :rules="customRules"
+      label-width="120px"
+      label-position="left"
+      class="setting-body bs-el-form"
+    >
+      <SettingTitle>基础</SettingTitle>
+      <div class="lc-field-body">
+        <el-form-item
+          label="标题"
+          label-width="120px"
+        >
+          <el-input
+            v-model="config.title"
+            placeholder="请输入标题"
+            clearable
+          />
+        </el-form-item>
+      </div>
+      <SettingTitle>边框</SettingTitle>
+      <div class="lc-field-body">
+         <BorderSetting
+          v-if="config.border"
+          label-width="120px"
+          :config="config.border"
+          :bigTitle='config.title'
+        />
+      </div>
+      <SettingTitle>位置</SettingTitle>
+      <div class="lc-field-body">
+        <PosWhSetting
+          label-width="120px"
+          :config="config"
+        />
+      </div>
+      <SettingTitle>旋转</SettingTitle>
+      <div class="lc-field-body">
+        <RotateSetting
+          :config="config"
+        />
+      </div>
+      <template v-for="group in groupList">
+        <div :key="group.groupName">
+          <SettingTitle>   {{ group.groupName | filterGroupName }}</SettingTitle>
+          <div class="lc-field-body">
+            <div
+              v-for="(setting, settingIndex) in group.list"
+              :key="settingIndex+1"
+            >
+              <el-form-item
+                :label="setting.type=== 'padding' ? '' : setting.label"
+                :label-width="setting.type=== 'padding' ? '0px' :'120px'"
+              >
+                <el-input
+                  v-if="setting.type === 'input'"
+                  v-model="setting.value"
+                  :placeholder="`请输入${setting.label}`"
+                  clearable
+                />
+                <el-select
+                  v-else-if="setting.type === 'select'"
+                  v-model="setting.value"
+                  popper-class="bs-el-select"
+                  class="bs-el-select"
+                  :placeholder="`请选择${setting.label}`"
+                  :multiple="setting.multiple"
+                  clearable
+                >
+                  <el-option
+                    v-for="(opt, optIndex) in setting.options"
+                    :key="optIndex"
+                    :label="opt.label"
+                    :value="opt.value"
+                  />
+                </el-select>
+                <template v-else-if="setting.type === 'colorSelect'">
+                  <color-select
+                    v-model="setting.value"
+                    @update="updateColorScheme"
+                  />
+                  <div
+                    style="
+                    display: flex;
+                    align-items: center;
+                    flex-wrap: wrap;
+                  "
+                    class="color-picker-box"
+                  >
+                    <el-color-picker
+                      v-for="(colorItem, colorItemIndex) in colors"
+                      :key="colorItemIndex"
+                      v-model="setting.value[colorItemIndex]"
+                      popper-class="bs-el-color-picker"
+                      show-alpha
+                      class="start-color"
+                    />
+                    <span
+                      class="el-icon-circle-plus-outline"
+                      style="color: #007aff; font-size: 20px"
+                      @click="addColor"
+                    />
+                    <span
+                      v-if="colors.length"
+                      class="el-icon-remove-outline"
+                      style="color: #ea0b30; font-size: 20px"
+                      @click="delColor()"
+                    />
+                  </div>
+                </template>
+                <el-color-picker
+                  v-else-if="setting.type === 'colorPicker'"
+                  v-model="setting.value"
+                  popper-class="bs-el-color-picker"
+                  class="bs-el-color-picker"
+                  show-alpha
+                />
+                <!-- 渐变色设置 -->
+                <GradualSetting
+                  v-else-if="setting.type === 'gradual'"
+                  v-model="setting.value"
+                />
+                <el-input-number
+                  v-else-if="setting.type === 'inputNumber'"
+                  v-model="setting.value"
+                  class="bs-el-input-number"
+                  :step="setting.step || 1"
+                  :min="setting.min || 0"
+                  :max="setting.max || 100000"
+                />
+                <el-radio-group
+                  v-else-if="setting.type === 'radio'"
+                  v-model="setting.value"
+                  class="bs-el-radio-group"
+                >
+                  <template v-for="(opt, optIndex) in setting.options">
+                    <el-radio-button
+                      :key="optIndex"
+                      :label="opt.value"
+                    >
+                      {{ opt.label }}
+                    </el-radio-button>
+                  </template>
+                </el-radio-group>
+                <el-switch
+                  v-else-if="setting.type === 'switch'"
+                  v-model="setting.value"
+                  class="bs-el-switch"
+                  :active-value="setting.active"
+                  :inactive-value="setting.inactive"
+                />
+                <el-slider
+                  v-else-if="setting.type === 'slider'"
+                  v-model="setting.value"
+                  :min="0"
+                  :max="1"
+                  :step="0.01"
+                />
+                <PaddingSetting
+                  v-else-if="setting.type === 'padding'"
+                  v-model="setting.value"
+                />
+              </el-form-item>
+            </div>
+          </div>
+        </div>
+      </template>
+      <!-- </div> -->
+    </el-form>
+  </div>
+</template>
+<script>
+import BorderSetting from 'data-room-ui/BigScreenDesign/RightSetting/BorderSetting.vue'
+import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
+import { chartSettingMixins } from 'data-room-ui/js/mixins/chartSettingMixins'
+import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
+// import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
+import PaddingSetting from 'data-room-ui/BigScreenDesign/RightSetting/PaddingSetting/index.vue'
+import GradualSetting from 'data-room-ui/BigScreenDesign/RightSetting/GradualSetting/index.vue'
+import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
+import RotateSetting from 'data-room-ui/BigScreenDesign/RightSetting/RotateSetting.vue'
+export default {
+  name: 'EchartsCustomSetting',
+  components: {
+    ColorSelect,
+    // ColorPicker,
+    PaddingSetting,
+    GradualSetting,
+    PosWhSetting,
+    BorderSetting,
+    SettingTitle,
+    RotateSetting
+  },
+  mixins: [chartSettingMixins],
+  data () {
+    return {
+      groupList: []
+    }
+  },
+  filters: {
+    filterGroupName (val) {
+      const settingGroup = {
+        basic: '基础',
+        position: '位置',
+        graph: '图表',
+        rotate: '旋转',
+        grid: '网格线',
+        legend: '图例',
+        xAxis: 'X轴',
+        yAxis: 'Y轴',
+        padding: '边距',
+        other: '其他'
+      }
+      return settingGroup[val]
+    }
+  },
+  computed: {
+    config: {
+      get () {
+        return this.$store.state.bigScreen.activeItemConfig
+      },
+      set (val) {
+        this.$store.commit('bigScreen/changeActiveItemConfig', val)
+      }
+    },
+    appCode: {
+      get () {
+        return this.$store.state.bigScreen.pageInfo.appCode
+      }
+    },
+    pageCode () {
+      return this.$route.query.code
+    }
+  },
+  watch: {
+    groupList: {
+      // 1、原数组,2、修改后的数组只包含custom,3、合并的时候xy的配置必须放在最前面
+      handler (val) {
+        const setList = [].concat(...val.map(item => item.list))
+        const newSetList = [...this.config.setting, ...setList]
+        let newArr = [] // 存新数组
+        const hash = {}
+        newArr = newSetList.reduce(function (acc, cru, index) {
+          if (!hash[cru.field]) {
+            hash[cru.field] = { index: index }
+            acc.push(cru)
+          } else {
+            acc.splice(hash[cru.field].index, 1, cru)
+          }
+          return acc
+        }, [])
+        this.$store.commit('bigScreen/changeActiveItemConfig', { ...this.config, setting: newArr })
+      },
+      deep: true
+    }
+  },
+  mounted () {
+    this.init()
+    const groupNameList = []
+    this.config.setting.filter(
+      (item) => item.tabName === 'custom'
+    ).forEach(item => {
+      if (item.tabName === 'custom' && item.groupName) {
+        if (!groupNameList.includes(item.groupName)) {
+          groupNameList.push(item.groupName)
+          this.groupList.push({
+            groupName: item.groupName,
+            list: [item]
+          })
+        } else {
+          this.groupList.find(group => group.groupName === item.groupName).list.push(item)
+        }
+      } else {
+        if (this.groupList.find(group => group.groupName === 'other')) {
+          this.groupList.find(group => group.groupName === 'other').list.push(item)
+        } else {
+          this.groupList.push({
+            groupName: 'other',
+            list: [item]
+          })
+        }
+      }
+    })
+    for (let i = 0; i < this.groupList.length; i++) {
+      if (this.groupList[i].groupName === 'other') {
+        const otherObject = this.groupList.splice(i, 1)[0]
+        this.groupList.push(otherObject)
+        break
+      }
+    }
+  },
+  methods: {
+    init () {
+      this.config = this.$store.state.bigScreen.activeItemConfig
+    }
+  }
+}
+</script>
+ <style lang="scss" scoped>
+ @import '../../assets/style/settingWrap.scss';
+ @import '../../assets/style/bsTheme.scss';
+ // 筛选条件的按钮样式
+ .add-filter-box {
+   position: relative;
+   .add-filter {
+     margin-left: 90px;
+     margin-bottom: 10px;
+   }
+   .add-filter-btn {
+     position: absolute;
+     top: 0;
+   }
+ }
+ .lc-field-body {
+   padding:12px 16px;
+ }
+ .el-form-item{
+   margin-bottom: 6px !important;
+ }
+ .lc-field-title {
+   position: relative;
+   padding-left: 12px;
+   line-height: 30px;
+   height: 30px;
+   margin-bottom: 12px;
+   &:after {
+     position: absolute;
+     left: 0;
+     top: 50%;
+     transform: translateY(-50%);
+     content: '';
+     width: 4px;
+     height: 14px;
+     background-color: var(--bs-el-color-primary);
+   }
+ }
+ ::v-deep .el-color-picker__trigger {
+   border-color: var(--bs-el-border);
+ }
+ .color-picker-box{
+   ::v-deep .el-color-picker__trigger {
+     width: 27px!important;
+   }
+ }
+ </style>

+ 74 - 0
data-room-ui/packages/BigScreenDesign/RightSetting/RotateSetting.vue

@@ -0,0 +1,74 @@
+<!--
+ * @description: 旋转的角度
+-->
+
+<template>
+  <div>
+    <el-form-item
+      :label-width="labelWidth"
+      label="绕x轴旋转角度"
+    >
+      <el-input-number
+        v-model="config.rotateX"
+        class="bs-el-input-number"
+        :min="0"
+        :max="360"
+        :step="1"
+      />
+    </el-form-item>
+    <el-form-item
+      :label-width="labelWidth"
+      label="绕y轴旋转角度"
+    >
+      <el-input-number
+        v-model="config.rotateY"
+        class="bs-el-input-number"
+        :min="0"
+        :max="360"
+        :step="1"
+      />
+    </el-form-item> <el-form-item
+      :label-width="labelWidth"
+      label="绕z轴旋转角度"
+    >
+      <el-input-number
+        v-model="config.rotateZ"
+        class="bs-el-input-number"
+        :min="0"
+        :max="360"
+        :step="1"
+      />
+    </el-form-item>
+  </div>
+</template>
+<script>
+export default {
+  name: '',
+  props: {
+    config: {
+      type: Object,
+      default: () => ({
+        rotateX: 0,
+        rotateY: 0,
+        rotateZ: 0
+      })
+    },
+    labelWidth: {
+      type: String,
+      default: '120px'
+    }
+  },
+  data () {
+    return {
+
+    }
+  },
+  mounted () {},
+  methods: {
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 5 - 1
data-room-ui/packages/BigScreenDesign/RightSetting/index.vue

@@ -56,6 +56,7 @@ import { resolveComponentType } from 'data-room-ui/js/utils'
 import DataSetting from './DataSetting.vue'
 import rightSetting from 'data-room-ui/js/utils/rightSettingImport'
 import CustomComponent from './G2CustomSetting.vue'
+import EchartsCustomSetting from './EchartsCustomSetting.vue'
 import Svgs from 'data-room-ui/Svgs/setting.vue'
 import { mapState, mapMutations } from 'vuex'
 // import _ from 'lodash'
@@ -78,7 +79,7 @@ export default {
     Svgs,
     // 远程组件的样式配置也和g2Plot的样式配置一样,采用属性配置, 故使用一个组件
     RemoteComponent: CustomComponent,
-    EchartsComponent: CustomComponent
+    EchartsComponent: EchartsCustomSetting
   },
   data () {
     return {
@@ -114,6 +115,9 @@ export default {
         x: this.config?.x,
         y: this.config?.y,
         z: this.config?.z,
+        rotateX: this.config?.rotateX,
+        rotateY: this.config?.rotateY,
+        rotateZ: this.config?.rotateZ,
         setting: cloneDeep(this.config?.setting),
         customize: cloneDeep(this.config?.customize),
         url: this.config?.url,

+ 20 - 0
data-room-ui/packages/BigScreenList/EditForm.vue

@@ -67,6 +67,22 @@
             class="bs-el-input-number"
           />
         </el-form-item>
+        <el-form-item label="分组">
+          <el-select
+            v-model="dataForm.parentCode"
+            class="bs-el-select"
+            popper-class="bs-el-select"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="catalogItem in catalogList"
+              :key="catalogItem.id"
+              :label="catalogItem.name"
+              :value="catalogItem.code"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="排序">
           <el-input-number
             v-model="dataForm.orderNum"
@@ -125,6 +141,7 @@ export default {
     return {
       resolutionRatioValue: '',
       resolutionRatio: {},
+      catalogList: [],
       resolutionRatioOptions: [
         {
           value: '1024*768',
@@ -245,6 +262,9 @@ export default {
       const code = nodeData ? nodeData.code : ''
       this.formVisible = true
       this.$nextTick(() => {
+        this.$dataRoomAxios.get('/bigScreen/type/list/bigScreenCatalog').then((resp) => {
+          this.catalogList = resp
+        })
         if (code) {
           this.$dataRoomAxios.get(`/bigScreen/design/info/code/${code}`).then((resp) => {
             this.$set(this, 'title', resp.name)

+ 0 - 13
data-room-ui/packages/BigScreenManagement/addDialog.vue

@@ -199,13 +199,9 @@ export default {
         id: '',
         type: '',
         name: '',
-        icon: '',
         code: '',
         remark: '',
-        iconColor: '#007aff',
         components: '',
-        style: '',
-        modelCode: '',
         formType: '',
         formConfig: '',
         pageTemplateId: ''
@@ -294,12 +290,9 @@ export default {
               this.$set(this.dataForm, 'name', resp.name)
               this.$set(this.dataForm, 'chartList', resp.chartList)
               this.$set(this.dataForm, 'code', resp.code)
-              this.$set(this.dataForm, 'icon', resp.icon)
-              this.$set(this.dataForm, 'iconColor', resp.iconColor)
               this.$set(this.dataForm, 'id', resp.id)
               this.$set(this.dataForm, 'parentCode', resp.parentCode === '0' ? '' : resp.parentCode)
               this.$set(this.dataForm, 'remark', resp.remark)
-              this.$set(this.dataForm, 'style', resp.style)
               this.$set(this.dataForm, 'type', resp.type)
               this.$set(this.dataForm, 'orderNum', nodeData.orderNum)
               this.$set(this.dataForm, 'pageTemplateId', resp?.pageTemplateId)
@@ -315,12 +308,9 @@ export default {
             this.$set(this.dataForm, 'name', '')
             this.$set(this.dataForm, 'chartList', [])
             this.$set(this.dataForm, 'code', '')
-            this.$set(this.dataForm, 'icon', Icon.getNameList()[0])
-            this.$set(this.dataForm, 'iconColor', '#007aff')
             this.$set(this.dataForm, 'id', '')
             this.$set(this.dataForm, 'parentCode', parentNode.code)
             this.$set(this.dataForm, 'remark', '')
-            this.$set(this.dataForm, 'style', '')
             this.$set(this.dataForm, 'type', this.dataForm.type)
             this.$set(this.dataForm, 'orderNum', 0)
             this.$set(this.dataForm, 'pageTemplateId', '')
@@ -352,13 +342,10 @@ export default {
           className: 'com.gccloud.dataroom.core.module.manage.dto.DataRoomPageDTO',
           chartList: this.dataForm.chartList,
           code: this.dataForm.code,
-          icon: this.dataForm.icon,
-          iconColor: this.dataForm.iconColor,
           id: this.dataForm.id,
           name: this.dataForm.name,
           parentCode: this.dataForm.parentCode,
           remark: this.dataForm.remark,
-          style: this.dataForm.style,
           type: 'bigScreen',
           orderNum: this.dataForm.orderNum,
           pageConfig: {

+ 6 - 6
data-room-ui/packages/BigScreenRun/index.vue

@@ -94,7 +94,7 @@ export default {
       return this.config.fitMode || this.stateFitMode
     },
     fitSelector () {
-      return this.config.fitSelector
+            return this.config.fitSelector
     },
     pageLoading () {
       return this.$store.state.bigScreen.pageLoading
@@ -307,7 +307,7 @@ export default {
       let overflowX = 'auto'
       let overflowY = 'auto'
       // 自适应模式, 画布等比例自适应后保持一屏展示,会存在某一个方向两边留白,留白部分颜色背景和画布中的背景色一致
-      if (this.fitMode === 'auto') {
+      if (pageConfig.fitMode === 'auto') {
         const scaleW = this.innerWidth / w
         const scaleH = this.innerHeight / h
         scaleX = Math.min(scaleW, scaleH)
@@ -318,9 +318,9 @@ export default {
       }
 
       // 宽度铺满 预览时画布横向铺满,纵向超出时出现滚动条
-      if (this.fitMode === 'fitWidth') {
+      if (pageConfig.fitMode === 'fitWidth') {
         scaleX = this.innerWidth / w
-        // 如果实际高度小于屏幕,纵向居中
+                // 如果实际高度小于屏幕,纵向居中
         if (this.innerHeight > h) {
           translate = `${((this.innerWidth - w) / 2) / scaleX}px, ${((this.innerHeight - h) / 2) / scaleY}px`
         } else {
@@ -330,7 +330,7 @@ export default {
       }
 
       // 高度铺满 预览时画布纵向铺满,横向超出时出现滚动条
-      if (this.fitMode === 'fitHeight') {
+      if (pageConfig.fitMode === 'fitHeight') {
         scaleY = this.innerHeight / h
         // 如果实际宽度小于屏幕,横向居中
         if (this.innerWidth > w) {
@@ -342,7 +342,7 @@ export default {
       }
 
       // 双向铺满 预览时画布横向纵向铺满,无滚动条,但是元素可能会出现拉伸情况
-      if (this.fitMode === 'cover') {
+      if (pageConfig.fitMode === 'cover') {
         scaleX = this.innerWidth / w
         scaleY = this.innerHeight / h
         translate = `${((this.innerWidth - w) / 2) / scaleX}px, ${((this.innerHeight - h) / 2) / scaleY}px`

+ 1 - 0
data-room-ui/packages/BizComponent/index.vue

@@ -605,6 +605,7 @@ export default {
   top: 0;
   overflow-x: hidden;
   overflow-y: scroll;
+  margin-right: 4px;
 }
 
 /* Webkit浏览器滚动条样式 */

+ 53 - 4
data-room-ui/packages/ComponentList/EditForm.vue

@@ -30,7 +30,7 @@
           />
         </el-form-item>
         <el-form-item
-          v-if="type === 'bizComponent'"
+          v-if="type === 'bizComponent'&&!title"
           label="组件类型"
         >
           <el-select
@@ -89,6 +89,40 @@
             class="bs-el-input-number"
           />
         </el-form-item>
+        <el-form-item label="分组">
+          <div v-if="type === 'component'">
+            <el-select
+              v-model="dataForm.parentCode"
+              class="bs-el-select"
+              popper-class="bs-el-select"
+              clearable
+              filterable
+            >
+              <el-option
+                v-for="catalogItem in catalogList"
+                :key="catalogItem.id"
+                :label="catalogItem.name"
+                :value="catalogItem.code"
+              />
+            </el-select>
+          </div>
+          <div v-else>
+            <el-select
+              v-model="dataForm.type"
+              class="bs-el-select"
+              popper-class="bs-el-select"
+              clearable
+              filterable
+            >
+              <el-option
+                v-for="catalogItem in catalogList"
+                :key="catalogItem.id"
+                :label="catalogItem.name"
+                :value="catalogItem.code"
+              />
+            </el-select>
+          </div>
+        </el-form-item>
         <el-form-item label="排序">
           <el-input-number
             v-model="dataForm.orderNum"
@@ -148,10 +182,11 @@ export default {
       bizType: 'native',
       resolutionRatioValue: '',
       resolutionRatio: {},
+      catalogList: [],
       BizList: [
         {
           label: 'echarts组件',
-          value: 'echarts'
+          value: 'echart'
         }, {
           label: 'g2Plot组件',
           value: 'g2plot'
@@ -198,6 +233,7 @@ export default {
         name: '',
         icon: '',
         code: '',
+        parentCode: '',
         remark: '',
         iconColor: '#007aff',
         components: '',
@@ -214,7 +250,11 @@ export default {
           {
             validator: (rule, value, callback) => {
               if (value) {
-                this.$dataRoomAxios.post('/bigScreen/design/name/repeat', {
+                const reqUrl = {
+                  component: '/bigScreen/design/name/repeat',
+                  bizComponent: '/bigScreen/bizComponent/name/repeat'
+                }
+                this.$dataRoomAxios.post(reqUrl[this.type], {
                   name: value,
                   type: this.type,
                   id: this.dataForm.id
@@ -229,7 +269,7 @@ export default {
                 callback()
               }
             },
-            trigger: 'change'
+            trigger: ['blur', 'change']
           }
         ]
       },
@@ -289,6 +329,9 @@ export default {
       const code = nodeData ? nodeData.code : ''
       this.formVisible = true
       this.$nextTick(() => {
+        this.$dataRoomAxios.get('/bigScreen/type/list/bizComponentCatalog').then((resp) => {
+          this.catalogList = resp
+        })
         if (code) {
           this.$dataRoomAxios.get(`/bigScreen/bizComponent/info/${code}`).then((resp) => {
             this.$set(this, 'title', resp.name)
@@ -297,6 +340,7 @@ export default {
             this.$set(this.dataForm, 'orderNum', nodeData.orderNum)
             this.$set(this.dataForm, 'type', resp.type)
             this.$set(this.dataForm, 'id', resp.id)
+            this.$set(this.dataForm, 'parentCode', resp.parentCode)
           })
         } else {
           this.$set(this.dataForm, 'name', '')
@@ -304,6 +348,7 @@ export default {
           this.$set(this.dataForm, 'type', parentCode)
           this.$set(this.dataForm, 'orderNum', 0)
           this.$set(this.dataForm, 'id', '')
+          this.$set(this.dataForm, 'parentCode', parentCode)
         }
       })
     },
@@ -312,6 +357,9 @@ export default {
       const code = nodeData ? nodeData.code : ''
       this.formVisible = true
       this.$nextTick(() => {
+        this.$dataRoomAxios.get('/bigScreen/type/list/componentCatalog').then((resp) => {
+          this.catalogList = resp
+        })
         if (code) {
           this.$dataRoomAxios.get(`/bigScreen/design/info/code/${code}`).then((resp) => {
             this.$set(this, 'title', resp.name)
@@ -328,6 +376,7 @@ export default {
             this.$set(this.dataForm, 'orderNum', nodeData.orderNum)
             this.$set(this.dataForm, 'pageTemplateId', resp?.pageTemplateId)
             this.$set(this.dataForm, 'pageConfig', resp?.pageConfig)
+            this.$set(this.dataForm, 'parentCode', resp?.parentCode)
             const { w, h } = resp.pageConfig
             this.resolutionRatio.w = w
             this.resolutionRatio.h = h

+ 1 - 1
data-room-ui/packages/ComponentList/index.vue

@@ -64,7 +64,7 @@
             <div class="add-big-screen-card">
               <div class="add-big-screen-card-inner">
                 <div class="add-big-screen-card-text">
-                  新组件
+                  新组件
                 </div>
               </div>
             </div>

+ 86 - 25
data-room-ui/packages/DataSetManagement/src/CustomEditForm.vue

@@ -192,7 +192,7 @@
                   <LabelSelect
                     :dataset-id="datasetId"
                     :id-list="dataForm.labelIds"
-                    @commit="(ids) =>{dataForm.labelIds = ids}"
+                    @commit="(ids) => { dataForm.labelIds = ids }"
                   />
                 </el-form-item>
               </el-col>
@@ -289,7 +289,7 @@
               </div>
               <div class="field-wrap bs-field-wrap bs-scrollbar">
                 <div
-                  v-for="field in structurePreviewList"
+                  v-for="field in sortedStructurePreviewList"
                   :key="field.fieldName"
                   class="field-item"
                   @click="fieldsetVisible = true"
@@ -329,15 +329,15 @@
             class="bs-el-table bs-scrollbar"
           >
             <el-table-column
-              v-for="(value, key) in dataPreviewList[0] ? dataPreviewList[0] : noDataTableDisplayFields"
+              v-for="(value, key) in sortedTablePreviewList"
               :key="key"
-              :label="key"
+              :label="value"
               align="center"
               show-overflow-tooltip
               :render-header="renderHeader"
             >
               <template slot-scope="scope">
-                <span>{{ scope.row[key] }}</span>
+                <span>{{ scope.row[value] }}</span>
               </template>
             </el-table-column>
           </el-table>
@@ -708,20 +708,32 @@
               align="center"
             >
               <template slot-scope="scope">
-                <el-date-picker
-                  v-if="scope.row.type === 'Date'"
-                  v-model="scope.row.value"
-                  type="datetime"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  placeholder="选择日期时间"
-                />
-                <el-input
-                  v-else
-                  v-model="scope.row.value"
-                  class="bs-el-input"
-                  clearable
-                  placeholder="请输入值"
-                />
+                <el-form
+                  ref="form"
+                  :model="scope.row"
+                >
+                  <el-form-item
+                    :show-message="scope.row.require === 1"
+                    class="form-item-value"
+                    prop="value"
+                    :rules="getRules(scope.row)"
+                  >
+                    <el-date-picker
+                      v-if="scope.row.type === 'Date'"
+                      v-model="scope.row.value"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm:ss"
+                      placeholder="选择日期时间"
+                    />
+                    <el-input
+                      v-else
+                      v-model="scope.row.value"
+                      class="bs-el-input"
+                      clearable
+                      placeholder="请输入值"
+                    />
+                  </el-form-item>
+                </el-form>
               </template>
             </el-table-column>
             <el-table-column
@@ -775,11 +787,15 @@
           <el-button
             class="bs-el-button-default"
             @click="cancelParam"
-          >取消</el-button>
+          >
+            取消
+          </el-button>
           <el-button
             type="primary"
             @click="setParam"
-          >确定</el-button>
+          >
+            确定
+          </el-button>
         </span>
       </el-dialog>
     </el-scrollbar>
@@ -891,6 +907,22 @@ export default {
         tableColumnObject[item.fieldName] = ''
       })
       return tableColumnObject
+    },
+    // 输出字段根据orderNum排序
+    sortedStructurePreviewList () {
+      const list = this.structurePreviewList
+      list.sort((a, b) => {
+        return a.orderNum - b.orderNum
+      })
+      return list
+    },
+    sortedTablePreviewList () {
+      const tableList = this.dataPreviewList[0] ? this.dataPreviewList[0] : this.noDataTableDisplayFields
+      const list = Object.keys(tableList)
+      list.sort((a, b) => {
+        return this.structurePreviewListCopy.findIndex(item => item.fieldName === a) - this.structurePreviewListCopy.findIndex(item => item.fieldName === b)
+      })
+      return list
     }
   },
   watch: {
@@ -963,6 +995,13 @@ export default {
         this.datasetTest(false)
       })
     },
+    getRules (row) {
+      return [{
+        required: row.require === 1,
+        message: '参数值不能为空',
+        trigger: ['blur', 'change']
+      }]
+    },
     /**
      * 获取数据源列表
      */
@@ -1014,6 +1053,13 @@ export default {
      * 保存参数设置
      */
     setParam () {
+      for (let i = 0; i < this.paramsListCopy.length; i++) {
+        const row = this.paramsListCopy[i]
+        if (row.require === 1 && (row.value === '' || row.value === null)) {
+          this.$message.error(`第${i + 1}行参数值不能为空`)
+          return
+        }
+      }
       this.dataForm.paramsList = cloneDeep(this.paramsListCopy)
       if (this.isTest) {
         this.datasetTest()
@@ -1232,6 +1278,9 @@ export default {
           })
         }
         this.structurePreviewListCopy = cloneDeep(this.structurePreviewList)
+        this.structurePreviewListCopy = this.structurePreviewListCopy.sort((a, b) => {
+          return a.orderNum - b.orderNum
+        })
         let paramsNameCheck = false
         this.dataForm.paramsList.forEach(param => {
           const checkList = this.structurePreviewList.filter(item => item.fieldName === param.name)
@@ -1419,18 +1468,30 @@ export default {
 .bs-pagination {
   padding: 16px !important;
   position: unset !important;
+
   ::v-deep .el-input__inner {
     width: 110px !important;
     border: none;
     background: var(--bs-el-background-1);
   }
 }
-.bs-el-select{
+
+.bs-el-select {
   width: 100% !important;
 }
-::v-deep .el-input__inner{
+
+::v-deep .el-input__inner {
   width: 100% !important;
 }
-</style>
 
-<style></style>
+::v-deep .el-table__row {
+  height: 58px;
+
+  .cell {
+    width: 100%;
+    margin: 0 auto;
+    position: absolute;
+    top: 8px;
+  }
+}
+</style>

+ 1 - 0
data-room-ui/packages/DataSetManagement/src/ScriptEditForm.vue

@@ -1173,6 +1173,7 @@ return ElasticsearchDsService.query(host, port, username, password, path, dsl);
   top: 0;
   overflow-x: hidden;
   overflow-y: scroll;
+  margin-right: 4px;
 }
 
 /* Webkit浏览器滚动条样式 */

+ 6 - 5
data-room-ui/packages/DataSetManagement/src/StoredProcedureEditForm.vue

@@ -310,27 +310,28 @@
         <div class="result-view">
           数据预览
         </div>
-        <div class="bs-table-box is-Edit bs-scrollbar">
+        <div class="bs-table-box is-Edit">
           <el-table
             align="center"
             :data="dataPreviewList"
-            max-height="400"
-            class="bs-el-table bs-scrollbar"
+            max-height="100%"
+            class="bs-el-table"
           >
+            <!-- 第一个表格列固定 -->
             <el-table-column
               v-for="(value, key) in dataPreviewList[0] ? dataPreviewList[0] : noDataTableDisplayFields"
               :key="key"
               :label="key"
+              :fixed="left"
               align="center"
               show-overflow-tooltip
-              :render-header="renderHeader"
             >
               <template slot-scope="scope">
                 <span>{{ scope.row[key] }}</span>
               </template>
             </el-table-column>
           </el-table>
-          <div style="padding: 12px 0 0;color:var(--bs-el-text)">
+          <div style="margin: 8px 0;color:var(--bs-el-text)">
             <span v-show="dataPreviewList.length">数据预览中,存储过程仅展示20条数据</span>
           </div>
         </div>

+ 3 - 0
data-room-ui/packages/Echarts/echartList.js

@@ -31,6 +31,9 @@ function getEchartsList (files) {
       h: config?.option?.height || 320,
       x: 0,
       y: 0,
+      rotateX: 0,
+      rotateY: 0,
+      rotateZ: 0,
       type: 'echartsComponent',
       loading: false,
       // 把默认右侧配置与自定义右侧配置集合

+ 37 - 1
data-room-ui/packages/EchartsRender/index.vue

@@ -71,6 +71,42 @@ export default {
           this.changeStyle(this.config, true)
         }
       }
+    },
+    'config.rotateX': {
+      deep: true,
+      handler (val) {
+        const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg)  rotateZ(${this.config.rotateZ}deg)`
+        const dom1 = document.querySelector('.bs-design-wrap')
+        const dom2 = document.querySelector('.render-item-wrap')
+        dom1.setAttribute('style', 'perspective: 500px;')
+        dom2.setAttribute('style', 'perspective: 500px;')
+        dom1.setAttribute('style', 'transform:' + rotate)
+        dom2.setAttribute('style', 'transform:' + rotate)
+      }
+    },
+    'config.rotateY': {
+      deep: true,
+      handler (val) {
+        const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg)  rotateZ(${this.config.rotateZ}deg)`
+        const dom1 = document.querySelector('.bs-design-wrap')
+        const dom2 = document.querySelector('.render-item-wrap')
+        dom1.setAttribute('style', 'perspective: 500px;')
+        dom2.setAttribute('style', 'perspective: 500px;')
+        dom1.setAttribute('style', 'transform:' + rotate)
+        dom2.setAttribute('style', 'transform:' + rotate)
+      }
+    },
+    'config.rotateZ': {
+      deep: true,
+      handler (val) {
+        const rotate = `rotateX(${this.config.rotateX}deg) rotateY(${this.config.rotateY}deg)  rotateZ(${this.config.rotateZ}deg)`
+        const dom1 = document.querySelector('.bs-design-wrap')
+        const dom2 = document.querySelector('.render-item-wrap')
+        dom1.setAttribute('style', 'perspective: 500px;')
+        dom2.setAttribute('style', 'perspective: 500px;')
+        dom1.setAttribute('style', 'transform:' + rotate)
+        dom2.setAttribute('style', 'transform:' + rotate)
+      }
     }
   },
   mounted () {
@@ -410,8 +446,8 @@ export default {
     seriesStyle (config) {
       const _config = CloneDeep(config)
       const seriesCustom = _config.option.seriesCustom
-      // const ids = ['barTopColor', 'barColor', 'barBottomColor', 'shadowColor', 'shadowTopColor']
       const ids = Object.keys(config.option.seriesCustom)
+      // 判断是否是分组柱状图
       const isGroup = _config.option.series.length !== 5
       // 宽度配置
       _config.option.series.forEach(item => {

+ 33 - 15
data-room-ui/packages/MapDataManagement/src/index.vue

@@ -272,19 +272,24 @@ export default {
     },
     getDataList() {
       this.lazyResolveMap.clear()
-      this.searchLoading = true
-      this.loadingText = '正在加载地图数据...'
-      mapList(this.searchForm).then(res => {
-        this.mapList = res
-        this.searchLoading = false
-      }).catch(err => {
-        this.searchLoading = false
+      this.$nextTick(() => {
+        this.mapList = []
+      })
+      this.$nextTick(() => {
+        this.searchLoading = true
+        this.loadingText = '正在加载地图数据...'
+        mapList(this.searchForm).then(res => {
+          this.mapList = res
+          this.searchLoading = false
+        }).catch(err => {
+          this.searchLoading = false
+        })
+        // 清除展开状态
+        for (let i = 0; i < this.lazyResolveIds.length; i++) {
+          this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].loaded = false;
+          this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].expanded = false
+        }
       })
-      // 清除展开状态
-      for (let i = 0; i < this.lazyResolveIds.length; i++) {
-        this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].loaded = false;
-        this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].expanded = false
-      }
     },
     /**
      * 新增、删除、修改等操作成功后刷新数据,不改变展开状态
@@ -295,7 +300,6 @@ export default {
       if (this.lazyResolveMap.get(parentId)) {
         // 刷新父节点
         const { data, treeNode, resolve } = this.lazyResolveMap.get(parentId)
-        // debugger
         this.$set(this.$refs.table.store.states.lazyTreeNodeMap, parentId, [])
         this.load(data, treeNode, resolve)
         return
@@ -312,6 +316,8 @@ export default {
           const { data, treeNode, resolve } = this.lazyResolveMap.get(parentId)
           this.$set(this.$refs.table.store.states.lazyTreeNodeMap, parentId, [])
           this.load(data, treeNode, resolve)
+          // 展开该父节点
+          this.$refs.table.toggleRowExpansion(parentId, true);
         } else {
           // 刷新根节点
           this.getDataList()
@@ -330,8 +336,20 @@ export default {
       this.lazyResolveIds.push(data.id)
       mapList({
         parentId: data.id
-      }).then(res => {
-        resolve(res)
+      }).then(childList => {
+        // 解决同一页中同一条数据同时出现,如果懒加载中存在,那么将之前查询出来的数据删除
+        let deleteIdList = []
+        childList.forEach((child) => {
+          this.mapList.forEach((mapInfo) => {
+            if (mapInfo.id === child.id) {
+              deleteIdList.push(mapInfo.id)
+            }
+          })
+        })
+        this.mapList = this.mapList.filter((map) => {
+          return deleteIdList.indexOf(map.id) === -1
+        })
+        resolve(childList)
       }).catch(err => {
         resolve([])
       })

+ 9 - 9
data-room-ui/packages/Render/index.vue

@@ -485,7 +485,7 @@ export default {
 }
 //调整拖拽插件的句柄样式
 //句柄公共样式
-/deep/.bs-handle-class{
+::v-deep .bs-handle-class{
   width: 16px!important;
   height: 16px!important;
   position: absolute;
@@ -494,7 +494,7 @@ export default {
   border: 3px solid #c8ff00;
 }
 // 每个句柄不同样式
-/deep/.bs-handle-class-tl{
+::v-deep .bs-handle-class-tl{
   top: -2px!important;
   left: -2px!important;
   display: block;
@@ -502,7 +502,7 @@ export default {
   border-right: none;
   border-bottom: none;
 }
-/deep/.bs-handle-class-tm{
+::v-deep .bs-handle-class-tm{
   top: -2px!important;
   left: calc(50% - 8px)!important;
   display: block;
@@ -511,7 +511,7 @@ export default {
   border-right: none;
   border-bottom: none;
 }
-/deep/.bs-handle-class-tr{
+::v-deep .bs-handle-class-tr{
   top: -2px!important;
   right: -2px!important;
   display: block;
@@ -519,7 +519,7 @@ export default {
   border-left: none;
   border-bottom: none;
 }
-/deep/.bs-handle-class-mr{
+::v-deep .bs-handle-class-mr{
   top: calc(50% - 8px)!important;
   right: -2px!important;
   display: block;
@@ -528,7 +528,7 @@ export default {
   border-top: none;
   border-bottom: none;
 }
-/deep/.bs-handle-class-br{
+::v-deep .bs-handle-class-br{
   right: -2px!important;
   bottom: -2px!important;
   display: block;
@@ -536,7 +536,7 @@ export default {
   border-left: none;
   border-top: none;
 }
-/deep/.bs-handle-class-bm{
+::v-deep .bs-handle-class-bm{
   right: calc(50% - 8px)!important;
   bottom: -2px!important;
   display: block;
@@ -545,7 +545,7 @@ export default {
   border-right: none;
   border-top: none;
 }
-/deep/.bs-handle-class-bl{
+::v-deep .bs-handle-class-bl{
   left: -2px!important;
   bottom: -2px!important;
   display: block;
@@ -553,7 +553,7 @@ export default {
   border-right: none;
   border-top: none;
 }
-/deep/.bs-handle-class-ml{
+::v-deep .bs-handle-class-ml{
   top: calc(50% - 8px)!important;
   left: -2px!important;
   display: block;

BIN
data-room-ui/packages/assets/images/cardImg/card.png


BIN
data-room-ui/packages/assets/images/cardImg/card2.png


BIN
data-room-ui/packages/assets/images/cardImg/indcard2.png


BIN
data-room-ui/packages/assets/images/cardImg/indicard.png


+ 7 - 7
data-room-ui/packages/assets/style/common/index.scss

@@ -148,12 +148,12 @@ $--font-path: "~element-ui/lib/theme-chalk/fonts";
 
     /* 滚动条样式设置*/
     .el-table__body-wrapper::-webkit-scrollbar {
-      width: 12px !important;
-      height: 12px !important;
-    }
+        width: 6px !important; 
+        height: 6px !important;
+        }
 
     .el-table__body-wrapper::-webkit-scrollbar-corner {
-      background: transparent !important;
+      background: #444851 !important;
     }
 
     .el-table__body-wrapper::-webkit-scrollbar-track {
@@ -163,9 +163,9 @@ $--font-path: "~element-ui/lib/theme-chalk/fonts";
     .el-table__body-wrapper::-webkit-scrollbar-thumb {
       min-height: 20px !important;
       background-clip: content-box !important;
-      border: 2px solid transparent !important;
-      border-radius: 10px !important;
-      // background-color: #ddd;
+      border: 1px solid #444851 !important;
+      border-radius: 6px !important;
+      background: #444851 !important;
     }
 
     .el-table__fixed::before,

+ 15 - 2
data-room-ui/packages/assets/style/settingWrap.scss

@@ -242,15 +242,28 @@
   margin-right: 10px;
 }
 
+// 表格边框
+
 ::v-deep .el-table {
   background: var(--bs-el-background-1);
-  border-bottom: 1px solid var(--bs-el-title);
+  // 底部
+  border-bottom: 0 solid var(--bs-el-border);
 }
 
 ::v-deep .el-table__cell {
   background: var(--bs-el-background-1) !important;
   color: var(--bs-el-title) !important;
-  border-color: var(--bs-el-text) !important;
+  // 中间边框
+  border-width: 2px;
+  border-color: var(--bs-background-2) !important;
+}
+.el-table--group::after, .el-table--border::after, .el-table::before {
+  // 右侧、底部边框
+  background-color: var(--bs-el-border);
+}
+
+.el-table--group, .el-table--border {
+  border: var(--bs-el-border);
 }
 
 ::v-deep .el-select {

+ 3 - 0
data-room-ui/packages/js/api/bigScreenApi.js

@@ -8,6 +8,9 @@ export function getScreenInfo (code) {
 export function saveScreen(data) {
   data.chartList.forEach((item) => {
     if (item.type == 'customComponent') {
+      const a = JSON.parse(item.option)
+      a[a.dataKey] = []
+      item.option=JSON.stringify(a)
       item.setting=item.setting.map((x) => {
         const {field,value,...obj}=x
 	        return {field,value}

+ 4 - 1
data-room-ui/packages/js/config/basicComponentsConfig.js

@@ -35,7 +35,10 @@ const typeList = [
   'timePicker',
   'dateTimePicker',
   'indicatorCard',
-  'indexCard'
+  'indexCard',
+  'indicatorCard2',
+  'indexCard2'
+
 ]
 let basicConfigList = []
 basicConfigList = typeList.map((type) => {

+ 35 - 6
data-room-ui/packages/js/utils/getComponentConfig.js

@@ -289,26 +289,55 @@ export default function getComponentConfig (type) {
         return {
           name: '指标卡',
           title: '指标卡',
-          icon: Icon.getNameList()[26],
+          icon: null,
+          img: require('data-room-ui/assets/images/cardImg/card.png'),
           className: 'com.gccloud.dataroom.core.module.chart.components.ScreenIndicatorCardChart',
-          w: 500,
-          h: 250,
+          w: 400,
+          h: 170,
           x: 0,
           y: 0,
           type
       }
+
       case 'indexCard':
         return {
           name: '指标卡一',
           title: '指标卡一',
-          icon: Icon.getNameList()[27],
+          icon: null,
+          img: require('data-room-ui/assets/images/cardImg/indicard.png'),
           className: 'com.gccloud.dataroom.core.module.chart.components.ScreenIndexCardChart',
-          w: 600,
-          h: 250,
+          w: 400,
+          h: 200,
+          x: 0,
+          y: 0,
+          type
+      }
+      case 'indicatorCard2':
+        return {
+          name: '指标卡二',
+          title: '指标卡二',
+          icon: null,
+          img: require('data-room-ui/assets/images/cardImg/card2.png'),
+          className: 'com.gccloud.dataroom.core.module.chart.components.ScreenIndicatorCardChart',
+          w: 400,
+          h: 170,
           x: 0,
           y: 0,
           type
         }
+        case 'indexCard2':
+          return {
+            name: '指标卡三',
+            title: '指标卡三',
+            icon: null,
+            img: require('data-room-ui/assets/images/cardImg/indcard2.png'),
+            className: 'com.gccloud.dataroom.core.module.chart.components.ScreenIndexCardChart',
+            w: 400,
+            h: 200,
+            x: 0,
+            y: 0,
+            type
+        }
     default:
       return {}
   }