From 42b1599043360979f63242732270ee5830278524 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Fri, 21 May 2021 12:30:07 +0800 Subject: [PATCH 01/13] =?UTF-8?q?fix:=20=E8=8F=9C=E5=8D=95=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A0=87=E8=AF=86=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/resources/db/migration/V3__init_data.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/resources/db/migration/V3__init_data.sql b/backend/src/main/resources/db/migration/V3__init_data.sql index 397af9e899..9232d37f3e 100644 --- a/backend/src/main/resources/db/migration/V3__init_data.sql +++ b/backend/src/main/resources/db/migration/V3__init_data.sql @@ -42,9 +42,9 @@ INSERT INTO `sys_menu` VALUES (36, 1, 0, 1, '菜单表单', 'system-menu-form', INSERT INTO `sys_menu` VALUES (37, 1, 0, 1, '组织表单', 'system-dept-form', 'system/dept/form', 12, '', 'dept-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (38, 1, 0, 1, '角色表单', 'system-role-form', 'system/role/form', 13, '', 'role-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (39, 0, 0, 1, '数据源表单', 'datasource-form', 'system/datasource/form', 5, NULL, '/ds-form', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL); -INSERT INTO `sys_menu` VALUES (40, 1, 0, 1, '模板管理', 'system-template', 'panel/template/index', 13, 'dashboard', 'panel/template/index', NULL, b'0', b'0', 'sysparam:read', NULL, NULL, NULL, 1620444227389); -INSERT INTO `sys_menu` VALUES (41, 1, 0, 1, '权限管理', 'system-auth', 'system/authority/index', 14, 'password', 'system/authority/index', b'0', b'0', b'0', 'sysparam:read', NULL, NULL, NULL, 1620447312657); -INSERT INTO `sys_menu` VALUES (42, 1, 0, 1, '插件管理', 'system-plugin', 'system/plugin/index', 15, 'sys-tools', '/plugin', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `sys_menu` VALUES (40, 1, 0, 1, '模板管理', 'system-template', 'panel/template/index', 13, 'dashboard', 'panel/template/index', NULL, b'0', b'0', 'template:read', NULL, NULL, NULL, 1620444227389); +INSERT INTO `sys_menu` VALUES (41, 1, 0, 1, '权限管理', 'system-auth', 'system/authority/index', 14, 'password', 'system/authority/index', b'0', b'0', b'0', 'auth:read', NULL, NULL, NULL, 1620447312657); +INSERT INTO `sys_menu` VALUES (42, 1, 0, 1, '插件管理', 'system-plugin', 'system/plugin/index', 15, 'sys-tools', '/plugin', b'0', b'0', b'0', 'plugin:read', NULL, NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (50, 0, 0, 1, '个人信息', 'person-info', 'system/user/privateForm', 999, NULL, '/person-info', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (51, 0, 0, 1, '重置密码', 'person-pwd-reset', 'system/user/personPwd', 999, NULL, '/person-pwd', b'0', b'0', b'1', NULL, NULL, NULL, NULL, NULL); INSERT INTO `sys_menu` VALUES (52, 0, 0, 1, '关于', 'about', 'system/about/index', 16, 'system', '/about', b'0', b'0', b'1', NULL, NULL, NULL, NULL, 1620897406691); From c5b7a766f38bbe937a59497c385b56846ae4c871 Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 21 May 2021 12:35:24 +0800 Subject: [PATCH 02/13] =?UTF-8?q?feat(backend):=E4=BB=AA=E8=A1=A8=E7=9B=98?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=97=A5=E6=9C=9F=E8=BF=87=E6=BB=A4=EF=BC=9B?= =?UTF-8?q?doris=E8=BF=87=E6=BB=A4=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/doris/DorisQueryProvider.java | 9 ++++++ .../provider/mysql/MysqlQueryProvider.java | 9 ++++++ .../impl/direct/DirectFieldService.java | 28 +++++++++++++------ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index a348aa7e8e..20d6b9ee9b 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -9,7 +9,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.text.MessageFormat; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.List; /** @@ -255,6 +257,8 @@ public class DorisQueryProvider extends QueryProvider { return " IS NULL "; case "not_null": return " IS NOT NULL "; + case "between": + return " BETWEEN "; default: return ""; } @@ -285,6 +289,11 @@ public class DorisQueryProvider extends QueryProvider { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { filter.append("'%").append(value.get(0)).append("%'"); + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); + String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1)))); + filter.append("'").append(startTime).append("' AND '").append(endTime).append("'"); } else { filter.append("'").append(value.get(0)).append("'"); } diff --git a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java index 2fe0d6c0b4..56019e566d 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -9,7 +9,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.text.MessageFormat; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.List; /** @@ -262,6 +264,8 @@ public class MysqlQueryProvider extends QueryProvider { return " IS NULL "; case "not_null": return " IS NOT NULL "; + case "between": + return " BETWEEN "; default: return ""; } @@ -292,6 +296,11 @@ public class MysqlQueryProvider extends QueryProvider { filter.append("('").append(StringUtils.join(value, "','")).append("')"); } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { filter.append("'%").append(value.get(0)).append("%'"); + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); + String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1)))); + filter.append("'").append(startTime).append("' AND '").append(endTime).append("'"); } else { filter.append("'").append(value.get(0)).append("'"); } diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index 306051c0cd..bb2d6ea60e 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -3,6 +3,7 @@ package io.dataease.service.dataset.impl.direct; import io.dataease.base.domain.DatasetTable; import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.Datasource; +import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.datasource.provider.DatasourceProvider; import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.request.DatasourceRequest; @@ -53,15 +54,26 @@ public class DirectFieldService implements DataSetFieldService { if (ObjectUtils.isEmpty(datasetTable) || StringUtils.isEmpty(datasetTable.getName())) return null; String tableName = datasetTable.getName(); - String dataSourceId = datasetTable.getDataSourceId(); - if (StringUtils.isEmpty(dataSourceId)) return null; - Datasource ds = datasourceService.get(dataSourceId); - DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); - datasourceRequest.setDatasource(ds); - QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - String querySQL = qp.createQuerySQL(tableName, Collections.singletonList(field)); - datasourceRequest.setQuery(querySQL); + DatasourceProvider datasourceProvider; + if (datasetTable.getMode() == 0) { + String dataSourceId = datasetTable.getDataSourceId(); + if (StringUtils.isEmpty(dataSourceId)) return null; + Datasource ds = datasourceService.get(dataSourceId); + datasourceProvider = ProviderFactory.getProvider(ds.getType()); + datasourceRequest.setDatasource(ds); + QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); + String querySQL = qp.createQuerySQL(tableName, Collections.singletonList(field)); + datasourceRequest.setQuery(querySQL); + } else { + Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource"); + datasourceProvider = ProviderFactory.getProvider(ds.getType()); + datasourceRequest.setDatasource(ds); + QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); + String querySQL = qp.createQuerySQL(tableName, Collections.singletonList(field)); + datasourceRequest.setQuery(querySQL); + } + try { List rows = datasourceProvider.getData(datasourceRequest); List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); From 2222eda12fba13c2e07cc5a0ee70b209b3814e4d Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 21 May 2021 12:42:40 +0800 Subject: [PATCH 03/13] =?UTF-8?q?fix:=20=E7=BC=96=E8=BE=91=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E7=9B=98=20=E5=85=A8=E5=B1=8F=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canvas/components/Editor/PreviewEject.vue | 1 + .../components/Editor/PreviewFullScreen.vue | 7 +++-- .../components/canvas/components/Toolbar.vue | 3 +-- frontend/src/styles/index.scss | 16 ++++++++++++ frontend/src/views/panel/edit/index.vue | 26 ++++++++++++++++--- 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/canvas/components/Editor/PreviewEject.vue b/frontend/src/components/canvas/components/Editor/PreviewEject.vue index a236d7eb00..62787bce27 100644 --- a/frontend/src/components/canvas/components/Editor/PreviewEject.vue +++ b/frontend/src/components/canvas/components/Editor/PreviewEject.vue @@ -148,6 +148,7 @@ export default { diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index fc583bc76a..df922fe19d 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -165,22 +165,11 @@ -
+
{{ $t('chart.result_filter') }} -
- - - - - -
+ + {{ $t('chart.filter_condition') }} +
@@ -188,7 +177,7 @@ - {{ $t('chart.dimension') }} + {{ $t('chart.dimension') }} - {{ $t('chart.quota') }} + {{ $t('chart.quota') }} {{ $t('chart.confirm') }}
+ + + + @@ -283,7 +286,7 @@ import { post, ajaxGetData } from '@/api/chart/chart' import draggable from 'vuedraggable' import DimensionItem from '../components/drag-item/DimensionItem' import QuotaItem from '../components/drag-item/QuotaItem' -import FilterItem from '../components/drag-item/FilterItem' +import ResultFilterEditor from '../components/filter/ResultFilterEditor' import ChartComponent from '../components/ChartComponent' import bus from '@/utils/bus' import DatasetChartDetail from '../../dataset/common/DatasetChartDetail' @@ -317,7 +320,7 @@ import html2canvas from 'html2canvas' export default { name: 'ChartEdit', - components: { LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, FilterItem, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, + components: { ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable }, props: { param: { type: Object, @@ -359,6 +362,8 @@ export default { dimensionItem: {}, quotaFilterEdit: false, quotaItem: {}, + resultFilterEdit: false, + chartForFilter: {}, renameItem: false, itemForm: { name: '' @@ -784,6 +789,19 @@ export default { this.closeQuotaFilter() }, + showResultFilter() { + this.chartForFilter = JSON.parse(JSON.stringify(this.view)) + this.resultFilterEdit = true + }, + closeResultFilter() { + this.resultFilterEdit = false + }, + saveResultFilter() { + this.view.customFilter = this.chartForFilter.customFilter + this.save(true) + this.closeResultFilter() + }, + showRename(val) { this.itemForm = JSON.parse(JSON.stringify(val)) this.renameItem = true @@ -948,7 +966,7 @@ export default { } .attr-style{ - height: calc(100vh - 56px - 25vh - 40px - 62px - 10px); + height: calc(100vh - 56px - 25vh - 40px - 62px - 10px - 60px); } .attr-selector{ @@ -992,4 +1010,13 @@ export default { .dialog-css >>> .el-dialog__body { padding: 10px 20px 20px; } + + .filter-btn-class{ + padding: 6px; + border: none; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + } From 744c9a2dd43b35ec0210bbd0c01c6ed7e8322371 Mon Sep 17 00:00:00 2001 From: junjie Date: Fri, 21 May 2021 16:58:39 +0800 Subject: [PATCH 13/13] =?UTF-8?q?feat(=E8=A7=86=E5=9B=BE):=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E5=A2=9E=E5=8A=A0=20=E8=BF=87=E6=BB=A4=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E5=AF=B9=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=BF=9B=E8=A1=8C=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/lang/en.js | 3 ++- frontend/src/lang/tw.js | 3 ++- frontend/src/lang/zh.js | 3 ++- frontend/src/views/chart/view/ChartEdit.vue | 11 +++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index ec654784a8..e6abb09e2f 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -673,7 +673,8 @@ export default { dimension_show: 'Dimension Show', quota_show: 'Quota Show', title_limit: 'Title cannot be greater than 50 characters', - filter_condition: 'Filter Condition' + filter_condition: 'Filter Condition', + filter_field_can_null: 'Filter field must choose' }, 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 2d7d6e44b7..acdd425484 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -672,7 +672,8 @@ export default { dimension_show: '維度顯示', quota_show: '指標顯示', title_limit: '標題不能大於50個字符', - filter_condition: '過濾條件' + filter_condition: '過濾條件', + filter_field_can_null: '過濾字段必填' }, dataset: { sheet_warn: '有多個sheet頁面,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 9aee869067..a810cbf8d3 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -674,7 +674,8 @@ export default { dimension_show: '维度显示', quota_show: '指标显示', title_limit: '标题不能大于50个字符', - filter_condition: '过滤条件' + filter_condition: '过滤条件', + filter_field_can_null: '过滤字段必填' }, dataset: { sheet_warn: '有多个Sheet页,默认抽取第一个', diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index df922fe19d..a78eff2284 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -797,6 +797,17 @@ export default { this.resultFilterEdit = false }, saveResultFilter() { + for (let i = 0; i < this.chartForFilter.customFilter.length; i++) { + const f = this.chartForFilter.customFilter[i] + if (!f.fieldId || f.fieldId === '') { + this.$message({ + message: this.$t('chart.filter_field_can_null'), + type: 'error', + showClose: true + }) + return + } + } this.view.customFilter = this.chartForFilter.customFilter this.save(true) this.closeResultFilter()