diff --git a/README.md b/README.md index e01b092a44..8b61b593d3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Codacy Latest release Stars - Downloads +


diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 5aaf397c2e..f8e0c1ca9f 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -13,6 +13,7 @@ import io.dataease.commons.exception.DEException; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.MultFieldValuesRequest; import io.dataease.controller.response.DatasetTableField4Type; +import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; @@ -107,9 +108,33 @@ public class DataSetTableFieldController { DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(tableId); datasetTableField.setGroupType("d"); - List dimensionList = dataSetTableFieldsService.list(datasetTableField); + List dimensionList = new ArrayList<>(); + dataSetTableFieldsService.list(datasetTableField).forEach(o -> { + DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO(); + BeanUtils.copyProperties(o, datasetTableFieldDTO); + List deTypeCascader = new ArrayList<>(); + deTypeCascader.add(datasetTableFieldDTO.getDeType()); + if (datasetTableFieldDTO.getDeExtractType() == 0 && datasetTableFieldDTO.getDeType() == 1) { + deTypeCascader.add(datasetTableFieldDTO.getDateFormatType()); + } + datasetTableFieldDTO.setDeTypeCascader(deTypeCascader); + dimensionList.add(datasetTableFieldDTO); + }); + + datasetTableField.setGroupType("q"); - List quotaList = dataSetTableFieldsService.list(datasetTableField); + List quotaList = new ArrayList<>(); + dataSetTableFieldsService.list(datasetTableField).forEach(o -> { + DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO(); + BeanUtils.copyProperties(o, datasetTableFieldDTO); + List deTypeCascader = new ArrayList<>(); + deTypeCascader.add(datasetTableFieldDTO.getDeType()); + if (datasetTableFieldDTO.getDeExtractType() == 0 && datasetTableFieldDTO.getDeType() == 1) { + deTypeCascader.add(datasetTableFieldDTO.getDateFormatType()); + } + datasetTableFieldDTO.setDeTypeCascader(deTypeCascader); + quotaList.add(datasetTableFieldDTO); + }); DatasetTableField4Type datasetTableField4Type = new DatasetTableField4Type(); datasetTableField4Type.setDimensionList(dimensionList); diff --git a/backend/src/main/java/io/dataease/controller/response/DatasetTableField4Type.java b/backend/src/main/java/io/dataease/controller/response/DatasetTableField4Type.java index 5f1081716a..8dbc9421cf 100644 --- a/backend/src/main/java/io/dataease/controller/response/DatasetTableField4Type.java +++ b/backend/src/main/java/io/dataease/controller/response/DatasetTableField4Type.java @@ -1,6 +1,6 @@ package io.dataease.controller.response; -import io.dataease.plugins.common.base.domain.DatasetTableField; +import io.dataease.dto.dataset.DatasetTableFieldDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,7 +9,7 @@ import java.util.List; @Data public class DatasetTableField4Type { @ApiModelProperty("维度") - List dimensionList; + List dimensionList; @ApiModelProperty("指标") - List quotaList; + List quotaList; } diff --git a/backend/src/main/java/io/dataease/dto/dataset/DatasetTableFieldDTO.java b/backend/src/main/java/io/dataease/dto/dataset/DatasetTableFieldDTO.java index 83a65cb94d..f1455ae21d 100644 --- a/backend/src/main/java/io/dataease/dto/dataset/DatasetTableFieldDTO.java +++ b/backend/src/main/java/io/dataease/dto/dataset/DatasetTableFieldDTO.java @@ -3,7 +3,10 @@ package io.dataease.dto.dataset; import io.dataease.plugins.common.base.domain.DatasetTableField; import lombok.Data; +import java.util.List; + @Data public class DatasetTableFieldDTO extends DatasetTableField { private String jsonPath; + private List deTypeCascader; } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index e0ce934228..da97c6c019 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -41,6 +41,7 @@ import org.apache.commons.lang3.StringUtils; import org.quartz.*; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.web.util.HtmlUtils; import javax.annotation.Resource; import java.io.File; @@ -67,9 +68,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { protected JobDataMap jobDataMap(GlobalTaskEntity taskEntity) { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskEntity", taskEntity); - EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); - XpackEmailTemplateDTO emailTemplateDTO = emailXpackService.emailTemplate(taskEntity.getTaskId()); - jobDataMap.put("emailTemplate", emailTemplateDTO); + SysUserEntity creator = authUserServiceImpl.getUserByIdNoCache(taskEntity.getCreator()); jobDataMap.put("creator", creator); return jobDataMap; @@ -109,10 +108,9 @@ public class EmailTaskHandler extends TaskHandler implements Job { Long instanceId = saveInstance(taskInstance); taskInstance.setInstanceId(instanceId); - XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate"); SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator"); LogUtil.info("start execute send panel report task..."); - proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator, isTempTask); + proxy(taskEntity.getTaskType()).sendReport(taskInstance, creator, isTempTask); if (isTempTask) { removeTask(scheduleManager, taskEntity); } @@ -160,13 +158,14 @@ public class EmailTaskHandler extends TaskHandler implements Job { } @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { + public void sendReport(GlobalTaskInstance taskInstance, SysUserEntity user, Boolean isTempTask) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); SysUserService sysUserService = SpringContextUtil.getBean(SysUserService.class); List files = null; try { + XpackEmailTemplateDTO emailTemplateDTO = emailXpackService.emailTemplate(taskInstance.getTaskId()); XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); if (ObjectUtils.isEmpty(taskForm) || (!isTempTask && CronUtils.taskExpire(taskForm.getEndTime()))) { removeInstance(taskInstance); @@ -202,7 +201,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { String contentStr = ""; if (ObjectUtils.isNotEmpty(content)) { - contentStr = new String(content, "UTF-8"); + contentStr = HtmlUtils.htmlUnescape(new String(content, "UTF-8")); } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java index 5eff2cb4eb..79a53d3120 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java @@ -4,20 +4,17 @@ import io.dataease.auth.entity.SysUserEntity; import io.dataease.plugins.common.entity.GlobalTaskInstance; -import io.dataease.plugins.xpack.email.dto.response.XpackEmailTemplateDTO; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import javax.annotation.Resource; - @Service("emailTaskViewHandler") public class EmailTaskViewHandler extends EmailTaskHandler { @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { - super.sendReport(taskInstance, emailTemplateDTO, user, isTempTask); + public void sendReport(GlobalTaskInstance taskInstance, SysUserEntity user, Boolean isTempTask) { + super.sendReport(taskInstance, user, isTempTask); } } diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 1609e13d27..ecd35e8214 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.util.HtmlUtils; import springfox.documentation.annotations.ApiIgnore; import java.io.*; @@ -136,6 +137,9 @@ public class XEmailTaskServer { String emailContent; try { emailContent = new String(bytes, "UTF-8"); + if (StringUtils.isNotBlank(emailContent)) { + emailContent = HtmlUtils.htmlUnescape(emailContent); + } } catch (Exception e) { throw new RuntimeException(e); } @@ -176,7 +180,7 @@ public class XEmailTaskServer { } String imageUrl = "/system/ui/image/" + fileId; String html = "
" + - "

" + content + "

" + + content + "" + "
"; diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index afe3f3e316..28899c9d2e 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -1695,15 +1695,34 @@ public class ChartViewService { continue; } + Boolean isEndParam = false; for (String parameter : chartExtFilterRequest.getParameters()) { if (parameter.contains("|DE|")) { - if (!parameter.split("\\|DE\\|")[0].equals(table.getId())) { + String[] parameterArray = parameter.split("\\|DE\\|"); + if (!parameterArray[0].equals(table.getId())) { continue; } - List parameters = sqlVariables.stream().filter(item -> item.getVariableName().equalsIgnoreCase(parameter.split("\\|DE\\|")[1])).collect(Collectors.toList()); + String paramName = null; + if (parameterArray.length > 1) { + paramName = parameterArray[1]; + if (paramName.contains("_START_END_SPLIT")) { + String[] paramNameArray = paramName.split("_START_END_SPLIT"); + paramName = paramNameArray[0]; + isEndParam = true; + } + } else { + continue; + } + final String finalParamName = paramName; + List parameters = sqlVariables.stream().filter(item -> item.getVariableName().equalsIgnoreCase(finalParamName)).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(parameters)) { - String filter = qp.transFilter(chartExtFilterRequest, parameters.get(0)); - sql = sql.replace("${" + parameter.split("\\|DE\\|")[1] + "}", filter); + String filter = null; + if (isEndParam) { + filter = transEndParamSql(chartExtFilterRequest, parameters.get(0)); + } else { + filter = qp.transFilter(chartExtFilterRequest, parameters.get(0)); + } + sql = sql.replace("${" + finalParamName + "}", filter); } } else { List parameters = sqlVariables.stream().filter(item -> item.getVariableName().equalsIgnoreCase(parameter)).collect(Collectors.toList()); @@ -1719,6 +1738,11 @@ public class ChartViewService { return sql; } + public String transEndParamSql(ChartExtFilterRequest chartExtFilterRequest, SqlVariableDetails sqlVariableDetails) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sqlVariableDetails.getType().size() > 1 ? sqlVariableDetails.getType().get(1) : "YYYY"); + return simpleDateFormat.format(new Date(Long.parseLong(chartExtFilterRequest.getValue().get(1)))); + } + private String getDrillSort(List xAxis, ChartViewFieldDTO field) { String res = ""; for (ChartViewFieldDTO f : xAxis) { diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 85a8ccf334..81d1e820a9 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -65,49 +65,49 @@ management.health.redis.enabled=false #management.server.port=8083 #management.endpoints.web.exposure.include=* #spring.freemarker.checkTemplateLocation=false -#RSA非对称加密参数:私钥 +#RSA\u975E\u5BF9\u79F0\u52A0\u5BC6\u53C2\u6570\uFF1A\u79C1\u94A5 rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== rsa.public_key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ== #spring.cache.type=ehcache spring.cache.ehcache.config=classpath:/ehcache/ehcache.xml -#打印URL路径 +#\u6253\u5370URL\u8DEF\u5F84 #logging.level.org.springframework.web=trace #logging.level.org.springframework.boot.web=trace #spring.mvc.log-request-details=true pagehelper.PageRowBounds=true -#excel等用户上传文件路径 +#excel\u7B49\u7528\u6237\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84 upload.file.path=/opt/dataease/data/kettle/ -dataease.sqlinjection.whitelists=/dataset/table/sqlPreview,/dataset/table/update +dataease.sqlinjection.whitelists=/dataset/table/sqlPreview,/dataset/table/update,/dataset/field/multFieldValues,/dataset/field/linkMultFieldValues -#开启压缩 提高响应速度 减少带宽压力 +#\u5F00\u542F\u538B\u7F29 \u63D0\u9AD8\u54CD\u5E94\u901F\u5EA6 \u51CF\u5C11\u5E26\u5BBD\u538B\u529B server.compression.enabled=true server.compression.mime-types=application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain server.compression.min-response-size=1024 -#下面的配置新增到/opt/dataease/conf/dataease/properties -#缓存类型 +#\u4E0B\u9762\u7684\u914D\u7F6E\u65B0\u589E\u5230/opt/dataease/conf/dataease/properties +#\u7F13\u5B58\u7C7B\u578B ##spring.cache.type=redis #spring.cache.type=ehcache -#redis公共配置 +#redis\u516C\u5171\u914D\u7F6E #spring.redis.timeout=10000 #spring.redis.lettuce.pool.max-active=8 #spring.redis.lettuce.pool.max-wait=-1 #spring.redis.lettuce.pool.max-idle=8 -#单机模式redis配置 +#\u5355\u673A\u6A21\u5F0Fredis\u914D\u7F6E #spring.redis.database=0 #spring.redis.host=192.168.0.110 #spring.redis.port=6379 #spring.redis.password=DataEase_ZNB@REDIS -#哨兵模式redis配置 +#\u54E8\u5175\u6A21\u5F0Fredis\u914D\u7F6E #spring.redis.sentinel.master=mymaster #spring.redis.sentinel.nodes=192.168.0.110:26379,192.168.0.110:26380,192.168.0.110:26381 #spring.redis.sentinel.password= -#cluster模式redis配置 +#cluster\u6A21\u5F0Fredis\u914D\u7F6E #spring.redis.cluster.nodes=192.168.0.110:7001,192.168.0.110:7002,192.168.0.110:7003,192.168.0.110:7004,192.168.0.110:7005,192.168.0.110:7006 #spring.redis.cluster.max-redirects=3 #spring.redis.password=DataEase_ZNB@REDIS diff --git a/backend/src/main/resources/db/migration/V44__1.17.sql b/backend/src/main/resources/db/migration/V44__1.17.sql index 30b3206948..0de7b7ddc4 100644 --- a/backend/src/main/resources/db/migration/V44__1.17.sql +++ b/backend/src/main/resources/db/migration/V44__1.17.sql @@ -39,3 +39,9 @@ WHERE (`component` = 'msg/setting'); ALTER TABLE `panel_group` ADD COLUMN `panel_sort` bigint(13) NULL COMMENT '排序' AFTER `watermark_open`; + +ALTER TABLE `sys_task_email` + CHANGE COLUMN `content` `content` MEDIUMBLOB NULL DEFAULT NULL COMMENT '内容' ; + +ALTER TABLE `dataset_table_field` + ADD COLUMN `date_format_type` VARCHAR(255) NULL COMMENT '时间格式类型' AFTER `date_format`; diff --git a/frontend/src/api/panel/share.js b/frontend/src/api/panel/share.js index e711dc0a44..16bef88d09 100644 --- a/frontend/src/api/panel/share.js +++ b/frontend/src/api/panel/share.js @@ -38,7 +38,7 @@ export function loadShares(data) { return request({ url: '/api/share/queryWithResourceId', method: 'post', - loading: true, + loading: false, data }) } diff --git a/frontend/src/api/system/dept.js b/frontend/src/api/system/dept.js index 1937d17234..9ab0075afb 100644 --- a/frontend/src/api/system/dept.js +++ b/frontend/src/api/system/dept.js @@ -13,7 +13,7 @@ export function loadTable(data) { url: 'api/dept/search', method: 'post', data, - loading: true + loading: false }) } diff --git a/frontend/src/components/canvas/components/editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/editor/ComponentWrapper.vue index 45a0b017b1..639bb5f740 100644 --- a/frontend/src/components/canvas/components/editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/editor/ComponentWrapper.vue @@ -199,14 +199,18 @@ export default { return style }, componentActiveFlag() { - return !this.mobileLayoutStatus && ((this.curComponent && this.config === this.curComponent && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing')) + return !this.mobileLayoutStatus && ((this.curComponent && this.config.id === this.curComponent.id && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing')) + }, + scale() { + return Math.min(this.previewCanvasScale.scalePointWidth, this.previewCanvasScale.scalePointHeight) }, curGap() { - return (this.canvasStyleData.panel.gap === 'yes' && this.config.auxiliaryMatrix) ? this.componentGap : 0 + return ((this.canvasStyleData.panel.gap === 'yes' && this.config.auxiliaryMatrix) ? this.componentGap : 0) * this.scale }, ...mapState([ 'mobileLayoutStatus', 'curComponent', + 'previewCanvasScale', 'componentGap' ]) }, diff --git a/frontend/src/components/canvas/components/editor/Preview.vue b/frontend/src/components/canvas/components/editor/Preview.vue index 4ad3d7717a..729bffbb40 100644 --- a/frontend/src/components/canvas/components/editor/Preview.vue +++ b/frontend/src/components/canvas/components/editor/Preview.vue @@ -1,10 +1,6 @@ {{ - $t('dataset.value') + '(' + $t('dataset.float') + ')' - }} + $t('dataset.value') + '(' + $t('dataset.float') + ')' + }} {{ - $t('dataset.calc_field') - }} + $t('dataset.calc_field') + }} @@ -356,7 +356,7 @@ " command="copy" > - + {{ $t('dataset.copy') }} - + {{ $t('chart.delete') }} @@ -470,30 +470,30 @@ " > {{ - $t('dataset.calc_field') - }} + $t('dataset.calc_field') + }} {{ - $t('dataset.value') + '(' + $t('dataset.float') + ')' - }} + $t('dataset.value') + '(' + $t('dataset.float') + ')' + }} {{ - $t('dataset.calc_field') - }} + $t('dataset.calc_field') + }} @@ -689,7 +689,7 @@ " command="copy" > - + {{ $t('dataset.copy') }} - + {{ $t('chart.delete') }} @@ -742,7 +742,7 @@ diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index 1634189267..f6cc43b511 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -790,8 +790,8 @@ export default { } }, created() { - // Global listening for key events listenGlobalKeyDown() + document.addEventListener('paste', this.passFromClipboard) }, mounted() { this.initWatermark() @@ -808,6 +808,7 @@ export default { this.init(this.$store.state.panel.panelInfo.id) }, beforeDestroy() { + document.removeEventListener('paste', this.passFromClipboard) bus.$off('component-on-drag', this.componentOnDrag) // bus.$off('component-dialog-edit', this.editDialog) // bus.$off('button-dialog-edit', this.editButtonDialog) @@ -821,6 +822,14 @@ export default { elx && elx.remove() }, methods: { + passFromClipboard(event) { + // 获取解析 粘贴的文本 + const text = (event.clipboardData || window.clipboardData).getData('text') + if (text && text.includes('datease-component-')) { + event.preventDefault() + this.$store.commit('passFromClipboard', text.replace('datease-component-', '')) + } + }, initWatermark() { if (this.panelInfo.watermarkInfo) { userLoginInfo().then(res => { diff --git a/frontend/src/views/panel/filter/filterMain/FilterControl.vue b/frontend/src/views/panel/filter/filterMain/FilterControl.vue index d054c00185..d6dfacc517 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterControl.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterControl.vue @@ -169,7 +169,51 @@ width="200" >
- + + + + +
+ {{ item.alias }} + + {{ item.alias }} + +
+ +
+
+
+
+ 0) { + if (showFirst && this.defaultData && this.defaultData.length > 0) { this.activeDefaultNodeAndClickOnly(this.defaultData[0].id) } } @@ -935,7 +935,7 @@ export default { localStorage.setItem('panel-default-tree', JSON.stringify(res.data)) if (!userCache) { this.defaultData = res.data - if (showFirst && this.defaultData.length > 0) { + if (showFirst && this.defaultData && this.defaultData.length > 0) { this.activeDefaultNodeAndClickOnly(this.defaultData[0].id) } } diff --git a/frontend/src/views/panel/subjectSetting/panelStyle/PanelColorSelector.vue b/frontend/src/views/panel/subjectSetting/panelStyle/PanelColorSelector.vue index 421557c96c..7960725df9 100644 --- a/frontend/src/views/panel/subjectSetting/panelStyle/PanelColorSelector.vue +++ b/frontend/src/views/panel/subjectSetting/panelStyle/PanelColorSelector.vue @@ -190,6 +190,19 @@ @change="changeColorCase('tableBorderColor')" /> + + +