From ab886fe1b47136ec14ef2ce56bc6855995e44294 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Sat, 26 Mar 2022 21:17:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E4=BB=AA=E8=A1=A8=E6=9D=BF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8E=A5=E6=94=B6=E5=A4=96=E9=83=A8=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/ext/ExtPanelOuterParamsMapper.java | 6 +- .../mapper/ext/ExtPanelOuterParamsMapper.xml | 18 +++++ .../dataease/controller/IndexController.java | 9 +++ .../panel/PanelOuterParamsController.java | 7 ++ .../request/chart/ChartExtRequest.java | 4 +- .../PanelOuterParamsBaseResponse.java | 25 +++++++ .../outerParams/PanelOuterParamsInfoDTO.java | 6 ++ .../service/chart/ChartViewService.java | 17 ++++- .../panel/PanelOuterParamsService.java | 9 +++ frontend/public/link.html | 4 ++ frontend/src/api/panel/outerParams.js | 10 ++- .../canvas/components/Editor/PreviewEject.vue | 52 +++++++++++--- .../canvas/custom-component/UserView.vue | 1 + frontend/src/lang/en.js | 1 + frontend/src/lang/tw.js | 1 + frontend/src/lang/zh.js | 1 + frontend/src/store/index.js | 49 +++++++++++++ frontend/src/utils/check.js | 11 +++ frontend/src/views/link/view/index.vue | 69 ++++++++++++++----- .../src/views/panel/OuterParamsSet/index.vue | 15 +++- 20 files changed, 283 insertions(+), 32 deletions(-) create mode 100644 backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsBaseResponse.java create mode 100644 frontend/src/utils/check.js diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.java index c32cc032a9..2b4aa36180 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.java @@ -1,9 +1,11 @@ package io.dataease.base.mapper.ext; - import io.dataease.dto.panel.outerParams.PanelOuterParamsDTO; +import io.dataease.dto.panel.outerParams.PanelOuterParamsInfoDTO; import org.apache.ibatis.annotations.Param; +import java.util.List; + public interface ExtPanelOuterParamsMapper { PanelOuterParamsDTO queryWithPanelId(@Param("panelId") String panelId); @@ -14,4 +16,6 @@ public interface ExtPanelOuterParamsMapper { void deleteOuterParamsWithPanelId(@Param("panelId") String panelId); + List getPanelOuterParamsInfo(@Param("panelId") String panelId); + } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.xml index 7d535fd956..ced559f72c 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelOuterParamsMapper.xml @@ -17,6 +17,13 @@ + + + + + + + + SELECT DISTINCT + param_name AS sourceInfo, + CONCAT( poptvi.target_view_id, '#', poptvi.target_field_id ) AS targetInfo + FROM + panel_outer_params pop + LEFT JOIN panel_outer_params_info popi ON pop.params_id = popi.params_id + LEFT JOIN panel_outer_params_target_view_info poptvi ON popi.params_info_id = poptvi.params_info_id + WHERE + pop.panel_id = #{panelId} + diff --git a/backend/src/main/java/io/dataease/controller/IndexController.java b/backend/src/main/java/io/dataease/controller/IndexController.java index 02f7aca44f..22a1c4d6ed 100644 --- a/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/backend/src/main/java/io/dataease/controller/IndexController.java @@ -7,12 +7,15 @@ import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.service.panel.PanelLinkService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import javax.annotation.Resource; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -59,6 +62,12 @@ public class IndexController { } HttpServletResponse response = ServletUtils.response(); try { + // TODO 增加仪表板外部参数 + HttpServletRequest request = ServletUtils.request(); + String attachParams = request.getParameter("attachParams"); + if(StringUtils.isNotEmpty(attachParams)){ + url = url+"&attachParams="+attachParams; + } response.sendRedirect(url); } catch (IOException e) { LogUtil.error(e.getMessage()); diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelOuterParamsController.java b/backend/src/main/java/io/dataease/controller/panel/PanelOuterParamsController.java index e412a65a8b..7a9ca00a08 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelOuterParamsController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelOuterParamsController.java @@ -1,6 +1,7 @@ package io.dataease.controller.panel; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.dto.panel.outerParams.PanelOuterParamsBaseResponse; import io.dataease.dto.panel.outerParams.PanelOuterParamsDTO; import io.dataease.service.panel.PanelOuterParamsService; import io.swagger.annotations.Api; @@ -34,4 +35,10 @@ public class PanelOuterParamsController { public void updateOuterParamsSet(@RequestBody PanelOuterParamsDTO OuterParamsDTO) { panelOuterParamsService.updateOuterParamsSet(OuterParamsDTO); } + + @ApiOperation("仪表板外部参数映射关系") + @GetMapping("/getOuterParamsInfo/{panelId}") + public PanelOuterParamsBaseResponse getOuterParamsInfo(@PathVariable("panelId") String panelId){ + return panelOuterParamsService.getOuterParamsInfo(panelId); + } } diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java index 03ec1abeaa..a98ae98a97 100644 --- a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java @@ -18,10 +18,12 @@ public class ChartExtRequest { @ApiModelProperty("视图额外过滤条件集合") private List filter; - // 联动过滤条件 @ApiModelProperty("联动过滤条件集合") private List linkageFilters; + @ApiModelProperty("外部参数过滤条件集合") + private List outerParamsFilters; + @ApiModelProperty("下钻维度集合") private List drill; diff --git a/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsBaseResponse.java b/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsBaseResponse.java new file mode 100644 index 0000000000..618c98ccd0 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsBaseResponse.java @@ -0,0 +1,25 @@ +package io.dataease.dto.panel.outerParams; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * Author: wangjiahao + * Date: 2022/3/25 + * Description: + */ +@Data +public class PanelOuterParamsBaseResponse { + + // 获取仪表板外部参数映射信息 + private Map> outerParamsInfoMap; + + public PanelOuterParamsBaseResponse(Map> outerParamsInfoMap) { + this.outerParamsInfoMap = outerParamsInfoMap; + } + + public PanelOuterParamsBaseResponse() { + } +} diff --git a/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsInfoDTO.java b/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsInfoDTO.java index 0f79c1bb77..3cdd539e78 100644 --- a/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsInfoDTO.java +++ b/backend/src/main/java/io/dataease/dto/panel/outerParams/PanelOuterParamsInfoDTO.java @@ -18,4 +18,10 @@ public class PanelOuterParamsInfoDTO extends PanelOuterParamsInfo { private String panelId; private List targetViewInfoList=new ArrayList<>(); + + //仪表板外部参数信息 panelId#paramName + private String sourceInfo; + + //目标联动参数 targetViewId#targetFieldId + private List targetInfoList; } diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 6aea786d27..d6193cf237 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -426,9 +426,20 @@ public class ChartViewService { } } - //联动过滤条件联动条件全部加上 - if (ObjectUtils.isNotEmpty(requestList.getLinkageFilters())) { - for (ChartExtFilterRequest request : requestList.getLinkageFilters()) { + List filters = new ArrayList<>(); + // 联动条件 + if(ObjectUtils.isNotEmpty(requestList.getLinkageFilters())){ + filters.addAll(requestList.getLinkageFilters()); + } + + // 外部参数条件 + if(ObjectUtils.isNotEmpty(requestList.getOuterParamsFilters())){ + filters.addAll(requestList.getOuterParamsFilters()); + } + + //联动过滤条件和外部参数过滤条件全部加上 + if (ObjectUtils.isNotEmpty(filters)) { + for (ChartExtFilterRequest request : filters) { DatasetTableField datasetTableField = dataSetTableFieldsService.get(request.getFieldId()); if (!desensitizationList.contains(datasetTableField.getDataeaseName()) && dataeaseNames.contains(datasetTableField.getDataeaseName())) { request.setDatasetTableField(datasetTableField); diff --git a/backend/src/main/java/io/dataease/service/panel/PanelOuterParamsService.java b/backend/src/main/java/io/dataease/service/panel/PanelOuterParamsService.java index 0bbd7d0997..c5e2b0c068 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelOuterParamsService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelOuterParamsService.java @@ -5,15 +5,19 @@ import io.dataease.base.mapper.PanelOuterParamsMapper; import io.dataease.base.mapper.PanelOuterParamsTargetViewInfoMapper; import io.dataease.base.mapper.ext.ExtPanelOuterParamsMapper; import io.dataease.dto.panel.linkJump.PanelLinkJumpDTO; +import io.dataease.dto.panel.outerParams.PanelOuterParamsBaseResponse; import io.dataease.dto.panel.outerParams.PanelOuterParamsDTO; +import io.dataease.dto.panel.outerParams.PanelOuterParamsInfoDTO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; /** * Author: wangjiahao @@ -67,4 +71,9 @@ public class PanelOuterParamsService { }); } + public PanelOuterParamsBaseResponse getOuterParamsInfo(String panelId){ + List result = extPanelOuterParamsMapper.getPanelOuterParamsInfo(panelId); + return new PanelOuterParamsBaseResponse(Optional.ofNullable(result).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(PanelOuterParamsInfoDTO::getSourceInfo, PanelOuterParamsInfoDTO::getTargetInfoList))); + } + } diff --git a/frontend/public/link.html b/frontend/public/link.html index dd609e0dd8..b3008b8551 100644 --- a/frontend/public/link.html +++ b/frontend/public/link.html @@ -32,6 +32,7 @@ const link = getQueryVariable('link') const user = getQueryVariable('user') const terminal = getQueryVariable('terminal') + const attachParams = getQueryVariable('attachParams') let url = "/#/delink?link=" + encodeURIComponent(link) if (terminal) { url += '&terminal=' + terminal @@ -39,6 +40,9 @@ if (user) { url += '&user=' + user } + if (attachParams) { + url += '&attachParams=' + attachParams + } window.location.href = url diff --git a/frontend/src/api/panel/outerParams.js b/frontend/src/api/panel/outerParams.js index 7f8ecb3c5d..31d2a7890b 100644 --- a/frontend/src/api/panel/outerParams.js +++ b/frontend/src/api/panel/outerParams.js @@ -7,8 +7,6 @@ export function queryWithPanelId(panelId) { }) } - - export function updateOuterParamsSet(requestInfo) { return request({ url: '/outerParams/updateOuterParamsSet', @@ -17,3 +15,11 @@ export function updateOuterParamsSet(requestInfo) { loading: true }) } + +export function getOuterParamsInfo(panelId) { + return request({ + url: '/outerParams/getOuterParamsInfo/' + panelId, + method: 'get', + loading: true + }) +} diff --git a/frontend/src/components/canvas/components/Editor/PreviewEject.vue b/frontend/src/components/canvas/components/Editor/PreviewEject.vue index 5746f77bef..068c6e77e1 100644 --- a/frontend/src/components/canvas/components/Editor/PreviewEject.vue +++ b/frontend/src/components/canvas/components/Editor/PreviewEject.vue @@ -9,6 +9,7 @@ import { uuid } from 'vue-uuid' import { initPanelData } from '@/api/panel/panel' import { queryTargetPanelJumpInfo } from '@/api/panel/linkJump' import { proxyInitPanelData } from '@/api/panel/shareProxy' +import { getOuterParamsInfo } from '@/api/panel/outerParams' export default { components: { Preview }, @@ -75,9 +76,33 @@ export default { }, initCallBack() { - this.dataLoading = false + this.dataLoading = true + let loadingCount = 0 // 如果含有跳转参数 进行触发 const tempParam = localStorage.getItem('jumpInfoParam') + // 添加外部参数 + const attachParamsEncode = this.$route.query.attachParams + tempParam && loadingCount++ + attachParamsEncode && loadingCount++ + + if (attachParamsEncode) { + try { + const Base64 = require('js-base64').Base64 + const attachParam = JSON.parse(Base64.decode(attachParamsEncode)) + getOuterParamsInfo(this.panelId).then(rsp => { + if (--loadingCount === 0) { + this.dataLoading = false + } + this.$store.commit('setNowPanelOuterParamsInfo', rsp.data) + this.$store.commit('addOuterParamsFilter', attachParam) + }) + } catch (e) { + if (--loadingCount === 0) { + this.dataLoading = false + } + console.log('outerParams Deocode error:', e) + } + } if (tempParam) { localStorage.removeItem('jumpInfoParam') const jumpParam = JSON.parse(tempParam) @@ -87,13 +112,24 @@ export default { sourceFieldId: jumpParam.sourceFieldId, targetPanelId: this.panelId } - this.dataLoading = true - // 刷新跳转目标仪表板联动信息 - queryTargetPanelJumpInfo(jumpRequestParam).then(rsp => { - this.dataLoading = false - this.$store.commit('setNowTargetPanelJumpInfo', rsp.data) - this.$store.commit('addViewTrackFilter', jumpParam) - }) + try { + // 刷新跳转目标仪表板联动信息 + queryTargetPanelJumpInfo(jumpRequestParam).then(rsp => { + if (--loadingCount === 0) { + this.dataLoading = false + } + this.$store.commit('setNowTargetPanelJumpInfo', rsp.data) + this.$store.commit('addViewTrackFilter', jumpParam) + }) + } catch (e) { + if (--loadingCount === 0) { + this.dataLoading = false + } + console.log('queryTargetPanelJumpInfo error:', e) + } + } + if (loadingCount === 0) { + this.dataLoading = false } }, resetID(data) { diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index c22fa3e143..afb04f90c8 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -213,6 +213,7 @@ export default { const filter = {} filter.filter = this.isFirstLoad ? this.filters : this.cfilters filter.linkageFilters = this.element.linkageFilters + filter.outerParamsFilters = this.element.outerParamsFilters filter.drill = this.drillClickDimensionList filter.resultCount = this.resultCount filter.resultMode = this.resultMode diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index ca082a4505..5721887091 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1382,6 +1382,7 @@ export default { sure_bt: 'Confirm' }, panel: { + repeat_params: 'Repeat Params Exist', enable_outer_param_set: 'Enable Outer Param Set', select_param: 'Please Select Param...', add_param_link_field: "Add Params' Linked Field", diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index af37fb6af0..242f4469c2 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1383,6 +1383,7 @@ export default { sure_bt: '確定' }, panel: { + repeat_params: '存在名称重复的参数', enable_outer_param_set: '启用外部参数设置', select_param: '请选择参数...', add_param_link_field: '添加参数联动字段', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 11497026ef..6a0cd6f08b 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1391,6 +1391,7 @@ export default { sure_bt: '确定' }, panel: { + repeat_params: '存在名称重复的参数', enable_outer_param_set: '启用外部参数设置', select_param: '请选择参数...', add_param_link_field: '添加参数联动字段', diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index e893100ee2..a403048b7d 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -79,6 +79,8 @@ const data = { nowPanelJumpInfo: {}, // 当前仪表板的跳转信息(只包括仪表板) nowPanelJumpInfoTargetPanel: {}, + // 当前仪表板的外部参数信息 + nowPanelOuterParamsInfo: {}, // 拖拽的组件信息 dragComponentInfo: null, // 仪表板组件间隙大小 px @@ -293,6 +295,50 @@ const data = { state.componentData[index] = element } }, + // 添加外部参数的过滤条件 + addOuterParamsFilter(state, params) { + // params 结构 {key1:value1,key2:value2} + if (params) { + const trackInfo = state.nowPanelOuterParamsInfo + + for (let index = 0; index < state.componentData.length; index++) { + const element = state.componentData[index] + if (!element.type || element.type !== 'view') continue + const currentFilters = element.outerParamsFilters || [] // 外部参数信息 + + // 外部参数 可能会包含多个参数 + Object.keys(params).forEach(function(sourceInfo) { + // 获取外部参数的值 sourceInfo 是外部参数名称 + const paramValue = params[sourceInfo] + // 获取所有目标联动信息 + const targetInfoList = trackInfo[sourceInfo] || [] + + targetInfoList.forEach(targetInfo => { + const targetInfoArray = targetInfo.split('#') + const targetViewId = targetInfoArray[0] // 目标视图 + if (element.propValue.viewId === targetViewId) { // 如果目标视图 和 当前循环组件id相等 则进行条件增减 + const targetFieldId = targetInfoArray[1] // 目标视图列ID + const condition = new Condition('', targetFieldId, 'eq', [paramValue], [targetViewId]) + let j = currentFilters.length + while (j--) { + const filter = currentFilters[j] + // 兼容性准备 viewIds 只会存放一个值 + if (targetFieldId === filter.fieldId && filter.viewIds.includes(targetViewId)) { + currentFilters.splice(j, 1) + } + } + // 不存在该条件 且 条件有效 直接保存该条件 + // !filterExist && vValid && currentFilters.push(condition) + currentFilters.push(condition) + } + }) + element.outerParamsFilters = currentFilters + state.componentData[index] = element + }) + } + } + }, + setComponentWithId(state, component) { for (let index = 0; index < state.componentData.length; index++) { const element = state.componentData[index] @@ -338,6 +384,9 @@ const data = { setNowTargetPanelJumpInfo(state, jumpInfo) { state.nowPanelJumpInfoTargetPanel = jumpInfo.baseJumpInfoPanelMap }, + setNowPanelOuterParamsInfo(state, outerParamsInfo) { + state.nowPanelOuterParamsInfo = outerParamsInfo.outerParamsInfoMap + }, clearPanelLinkageInfo(state) { state.componentData.forEach(item => { if (item.linkageFilters && item.linkageFilters.length > 0) { diff --git a/frontend/src/utils/check.js b/frontend/src/utils/check.js new file mode 100644 index 0000000000..6786ba8e9d --- /dev/null +++ b/frontend/src/utils/check.js @@ -0,0 +1,11 @@ +export function checkRepeat(arrayData, key) { + for (let i = 0; i < arrayData.length; i++) { + for (let j = i + 1; j < arrayData.length; j++) { + if (arrayData[i][key] === arrayData[j][key]) { + return true + } + } + } + return false +} + diff --git a/frontend/src/views/link/view/index.vue b/frontend/src/views/link/view/index.vue index 21a6fc1ad9..edf37188a0 100644 --- a/frontend/src/views/link/view/index.vue +++ b/frontend/src/views/link/view/index.vue @@ -11,6 +11,7 @@ import Preview from '@/components/canvas/components/Editor/Preview' import { getPanelAllLinkageInfo } from '@/api/panel/linkage' import { queryPanelJumpInfo, queryTargetPanelJumpInfo } from '@/api/panel/linkJump' import { panelInit } from '@/components/canvas/utils/utils' +import { getOuterParamsInfo } from '@/api/panel/outerParams' export default { name: 'LinkView', @@ -37,6 +38,8 @@ export default { methods: { setPanelInfo() { loadResource(this.resourceId).then(res => { + this.show = false + let loadingCount = 0 this.$store.dispatch('panel/setPanelInfo', { id: res.data.id, name: res.data.name, @@ -54,25 +57,59 @@ export default { queryPanelJumpInfo(this.resourceId).then(rsp => { this.$store.commit('setNowPanelJumpInfo', rsp.data) }) + // 如果含有跳转参数 进行触发 const tempParam = localStorage.getItem('jumpInfoParam') - if (tempParam) { - localStorage.removeItem('jumpInfoParam') - const jumpParam = JSON.parse(tempParam) - const jumpRequestParam = { - sourcePanelId: jumpParam.sourcePanelId, - sourceViewId: jumpParam.sourceViewId, - sourceFieldId: jumpParam.sourceFieldId, - targetPanelId: this.resourceId + // 添加外部参数 + const attachParamsEncode = this.$route.query.attachParams + + tempParam && loadingCount++ + attachParamsEncode && loadingCount++ + + if (attachParamsEncode) { + try { + const Base64 = require('js-base64').Base64 + const attachParam = JSON.parse(Base64.decode(attachParamsEncode)) + getOuterParamsInfo(this.resourceId).then(rsp => { + if (--loadingCount === 0) { + this.show = true + } + this.$store.commit('setNowPanelOuterParamsInfo', rsp.data) + this.$store.commit('addOuterParamsFilter', attachParam) + }) + } catch (e) { + if (--loadingCount === 0) { + this.show = true + } + console.log('outerParams Decode error:', e) } - this.show = false - // 刷新跳转目标仪表板联动信息 - queryTargetPanelJumpInfo(jumpRequestParam).then(rsp => { - this.show = true - this.$store.commit('setNowTargetPanelJumpInfo', rsp.data) - this.$store.commit('addViewTrackFilter', jumpParam) - }) - } else { + } + + if (tempParam) { + try { + localStorage.removeItem('jumpInfoParam') + const jumpParam = JSON.parse(tempParam) + const jumpRequestParam = { + sourcePanelId: jumpParam.sourcePanelId, + sourceViewId: jumpParam.sourceViewId, + sourceFieldId: jumpParam.sourceFieldId, + targetPanelId: this.resourceId + } + // 刷新跳转目标仪表板联动信息 + queryTargetPanelJumpInfo(jumpRequestParam).then(rsp => { + this.show = true + this.$store.commit('setNowTargetPanelJumpInfo', rsp.data) + this.$store.commit('addViewTrackFilter', jumpParam) + }) + } catch (e) { + if (--loadingCount === 0) { + this.show = true + } + console.log('tempParam error:', e) + } + } + + if (loadingCount === 0) { this.show = true } }) diff --git a/frontend/src/views/panel/OuterParamsSet/index.vue b/frontend/src/views/panel/OuterParamsSet/index.vue index 8641f9f5dc..531fa3e1ea 100644 --- a/frontend/src/views/panel/OuterParamsSet/index.vue +++ b/frontend/src/views/panel/OuterParamsSet/index.vue @@ -173,6 +173,7 @@ import { mapState } from 'vuex' import { queryWithPanelId, updateOuterParamsSet } from '@/api/panel/outerParams' import { uuid } from 'vue-uuid' import { deepCopy } from '@/components/canvas/utils/utils' +import { checkRepeat } from '@/utils/check' export default { name: 'OuterParamsSet', @@ -258,9 +259,17 @@ export default { this.$emit('outerParamsSetVisibleChange', false) }, save() { + if (checkRepeat(this.outerParams.outerParamsInfoArray, 'name')) { + this.$message({ + message: this.$t('panel.repeat_params'), + type: 'warn', + showClose: true + }) + return + } updateOuterParamsSet(this.outerParams).then(rsp => { this.$message({ - message: '保存成功', + message: this.$t('commons.save_success'), type: 'success', showClose: true }) @@ -329,6 +338,10 @@ export default { const children = parent.data.children || parent.data const index = children.findIndex(d => d.paramsInfoId === data.paramsInfoId) children.splice(index, 1) + if (data.paramsInfoId === this.outerParamsInfo.paramsInfoId) { + delete this.mapOuterParamsInfoArray[data.paramsInfoId] + this.outerParamsInfo = null + } } } } From 92b9b4335d66f14b73f369cd2cb0527534ca625a Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Sun, 27 Mar 2022 13:09:56 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E9=BB=98=E8=AE=A4=E6=9D=83=E9=99=90=E7=BB=A7=E6=89=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dataset/DataSetGroupService.java | 4 + .../service/dataset/DataSetTableService.java | 5 + .../service/panel/PanelGroupService.java | 15 +- .../main/resources/db/migration/V33__1.9.sql | 158 ++++++++++++++++++ 4 files changed, 179 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java index a6b42f3038..c7144d4129 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java @@ -5,6 +5,7 @@ import io.dataease.base.domain.DatasetGroup; import io.dataease.base.domain.DatasetGroupExample; import io.dataease.base.mapper.DatasetGroupMapper; import io.dataease.base.mapper.ext.ExtDataSetGroupMapper; +import io.dataease.commons.constants.AuthConstants; import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; @@ -14,6 +15,7 @@ import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.dto.dataset.DataSetGroupDTO; import io.dataease.dto.dataset.DataSetTableDTO; import io.dataease.i18n.Translator; +import io.dataease.listener.util.CacheUtils; import io.dataease.service.sys.SysAuthService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -49,6 +51,8 @@ public class DataSetGroupService { datasetGroup.setCreateBy(AuthUtils.getUser().getUsername()); datasetGroup.setCreateTime(System.currentTimeMillis()); datasetGroupMapper.insert(datasetGroup); + // 清理权限缓存 + CacheUtils.removeAll(AuthConstants.USER_PERMISSION_CACHE_NAME); } else { datasetGroupMapper.updateByPrimaryKeySelective(datasetGroup); } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index ed4e4a9d64..9cfd313b05 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -24,6 +24,7 @@ import io.dataease.dto.dataset.union.UnionParamDTO; import io.dataease.dto.datasource.TableField; import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; +import io.dataease.listener.util.CacheUtils; import io.dataease.plugins.common.constants.DatasourceTypes; import io.dataease.plugins.loader.ClassloaderResponsity; import io.dataease.provider.ProviderFactory; @@ -115,6 +116,10 @@ public class DataSetTableService { public void batchInsert(List datasetTable) throws Exception { for (DataSetTableRequest table : datasetTable) { save(table); + // 清理权限缓存 + CacheUtils.removeAll(AuthConstants.USER_DATASET_NAME); + CacheUtils.removeAll(AuthConstants.ROLE_DATASET_NAME); + CacheUtils.removeAll(AuthConstants.DEPT_DATASET_NAME); } } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index 1d47c4da11..b88280396b 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -6,6 +6,7 @@ import io.dataease.auth.annotation.DeCleaner; import io.dataease.base.domain.*; import io.dataease.base.mapper.*; import io.dataease.base.mapper.ext.*; +import io.dataease.commons.constants.AuthConstants; import io.dataease.commons.constants.CommonConstants; import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.PanelConstants; @@ -24,6 +25,7 @@ import io.dataease.dto.panel.linkJump.PanelLinkJumpBaseRequest; import io.dataease.dto.panel.po.PanelViewInsertDTO; import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; +import io.dataease.listener.util.CacheUtils; import io.dataease.service.chart.ChartViewService; import io.dataease.service.dataset.DataSetTableService; import io.dataease.service.sys.SysAuthService; @@ -119,6 +121,8 @@ public class PanelGroupService { checkPanelName(request.getName(), request.getPid(), PanelConstants.OPT_TYPE_INSERT, null, request.getNodeType()); panelId = newPanel(request); panelGroupMapper.insert(request); + // 清理权限缓存 + clearPermissionCache(); } else if ("toDefaultPanel".equals(request.getOptType())) { panelId = UUID.randomUUID().toString(); // 转存为默认仪表板 @@ -133,8 +137,12 @@ public class PanelGroupService { newDefaultPanel.setCreateBy(AuthUtils.getUser().getUsername()); checkPanelName(newDefaultPanel.getName(), newDefaultPanel.getPid(), PanelConstants.OPT_TYPE_INSERT, newDefaultPanel.getId(), newDefaultPanel.getNodeType()); panelGroupMapper.insertSelective(newDefaultPanel); + // 清理权限缓存 + clearPermissionCache(); } else if ("copy".equals(request.getOptType())) { panelId = this.panelGroupCopy(request, null, true); + // 清理权限缓存 + clearPermissionCache(); } else if ("move".equals(request.getOptType())) { PanelGroupWithBLOBs panelInfo = panelGroupMapper.selectByPrimaryKey(request.getId()); if (panelInfo.getPid().equalsIgnoreCase(request.getPid())) { @@ -431,9 +439,10 @@ public class PanelGroupService { } return null; } - - public void findPanelAttachInfo(String panelId) { - + private void clearPermissionCache(){ + CacheUtils.removeAll(AuthConstants.USER_PANEL_NAME); + CacheUtils.removeAll(AuthConstants.ROLE_PANEL_NAME); + CacheUtils.removeAll(AuthConstants.DEPT_PANEL_NAME); } diff --git a/backend/src/main/resources/db/migration/V33__1.9.sql b/backend/src/main/resources/db/migration/V33__1.9.sql index be23dae42e..6a1d66b0b3 100644 --- a/backend/src/main/resources/db/migration/V33__1.9.sql +++ b/backend/src/main/resources/db/migration/V33__1.9.sql @@ -89,3 +89,161 @@ INSERT INTO `system_parameter`(`param_key`, `param_value`, `type`, `sort`) VALUE UPDATE `demo_gdp_district_top100` set `province` = '新疆维吾尔自治区' WHERE `province` = '新疆维吾尔族自治区'; +ALTER TABLE `sys_auth` +ADD COLUMN `copy_from` varchar(255) NULL COMMENT '复制来源' AFTER `update_time`, +ADD COLUMN `copy_id` varchar(255) NULL COMMENT '复制ID' AFTER `copy_from`; + +ALTER TABLE `sys_auth_detail` +ADD COLUMN `copy_from` varchar(255) NULL COMMENT '复制来源' AFTER `update_time`, +ADD COLUMN `copy_id` varchar(255) NULL COMMENT '复制ID' AFTER `copy_from`; + + +-- ---------------------------- +-- Function structure for copy_auth +-- ---------------------------- +DROP FUNCTION IF EXISTS `copy_auth`; +delimiter ;; +CREATE FUNCTION `copy_auth`(authSource varchar(255),authSourceType varchar(255),authUser varchar(255)) + RETURNS varchar(255) CHARSET utf8mb4 + READS SQL DATA +BEGIN + +DECLARE authId varchar(255); + +DECLARE userId varchar(255); + +DECLARE copyId varchar(255); + +select uuid() into authId; + +select uuid() into copyId; + +select max(sys_user.user_id) into userId from sys_user where username= authUser; + +delete from sys_auth_detail where auth_id in ( +select id from sys_auth where sys_auth.auth_source=authSource and sys_auth.auth_source_type=authSourceType +); + +delete from sys_auth where sys_auth.auth_source=authSource and sys_auth.auth_source_type=authSourceType; + +INSERT INTO sys_auth ( + id, + auth_source, + auth_source_type, + auth_target, + auth_target_type, + auth_time, + auth_user +) +VALUES + ( + authId, + authSource, + authSourceType, + userId, + 'user', + unix_timestamp( + now())* 1000,'auto'); + + INSERT INTO sys_auth_detail ( + id, + auth_id, + privilege_name, + privilege_type, + privilege_value, + privilege_extend, + remark, + create_user, + create_time + ) SELECT + uuid() AS id, + authId AS auth_id, + sys_auth_detail.privilege_name, + sys_auth_detail.privilege_type, + 1, + sys_auth_detail.privilege_extend, + sys_auth_detail.remark, + 'auto' AS create_user, + unix_timestamp(now())* 1000 AS create_time + FROM + sys_auth_detail where auth_id =authSourceType; + +/**继承第一父级权限**/ + +insert into sys_auth( +id, + auth_source, + auth_source_type, + auth_target, + auth_target_type, + auth_time, + auth_user, + copy_from, + copy_id +) +SELECT + uuid() as id, + authSource as auth_source, + authSourceType as auth_source_type, + auth_target, + auth_target_type, + NOW()* 1000 as auth_time, + 'auto' as auth_user, + id as copy_from, + copyId as copy_id +FROM + sys_auth +WHERE + auth_source IN ( + SELECT + pid + FROM + v_auth_model + WHERE + id = authSource + AND model_type = authSourceType + ) + AND auth_source_type = authSourceType; +INSERT INTO sys_auth_detail ( + id, + auth_id, + privilege_name, + privilege_type, + privilege_value, + privilege_extend, + remark, + create_user, + create_time, + copy_from, + copy_id +) SELECT +uuid() AS id, +sa_copy.t_id AS auth_id, +sys_auth_detail.privilege_name, +sys_auth_detail.privilege_type, +sys_auth_detail.privilege_value, +sys_auth_detail.privilege_extend, +sys_auth_detail.remark, +'auto' AS create_user, +unix_timestamp( +now())* 1000 AS create_time, +id AS copy_from, +copyId AS copy_id +FROM + sys_auth_detail + INNER JOIN ( + SELECT + id AS t_id, + copy_from AS s_id + FROM + sys_auth + WHERE + copy_id = copyId + ) sa_copy ON sys_auth_detail.auth_id = sa_copy.s_id; + +RETURN 'success'; + +END +;; +delimiter ; + From 44e7cd5dfb252c4de2f5bf0a2febcb68e3ec7569 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Sun, 27 Mar 2022 19:06:37 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E4=BB=AA=E8=A1=A8=E6=9D=BF?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Web=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 4 +- .../io/dataease/config/WebSecurityConfig.java | 9 ++ frontend/package.json | 1 + .../canvas/components/Editor/FrameLinks.vue | 130 ++++++++++++++++++ .../components/canvas/components/TextAttr.vue | 12 +- .../canvas/custom-component/DeFrame.vue | 106 ++++++++++++++ .../canvas/custom-component/component-list.js | 36 ++++- .../canvas/custom-component/index.js | 2 + frontend/src/lang/en.js | 4 + frontend/src/lang/tw.js | 4 + frontend/src/lang/zh.js | 4 + frontend/src/main.js | 4 + frontend/src/styles/deicon/demo_index.html | 29 +++- frontend/src/styles/deicon/iconfont.css | 10 +- frontend/src/styles/deicon/iconfont.js | 2 +- frontend/src/styles/deicon/iconfont.json | 7 + frontend/src/styles/deicon/iconfont.ttf | Bin 21932 -> 22220 bytes frontend/src/styles/deicon/iconfont.woff | Bin 13520 -> 13760 bytes frontend/src/styles/deicon/iconfont.woff2 | Bin 11448 -> 11704 bytes .../src/views/panel/AssistComponent/index.vue | 6 +- frontend/src/views/panel/edit/index.vue | 3 +- 21 files changed, 358 insertions(+), 15 deletions(-) create mode 100644 backend/src/main/java/io/dataease/config/WebSecurityConfig.java create mode 100644 frontend/src/components/canvas/components/Editor/FrameLinks.vue create mode 100644 frontend/src/components/canvas/custom-component/DeFrame.vue diff --git a/backend/pom.xml b/backend/pom.xml index 0dbfcb18e5..519f4acc6d 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -420,7 +420,7 @@ - + @@ -486,7 +486,7 @@ - + diff --git a/backend/src/main/java/io/dataease/config/WebSecurityConfig.java b/backend/src/main/java/io/dataease/config/WebSecurityConfig.java new file mode 100644 index 0000000000..c3c29f34a4 --- /dev/null +++ b/backend/src/main/java/io/dataease/config/WebSecurityConfig.java @@ -0,0 +1,9 @@ +package io.dataease.config; + +/** + * Author: wangjiahao + * Date: 2022/3/27 + * Description: + */ +public class WebSecurityConfig { +} diff --git a/frontend/package.json b/frontend/package.json index 9cd95b9828..e0c6fa78f8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,6 +54,7 @@ "vue-axios": "3.2.4", "vue-clipboard2": "0.3.1", "vue-codemirror": "^4.0.6", + "vue-friendly-iframe": "^0.20.0", "vue-fullscreen": "^2.5.2", "vue-i18n": "7.3.2", "vue-proportion-directive": "^1.1.0", diff --git a/frontend/src/components/canvas/components/Editor/FrameLinks.vue b/frontend/src/components/canvas/components/Editor/FrameLinks.vue new file mode 100644 index 0000000000..b7f918dd96 --- /dev/null +++ b/frontend/src/components/canvas/components/Editor/FrameLinks.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index 94cdc24b5c..3f89341cc8 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -134,6 +134,11 @@ +
+ + + +
@@ -156,9 +161,10 @@ import Hyperlinks from '@/components/canvas/components/Editor/Hyperlinks' import VideoLinks from '@/components/canvas/components/Editor/VideoLinks' import DateFormat from '@/components/canvas/components/Editor/DateFormat' import { COLOR_PANEL } from '@/views/chart/chart/chart' +import FrameLinks from '@/components/canvas/components/Editor/FrameLinks' export default { - components: { Hyperlinks, DateFormat, VideoLinks }, + components: { FrameLinks, Hyperlinks, DateFormat, VideoLinks }, props: { scrollLeft: { type: Number, @@ -292,6 +298,10 @@ export default { 'de-video': [ 'opacity', 'videoLinks' + ], + 'de-frame': [ + 'opacity', + 'frameLinks' ] } }, diff --git a/frontend/src/components/canvas/custom-component/DeFrame.vue b/frontend/src/components/canvas/custom-component/DeFrame.vue new file mode 100644 index 0000000000..61e8d7cf7d --- /dev/null +++ b/frontend/src/components/canvas/custom-component/DeFrame.vue @@ -0,0 +1,106 @@ +