diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java index 1b7f75132f..635da3b188 100644 --- a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java @@ -45,4 +45,5 @@ public class ChartViewDTO extends ChartViewWithBLOBs { private long totalPage; private long totalItems; private int datasetMode; + private String datasourceType; } diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index c3ce406b2d..6cdf6d874c 100644 --- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -405,7 +405,7 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLWithPage(boolean isTable, String table, List orgXAxis, List OrgFeldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + public String getSQLWithPage(boolean isTable, String table, List orgXAxis, List OrgFieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { List xAxis = new ArrayList<>(); orgXAxis.forEach(chartViewFieldDTO -> { xAxis.add(chartViewFieldDTO); @@ -416,7 +416,7 @@ public class OracleQueryProvider extends QueryProvider { List fieldCustomFilter = new ArrayList<>(); - for (ChartFieldCustomFilterDTO chartFieldCustomFilterDTO : OrgFeldCustomFilter) { + for (ChartFieldCustomFilterDTO chartFieldCustomFilterDTO : OrgFieldCustomFilter) { fieldCustomFilter.add(chartFieldCustomFilterDTO); } ChartFieldCustomFilterDTO chartFieldCustomFilterDTO = new ChartFieldCustomFilterDTO(); 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 28899c9d2e..884566c6eb 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -302,6 +302,8 @@ public class ChartViewService { DatasetTable datasetTable = dataSetTableService.get(view.getTableId()); if (ObjectUtils.isNotEmpty(datasetTable)) { view.setDatasetMode(datasetTable.getMode()); + Datasource datasource = datasourceService.get(datasetTable.getDataSourceId()); + view.setDatasourceType(datasource != null ? datasource.getType() : null); } // 如果是从仪表板获取视图数据,则仪表板的查询模式,查询结果的数量,覆盖视图对应的属性 if (CommonConstants.VIEW_RESULT_MODE.CUSTOM.equals(request.getResultMode())) { diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 9bea1637f4..97c899720c 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -2865,7 +2865,10 @@ public class DataSetTableService { tree = gson.fromJson(request.getExpressionTree(), DatasetRowPermissionsTreeObj.class); permissionsTreeService.getField(tree); } - Map previewData = getPreviewData(request, 1, 100000, null, tree); + Datasource datasource = datasourceService.get(request.getDataSourceId()); + int pageSize = (datasource != null && StringUtils.equalsIgnoreCase(datasource.getType(), "es")) ? 10000 : 100000; + request.setRow(String.valueOf(pageSize)); + Map previewData = getPreviewData(request, 1, pageSize, null, tree); List fields = (List) previewData.get("fields"); List> data = (List>) previewData.get("data"); // 构建Excel数据格式 diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index 5ad6ab684e..a6e418bc6e 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -222,6 +222,10 @@ public class PanelGroupService { } else { // 更新 + if (StringUtils.isBlank(request.getPid())) { + PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(request.getId()); + request.setPid(panel.getPid()); + } if (StringUtils.isNotEmpty(request.getName())) { checkPanelName(request.getName(), request.getPid(), PanelConstants.OPT_TYPE_UPDATE, request.getId(), request.getNodeType()); } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index de5eafc195..bc8f5acbb8 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,8 +1,6 @@ spring.profiles.active=@profiles.active@ spring.application.name=dataease - server.port=8081 - # Hikari spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.minimum-idle=5 @@ -13,7 +11,6 @@ spring.datasource.hikari.pool-name=DatebookHikariCP spring.datasource.hikari.max-lifetime=1800000 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1 - # mybatis mybatis.configuration.cache-enabled=true mybatis.configuration.lazy-loading-enabled=false @@ -23,7 +20,6 @@ mybatis.configuration.use-column-label=true mybatis.configuration.auto-mapping-behavior=full mybatis.configuration.default-statement-timeout=25000 mybatis.configuration.map-underscore-to-camel-case=true - # knife4j knife4j.enable=true knife4j.setting.enableFooter=false @@ -34,14 +30,10 @@ knife4j.setting.enableDocumentManage=false knife4j.setting.enableSearch=false knife4j.setting.enableOpenApi=false knife4j.setting.enableAfterScript=false - version=@project.version@ - logging.file.path=/opt/dataease/logs/${spring.application.name} - # view spring.resources.static-locations=classpath:/templates/,classpath:/static/ - # flyway enable spring.flyway.enabled=true spring.flyway.baseline-on-migrate=true @@ -50,11 +42,9 @@ spring.flyway.table=dataease_version spring.flyway.baseline-version=0 spring.flyway.encoding=UTF-8 spring.flyway.validate-on-migrate=false +spring.flyway.placeholderReplacement=false spring.kafka.listener.missing-topics-fatal=false -spring.flyway.placeholder-replacement=false - spring.messages.basename=i18n/messages - # quartz quartz.enabled=true quartz.scheduler-name=deServerJob @@ -78,15 +68,11 @@ spring.cache.ehcache.config=classpath:/ehcache/ehcache.xml pagehelper.PageRowBounds=true #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,/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 - #\u4E0B\u9762\u7684\u914D\u7F6E\u65B0\u589E\u5230/opt/dataease/conf/dataease/properties #\u7F13\u5B58\u7C7B\u578B ##spring.cache.type=redis @@ -96,25 +82,19 @@ server.compression.min-response-size=1024 #spring.redis.lettuce.pool.max-active=8 #spring.redis.lettuce.pool.max-wait=-1 #spring.redis.lettuce.pool.max-idle=8 - #\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 - #\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\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 - - - server.servlet.context-parameters.configurationStrategy=SYSTEM_PROPERTIES server.servlet.session.cookie.http-only=true server.servlet.session.tracking-modes=cookie diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue index 4e0eab71aa..5a8aa76f9e 100644 --- a/frontend/src/components/canvas/DeCanvas.vue +++ b/frontend/src/components/canvas/DeCanvas.vue @@ -8,7 +8,6 @@ @mouseup="deselectCurComponent" @scroll="canvasScroll" > - - + @@ -47,7 +47,7 @@ :value="item.value" > - + {{ item.label }} @@ -100,7 +100,7 @@ -
+
-
+
-
+
- +
@@ -327,7 +327,7 @@ style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;" > - +
@@ -336,7 +336,7 @@ style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;" > - +
- +
@@ -465,7 +465,7 @@ export default { mainWidthOffset: 600, initFontSize: 12, initActiveFontSize: 18, - miniFontSize: 0, + miniFontSize: 12, maxFontSize: 128, textAlignOptions: [ { diff --git a/frontend/src/components/canvas/components/editor/DeEditor.vue b/frontend/src/components/canvas/components/editor/DeEditor.vue index 07d86d0b33..661432bfe1 100644 --- a/frontend/src/components/canvas/components/editor/DeEditor.vue +++ b/frontend/src/components/canvas/components/editor/DeEditor.vue @@ -121,7 +121,7 @@ :canvas-id="canvasId" /> - + { + if (_this.screenShotStatues) { + _this.initWatermark('preview-temp-canvas-main') + } else { + _this.initWatermark() + } + }) + } } }, created() { @@ -377,12 +393,16 @@ export default { bus.$off('trigger-reset-button', this.triggerResetButton) }, methods: { - initWatermark() { + initWatermark(waterDomId = 'preview-main-canvas-main') { if (this.panelInfo.watermarkInfo && this.canvasId === 'canvas-main') { - userLoginInfo().then(res => { - const userInfo = res.data - activeWatermark(this.panelInfo.watermarkInfo.settingContent, userInfo, 'preview-main-canvas-main', this.canvasId, this.panelInfo.watermarkOpen) - }) + if (this.userInfo) { + activeWatermark(this.panelInfo.watermarkInfo.settingContent, this.userInfo, waterDomId, this.canvasId, this.panelInfo.watermarkOpen) + } else { + userLoginInfo().then(res => { + this.userInfo = res.data + activeWatermark(this.panelInfo.watermarkInfo.settingContent, this.userInfo, waterDomId, this.canvasId, this.panelInfo.watermarkOpen) + }) + } } }, isMainCanvas() { @@ -606,6 +626,7 @@ export default { _this.$nextTick(() => { // 将mainHeight 修改为px 临时解决html2canvas 截图不全的问题 _this.mainHeight = tempCanvas.scrollHeight + 'px!important' + _this.mainHeightCount = tempCanvas.scrollHeight this.$emit('mainHeightChange', _this.mainHeight) }) }) diff --git a/frontend/src/components/canvas/components/editor/SettingMenu.vue b/frontend/src/components/canvas/components/editor/SettingMenu.vue index c1c1ac35bd..038d2ea8e9 100644 --- a/frontend/src/components/canvas/components/editor/SettingMenu.vue +++ b/frontend/src/components/canvas/components/editor/SettingMenu.vue @@ -5,7 +5,7 @@ trigger="click" @mouseup="handleMouseUp" > - + - {{ $t('panel.level') }} + {{ $t('panel.level') }} - + {{ $t('panel.hyperlinks') }} - + {{ $t('panel.position_adjust') }} diff --git a/frontend/src/components/canvas/customComponent/UserView.vue b/frontend/src/components/canvas/customComponent/UserView.vue index 2c5988c915..c9a5137afd 100644 --- a/frontend/src/components/canvas/customComponent/UserView.vue +++ b/frontend/src/components/canvas/customComponent/UserView.vue @@ -574,6 +574,9 @@ export default { const updateParams = { 'id': this.chart.id } if (param.custom === 'customAttr') { const sourceCustomAttr = JSON.parse(this.sourceCustomAttrStr) + if (!sourceCustomAttr[param.property]) { + this.$set(sourceCustomAttr, param.property, {}) + } sourceCustomAttr[param.property][param.value.modifyName] = param.value[param.value.modifyName] this.sourceCustomAttrStr = JSON.stringify(sourceCustomAttr) this.chart.customAttr = this.sourceCustomAttrStr @@ -650,7 +653,12 @@ export default { }, clearPanelLinkage(param) { if (param.viewId === 'all' || param.viewId === this.element.propValue.viewId) { - this.$refs[this.element.propValue.id].reDrawView() + try { + this.$refs[this.element.propValue.id].reDrawView() + } catch (e) { + console.error('reDrawView-error:', this.element.propValue.id) + } + } }, bindPluginEvent() { diff --git a/frontend/src/components/canvas/store/copy.js b/frontend/src/components/canvas/store/copy.js index e9b6694ded..0912e41475 100644 --- a/frontend/src/components/canvas/store/copy.js +++ b/frontend/src/components/canvas/store/copy.js @@ -88,6 +88,8 @@ export default { component.style.width = width component.style.height = height } + component['canvasId'] = 'canvas-main' + component['canvasPid'] = '0' state.copyData = { data: component, index: index diff --git a/frontend/src/components/canvas/tools/watermark.js b/frontend/src/components/canvas/tools/watermark.js index ab14bb5e60..a70aa07757 100644 --- a/frontend/src/components/canvas/tools/watermark.js +++ b/frontend/src/components/canvas/tools/watermark.js @@ -71,7 +71,7 @@ export function watermark(settings, domId) { mask_div.style.left = x + 'px' mask_div.style.top = y + 'px' mask_div.style.overflow = 'hidden' - mask_div.style.zIndex = '9999' + mask_div.style.zIndex = '10' // 让水印不遮挡页面的点击事件 mask_div.style.pointerEvents = 'none' mask_div.style.opacity = defaultSettings.watermark_alpha @@ -124,7 +124,7 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w if (watermarkForm.type === 'custom') { watermark_txt = watermarkForm.content watermark_txt = watermark_txt.replaceAll('${ip}', userLoginInfo.ip) - watermark_txt = watermark_txt.replaceAll('${userName}', userLoginInfo.userInfo.userName) + watermark_txt = watermark_txt.replaceAll('${username}', userLoginInfo.userInfo.username) watermark_txt = watermark_txt.replaceAll('${nickName}', userLoginInfo.userInfo.nickName) watermark_txt = watermark_txt.replaceAll('${time}', getNow()) watermark_width = watermark_txt.length * watermarkForm.watermark_fontsize * 0.75 @@ -138,7 +138,7 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w watermark_txt = getNow() watermark_width = 200 } else { - watermark_txt = userLoginInfo.userInfo.userName + watermark_txt = userLoginInfo.userInfo.username } const settings = { watermark_txt: watermark_txt, diff --git a/frontend/src/components/deDrag/PointShadow.vue b/frontend/src/components/deDrag/PointShadow.vue index 569c968315..234fe13b92 100644 --- a/frontend/src/components/deDrag/PointShadow.vue +++ b/frontend/src/components/deDrag/PointShadow.vue @@ -64,10 +64,6 @@ export default { this.init() }, beforeDestroy() { - // const targetComponent = document.getElementById(this.componentCanvasId) - // const domId = 'dragContent-' + this.curComponent.id - // console.log('domId='+domId) - // document.getElementById(domId).appendChild(targetComponent) }, methods: { init() { diff --git a/frontend/src/components/widget/deWidget/DeTabs.vue b/frontend/src/components/widget/deWidget/DeTabs.vue index 60c25fda40..eae0d0c38e 100644 --- a/frontend/src/components/widget/deWidget/DeTabs.vue +++ b/frontend/src/components/widget/deWidget/DeTabs.vue @@ -202,7 +202,7 @@ = 2 || extAxis?.length > 0 switch (strategy) { case 'breakLine': { + options.connectNulls = false if (multiDimension) { // 多维度线条断开 - handleBreakLineMultiDimension(chart, data, options) - } else { - // 单维度线条断开 - options.connectNulls = false + handleBreakLineMultiDimension(chart, data) } break } @@ -3446,8 +3445,7 @@ export function handleEmptyDataStrategy(strategy, chart, data, options) { } } -function handleBreakLineMultiDimension(chart, data, options) { - options.connectNulls = false +function handleBreakLineMultiDimension(chart, data) { const dimensionInfoMap = new Map() const subDimensionSet = new Set() for (let i = 0; i < data.length; i++) { @@ -3464,15 +3462,18 @@ function handleBreakLineMultiDimension(chart, data, options) { let insertCount = 0 dimensionInfoMap.forEach((dimensionInfo, field) => { if (dimensionInfo.set.size < subDimensionSet.size) { - const toBeFillDimension = [...subDimensionSet].filter(item => !dimensionInfo.set.has(item)) - toBeFillDimension.forEach(dimension => { - data.splice(dimensionInfo.index + insertCount, 0, { - field, - value: null, - category: dimension - }) + let subInsertIndex = 0 + subDimensionSet.forEach(dimension => { + if (!dimensionInfo.set.has(dimension)) { + data.splice(dimensionInfo.index + insertCount + subInsertIndex, 0, { + field, + value: null, + category: dimension + }) + } + subInsertIndex++ }) - insertCount += toBeFillDimension.size + insertCount += subDimensionSet.size - dimensionInfo.set.size } }) } diff --git a/frontend/src/views/chart/components/ChartComponent.vue b/frontend/src/views/chart/components/ChartComponent.vue index 1c8cedf253..a3f0cc1153 100644 --- a/frontend/src/views/chart/components/ChartComponent.vue +++ b/frontend/src/views/chart/components/ChartComponent.vue @@ -57,6 +57,7 @@ import { reverseColor } from '../chart/common/common' import MapController from './map/MapController.vue' import { mapState } from 'vuex' import bus from '@/utils/bus' + export default { name: 'ChartComponent', components: { @@ -180,16 +181,18 @@ export default { this.currentSeriesId = seriesId }, reDrawView() { - this.myChart.dispatchAction({ - type: 'unselect', - seriesIndex: this.linkageActiveParam.seriesIndex, - name: this.linkageActiveParam.name - }) - this.myChart.dispatchAction({ - type: 'downplay', - seriesIndex: this.linkageActiveParam.seriesIndex, - name: this.linkageActiveParam.name - }) + if (this.linkageActiveParam) { + this.myChart.dispatchAction({ + type: 'unselect', + seriesIndex: this.linkageActiveParam.seriesIndex, + name: this.linkageActiveParam.name + }) + this.myChart.dispatchAction({ + type: 'downplay', + seriesIndex: this.linkageActiveParam.seriesIndex, + name: this.linkageActiveParam.name + }) + } this.linkageActiveParam = null }, linkageActive() { diff --git a/frontend/src/views/chart/components/ChartComponentS2.vue b/frontend/src/views/chart/components/ChartComponentS2.vue index d8e0a556c2..39c91a2c90 100644 --- a/frontend/src/views/chart/components/ChartComponentS2.vue +++ b/frontend/src/views/chart/components/ChartComponentS2.vue @@ -92,7 +92,7 @@ import ViewTrackBar from '@/components/canvas/components/editor/ViewTrackBar' import { getRemark, hexColorToRGBA } from '@/views/chart/chart/util' import { baseTableInfo, baseTableNormal, baseTablePivot } from '@/views/chart/chart/table/table-info' import TitleRemark from '@/views/chart/view/TitleRemark' -import { DEFAULT_TITLE_STYLE } from '@/views/chart/chart/chart' +import { DEFAULT_TITLE_STYLE, NOT_SUPPORT_PAGE_DATASET } from '@/views/chart/chart/chart' import ChartTitleUpdate from './ChartTitleUpdate.vue' import { mapState } from 'vuex' @@ -234,7 +234,7 @@ export default { const attr = JSON.parse(this.chart.customAttr) this.currentPage.pageSize = parseInt(attr.size.tablePageSize ? attr.size.tablePageSize : 20) data = JSON.parse(JSON.stringify(this.chart.data.tableRow)) - if (this.chart.datasetMode === 0) { + if (this.chart.datasetMode === 0 && !NOT_SUPPORT_PAGE_DATASET.includes(this.chart.datasourceType)) { if (this.chart.type === 'table-info' && (attr.size.tablePageMode === 'page' || !attr.size.tablePageMode) && this.chart.totalItems > this.currentPage.pageSize) { this.currentPage.show = this.chart.totalItems this.showPage = true @@ -455,7 +455,7 @@ export default { }, pageChange(val) { this.currentPage.pageSize = val - if (this.chart.datasetMode === 0) { + if (this.chart.datasetMode === 0 && !NOT_SUPPORT_PAGE_DATASET.includes(this.chart.datasourceType)) { this.$emit('onPageChange', this.currentPage) } else { this.initData() @@ -465,7 +465,7 @@ export default { pageClick(val) { this.currentPage.page = val - if (this.chart.datasetMode === 0) { + if (this.chart.datasetMode === 0 && !NOT_SUPPORT_PAGE_DATASET.includes(this.chart.datasourceType)) { this.$emit('onPageChange', this.currentPage) } else { this.initData() diff --git a/frontend/src/views/chart/components/table/TableNormal.vue b/frontend/src/views/chart/components/table/TableNormal.vue index c67a5b74ac..d99837281f 100644 --- a/frontend/src/views/chart/components/table/TableNormal.vue +++ b/frontend/src/views/chart/components/table/TableNormal.vue @@ -79,7 +79,7 @@