Merge branch 'master' of github.com:gcpaas/DataRoom

main
liu.tao3 1 year ago
commit 8304f8558e

@ -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>

@ -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;

@ -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;
}
}

@ -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()));
}
}

@ -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;
}

@ -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;
}
}

@ -91,4 +91,7 @@ public class Chart {
@ApiModelProperty(notes = "计算表达式")
private String expression;
@ApiModelProperty(notes = "表达式关联的组件的code集合")
private List<String> expressionCodes;
}

@ -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);
}

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;
}
}

@ -6,15 +6,16 @@
<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>
@ -29,7 +30,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 +52,6 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
</dependencies>

@ -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;
}
}

@ -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改为allowedOriginPatternsspringboot新版本中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());

@ -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);
}
}
};
}
}

@ -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

@ -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 '创建时间',

@ -144,3 +144,9 @@ CREATE TABLE `big_screen_page_preview`
PRIMARY KEY (`id`)
) ENGINE = InnoDB
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;

@ -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>

@ -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)

@ -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,6 +182,7 @@ export default {
bizType: 'native',
resolutionRatioValue: '',
resolutionRatio: {},
catalogList: [],
BizList: [
{
label: 'echarts组件',
@ -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

@ -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,16 +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;
}
::v-deep .el-table__row {
height: 58px;
.cell {
width: 100%;
margin: 0 auto;
position: absolute;
top: 8px;
}
}
</style>

@ -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>

@ -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([])
})

@ -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,

@ -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 {

Loading…
Cancel
Save