From 3f8088d9b4a1454a3000231a33a5190b71594f15 Mon Sep 17 00:00:00 2001 From: xuwei-fit2cloud Date: Wed, 13 Oct 2021 17:46:42 +0800 Subject: [PATCH 001/190] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 12c3980b2c..ec6fcb0210 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,17 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数 - 秒级响应:集成 Apache Doris,超大数据量下秒级查询返回延时; - 安全分享:支持多种数据分享方式,确保数据安全。 +### DataEase 已支持的数据源: + +- MySQL +- Oracle +- SQL Server +- PostgreSQL +- Elasticsearch +- MariaDB +- Doris +- ClickHouse + ## UI 展示 ![de-ui](https://www.fit2cloud.com/dataease/images/screenshot/dataease-v1.gif) From 6f8e75601cf8ab2dcc36a5185fdde59d246e96f0 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 13 Oct 2021 18:44:07 +0800 Subject: [PATCH 002/190] =?UTF-8?q?fix:=20=E3=80=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E3=80=91=E8=BF=BD=E5=8A=A0excel=E6=97=B6=E5=88=9B?= =?UTF-8?q?=E5=BB=BAexcel=E6=8F=90=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/dataset/add/AddExcel.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/dataset/add/AddExcel.vue b/frontend/src/views/dataset/add/AddExcel.vue index 4ec282d36b..79133cbc06 100644 --- a/frontend/src/views/dataset/add/AddExcel.vue +++ b/frontend/src/views/dataset/add/AddExcel.vue @@ -165,7 +165,7 @@ export default { }, tableId: { type: String, - default: null + default: '' }, editType: { type: Number, From 131d964546951f0c621a0dc5d87e91fa5ac2e885 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 14 Oct 2021 10:16:31 +0800 Subject: [PATCH 003/190] =?UTF-8?q?fix:=20excel=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=AD=97=E6=AE=B5=E6=A0=87=E7=A4=BA=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E9=87=8D=E6=96=B0=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/dataset/data/TabDataPreview.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/dataset/data/TabDataPreview.vue b/frontend/src/views/dataset/data/TabDataPreview.vue index c849810db2..e839cda85d 100644 --- a/frontend/src/views/dataset/data/TabDataPreview.vue +++ b/frontend/src/views/dataset/data/TabDataPreview.vue @@ -22,7 +22,7 @@ > Date: Thu, 14 Oct 2021 11:18:22 +0800 Subject: [PATCH 004/190] =?UTF-8?q?fix:=20=E8=AF=86=E5=88=ABes=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/datasource/provider/EsProvider.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java b/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java index dba8980fca..69948926f0 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java @@ -231,16 +231,17 @@ public class EsProvider extends DatasourceProvider { throw new Exception(JSONObject.parseObject(response).getJSONObject("error").getString("reason")); } String version = JSONObject.parseObject(response).getJSONObject("version").getString("number"); - if(Integer.valueOf(version.substring(0,1)) < 6 ){ + + if(Integer.valueOf(version.split("\\.")[0]) < 6 ){ throw new Exception(Translator.get("i18n_es_limit")); } - if(Integer.valueOf(version.substring(2,3)) < 3 ){ + if(Integer.valueOf(version.split("\\.")[1]) < 3 ){ throw new Exception(Translator.get("i18n_es_limit")); } - if(Integer.valueOf(version.substring(0,1)) == 6 ) { + if(Integer.valueOf(version.split("\\.")[0]) == 6 ) { esConfiguration.setUri("_xpack/sql"); } - if(Integer.valueOf(version.substring(0,1)) == 7 ) { + if(Integer.valueOf(version.split("\\.")[0]) == 7 ) { esConfiguration.setUri("_sql"); } datasourceRequest.getDatasource().setConfiguration(new Gson().toJson(esConfiguration)); From c06725a8abcf77d21db2648c0f69b4cc40718d6b Mon Sep 17 00:00:00 2001 From: maninhill <41712985+maninhill@users.noreply.github.com> Date: Thu, 14 Oct 2021 11:55:56 +0800 Subject: [PATCH 005/190] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ec6fcb0210..f5a37f3bab 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,18 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数 ### DataEase 已支持的数据源: +- Excel - MySQL - Oracle - SQL Server - PostgreSQL - Elasticsearch - MariaDB -- Doris +- Apache Doris - ClickHouse +> 更多数据源支持持续增加中... + ## UI 展示 ![de-ui](https://www.fit2cloud.com/dataease/images/screenshot/dataease-v1.gif) From c274aece5b1519c2dd41848573cd48fbeffadcfa Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Oct 2021 14:40:41 +0800 Subject: [PATCH 006/190] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95main=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/commons/utils/ExcelReaderUtil.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java b/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java index 0f866bd233..d44ccbd1ce 100644 --- a/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java +++ b/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java @@ -1,9 +1,6 @@ package io.dataease.commons.utils; import com.google.gson.Gson; import io.dataease.datasource.dto.TableFiled; -import org.apache.poi.hssf.usermodel.HSSFCell; - -import java.io.FileInputStream; import java.io.InputStream; import java.util.List; @@ -70,10 +67,10 @@ public class ExcelReaderUtil { } } - public static void main(String[] args) throws Exception { + /* public static void main(String[] args) throws Exception { String file ="各省市GDP-表格_加内容.xlsx"; ExcelReaderUtil.readExcel(file, new FileInputStream("/Users/taojinlong/Desktop/" + file)); - } + } */ } From 74ec45a45856e6a12f8ef0aa69ce63adccae7302 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Oct 2021 14:41:28 +0800 Subject: [PATCH 007/190] =?UTF-8?q?fix:=20=E4=B8=8B=E6=8B=89=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E9=80=89=E9=A1=B9=E5=AE=BD=E5=BA=A6=E6=97=A0=E9=99=90?= =?UTF-8?q?=E5=AE=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/widget/DeWidget/DeSelect.vue | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index 2c8470b6b6..602711bbaa 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -10,13 +10,17 @@ :placeholder="$t(options.attrs.placeholder)" :popper-append-to-body="inScreen" @change="changeValue" + @focus="setOptionWidth" > + > + {{ item[options.attrs.label] }} + @@ -43,7 +47,8 @@ export default { data() { return { options: null, - showNumber: false + showNumber: false, + selectOptionWidth: 0 } }, computed: { @@ -119,6 +124,12 @@ export default { text: item } }) + }, + setOptionWidth(event) { + // 下拉框弹出时,设置弹框的宽度 + this.$nextTick(() => { + this.selectOptionWidth = event.srcElement.offsetWidth + 'px' + }) } } From 03ab93664d3b46d30cae6e3c1ff4a8a058b9e39c Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Oct 2021 14:58:35 +0800 Subject: [PATCH 008/190] =?UTF-8?q?fix:=20=E4=BB=AA=E8=A1=A8=E6=9D=BF?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E5=8D=A1=E6=9C=AA=E9=80=89=E6=8B=A9=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E6=97=B6=E6=8B=96=E5=8A=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/canvas/custom-component/UserView.vue | 5 ++++- frontend/src/components/widget/DeWidget/DeTabs.vue | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index f05cbdcffa..bb197ccc33 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -211,7 +211,10 @@ export default { created() { this.refId = uuid.v1 // this.filter.filter = this.$store.getters.conditions - this.getData(this.element.propValue.viewId) + if (this.element && this.element.propValue && this.element.propValue.viewId) { + this.getData(this.element.propValue.viewId) + } + // this.initAreas() }, mounted() { diff --git a/frontend/src/components/widget/DeWidget/DeTabs.vue b/frontend/src/components/widget/DeWidget/DeTabs.vue index 18fa38d54a..fbeea71071 100644 --- a/frontend/src/components/widget/DeWidget/DeTabs.vue +++ b/frontend/src/components/widget/DeWidget/DeTabs.vue @@ -35,7 +35,7 @@
- +
From 6e2dd0187be1469bda83a0de9053d53ce8975355 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 14 Oct 2021 16:44:51 +0800 Subject: [PATCH 009/190] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=96=87=E6=9C=AC=E8=B6=85=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canvas/components/Editor/Hyperlinks.vue | 120 ++++++ .../components/canvas/components/TextAttr.vue | 18 +- .../canvas/custom-component/VText.vue | 15 +- .../canvas/custom-component/component-list.js | 8 + frontend/src/lang/en.js | 8 +- frontend/src/lang/tw.js | 8 +- frontend/src/lang/zh.js | 8 +- frontend/src/styles/deicon/demo_index.html | 400 ++++++++++-------- frontend/src/styles/deicon/iconfont.css | 14 +- frontend/src/styles/deicon/iconfont.js | 2 +- frontend/src/styles/deicon/iconfont.json | 14 + frontend/src/styles/deicon/iconfont.ttf | Bin 16320 -> 17284 bytes frontend/src/styles/deicon/iconfont.woff | Bin 17537 -> 10628 bytes frontend/src/styles/deicon/iconfont.woff2 | Bin 8360 -> 8940 bytes 14 files changed, 424 insertions(+), 191 deletions(-) create mode 100644 frontend/src/components/canvas/components/Editor/Hyperlinks.vue diff --git a/frontend/src/components/canvas/components/Editor/Hyperlinks.vue b/frontend/src/components/canvas/components/Editor/Hyperlinks.vue new file mode 100644 index 0000000000..45da866b42 --- /dev/null +++ b/frontend/src/components/canvas/components/Editor/Hyperlinks.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index 516070e87e..db382e2368 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -1,6 +1,6 @@ - diff --git a/frontend/src/views/chart/components/component-style/LegendSelectorAntV.vue b/frontend/src/views/chart/components/component-style/LegendSelectorAntV.vue new file mode 100644 index 0000000000..982ba8f15c --- /dev/null +++ b/frontend/src/views/chart/components/component-style/LegendSelectorAntV.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/frontend/src/views/chart/components/component-style/SplitSelectorAntV.vue b/frontend/src/views/chart/components/component-style/SplitSelectorAntV.vue new file mode 100644 index 0000000000..5378642eee --- /dev/null +++ b/frontend/src/views/chart/components/component-style/SplitSelectorAntV.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/frontend/src/views/chart/components/component-style/TitleSelectorAntV.vue b/frontend/src/views/chart/components/component-style/TitleSelectorAntV.vue new file mode 100644 index 0000000000..10e6ef36f6 --- /dev/null +++ b/frontend/src/views/chart/components/component-style/TitleSelectorAntV.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/frontend/src/views/chart/components/component-style/XAxisSelectorAntV.vue b/frontend/src/views/chart/components/component-style/XAxisSelectorAntV.vue new file mode 100644 index 0000000000..394dc3fdbc --- /dev/null +++ b/frontend/src/views/chart/components/component-style/XAxisSelectorAntV.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/frontend/src/views/chart/components/component-style/YAxisExtSelectorAntV.vue b/frontend/src/views/chart/components/component-style/YAxisExtSelectorAntV.vue new file mode 100644 index 0000000000..5fa2d342f9 --- /dev/null +++ b/frontend/src/views/chart/components/component-style/YAxisExtSelectorAntV.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/frontend/src/views/chart/components/component-style/YAxisSelectorAntV.vue b/frontend/src/views/chart/components/component-style/YAxisSelectorAntV.vue new file mode 100644 index 0000000000..dfc2e5c914 --- /dev/null +++ b/frontend/src/views/chart/components/component-style/YAxisSelectorAntV.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue b/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue new file mode 100644 index 0000000000..476c98d9b4 --- /dev/null +++ b/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelector.vue b/frontend/src/views/chart/components/shape-attr/SizeSelector.vue index fc6666657d..1753d0dc06 100644 --- a/frontend/src/views/chart/components/shape-attr/SizeSelector.vue +++ b/frontend/src/views/chart/components/shape-attr/SizeSelector.vue @@ -39,9 +39,9 @@ {{ $t('chart.line_smooth') }} - - {{ $t('chart.show') }} - + + + diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue b/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue new file mode 100644 index 0000000000..047bd8918c --- /dev/null +++ b/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue @@ -0,0 +1,375 @@ + + + + + diff --git a/frontend/src/views/chart/components/shape-attr/TooltipSelectorAntV.vue b/frontend/src/views/chart/components/shape-attr/TooltipSelectorAntV.vue new file mode 100644 index 0000000000..e7efc00d5e --- /dev/null +++ b/frontend/src/views/chart/components/shape-attr/TooltipSelectorAntV.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/frontend/src/views/chart/group/Group.vue b/frontend/src/views/chart/group/Group.vue index d8c7cf620a..fca04a6c3e 100644 --- a/frontend/src/views/chart/group/Group.vue +++ b/frontend/src/views/chart/group/Group.vue @@ -729,6 +729,7 @@ export default { view.sceneId = this.currGroup.id view.tableId = this.table.id view.type = 'bar' + view.render = 'antv' view.customAttr = JSON.stringify({ color: DEFAULT_COLOR_CASE, tableColor: DEFAULT_COLOR_CASE, diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 1f74048d75..ec115af41d 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -94,128 +94,29 @@ - -
- {{ $t('chart.chart_type') }} +
+ + {{ $t('chart.chart_type') }} + + + + + + -
+
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - +
@@ -224,12 +125,12 @@ Tips: {{ $t('chart.only_one_quota') }} - - - - - - + + + + + +
@@ -418,7 +319,7 @@ {{ $t('chart.placeholder_field') }}
- + {{ $t('chart.drill') }} / @@ -466,13 +367,16 @@ - + + - + + - - + + + @@ -480,22 +384,28 @@ {{ $t('chart.module_style') }} - + + - + + - + + - + + - + + - - + + + @@ -511,7 +421,7 @@
- +
@@ -522,7 +432,7 @@
-
+
@@ -672,9 +582,29 @@ import { areaMapping } from '@/api/map/map' import QuotaExtItem from '@/views/chart/components/drag-item/QuotaExtItem' import YAxisExtSelector from '@/views/chart/components/component-style/YAxisExtSelector' import ChartComponentG2 from '@/views/chart/components/ChartComponentG2' +import ChartType from '@/views/chart/view/ChartType' +import TitleSelectorAntV from '@/views/chart/components/component-style/TitleSelectorAntV' +import LabelSelectorAntV from '@/views/chart/components/shape-attr/LabelSelectorAntV' +import TooltipSelectorAntV from '@/views/chart/components/shape-attr/TooltipSelectorAntV' +import LegendSelectorAntV from '@/views/chart/components/component-style/LegendSelectorAntV' +import XAxisSelectorAntV from '@/views/chart/components/component-style/XAxisSelectorAntV' +import YAxisSelectorAntV from '@/views/chart/components/component-style/YAxisSelectorAntV' +import YAxisExtSelectorAntV from '@/views/chart/components/component-style/YAxisExtSelectorAntV' +import SizeSelectorAntV from '@/views/chart/components/shape-attr/SizeSelectorAntV' +import SplitSelectorAntV from '@/views/chart/components/component-style/SplitSelectorAntV' export default { name: 'ChartEdit', components: { + SplitSelectorAntV, + SizeSelectorAntV, + YAxisExtSelectorAntV, + YAxisSelectorAntV, + XAxisSelectorAntV, + LegendSelectorAntV, + TooltipSelectorAntV, + LabelSelectorAntV, + TitleSelectorAntV, + ChartType, ChartComponentG2, YAxisExtSelector, QuotaExtItem, @@ -744,7 +674,8 @@ export default { background: DEFAULT_BACKGROUND_COLOR, split: DEFAULT_SPLIT }, - customFilter: [] + customFilter: [], + render: 'antv' }, moveId: -1, chart: { @@ -783,7 +714,12 @@ export default { attrActiveNames: [], styleActiveNames: [], drillClickDimensionList: [], - drillFilters: [] + drillFilters: [], + renderOptions: [ + { name: '新版', value: 'antv' }, + { name: '旧版', value: 'echarts' } + ], + drill: false } }, computed: { @@ -965,20 +901,16 @@ export default { view.yaxis.splice(1, view.yaxis.length) } } - if (view.type === 'line' && trigger === 'chart') { - view.customAttr.size.lineArea = false - } if (view.type === 'line-stack' && trigger === 'chart') { view.customAttr.size.lineArea = true } if (view.type === 'treemap' && trigger === 'chart') { view.customAttr.label.show = true } - if (view.type === 'treemap' || + if (view.type === 'liquid' || view.type.includes('table') || view.type.includes('text') || - view.type.includes('gauge') || - view.type.includes('radar')) { + view.type.includes('gauge')) { view.drillFields = [] } view.customFilter.forEach(function(ele) { @@ -1055,6 +987,7 @@ export default { this.resetDrill() } + this.drill = response.data.drill this.drillFilters = JSON.parse(JSON.stringify(response.data.drillFilters ? response.data.drillFilters : [])) }).catch(err => { this.resetView() @@ -1088,6 +1021,7 @@ export default { response.data.data = this.data this.chart = response.data + this.chart.drill = this.drill // this.httpRequest.status = true }).catch(err => { // this.resetView() @@ -1607,11 +1541,7 @@ export default { }, renderComponent() { - if (this.chart.type === 'liquid') { - return 'g2' - } else { - return 'echarts' - } + return this.chart.render } } @@ -1916,6 +1846,13 @@ export default { .drag-placeholder-style-span{ padding-left: 16px; } + .render-select>>>.el-input__suffix{ + width: 20px; + } + .render-select>>>.el-input__inner{ + padding-right: 10px; + padding-left: 6px; + } .blackTheme .theme-border-class { border-color: var(--TableBorderColor) !important; diff --git a/frontend/src/views/chart/view/ChartType.vue b/frontend/src/views/chart/view/ChartType.vue new file mode 100644 index 0000000000..5cbe4c62fd --- /dev/null +++ b/frontend/src/views/chart/view/ChartType.vue @@ -0,0 +1,270 @@ + + + + + From 57d4f3fd2d64134c2a2d8df940ba8a6b3758af98 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Oct 2021 18:20:27 +0800 Subject: [PATCH 013/190] =?UTF-8?q?fix:=20=E6=89=93=E5=8C=85=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E5=89=8D=E7=AB=AF=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 649a9928ca..a9dfd85ce0 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -268,10 +268,15 @@ src/main/resources - + true + + static/**/*.woff + static/**/*.woff2 + static/**/*.ttf + From fb4505d712a7207b427ee4076cc458428a9ee7f8 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Oct 2021 18:20:27 +0800 Subject: [PATCH 014/190] =?UTF-8?q?fix:=20=E6=89=93=E5=8C=85=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E5=89=8D=E7=AB=AF=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 649a9928ca..a9dfd85ce0 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -268,10 +268,15 @@ src/main/resources - + true + + static/**/*.woff + static/**/*.woff2 + static/**/*.ttf + From 3b0e88d8adb6c26a0270c7bf072859a5ced6a010 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 14 Oct 2021 18:26:19 +0800 Subject: [PATCH 015/190] =?UTF-8?q?feat:=20druid=20=E6=9B=BF=E6=8D=A2=20c3?= =?UTF-8?q?p0;=20=E4=BB=A5=E7=B1=BB=E5=8A=A0=E8=BD=BD=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=BC=95=E5=85=A5=E6=95=B0=E6=8D=AE=E6=BA=90=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=EF=BC=9B=E6=94=AF=E6=8C=81myqsl5.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/dataease/datasource/provider/JdbcProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index b8eb1e5b4d..b1958ee661 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -417,7 +417,7 @@ public class JdbcProvider extends DatasourceProvider { MysqlConfiguration mysqlConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfiguration.class); username = mysqlConfiguration.getUsername(); password = mysqlConfiguration.getPassword(); - driver = mysqlConfiguration.getDriver(); + driver = "com.mysql.jdbc.Driver"; jdbcurl = mysqlConfiguration.getJdbc(); break; case sqlServer: From 94209dd32fa6934872a9ff28874eeaeca0370d2c Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 14 Oct 2021 18:52:53 +0800 Subject: [PATCH 016/190] =?UTF-8?q?refactor:=E6=96=87=E6=9C=AC=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5hover=E5=A2=9E=E5=8A=A0=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/canvas/custom-component/VText.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/canvas/custom-component/VText.vue b/frontend/src/components/canvas/custom-component/VText.vue index b7ae40f08e..596d88026b 100644 --- a/frontend/src/components/canvas/custom-component/VText.vue +++ b/frontend/src/components/canvas/custom-component/VText.vue @@ -58,7 +58,7 @@ export default { computed: { textInfo() { if (this.element && this.element.hyperlinks && this.element.hyperlinks.enable) { - return "" + this.element.propValue + '' + return "" + this.element.propValue + '' } else { return this.element.propValue } @@ -154,6 +154,7 @@ export default { width: 100%; height: 100%; outline: none; + } .canEdit { @@ -161,4 +162,9 @@ export default { height: 100%; } } +::v-deep a:hover { + text-decoration: underline!important; + color: blue!important; +} + From 7d208d48f57148b3607ddac0cf6fcb995fd33b96 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 14 Oct 2021 18:55:08 +0800 Subject: [PATCH 017/190] =?UTF-8?q?feat:=20druid=20=E6=9B=BF=E6=8D=A2=20c3?= =?UTF-8?q?p0;=20=E4=BB=A5=E7=B1=BB=E5=8A=A0=E8=BD=BD=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=BC=95=E5=85=A5=E6=95=B0=E6=8D=AE=E6=BA=90=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=EF=BC=9B=E6=94=AF=E6=8C=81myqsl5.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 54 ++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index ae0ecab957..4f0a5bf6ed 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -361,33 +361,33 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + org.apache.maven.plugins + maven-antrun-plugin + + + main-class-placement + generate-resources + + + + + + + + + + + + + + + + run + + + + From c6482a8e844180413c0f3a55a178687f13a93430 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 15 Oct 2021 10:36:25 +0800 Subject: [PATCH 018/190] =?UTF-8?q?refactor:PDF=E5=AF=BC=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BA=E7=AD=89=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=87=86=E5=A4=87=E6=8F=90=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?PDF=E5=AF=BC=E5=87=BA=E5=90=8E=E8=87=AA=E5=8A=A8=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=AF=B9=E8=AF=9D=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/lang/zh.js | 5 +- .../src/views/panel/export/PDFPreExport.vue | 34 ++++--- .../src/views/panel/list/PanelViewShow.vue | 97 +++++++++++-------- 3 files changed, 85 insertions(+), 51 deletions(-) diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 27f0413953..cfffdb0f43 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1333,7 +1333,10 @@ export default { new_window: '新窗口', now_window: '当前窗口', hyperLinks: '超链接', - link_open_tips: '仪表板非编辑状态可打开链接' + link_open_tips: '仪表板非编辑状态可打开链接', + data_loading: '数据准备中...', + export_loading: '导出中...', + export_pdf: '导出PDF' }, plugin: { local_install: '本地安装', diff --git a/frontend/src/views/panel/export/PDFPreExport.vue b/frontend/src/views/panel/export/PDFPreExport.vue index af64d5e2bb..3051561bae 100644 --- a/frontend/src/views/panel/export/PDFPreExport.vue +++ b/frontend/src/views/panel/export/PDFPreExport.vue @@ -1,5 +1,11 @@ @@ -36,6 +42,7 @@ export default { }, data() { return { + exportLoading: false, activeName: '', templateContentChange: '', time: '', @@ -82,15 +89,20 @@ export default { }, save() { const _this = this - html2canvas(document.getElementById('exportPdf')).then(function(canvas) { - const contentWidth = canvas.width - const contentHeight = canvas.height - const pageData = canvas.toDataURL('image/jpeg', 1.0) - const PDF = new JsPDF('l', 'px', [contentWidth, contentHeight]) - PDF.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight) - PDF.save(_this.panelName + '.pdf') - } - ) + _this.exportLoading = true + setTimeout(() => { + html2canvas(document.getElementById('exportPdf')).then(function(canvas) { + _this.exportLoading = false + const contentWidth = canvas.width + const contentHeight = canvas.height + const pageData = canvas.toDataURL('image/jpeg', 1.0) + const PDF = new JsPDF('l', 'px', [contentWidth, contentHeight]) + PDF.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight) + PDF.save(_this.panelName + '.pdf') + _this.$emit('closePreExport') + } + ) + }, 50) } } diff --git a/frontend/src/views/panel/list/PanelViewShow.vue b/frontend/src/views/panel/list/PanelViewShow.vue index 623cdfd0d7..5f0535aa92 100644 --- a/frontend/src/views/panel/list/PanelViewShow.vue +++ b/frontend/src/views/panel/list/PanelViewShow.vue @@ -1,5 +1,11 @@ + + diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index 3bec402bf6..4088446f96 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -1351,7 +1351,7 @@ export default { }, resizeView(index, item) { - if (item.type === 'view') { + if (item.type === 'view' || item.type === 'de-show-date') { this.$refs.wrapperChild[index].chartResize() } }, diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index db382e2368..3526f73f9f 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -78,8 +78,12 @@
- - + + + + + +
@@ -90,9 +94,10 @@ diff --git a/frontend/src/components/widget/DeWidget/TimeComplex.vue b/frontend/src/components/widget/DeWidget/TimeComplex.vue new file mode 100644 index 0000000000..62179bac4d --- /dev/null +++ b/frontend/src/components/widget/DeWidget/TimeComplex.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/frontend/src/components/widget/DeWidget/TimeDefault.vue b/frontend/src/components/widget/DeWidget/TimeDefault.vue new file mode 100644 index 0000000000..bd8249ae74 --- /dev/null +++ b/frontend/src/components/widget/DeWidget/TimeDefault.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/frontend/src/components/widget/DeWidget/TimeElec.vue b/frontend/src/components/widget/DeWidget/TimeElec.vue new file mode 100644 index 0000000000..0d32882d5b --- /dev/null +++ b/frontend/src/components/widget/DeWidget/TimeElec.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/frontend/src/components/widget/DeWidget/TimeSimple.vue b/frontend/src/components/widget/DeWidget/TimeSimple.vue new file mode 100644 index 0000000000..a11cdab701 --- /dev/null +++ b/frontend/src/components/widget/DeWidget/TimeSimple.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index dbaab8569a..7ed129df3f 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1522,5 +1522,22 @@ export default { deyear: { label: 'Year', placeholder: 'Please select year' + }, + deshowdate: { + label: 'Time', + show_week: 'Show week', + show_date: 'Show date', + time_format: 'Time format', + date_format: 'Date format', + custom: 'Custom format', + open_mode: 'Time category', + m_default: 'Default', + m_elec: 'Electronic clock', + m_simple: 'Simple clock', + m_complex: 'Complex clock', + select_openMode: 'Please select time category', + select_time_format: 'Please select time format', + select_date_format: 'Please select date format' + } } diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index d52373d63c..230926a63a 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1543,5 +1543,22 @@ export default { deyear: { label: '年份', placeholder: '请选择年份' + }, + deshowdate: { + label: '时间', + show_week: '显示星期', + show_date: '显示日期', + time_format: '时间格式', + date_format: '日期格式', + custom: '自定义格式', + open_mode: '展示风格', + m_default: '简单风格', + m_elec: '电子时钟', + m_simple: '简单表盘', + m_complex: '复杂表盘', + select_openMode: '请选择展示风格', + select_time_format: '请选择时间格式', + select_date_format: '请选择时间格式' + } } diff --git a/frontend/src/main.js b/frontend/src/main.js index 070d1068c5..9fc65811e5 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -23,6 +23,8 @@ import './utils/dialog' import DeComplexInput from '@/components/business/condition-table/DeComplexInput' import DeComplexSelect from '@/components/business/condition-table/DeComplexSelect' import '@/components/canvas/custom-component' // 注册自定义组件 + +import '@/utils/DateUtil' Vue.config.productionTip = false Vue.use(VueClipboard) Vue.use(widgets) diff --git a/frontend/src/styles/deicon/iconfont.css b/frontend/src/styles/deicon/iconfont.css index 420f446663..3438ed8f00 100644 --- a/frontend/src/styles/deicon/iconfont.css +++ b/frontend/src/styles/deicon/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 2459092 */ - src: url('iconfont.woff2?t=1634191971474') format('woff2'), - url('iconfont.woff?t=1634191971474') format('woff'), - url('iconfont.ttf?t=1634191971474') format('truetype'); + src: url('iconfont.woff2?t=1634625523445') format('woff2'), + url('iconfont.woff?t=1634625523445') format('woff'), + url('iconfont.ttf?t=1634625523445') format('truetype'); } .iconfont { @@ -13,6 +13,18 @@ -moz-osx-font-smoothing: grayscale; } +.icon-tabs:before { + content: "\e9a8"; +} + +.icon-shijian:before { + content: "\e665"; +} + +.icon-shijiangeshizhuanhuan:before { + content: "\e6fb"; +} + .icon-chaolianjie:before { content: "\e9b2"; } @@ -45,10 +57,6 @@ content: "\e8e6"; } -.icon-tabs:before { - content: "\e62a"; -} - .icon-xiyu:before { content: "\e619"; } diff --git a/frontend/src/styles/deicon/iconfont.js b/frontend/src/styles/deicon/iconfont.js index 07207f78aa..63d1522ad7 100644 --- a/frontend/src/styles/deicon/iconfont.js +++ b/frontend/src/styles/deicon/iconfont.js @@ -1 +1 @@ -!function(h){var l,c,a,v,t,i='',z=(z=document.getElementsByTagName("script"))[z.length-1].getAttribute("data-injectcss"),o=function(h,l){l.parentNode.insertBefore(h,l)};if(z&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}function m(){t||(t=!0,a())}function s(){try{v.documentElement.doScroll("left")}catch(h){return void setTimeout(s,50)}m()}l=function(){var h,l;(l=document.createElement("div")).innerHTML=i,i=null,(h=l.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",l=h,(h=document.body).firstChild?o(l,h.firstChild):h.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),l()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(a=l,v=h.document,t=!1,s(),v.onreadystatechange=function(){"complete"==v.readyState&&(v.onreadystatechange=null,m())})}(window); \ No newline at end of file +!function(h){var l,a,c,v,i,t='',z=(z=document.getElementsByTagName("script"))[z.length-1].getAttribute("data-injectcss"),o=function(h,l){l.parentNode.insertBefore(h,l)};if(z&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}function m(){i||(i=!0,c())}function s(){try{v.documentElement.doScroll("left")}catch(h){return void setTimeout(s,50)}m()}l=function(){var h,l;(l=document.createElement("div")).innerHTML=t,t=null,(h=l.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",l=h,(h=document.body).firstChild?o(l,h.firstChild):h.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),l()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(c=l,v=h.document,i=!1,s(),v.onreadystatechange=function(){"complete"==v.readyState&&(v.onreadystatechange=null,m())})}(window); \ No newline at end of file diff --git a/frontend/src/styles/deicon/iconfont.json b/frontend/src/styles/deicon/iconfont.json index 093b9a689d..b7035567e9 100644 --- a/frontend/src/styles/deicon/iconfont.json +++ b/frontend/src/styles/deicon/iconfont.json @@ -5,6 +5,27 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "11982148", + "name": "tabs", + "font_class": "tabs", + "unicode": "e9a8", + "unicode_decimal": 59816 + }, + { + "icon_id": "658039", + "name": "时间", + "font_class": "shijian", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "8691950", + "name": "时间格式转换", + "font_class": "shijiangeshizhuanhuan", + "unicode": "e6fb", + "unicode_decimal": 59131 + }, { "icon_id": "3229030", "name": "超链接", @@ -61,13 +82,6 @@ "unicode": "e8e6", "unicode_decimal": 59622 }, - { - "icon_id": "15196968", - "name": "44.tabs", - "font_class": "tabs", - "unicode": "e62a", - "unicode_decimal": 58922 - }, { "icon_id": "23570269", "name": "洗浴", diff --git a/frontend/src/styles/deicon/iconfont.ttf b/frontend/src/styles/deicon/iconfont.ttf index 07b588c06619d1e7815f703445355f085809d34c..479dc6ad8683aec0b4c88d86d2b855a89113c884 100644 GIT binary patch delta 2227 zcmZXUeQZ8fgKF+=NwR8>PL8rn3$G*v7T-TKeOrU^|HRch(zq`gU?-O!}2XkFqxCnxPB zc3=I@*S+VQd!F~X_xq>R{a4g$@zP#Ey$WFevlBy8o@f4$0;~@Kr!_i$^xzAQGd}=4 zMIdv1Y-H#_~af8!HvA_X+#=#t%I^^k)3@HNbtF z{bLhDN2XL!y~z6w?6033ni#45X*BmspsS6Wj!qq#p4oNb++Tp5XW0Mi>vQoPIVe6$ z%5yjJ`+T|2P;KV`aO+IN^p|y|QaNt_iR~r!-LUj1FFh|;Zd5NQPx&?VR(VOe%a2*V zF2z>vz+lUESlHL3F`^sMy6VKB|b+M?0_n{?Prs#MA!+XqUDFE`9MfN{p;YD~ezVLTW!c=3Taf(PRmbO4WF zEkdYA9pYF=0Xo>KMGLlKBfMyUACLB93-yg4fOa$^j5f4l10KS|)I5zwB(M#SV>_a7 zB8kmd4-ZnPp}Ib597GcyLk3w?V-sRnL-p-&F;ULTAKNWe;x@dj+q&eH1B8`^F9%^h zHGEA7bFASDLu>}VI)v8H@YNx11CIl#G4NmzpMgh&_zgTPq!eI5RwnBO2o-J8aupz@F| z19Je`X<#-Wy9~?=ByV7bAUy`=3Q{mIYmfm0^9LE>{w%0JJBJKRD&(kv>4m&(V4@+f z8<=v)X#BIZ9b(34oWMoKJbPb^$F(5P4t11*b1%B7)s zv3S@(8)I?WKtp43)}VhZiQ*zZ3`rX6u}FXX^e_|4Haz=uY@b!#5gkMxv49k$chM=$(hgxHT1FanZU- zof@@uRa4Aa?+=FBOHIj4+MjB+HThGS?J5~st2o+}Zc3YOy{)j+n@A=T*3Wdg)En{N z^hY8ARam~c(zM=7#+MOKCgT>%rHksl0B;upk=|C_Fq>C?YrAUO!S8A}_HgqpDpq3! z8?9ugRZ2ChbgDV#T&tQ}bhIZkspd^8lhsil3?(y9s8Co(Jmw6BwkxNLVOyOOT&MU% zs>PPuasJZzGwLVxgB4vpch)2{OY;h)yV};{&L0kLf@!fv7dwLjnDLw6|eKE)9a`6_@k-Z zvAtspQSKbRj%UD+aDy`*)2B@7)3qnVjjF_htsFca)8`86leQ$Iq3vsoR z*``wi+4ZL`$2})pm%ryfuvO*C(lxVD<j#(tiQR0Vrnx delta 1724 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 delta 10196 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 O$=*uO`wjeJ)^q@=8LLeI diff --git a/frontend/src/styles/deicon/iconfont.woff2 b/frontend/src/styles/deicon/iconfont.woff2 index 34eb3d8f1abd93a7fbaa4a296bc37b1429e35ce5..faa1dc85f9fbd279c1bb781e8c89f298a265b81d 100644 GIT binary patch literal 9204 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 K*>QKRxCH=5DFEI8 literal 8940 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 GFnj?K4mFkl diff --git a/frontend/src/utils/DateUtil.js b/frontend/src/utils/DateUtil.js new file mode 100644 index 0000000000..0ae20d8b76 --- /dev/null +++ b/frontend/src/utils/DateUtil.js @@ -0,0 +1,21 @@ +/* eslint-disable no-extend-native */ +Date.prototype.format = function(fmt) { + var o = { + 'M+': this.getMonth() + 1, // 月份 + 'd+': this.getDate(), // 日 + 'h+': this.getHours(), // 小时 + 'm+': this.getMinutes(), // 分 + 's+': this.getSeconds(), // 秒 + 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度 + 'S': this.getMilliseconds() // 毫秒 + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + for (var k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) + } + } + return fmt +} diff --git a/frontend/src/views/panel/AssistComponent/index.vue b/frontend/src/views/panel/AssistComponent/index.vue index c37451808e..f5ce2ba388 100644 --- a/frontend/src/views/panel/AssistComponent/index.vue +++ b/frontend/src/views/panel/AssistComponent/index.vue @@ -48,6 +48,30 @@ +
+
+
+ 其他 +
+
+ +
+
+
+ +
+
{{ item.label }}
+
+
+
+ @@ -55,7 +79,7 @@ diff --git a/frontend/src/views/system/settings/index.vue b/frontend/src/views/system/settings/index.vue deleted file mode 100644 index 0d8026c857..0000000000 --- a/frontend/src/views/system/settings/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/frontend/src/views/system/settings/sso/index.vue b/frontend/src/views/system/settings/sso/index.vue deleted file mode 100644 index 346b65549a..0000000000 --- a/frontend/src/views/system/settings/sso/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/frontend/src/views/system/settings/sso/ldap/index.vue b/frontend/src/views/system/settings/sso/ldap/index.vue deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frontend/src/views/system/settings/sso/oidc/index.vue b/frontend/src/views/system/settings/sso/oidc/index.vue deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frontend/src/views/system/settings/theme/index.vue b/frontend/src/views/system/settings/theme/index.vue deleted file mode 100644 index 8e466fc5f4..0000000000 --- a/frontend/src/views/system/settings/theme/index.vue +++ /dev/null @@ -1,10 +0,0 @@ - - diff --git a/frontend/src/views/system/systemParamSettings/UiSetting.vue b/frontend/src/views/system/systemParamSettings/UiSetting.vue deleted file mode 100644 index 338f0ad73f..0000000000 --- a/frontend/src/views/system/systemParamSettings/UiSetting.vue +++ /dev/null @@ -1,322 +0,0 @@ - - - - - diff --git a/frontend/src/views/system/systemParamSettings/index.vue b/frontend/src/views/system/systemParamSettings/index.vue deleted file mode 100644 index e43a9cf823..0000000000 --- a/frontend/src/views/system/systemParamSettings/index.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/pom.xml b/pom.xml index e08a03d403..8ae328d1e5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.dataease dataease-server - 1.3.0 + 1.4.0 pom From 4bbbee07e036a3568ed5bdbda8067360af171805 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 21 Oct 2021 14:38:06 +0800 Subject: [PATCH 057/190] =?UTF-8?q?fix:=20=E5=8E=BB=E9=99=A4=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E6=9D=BF=E5=88=86=E4=BA=AB=E6=9C=89=E6=95=88=E6=9C=9F?= =?UTF-8?q?'=E6=AD=A4=E5=88=BB'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/pom.xml | 2 +- frontend/src/styles/index.scss | 3 +++ frontend/src/views/link/generate/index.vue | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/pom.xml b/frontend/pom.xml index 604c6b2027..a0d56dfe10 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -6,7 +6,7 @@ dataease-server io.dataease - 1.3.0 + 1.4.0 4.0.0 diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index 4e7cebde48..528b7cac24 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -670,5 +670,8 @@ div:focus { color: var(--Main, #0000ff); } +.link-date-picker-class > .el-picker-panel__footer > .el-button--text:first-child{ + display: none; +} diff --git a/frontend/src/views/link/generate/index.vue b/frontend/src/views/link/generate/index.vue index 1f3ddc0c66..c71a15d227 100644 --- a/frontend/src/views/link/generate/index.vue +++ b/frontend/src/views/link/generate/index.vue @@ -31,6 +31,7 @@ value-format="timestamp" :picker-options="pickerOptions" default-time="23:59:59" + popper-class="link-date-picker-class" @change="resetOverTime" /> @@ -241,4 +242,5 @@ export default { margin: 15px 0px 5px; text-align: right; } + From 8e50280de849fee419a03d7e87ff0a47ef06b009 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 21 Oct 2021 15:30:04 +0800 Subject: [PATCH 058/190] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E4=B8=80?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/datasource/provider/JdbcProvider.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java index 0ae3f56d60..ddc4e68337 100644 --- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java @@ -204,13 +204,16 @@ public class JdbcProvider extends DatasourceProvider { } String queryView = getViewSql(datasourceRequest); - try (Connection con = getConnectionFromPool(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryView)){ - while (resultSet.next()) { - tables.add(resultSet.getString(1)); + if(queryView != null){ + try (Connection con = getConnectionFromPool(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryView)){ + while (resultSet.next()) { + tables.add(resultSet.getString(1)); + } + } catch (Exception e) { + DataEaseException.throwException(e); } - } catch (Exception e) { - DataEaseException.throwException(e); } + return tables; } From 90c2b261baa892efcf68eb03ec62bc3b61957d02 Mon Sep 17 00:00:00 2001 From: junjie Date: Thu, 21 Oct 2021 16:11:51 +0800 Subject: [PATCH 059/190] feat:antv --- frontend/src/views/chart/chart/chart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js index 1d20681aab..8a258a56b5 100644 --- a/frontend/src/views/chart/chart/chart.js +++ b/frontend/src/views/chart/chart/chart.js @@ -15,7 +15,7 @@ export const DEFAULT_SIZE = { barGap: 0.4, lineWidth: 1, lineType: 'solid', - lineSymbol: 'emptyCircle', + lineSymbol: 'circle', lineSymbolSize: 4, lineSmooth: false, lineArea: false, From 6fd580e2f77713c49deb0552868206bdec569895 Mon Sep 17 00:00:00 2001 From: junjie Date: Thu, 21 Oct 2021 17:37:13 +0800 Subject: [PATCH 060/190] feat:antv --- frontend/src/lang/en.js | 4 +++- frontend/src/lang/tw.js | 4 +++- frontend/src/lang/zh.js | 4 +++- .../views/chart/components/shape-attr/SizeSelectorAntV.vue | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 9bedbf929b..68b3a24ce7 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -933,7 +933,9 @@ export default { liquid_shape_rect: 'Rect', dimension_or_quota: 'Dimension Or Quota', axis_value_split_count: 'Tick Count', - chart_waterfall: 'Waterfall' + chart_waterfall: 'Waterfall', + pie_inner_radius_percent: 'Inner Radius(%)', + pie_outer_radius_size: 'Outer Radius' }, dataset: { sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index dda1fcb63c..90bae6cee2 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -934,7 +934,9 @@ export default { liquid_shape_rect: '矩形', dimension_or_quota: '維度或指標', axis_value_split_count: '刻度數', - chart_waterfall: '瀑布圖' + chart_waterfall: '瀑布圖', + pie_inner_radius_percent: '內徑占比', + pie_outer_radius_size: '外徑大小' }, dataset: { sheet_warn: '有多個 Sheet 頁,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 8d7d6ad979..cb86a8742a 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -934,7 +934,9 @@ export default { liquid_shape_rect: '矩形', dimension_or_quota: '维度或指标', axis_value_split_count: '刻度数', - chart_waterfall: '瀑布图' + chart_waterfall: '瀑布图', + pie_inner_radius_percent: '内径占比', + pie_outer_radius_size: '外径大小' }, dataset: { sheet_warn: '有多个 Sheet 页,默认抽取第一个', diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue b/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue index 74799dac33..bc16201dc1 100644 --- a/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue +++ b/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue @@ -42,10 +42,10 @@
- + - + From 19c4962979f63164e3afa0889836bd2cea71457e Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 21 Oct 2021 17:46:24 +0800 Subject: [PATCH 061/190] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E6=9D=BF=E6=97=B6=E9=97=B4=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/canvas/components/TextAttr.vue | 22 +++++- .../canvas/custom-component/component-list.js | 4 +- frontend/src/components/canvas/utils/style.js | 3 +- .../components/widget/DeWidget/DeShowDate.vue | 10 +++ .../widget/DeWidget/TimeDefault.vue | 14 +++- .../components/widget/DeWidget/TimeElec.vue | 6 ++ .../components/widget/DeWidget/TimeSimple.vue | 68 ++++++++++++------ frontend/src/lang/zh.js | 2 + frontend/src/styles/deicon/iconfont.css | 14 +++- frontend/src/styles/deicon/iconfont.js | 2 +- frontend/src/styles/deicon/iconfont.json | 14 ++++ frontend/src/styles/deicon/iconfont.ttf | Bin 17784 -> 18284 bytes frontend/src/styles/deicon/iconfont.woff | Bin 10952 -> 11108 bytes frontend/src/styles/deicon/iconfont.woff2 | Bin 9204 -> 9352 bytes 14 files changed, 130 insertions(+), 29 deletions(-) diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index 0d90b84d2a..ac270ee15d 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -70,6 +70,22 @@ + + + + +
+ +
+ + + + + +
+ +
+ @@ -121,7 +137,7 @@ -
+
@@ -242,7 +258,9 @@ export default { 'borderRadius', 'color', 'backgroundColor', - 'date-format' + 'date-format', + 'time_margin' + /* 'margin' */ ], // 文本组件显示的属性 'v-text': [ diff --git a/frontend/src/components/canvas/custom-component/component-list.js b/frontend/src/components/canvas/custom-component/component-list.js index 54fcc49725..c6a5e0589c 100644 --- a/frontend/src/components/canvas/custom-component/component-list.js +++ b/frontend/src/components/canvas/custom-component/component-list.js @@ -243,7 +243,9 @@ const list = [ borderStyle: 'solid', borderWidth: 1, borderColor: '#000000', - borderRadius: 0 + borderRadius: 0, + /* margin: 10, */ + time_margin: 10 }, formatInfo: { openMode: '0', diff --git a/frontend/src/components/canvas/utils/style.js b/frontend/src/components/canvas/utils/style.js index 5d557f0316..a9a498fed1 100644 --- a/frontend/src/components/canvas/utils/style.js +++ b/frontend/src/components/canvas/utils/style.js @@ -9,7 +9,8 @@ export function getStyle(style, filter = []) { 'left', 'borderWidth', 'letterSpacing', - 'borderRadius' + 'borderRadius', + 'margin' ] const result = {} diff --git a/frontend/src/components/widget/DeWidget/DeShowDate.vue b/frontend/src/components/widget/DeWidget/DeShowDate.vue index 5165be1390..6b95c13419 100644 --- a/frontend/src/components/widget/DeWidget/DeShowDate.vue +++ b/frontend/src/components/widget/DeWidget/DeShowDate.vue @@ -24,6 +24,16 @@ export default { default: null } }, + data() { + return { + // time_margin: 0 + } + }, + computed: { + timeMargin() { + return this.element.style.time_margin + } + }, methods: { chartResize() { diff --git a/frontend/src/components/widget/DeWidget/TimeDefault.vue b/frontend/src/components/widget/DeWidget/TimeDefault.vue index bd8249ae74..c33066b290 100644 --- a/frontend/src/components/widget/DeWidget/TimeDefault.vue +++ b/frontend/src/components/widget/DeWidget/TimeDefault.vue @@ -1,5 +1,9 @@ diff --git a/frontend/src/api/system/basic.js b/frontend/src/api/system/basic.js new file mode 100644 index 0000000000..21d30b7bc6 --- /dev/null +++ b/frontend/src/api/system/basic.js @@ -0,0 +1,19 @@ +import request from '@/utils/request' + +export function basicInfo() { + return request({ + url: '/system/basic/info', + method: 'get', + loading: true + }) +} + +export function updateInfo(data) { + return request({ + url: '/system/edit/basic', + method: 'post', + loading: true, + data + + }) +} diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 68b3a24ce7..27fd8c95d1 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -606,6 +606,11 @@ export default { mailbox_service_settings: 'Mail Settings', test_connection: 'Test connection', SMTP_host: 'SMTP Host', + basic_setting: 'Basic setting', + front_time_out: 'Request timeOut(unit: second, Attention: Refresh browser takes effect after saving)', + msg_time_out: 'Message retention time(unit: day)', + empty_front: 'If empty then default value is 10s', + empty_msg: 'If empty then default value is 30 days', SMTP_port: 'SMTP Port', SMTP_account: 'SMTP Account', SMTP_password: 'SMTP Password', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 90bae6cee2..e4a8ce9497 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -608,6 +608,11 @@ export default { mailbox_service_settings: '郵件設置', test_connection: '測試連接', SMTP_host: 'SMTP主機', + basic_setting: '基礎設置', + front_time_out: '請求超時時間(單位:秒, 注意:保存後刷新瀏覽器生效)', + msg_time_out: '消息保留時間(單位:天)', + empty_front: '為空則默認取值10秒', + empty_msg: '為空則默認取值30天', SMTP_port: 'SMTP端口', SMTP_account: 'SMTP賬戶', SMTP_password: 'SMTP密碼', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 66da4cb2ad..9125c205b9 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -608,6 +608,13 @@ export default { mailbox_service_settings: '邮件设置', test_connection: '测试连接', SMTP_host: 'SMTP主机', + basic_setting: '基础设置', + front_time_out: '请求超时时间(单位:秒, 注意:保存后刷新浏览器生效)', + msg_time_out: '消息保留时间(单位:天)', + empty_front: '为空则默认取10秒', + empty_msg: '为空则默认取30天', + front_error: '请填写0-100正整数', + msg_error: '请填写正整数', SMTP_port: 'SMTP端口', SMTP_account: 'SMTP账户', SMTP_password: 'SMTP密码', @@ -1500,7 +1507,8 @@ export default { i18n_msg_type_dataset_sync_faild: '数据集同步失败', i18n_msg_type_ds_invalid: '数据源失效', i18n_msg_type_all: '全部类型', - channel_inner_msg: '站内消息' + channel_inner_msg: '站内消息', + channel_email_msg: '邮件' }, denumberrange: { label: '数值区间', diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js index dbefb1bcb2..e8093dcd03 100644 --- a/frontend/src/utils/auth.js +++ b/frontend/src/utils/auth.js @@ -48,3 +48,8 @@ export function getSysUI() { return json ? JSON.parse(json) : null } +export function getTimeOut() { + const val = Cookies.get('request-time-out') + return val +} + diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index 7495787389..1d0a00cf50 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -12,11 +12,42 @@ import { getLinkToken, setLinkToken } from '@/utils/auth' const TokenKey = Config.TokenKey const RefreshTokenKey = Config.RefreshTokenKey const LinkTokenKey = Config.LinkTokenKey +import Cookies from 'js-cookie' // create an axios instance -const service = axios.create({ + +const getTimeOut = () => { + let time = 10 + const url = '/system/requestTimeOut' + const xhr = new XMLHttpRequest() + xhr.onreadystatechange = () => { + if (xhr.readyState === 4 && xhr.status === 200) { + if (xhr.responseText) { + try { + const response = JSON.parse(xhr.responseText) + if (response.success) { + Cookies.set('request-time-out', response.data) + time = response.data + } else { + $error('系统异常,请联系管理员') + } + } catch (e) { + $error('系统异常,请联系管理员') + } + } else { + $error('网络异常,请联系网管') + } + } + } + + xhr.open('get', url, false) + xhr.send() + return time +} +const time = getTimeOut() +let service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url - // withCredentials: true, // send cookies when cross-domain requests - timeout: 10000 // request timeout + + timeout: time ? time * 1000 : 10000 }) // request interceptor @@ -60,13 +91,36 @@ service.interceptors.request.use( } ) -// const defaultOptions = { -// confirmButtonText: i18n.t('login.re_login') -// } +service.setTimeOut = time => { + service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API, + timeout: time + }) +} + +// 请根据实际需求修改 +service.interceptors.response.use(response => { + response.config.loading && tryHideLoading(store.getters.currentPath) + checkAuth(response) + return response.data +}, error => { + const config = error.response && error.response.config || error.config + const headers = error.response && error.response.headers || error.response || config.headers + config.loading && tryHideLoading(store.getters.currentPath) + + let msg + if (error.response) { + checkAuth(error.response) + // checkPermission(error.response) + msg = error.response.data.message || error.response.data + } else { + msg = error.message + } + !config.hideMsg && (!headers['authentication-status']) && $error(msg) + return Promise.reject(error) +}) const checkAuth = response => { - // 请根据实际需求修改 - if (response.headers['authentication-status'] === 'login_expire') { const message = i18n.t('login.expires') // store.dispatch('user/setLoginMsg', message) @@ -103,31 +157,5 @@ const checkAuth = response => { setLinkToken(linkToken) store.dispatch('user/setLinkToken', linkToken) } - // 许可状态改变 刷新页面 -// if (response.headers['lic-status']) { -// location.reload() -// } } - -// 请根据实际需求修改 -service.interceptors.response.use(response => { - response.config.loading && tryHideLoading(store.getters.currentPath) - checkAuth(response) - return response.data -}, error => { - const config = error.response && error.response.config || error.config - const headers = error.response && error.response.headers || error.response || config.headers - config.loading && tryHideLoading(store.getters.currentPath) - - let msg - if (error.response) { - checkAuth(error.response) - // checkPermission(error.response) - msg = error.response.data.message || error.response.data - } else { - msg = error.message - } - !config.hideMsg && (!headers['authentication-status']) && $error(msg) - return Promise.reject(error) -}) export default service diff --git a/frontend/src/views/system/SysParam/BasicSetting.vue b/frontend/src/views/system/SysParam/BasicSetting.vue new file mode 100644 index 0000000000..b71c23e7cc --- /dev/null +++ b/frontend/src/views/system/SysParam/BasicSetting.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/frontend/src/views/system/SysParam/index.vue b/frontend/src/views/system/SysParam/index.vue index 9d163a9d73..737a170bad 100644 --- a/frontend/src/views/system/SysParam/index.vue +++ b/frontend/src/views/system/SysParam/index.vue @@ -2,6 +2,10 @@ + + + + @@ -22,17 +26,17 @@ + + diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index 6e5e93eda2..9627f7da50 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -16,8 +16,8 @@ {{ $t('chart.chart_error_tips') }}
- - + + @@ -45,6 +45,7 @@ import { getToken, getLinkToken } from '@/utils/auth' import DrillPath from '@/views/chart/view/DrillPath' import { areaMapping } from '@/api/map/map' import ChartComponentG2 from '@/views/chart/components/ChartComponentG2' +import { Base64 } from 'js-base64' export default { name: 'UserView', components: { ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, @@ -99,6 +100,9 @@ export default { } }, computed: { + panelInfo() { + return this.$store.state.panel.panelInfo + }, filter() { const filter = {} filter.filter = this.element.filters @@ -121,12 +125,21 @@ export default { trackMenu() { const trackMenuInfo = [] let linkageCount = 0 + let jumpCount = 0 this.chart.data && this.chart.data.sourceFields && this.chart.data.sourceFields.forEach(item => { const sourceInfo = this.chart.id + '#' + item.id if (this.nowPanelTrackInfo[sourceInfo]) { linkageCount++ } }) + this.chart.data && this.chart.data.sourceFields && this.chart.data.sourceFields.forEach(item => { + const sourceInfo = this.chart.id + '#' + item.id + // console.log('nowPanelJumpInfo=>' + JSON.stringify(this.nowPanelJumpInfo)) + if (this.nowPanelJumpInfo[sourceInfo]) { + jumpCount++ + } + }) + jumpCount && trackMenuInfo.push('jump') linkageCount && trackMenuInfo.push('linkage') this.drillFields.length && trackMenuInfo.push('drill') // console.log('trackMenuInfo' + JSON.stringify(trackMenuInfo)) @@ -140,7 +153,8 @@ export default { }, ...mapState([ 'canvasStyleData', - 'nowPanelTrackInfo' + 'nowPanelTrackInfo', + 'nowPanelJumpInfo' ]) }, @@ -324,6 +338,42 @@ export default { } }, + jumpClick(param) { + const dimension = param.dimensionList[0] + + param.sourcePanelId = this.panelInfo.id + param.sourceViewId = param.viewId + param.sourceFieldId = dimension.id + const sourceInfo = param.viewId + '#' + dimension.id + const jumpInfo = this.nowPanelJumpInfo[sourceInfo] + if (jumpInfo) { + // 内部仪表板跳转 + if (jumpInfo.linkType === 'inner') { + if (jumpInfo.targetPanelId) { + const url = '#/preview/' + jumpInfo.targetPanelId + localStorage.setItem('jumpInfoParam', JSON.stringify(param)) + window.open(url, '_blank') + } else { + this.$message({ + type: 'warn', + message: '未指定跳转仪表板', + showClose: true + }) + } + } else { + const url = jumpInfo.content + window.open(url, '_blank') + } + } else { + this.$message({ + type: 'warn', + message: '未获取跳转信息', + showClose: true + }) + } + // console.log('param=>' + JSON.stringify(param)) + }, + resetDrill() { const length = this.drillClickDimensionList.length this.drillClickDimensionList = [] diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 9bedbf929b..58d2ef9307 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1313,6 +1313,7 @@ export default { save_and_close: 'Save', drill: 'drill', linkage: 'linkage', + jump: 'Jump', cancel_linkage: 'Cancel Linkage', remove_all_linkage: 'Remove All Linkage', exit_un_march_linkage_field: 'Exit Un March Linkage Field', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index dda1fcb63c..963d231259 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1316,6 +1316,7 @@ export default { save: '保存', drill: '下鑽', linkage: '聯動', + jump: '跳转', cancel_linkage: '取消聯動', remove_all_linkage: '清除所有聯動', exit_un_march_linkage_field: '存在未匹配聯動關系的字段', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 8d7d6ad979..f566b4ad9a 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1237,7 +1237,7 @@ export default { export_to_pdf: '导出为PDF', preview: '预览', fullscreen_preview: '全屏预览', - new_tab_preview: '新Tab页预览', + ta: '新Tab页预览', select_panel_from_left: '请从左侧选择仪表板', template_nale: '模板名称', template: '模板', @@ -1321,6 +1321,7 @@ export default { save: '保存', drill: '下钻', linkage: '联动', + jump: '跳转', cancel_linkage: '取消联动', remove_all_linkage: '清除所有联动', exit_un_march_linkage_field: '存在未匹配联动关系的字段', diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 80fc8294ba..bf21246af7 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -59,7 +59,12 @@ const data = { // 和当前组件联动的目标组件 targetLinkageInfo: [], // 当前仪表板联动 下钻 上卷等信息 - nowPanelTrackInfo: {}, + nowPanelTrackInfo: {}, // 当前仪表板联动 下钻 上卷等信息 + + nowPanelJumpInfo: {}, // 当前仪表板的跳转信息基础信息 + + nowPanelJumpInfoTargetPanel: {}, // 当前仪表板的跳转信息(只包括仪表板) + // 拖拽的组件信息 dragComponentInfo: null }, @@ -188,7 +193,12 @@ const data = { // 添加联动 下钻 等过滤组件 addViewTrackFilter(state, data) { const viewId = data.viewId - const trackInfo = state.nowPanelTrackInfo + let trackInfo + if (data.option === 'linkage') { + trackInfo = state.nowPanelTrackInfo + } else { + trackInfo = state.nowPanelJumpInfoTargetPanel + } for (let index = 0; index < state.componentData.length; index++) { const element = state.componentData[index] if (!element.type || element.type !== 'view') continue @@ -263,6 +273,12 @@ const data = { setNowPanelTrackInfo(state, trackInfo) { state.nowPanelTrackInfo = trackInfo }, + setNowPanelJumpInfo(state, jumpInfo) { + state.nowPanelJumpInfo = jumpInfo.baseJumpInfoMap + }, + setNowTargetPanelJumpInfo(state, jumpInfo) { + state.nowPanelJumpInfoTargetPanel = jumpInfo.baseJumpInfoPanelMap + }, clearPanelLinkageInfo(state) { state.componentData.forEach(item => { if (item.linkageFilters && item.linkageFilters.length > 0) { diff --git a/frontend/src/views/chart/components/ChartComponent.vue b/frontend/src/views/chart/components/ChartComponent.vue index 5cf336e0fe..7ba985a040 100644 --- a/frontend/src/views/chart/components/ChartComponent.vue +++ b/frontend/src/views/chart/components/ChartComponent.vue @@ -248,6 +248,13 @@ export default { return } const linkageParam = { + option: 'linkage', + viewId: this.chart.id, + dimensionList: this.pointParam.data.dimensionList, + quotaList: this.pointParam.data.quotaList + } + const jumpParam = { + option: 'jump', viewId: this.chart.id, dimensionList: this.pointParam.data.dimensionList, quotaList: this.pointParam.data.quotaList @@ -259,6 +266,9 @@ export default { case 'linkage': this.$store.commit('addViewTrackFilter', linkageParam) break + case 'jump': + this.$emit('onJumpClick', jumpParam) + break default: break } diff --git a/frontend/src/views/chart/components/ChartComponentG2.vue b/frontend/src/views/chart/components/ChartComponentG2.vue index 0cc6fc4549..e4bd1c900f 100644 --- a/frontend/src/views/chart/components/ChartComponentG2.vue +++ b/frontend/src/views/chart/components/ChartComponentG2.vue @@ -227,7 +227,8 @@ export default { } return } - const linkageParam = { + const jumpParam = { + option: 'jump', viewId: this.chart.id, dimensionList: this.pointParam.data.dimensionList, quotaList: this.pointParam.data.quotaList @@ -239,6 +240,9 @@ export default { case 'linkage': this.$store.commit('addViewTrackFilter', linkageParam) break + case 'jump': + this.$emit('onJumpClick', jumpParam) + break default: break } diff --git a/frontend/src/views/link/view/index.vue b/frontend/src/views/link/view/index.vue index b2b1a1cbf4..1a28cf9d65 100644 --- a/frontend/src/views/link/view/index.vue +++ b/frontend/src/views/link/view/index.vue @@ -9,6 +9,7 @@ import { loadResource } from '@/api/link' import { uuid } from 'vue-uuid' import Preview from '@/components/canvas/components/Editor/Preview' import { getPanelAllLinkageInfo } from '@/api/panel/linkage' +import {queryPanelJumpInfo} from "@/api/panel/linkJump"; export default { name: 'LinkView', @@ -38,6 +39,10 @@ export default { this.$store.commit('setComponentData', this.resetID(JSON.parse(res.data.panelData))) // this.$store.commit('setComponentData', JSON.parse(res.data.panelData)) this.$store.commit('setCanvasStyle', JSON.parse(res.data.panelStyle)) + // 刷新跳转信息 + queryPanelJumpInfo(this.resourceId).then(rsp => { + this.$store.commit('setNowPanelJumpInfo', rsp.data) + }) this.show = true }) }, diff --git a/frontend/src/views/panel/LinkJumpSet/TemplateAllList.vue b/frontend/src/views/panel/LinkJumpSet/TemplateAllList.vue new file mode 100644 index 0000000000..bfd345f072 --- /dev/null +++ b/frontend/src/views/panel/LinkJumpSet/TemplateAllList.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/frontend/src/views/panel/LinkJumpSet/index.vue b/frontend/src/views/panel/LinkJumpSet/index.vue new file mode 100644 index 0000000000..9b5236aa61 --- /dev/null +++ b/frontend/src/views/panel/LinkJumpSet/index.vue @@ -0,0 +1,451 @@ + + + + + diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index f9d2768826..02c569f7f7 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -218,6 +218,7 @@ import generateID from '@/components/canvas/utils/generateID' import RectangleAttr from '@/components/canvas/components/RectangleAttr' import TextAttr from '@/components/canvas/components/TextAttr' import FilterTextAttr from '@/components/canvas/components/FilterTextAttr' +import {queryPanelJumpInfo} from "@/api/panel/linkJump"; export default { name: 'PanelEdit', @@ -450,6 +451,10 @@ export default { getPanelAllLinkageInfo(panelId).then(rsp => { this.$store.commit('setNowPanelTrackInfo', rsp.data) }) + // 刷新跳转信息 + queryPanelJumpInfo(panelId).then(rsp => { + this.$store.commit('setNowPanelJumpInfo', rsp.data) + }) }) } }, diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue index 1bb8a1fad0..c19ab8cd75 100644 --- a/frontend/src/views/panel/list/PanelList.vue +++ b/frontend/src/views/panel/list/PanelList.vue @@ -232,6 +232,7 @@ import bus from '@/utils/bus' import EditPanel from './EditPanel' import { addGroup, delGroup, groupTree, defaultTree, findOne, panelSave } from '@/api/panel/panel' import { getPanelAllLinkageInfo } from '@/api/panel/linkage' +import { queryPanelJumpInfo } from '@/api/panel/linkJump' import { mapState } from 'vuex' import { DEFAULT_COMMON_CANVAS_STYLE_STRING @@ -639,6 +640,11 @@ export default { getPanelAllLinkageInfo(data.id).then(rsp => { this.$store.commit('setNowPanelTrackInfo', rsp.data) }) + + // 刷新跳转信息 + queryPanelJumpInfo(data.id).then(rsp => { + this.$store.commit('setNowPanelJumpInfo', rsp.data) + }) }) } if (node.expanded) { From d7ad1b86d280552add54c4168fe902fd9a8ebccc Mon Sep 17 00:00:00 2001 From: junjie Date: Thu, 28 Oct 2021 17:22:46 +0800 Subject: [PATCH 077/190] =?UTF-8?q?feat:=20=E8=A7=86=E5=9B=BE=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=AE=BE=E7=BD=AE=E7=BB=93=E6=9E=9C=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/base/domain/ChartView.java | 6 +- .../base/domain/ChartViewExample.java | 132 +++++++++++++++++- .../dataease/base/mapper/ChartViewMapper.xml | 76 +++++++--- .../service/chart/ChartViewService.java | 5 +- .../resources/db/migration/V27__de1.4.sql | 5 + .../src/main/resources/generatorConfig.xml | 1 + frontend/src/lang/en.js | 4 +- frontend/src/lang/tw.js | 4 +- frontend/src/lang/zh.js | 4 +- frontend/src/views/chart/view/ChartEdit.vue | 29 ++++ .../src/views/dataset/data/TabDataPreview.vue | 7 +- 11 files changed, 244 insertions(+), 29 deletions(-) diff --git a/backend/src/main/java/io/dataease/base/domain/ChartView.java b/backend/src/main/java/io/dataease/base/domain/ChartView.java index 4744402b39..69777d3f87 100644 --- a/backend/src/main/java/io/dataease/base/domain/ChartView.java +++ b/backend/src/main/java/io/dataease/base/domain/ChartView.java @@ -19,6 +19,10 @@ public class ChartView implements Serializable { private String type; @ApiModelProperty("chart渲染方式") private String render; + @ApiModelProperty("展示结果") + private Integer resultCount; + @ApiModelProperty("展示模式") + private String resultMode; @ApiModelProperty("标题") private String title; @ApiModelProperty("创建人") @@ -31,4 +35,4 @@ public class ChartView implements Serializable { private String stylePriority; private static final long serialVersionUID = 1L; -} +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/ChartViewExample.java b/backend/src/main/java/io/dataease/base/domain/ChartViewExample.java index aa4203c735..9def62d21e 100644 --- a/backend/src/main/java/io/dataease/base/domain/ChartViewExample.java +++ b/backend/src/main/java/io/dataease/base/domain/ChartViewExample.java @@ -524,6 +524,136 @@ public class ChartViewExample { return (Criteria) this; } + public Criteria andResultCountIsNull() { + addCriterion("result_count is null"); + return (Criteria) this; + } + + public Criteria andResultCountIsNotNull() { + addCriterion("result_count is not null"); + return (Criteria) this; + } + + public Criteria andResultCountEqualTo(Integer value) { + addCriterion("result_count =", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountNotEqualTo(Integer value) { + addCriterion("result_count <>", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountGreaterThan(Integer value) { + addCriterion("result_count >", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountGreaterThanOrEqualTo(Integer value) { + addCriterion("result_count >=", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountLessThan(Integer value) { + addCriterion("result_count <", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountLessThanOrEqualTo(Integer value) { + addCriterion("result_count <=", value, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountIn(List values) { + addCriterion("result_count in", values, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountNotIn(List values) { + addCriterion("result_count not in", values, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountBetween(Integer value1, Integer value2) { + addCriterion("result_count between", value1, value2, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultCountNotBetween(Integer value1, Integer value2) { + addCriterion("result_count not between", value1, value2, "resultCount"); + return (Criteria) this; + } + + public Criteria andResultModeIsNull() { + addCriterion("result_mode is null"); + return (Criteria) this; + } + + public Criteria andResultModeIsNotNull() { + addCriterion("result_mode is not null"); + return (Criteria) this; + } + + public Criteria andResultModeEqualTo(String value) { + addCriterion("result_mode =", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeNotEqualTo(String value) { + addCriterion("result_mode <>", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeGreaterThan(String value) { + addCriterion("result_mode >", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeGreaterThanOrEqualTo(String value) { + addCriterion("result_mode >=", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeLessThan(String value) { + addCriterion("result_mode <", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeLessThanOrEqualTo(String value) { + addCriterion("result_mode <=", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeLike(String value) { + addCriterion("result_mode like", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeNotLike(String value) { + addCriterion("result_mode not like", value, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeIn(List values) { + addCriterion("result_mode in", values, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeNotIn(List values) { + addCriterion("result_mode not in", values, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeBetween(String value1, String value2) { + addCriterion("result_mode between", value1, value2, "resultMode"); + return (Criteria) this; + } + + public Criteria andResultModeNotBetween(String value1, String value2) { + addCriterion("result_mode not between", value1, value2, "resultMode"); + return (Criteria) this; + } + public Criteria andTitleIsNull() { addCriterion("title is null"); return (Criteria) this; @@ -947,4 +1077,4 @@ public class ChartViewExample { this(condition, value, secondValue, null); } } -} +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml index 270765ab1f..1bdedbf438 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml @@ -8,6 +8,8 @@ + + @@ -85,11 +87,11 @@ - id, `name`, scene_id, table_id, `type`, render, title, create_by, create_time, update_time, - style_priority + id, `name`, scene_id, table_id, `type`, render, result_count, result_mode, title, + create_by, create_time, update_time, style_priority - x_axis, y_axis, y_axis_ext, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter, + x_axis, y_axis, y_axis_ext, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter, drill_fields, snapshot @@ -165,12 +165,7 @@ and panel_group.level = #{level} - - order by ${sort} - - - order by panel_group.create_time desc - + order by panel_group.name asc,panel_group.create_time desc From 26b601ae5346bbbe1a3d97b71d7515b619f3b287 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 28 Oct 2021 18:10:55 +0800 Subject: [PATCH 080/190] =?UTF-8?q?fix:=E8=A7=86=E5=9B=BE=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E5=90=8D=E7=A7=B0=E8=BF=87=E9=95=BF=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/resources/db/migration/V27__de1.4.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/src/main/resources/db/migration/V27__de1.4.sql b/backend/src/main/resources/db/migration/V27__de1.4.sql index 5bb6867aab..018c26ff16 100644 --- a/backend/src/main/resources/db/migration/V27__de1.4.sql +++ b/backend/src/main/resources/db/migration/V27__de1.4.sql @@ -39,3 +39,8 @@ CREATE TABLE `panel_link_jump_target_view_info` ( BEGIN; INSERT INTO `sys_menu` VALUES (6, 1, 0, 1, '系统参数', 'system-param', 'system/SysParam/index', 6, 'sys-tools', 'system-param', b'0', b'0', b'0', 'sysparam:read', NULL, NULL, NULL, NULL); COMMIT; + + +ALTER TABLE `chart_view` +MODIFY COLUMN `name` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称' AFTER `id`, +MODIFY COLUMN `title` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'EChart标题' AFTER `result_mode`; From d9071fdc529eb5dcc24a662d81174071fa25d941 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 28 Oct 2021 18:36:05 +0800 Subject: [PATCH 081/190] =?UTF-8?q?refactor:=E4=BB=A3=E7=A0=81=E5=9B=9E?= =?UTF-8?q?=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml | 7 +------ frontend/src/views/chart/components/ChartComponentG2.vue | 6 ++++++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml index 824e2b071a..6c6adb9155 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml @@ -86,12 +86,7 @@ and panel_group.level = #{level} - - order by ${sort} - - - order by panel_group.name asc,panel_group.create_time desc - + order by panel_group.name asc,panel_group.create_time desc