From 3ed4c133ba5f3664cffb41e57270ea2cb6cef6ce Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 14 Nov 2023 10:18:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?perf:=20=E4=B8=8B=E6=8B=89=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E9=80=89=E6=A8=A1=E7=B3=8A=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DataSetTableFieldController.java | 6 +-- .../dataset/MultFieldValuesRequest.java | 2 + .../service/dataset/DataSetFieldService.java | 4 +- .../impl/direct/DirectFieldService.java | 18 +++++-- .../src/components/elVisualSelect/index.vue | 24 +++++---- .../components/widget/deWidget/DeSelect.vue | 51 ++++++++++++++++++- 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 5f030fb51b..dee0a2fd4a 100644 --- a/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -214,7 +214,7 @@ public class DataSetTableFieldController { public List multFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { List results = new ArrayList<>(); for (String fieldId : multFieldValuesRequest.getFieldIds()) { - List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false); + List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false, multFieldValuesRequest.getKeyword()); if (CollectionUtil.isNotEmpty(fieldValues)) { results.addAll(fieldValues); } @@ -233,13 +233,13 @@ public class DataSetTableFieldController { DecodedJWT jwt = JWT.decode(linkToken); Long userId = jwt.getClaim("userId").asLong(); multFieldValuesRequest.setUserId(userId); - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword()); } @ApiIgnore @PostMapping("mappingFieldValues") public List mappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword()); } @ApiIgnore diff --git a/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java b/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java index 5c0bf52fa0..cd9b46b077 100644 --- a/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java +++ b/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java @@ -13,4 +13,6 @@ public class MultFieldValuesRequest { private DeSortDTO sort; + private String keyword; + } diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java index df8e1e5b02..cc433ec9bb 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java @@ -9,9 +9,9 @@ public interface DataSetFieldService { List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; - List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; + List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception; - List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception; + List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception; List chineseSort(List list, DeSortDTO sortDTO) throws Exception; } diff --git a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index e0f0031230..0930315a95 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -58,14 +58,14 @@ public class DirectFieldService implements DataSetFieldService { public List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { List fieldIds = new ArrayList<>(); fieldIds.add(fieldId); - return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm); + return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm, null); } @Override - public List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { + public List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception { List fieldIds = new ArrayList<>(); fieldIds.add(fieldId); - return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm); + return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm, keyword); } public List buildSorts(List allFields, DeSortDTO sortDTO) { @@ -98,8 +98,15 @@ public class DirectFieldService implements DataSetFieldService { return result; } + private String formatTableByKeyword(String keyword, String originTable, List fields) { + if (StringUtils.isBlank(keyword)) return originTable; + List fieldNames = fields.stream().map(DatasetTableField::getOriginName).collect(Collectors.toList()); + String whereSql = fieldNames.stream().map(fieldName -> " " + fieldName + " like '%" + keyword + "%'").collect(Collectors.joining(" or ")); + return "( select * from " + originTable + " where (" + whereSql + ") )"; + } + @Override - public List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception { + public List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception { String fieldId = fieldIds.get(0); DatasetTableField field = dataSetTableFieldsService.selectByPrimaryKey(fieldId); if (field == null || StringUtils.isEmpty(field.getTableId())) return null; @@ -165,7 +172,8 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.toString())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - createSQL = qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields); + String formatSql = formatTableByKeyword(keyword, dataTableInfoDTO.getTable(), permissionFields); + createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { String sql = dataTableInfoDTO.getSql(); if (dataTableInfoDTO.isBase64Encryption()) { diff --git a/core/frontend/src/components/elVisualSelect/index.vue b/core/frontend/src/components/elVisualSelect/index.vue index 9778792549..6f4af06266 100644 --- a/core/frontend/src/components/elVisualSelect/index.vue +++ b/core/frontend/src/components/elVisualSelect/index.vue @@ -124,9 +124,9 @@ export default { }, list() { this.resetList() - this.show = false + // this.show = false this.$nextTick(() => { - this.show = true + // this.show = true this.$nextTick(() => { this.init() }) @@ -212,14 +212,20 @@ export default { ) this.scrollbar = document.querySelector(`.${this.classId} .el-select-dropdown .el-scrollbar`) this.selectBoxDom = document.querySelector(`.${this.classId} .el-select-dropdown__wrap`) - this.selectBoxDom.style.display = 'flex' - this.selectBoxDom.style.flexDirection = 'row' - this.domList = selectDom.querySelector( - `.${this.classId} .el-select-dropdown__wrap .el-select-dropdown__list` - ) - this.addScrollDiv(this.selectBoxDom) + if (this.selectBoxDom) { + this.selectBoxDom.style.display = 'flex' + this.selectBoxDom.style.flexDirection = 'row' + } + if (selectDom) { + this.domList = selectDom.querySelector( + `.${this.classId} .el-select-dropdown__wrap .el-select-dropdown__list` + ) + } + if (this.selectBoxDom) { + this.addScrollDiv(this.selectBoxDom) + } - this.scrollFn() + this.scrollbar && this.scrollFn() this.customInputStyle() }, diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue index ef2e33d5c8..4b36c97e66 100644 --- a/core/frontend/src/components/widget/deWidget/DeSelect.vue +++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue @@ -94,7 +94,9 @@ export default { data: [], onFocus: false, keyWord: '', - separator: ',' + separator: ',', + timeMachine: null, + changeIndex: 0 } }, computed: { @@ -292,8 +294,55 @@ export default { this.value = this.element.options.attrs.multiple ? [] : null this.$refs.deSelect && this.$refs.deSelect.resetSelectAll && this.$refs.deSelect.resetSelectAll() }, + + searchWithKey(index) { + this.timeMachine = setTimeout(() => { + if (index === this.changeIndex) { + this.refreshOptions() + } + this.destroyTimeMachine() + }, 1500) + }, + destroyTimeMachine() { + this.timeMachine && clearTimeout(this.timeMachine) + this.timeMachine = null + }, filterMethod(key) { + if (key === this.keyWord) { + return + } this.keyWord = key + this.destroyTimeMachine() + this.changeIndex++ + this.searchWithKey(this.changeIndex) + }, + refreshOptions() { + // this.data = [] + let method = multFieldValues + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = linkMultFieldValues + } + if (!this.element.options.attrs.fieldId) { + return + } + const param = { fieldIds: this.element.options.attrs.fieldId.split(this.separator), sort: this.element.options.attrs.sort, keyword: this.keyWord } + if (this.panelInfo.proxy) { + param.userId = this.panelInfo.proxy + } + this.element.options.attrs.fieldId && + this.element.options.attrs.fieldId.length > 0 && + method(param).then(res => { + // console.log(res.data) + this.data = this.optionData(res.data) + /* this.$nextTick(() => { + this.handleCoustomStyle() + }) */ + // bus.$emit('valid-values-change', true) + }).catch(e => { + // bus.$emit('valid-values-change', false) + }) }, onScroll() { if (this.onFocus) { From a014b5200f5211560aff96d8123109bc720adb50 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 14 Nov 2023 16:03:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?perf:=20=E4=B8=8B=E6=8B=89=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E4=BD=BF=E7=94=A8=E5=90=8E=E5=8F=B0=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/direct/DirectFieldService.java | 18 +++++++-- .../src/components/elVisualSelect/index.vue | 39 +++++++++++-------- .../components/widget/deWidget/DeSelect.vue | 14 +++---- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index 0930315a95..590854017d 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -119,7 +119,7 @@ public class DirectFieldService implements DataSetFieldService { List deSortFields = buildSorts(fields, sortDTO); - Boolean needSort = CollectionUtils.isNotEmpty(deSortFields); + boolean needSort = CollectionUtils.isNotEmpty(deSortFields); final List allTableFieldIds = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()); boolean multi = fieldIds.stream().anyMatch(item -> !allTableFieldIds.contains(item)); @@ -180,15 +180,24 @@ public class DirectFieldService implements DataSetFieldService { sql = new String(java.util.Base64.getDecoder().decode(sql)); } sql = dataSetTableService.handleVariableDefaultValue(sql, null, ds.getType(), false); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); List listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, listUnion, ds); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null)); @@ -201,15 +210,16 @@ public class DirectFieldService implements DataSetFieldService { String tableName = "ds_" + datasetTable.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - createSQL = qp.createQuerySQL(tableName, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields); + String formatSql = formatTableByKeyword(keyword, tableName, permissionFields); + createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields); datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null)); } LogUtil.info(datasourceRequest.getQuery()); datasourceRequest.setPermissionFields(permissionFields); + assert datasourceProvider != null; List rows = datasourceProvider.getData(datasourceRequest); if (!needMapping) { - List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); - return results; + return rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); } Set pkSet = new HashSet<>(); diff --git a/core/frontend/src/components/elVisualSelect/index.vue b/core/frontend/src/components/elVisualSelect/index.vue index 6f4af06266..633e6520a1 100644 --- a/core/frontend/src/components/elVisualSelect/index.vue +++ b/core/frontend/src/components/elVisualSelect/index.vue @@ -85,6 +85,10 @@ export default { clearable: { type: Boolean, default: true + }, + flag: { + type: String, + require: true } }, data() { @@ -124,14 +128,14 @@ export default { }, list() { this.resetList() - // this.show = false this.$nextTick(() => { - // this.show = true this.$nextTick(() => { this.init() }) }) - }, + } + /* + 模糊搜索改为后端检索,暂注释前端 keyWord(val, old) { if (val === old) return const results = val ? this.vagueFilter(val, this.list) : null @@ -141,6 +145,7 @@ export default { this.callback() }) } + */ }, mounted() { this.resetList() @@ -174,8 +179,10 @@ export default { this.$emit('handleShowNumber') }, addScrollDiv(selectDom) { + const baseClass = `${this.classId}-creator` this.maxHeightDom = document.createElement('div') this.maxHeightDom.className = 'el-select-height' + this.maxHeightDom.classList.add(baseClass) selectDom.insertBefore(this.maxHeightDom, this.domList) }, reCacularHeight() { @@ -206,26 +213,26 @@ export default { this.customInputStyle() return } + const baseClass = `.${this.classId}-creator` + if (document.querySelector(baseClass)) { + this.customInputStyle() + this.reCacularHeight() + return + } const selectDom = document.querySelector( `.${this.classId} .el-select-dropdown .el-select-dropdown__wrap` ) this.scrollbar = document.querySelector(`.${this.classId} .el-select-dropdown .el-scrollbar`) this.selectBoxDom = document.querySelector(`.${this.classId} .el-select-dropdown__wrap`) - if (this.selectBoxDom) { - this.selectBoxDom.style.display = 'flex' - this.selectBoxDom.style.flexDirection = 'row' - } - if (selectDom) { - this.domList = selectDom.querySelector( - `.${this.classId} .el-select-dropdown__wrap .el-select-dropdown__list` - ) - } - if (this.selectBoxDom) { - this.addScrollDiv(this.selectBoxDom) - } + this.selectBoxDom.style.display = 'flex' + this.selectBoxDom.style.flexDirection = 'row' + this.domList = selectDom.querySelector( + `.${this.classId} .el-select-dropdown__wrap .el-select-dropdown__list` + ) + this.addScrollDiv(this.selectBoxDom) - this.scrollbar && this.scrollFn() + this.scrollFn() this.customInputStyle() }, diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue index 4b36c97e66..970ec23773 100644 --- a/core/frontend/src/components/widget/deWidget/DeSelect.vue +++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue @@ -18,6 +18,7 @@ popper-class="coustom-de-select" :class="{'disabled-close': !inDraw && selectFirst && element.options.attrs.multiple}" :list="data" + :flag="flag" :is-config="isConfig" :custom-style="customStyle" @resetKeyWords="filterMethod" @@ -52,7 +53,7 @@ import { isSameVueObj, mergeCustomSortOption } from '@/utils' import { getLinkToken, getToken } from '@/utils/auth' import customInput from '@/components/widget/deWidget/customInput' import { textSelectWidget } from '@/components/widget/deWidget/serviceNameFn.js' - +import { uuid } from 'vue-uuid' export default { components: { ElVisualSelect }, mixins: [customInput], @@ -96,7 +97,8 @@ export default { keyWord: '', separator: ',', timeMachine: null, - changeIndex: 0 + changeIndex: 0, + flag: uuid.v1() } }, computed: { @@ -334,14 +336,8 @@ export default { this.element.options.attrs.fieldId && this.element.options.attrs.fieldId.length > 0 && method(param).then(res => { - // console.log(res.data) this.data = this.optionData(res.data) - /* this.$nextTick(() => { - this.handleCoustomStyle() - }) */ - // bus.$emit('valid-values-change', true) - }).catch(e => { - // bus.$emit('valid-values-change', false) + this.flag = uuid.v1() }) }, onScroll() {