From 59f7cfe25776b6b18a5fafc1dbb449b80d494660 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Wed, 8 Feb 2023 16:20:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E6=9D=BF=E6=95=B0=E6=8D=AE=E9=9B=86=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E9=80=BB=E8=BE=91=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E9=87=8F=E5=A4=A7=E6=97=B6=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E9=80=A0=E6=88=90=E7=9A=84=E5=8D=A1=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DataSetGroupController.java | 12 +- .../dataset/DataSetTableController.java | 11 +- .../panel/PanelGroupController.java | 2 +- .../io/dataease/ext/ExtPanelGroupMapper.java | 12 +- .../io/dataease/ext/ExtPanelGroupMapper.xml | 240 ++++++++++-------- .../io/dataease/ext/ExtVAuthModelMapper.java | 6 +- .../io/dataease/ext/ExtVAuthModelMapper.xml | 29 ++- .../service/authModel/VAuthModelService.java | 18 +- .../service/panel/PanelGroupService.java | 15 +- frontend/src/components/canvas/utils/utils.js | 134 +++++++++- frontend/src/views/dataset/add/AddApi.vue | 21 +- frontend/src/views/dataset/add/AddDB.vue | 24 +- .../src/views/dataset/group/CreatDsGroup.vue | 29 +-- frontend/src/views/dataset/group/Group.vue | 155 ++++++----- .../views/dataset/group/GroupMoveSelector.vue | 41 +-- frontend/src/views/panel/list/PanelList.vue | 43 ++-- .../src/views/panel/list/editPanel/index.vue | 2 +- 17 files changed, 521 insertions(+), 273 deletions(-) diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java index 8833cccf3a..b8e3488641 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java @@ -9,8 +9,10 @@ import io.dataease.commons.constants.SysLogConstants; import io.dataease.commons.utils.DeLogUtils; import io.dataease.controller.request.dataset.DataSetGroupRequest; import io.dataease.dto.SysLogDTO; +import io.dataease.dto.authModel.VAuthModelDTO; import io.dataease.dto.dataset.DataSetGroupDTO; import io.dataease.plugins.common.base.domain.DatasetGroup; +import io.dataease.service.authModel.VAuthModelService; import io.dataease.service.dataset.DataSetGroupService; import io.dataease.service.kettle.KettleService; import io.swagger.annotations.Api; @@ -18,7 +20,9 @@ import io.swagger.annotations.ApiOperation; import org.apache.shiro.authz.annotation.Logical; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; + import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; /** @@ -35,14 +39,18 @@ public class DataSetGroupController { @Resource private KettleService kettleService; + @Resource + private VAuthModelService vAuthModelService; + @DePermissions(value = { @DePermission(type = DePermissionType.DATASET, value = "id"), @DePermission(type = DePermissionType.DATASET, value = "pid", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) }, logical = Logical.AND) @ApiOperation("保存") @PostMapping("/save") - public DataSetGroupDTO save(@RequestBody DatasetGroup datasetGroup) throws Exception { - return dataSetGroupService.save(datasetGroup); + public VAuthModelDTO save(@RequestBody DatasetGroup datasetGroup) throws Exception { + DataSetGroupDTO result = dataSetGroupService.save(datasetGroup); + return vAuthModelService.queryAuthModelByIds("dataset", Arrays.asList(result.getId())).get(0); } @ApiIgnore diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 6927f2b870..471297caff 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -16,6 +16,7 @@ import io.dataease.controller.handler.annotation.I18n; import io.dataease.controller.request.dataset.DataSetExportRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.response.DataSetDetail; +import io.dataease.dto.authModel.VAuthModelDTO; import io.dataease.dto.dataset.DataSetTableDTO; import io.dataease.dto.dataset.ExcelFileData; import io.dataease.plugins.common.base.domain.DatasetSqlLog; @@ -24,6 +25,7 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableIncrementalConfig; import io.dataease.plugins.common.dto.dataset.SqlVariableDetails; import io.dataease.plugins.common.dto.datasource.TableField; +import io.dataease.service.authModel.VAuthModelService; import io.dataease.service.dataset.DataSetTableService; import io.swagger.annotations.*; import org.apache.shiro.authz.annotation.Logical; @@ -35,6 +37,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Author gin @@ -48,14 +51,18 @@ public class DataSetTableController { @Resource private DataSetTableService dataSetTableService; + @Resource + private VAuthModelService vAuthModelService; + @DePermissions(value = { @DePermission(type = DePermissionType.DATASET, value = "id"), @DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) }, logical = Logical.AND) @ApiOperation("批量保存") @PostMapping("batchAdd") - public List batchAdd(@RequestBody List datasetTable) throws Exception { - return dataSetTableService.batchInsert(datasetTable); + public List batchAdd(@RequestBody List datasetTable) throws Exception { + List ids = dataSetTableService.batchInsert(datasetTable).stream().map(DatasetTable::getId).collect(Collectors.toList()); + return vAuthModelService.queryAuthModelByIds("dataset", ids); } @DePermissions(value = { diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java index dbe2e68035..2e46bab9ef 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java @@ -88,7 +88,7 @@ public class PanelGroupController { @DePermission(type = DePermissionType.PANEL, value = "pid", level = ResourceAuthLevel.PANEL_LEVEL_MANAGE) }, logical = Logical.AND) @I18n - public String update(@RequestBody PanelGroupRequest request) { + public PanelGroupDTO update(@RequestBody PanelGroupRequest request) { return panelGroupService.update(request); } diff --git a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java index 30dbcd2c75..a1fdf5af1a 100644 --- a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java +++ b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.java @@ -15,18 +15,20 @@ public interface ExtPanelGroupMapper { List panelGroupListDefault(PanelGroupRequest request); //会级联删除pid 下的所有数据 - int deleteCircle(@Param("pid") String pid); + int deleteCircle(@Param("pid") String pid, @Param("nodeType") String nodeType); - int deleteCircleView(@Param("pid") String pid); + int deleteCircleView(@Param("pid") String pid, @Param("nodeType") String nodeType); - int deleteCircleViewCache(@Param("pid") String pid); + int deleteCircleViewCache(@Param("pid") String pid, @Param("nodeType") String nodeType); - PanelGroupDTO findOneWithPrivileges(@Param("panelId") String panelId,@Param("userId") String userId); + PanelGroupDTO findOneWithPrivileges(@Param("panelId") String panelId, @Param("userId") String userId); + + PanelGroupDTO findShortOneWithPrivileges(@Param("panelId") String panelId, @Param("userId") String userId); void copyPanelView(@Param("pid") String panelId); //移除未使用的视图 - void removeUselessViews(@Param("panelId") String panelId,@Param("viewIds") List viewIds); + void removeUselessViews(@Param("panelId") String panelId, @Param("viewIds") List viewIds); List panelGroupInit(); diff --git a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml index 2f99cbe477..6b3d058df8 100644 --- a/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml +++ b/backend/src/main/java/io/dataease/ext/ExtPanelGroupMapper.xml @@ -31,6 +31,26 @@ and panel_type = 'self' + + - select - ifnull(ds.id,'') `id`, - ds.name, - ds_auth.auths, - 'link' `type`, - dt.id sub_id, - dt.name sub_name, - dt_auth.auths sub_auths, - if(dt.id is not null,'dataset',null) sub_type - from - panel_group pg - join - chart_view cv on cv.scene_id = pg.id - join - dataset_table dt on cv.table_id = dt.id - left join - ( - select - t_dt.id,group_concat(distinct sad.privilege_type) auths - from - dataset_table t_dt - left join sys_auth sa on sa.auth_source = t_dt.id - left join sys_auth_detail sad on sa.id = sad.auth_id - where - sa.auth_source_type = 'dataset' - and - sad.privilege_value = 1 - and - ( - ( - sa.auth_target_type = 'dept' - AND sa.auth_target in ( SELECT dept_id FROM sys_user WHERE user_id = #{userId,jdbcType=BIGINT} ) - ) - or - ( - sa.auth_target_type = 'user' - AND sa.auth_target = #{userId,jdbcType=BIGINT} - ) - or - ( - sa.auth_target_type = 'role' - AND sa.auth_target in ( SELECT role_id FROM sys_users_roles WHERE user_id = #{userId,jdbcType=BIGINT} ) - ) - ) - group by sa.auth_source - ) dt_auth on dt.id = dt_auth.id - left join datasource ds on dt.data_source_id = ds.id - left join - ( - select - t_pg.id,group_concat(distinct sad.privilege_type) auths - from - panel_group t_pg - left join sys_auth sa on sa.auth_source = t_pg.id - left join sys_auth_detail sad on sa.id = sad.auth_id - where - sa.auth_source_type = 'link' - and - sad.privilege_value = 1 - and - ( - ( - sa.auth_target_type = 'dept' - AND sa.auth_target in ( SELECT dept_id FROM sys_user WHERE user_id = #{userId,jdbcType=BIGINT} ) - ) - OR - ( - sa.auth_target_type = 'user' - AND sa.auth_target = #{userId,jdbcType=BIGINT} - ) - OR - ( - sa.auth_target_type = 'role' - AND sa.auth_target in ( SELECT role_id FROM sys_users_roles WHERE user_id = #{userId,jdbcType=BIGINT} ) - ) - ) - group by sa.auth_source - ) ds_auth on ds_auth.id = ds.id - where pg.id=#{panelId,jdbcType=VARCHAR} - group by id,sub_id + diff --git a/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.java b/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.java index 6c58a2807e..be71d05844 100644 --- a/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.java +++ b/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.java @@ -10,7 +10,9 @@ public interface ExtVAuthModelMapper { List queryAuthModel(@Param("record") VAuthModelRequest record); - List queryAuthModelViews (@Param("record") VAuthModelRequest record); + List queryAuthModelByIds(@Param("userId") String userId, @Param("modelType") String modelType, @Param("ids") List ids); - List queryAuthViewsOriginal (@Param("record") VAuthModelRequest record); + List queryAuthModelViews(@Param("record") VAuthModelRequest record); + + List queryAuthViewsOriginal(@Param("record") VAuthModelRequest record); } diff --git a/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.xml b/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.xml index 9363041cda..0ae460a5e7 100644 --- a/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.xml +++ b/backend/src/main/java/io/dataease/ext/ExtVAuthModelMapper.xml @@ -8,6 +8,29 @@ + + - SELECT - * - FROM - v_history_chart_view viewsOriginal + SELECT * + FROM v_history_chart_view viewsOriginal ORDER BY viewsOriginal.node_type desc, CONVERT(viewsOriginal.label using gbk) asc diff --git a/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java b/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java index 5273a13743..87d09f4fb0 100644 --- a/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java +++ b/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java @@ -4,7 +4,7 @@ import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.TreeUtils; import io.dataease.controller.request.authModel.VAuthModelRequest; import io.dataease.dto.authModel.VAuthModelDTO; -import io.dataease.ext.*; +import io.dataease.ext.ExtVAuthModelMapper; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; @@ -25,10 +25,22 @@ public class VAuthModelService { @Resource private ExtVAuthModelMapper extVAuthModelMapper; + public List queryAuthModelByIds(String modelType, List ids) { + if (CollectionUtils.isEmpty(ids)) { + return new ArrayList<>(); + } + List result = extVAuthModelMapper.queryAuthModelByIds(String.valueOf(AuthUtils.getUser().getUserId()), modelType, ids); + if (CollectionUtils.isEmpty(result)) { + return new ArrayList<>(); + } else { + return result; + } + } + public List queryAuthModel(VAuthModelRequest request) { request.setUserId(String.valueOf(AuthUtils.getUser().getUserId())); List result = extVAuthModelMapper.queryAuthModel(request); - if(CollectionUtils.isEmpty(result)){ + if (CollectionUtils.isEmpty(result)) { return new ArrayList<>(); } if (request.getPrivileges() != null) { @@ -44,7 +56,7 @@ public class VAuthModelService { } private List filterPrivileges(VAuthModelRequest request, List result) { - if(AuthUtils.getUser().getIsAdmin()){ + if (AuthUtils.getUser().getIsAdmin()) { return result; } if (request.getPrivileges() != null) { 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 125abb63c0..288ecffe74 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -182,7 +182,7 @@ public class PanelGroupService { } - public String update(PanelGroupRequest request) { + public PanelGroupDTO update(PanelGroupRequest request) { String panelId = request.getId(); request.setUpdateTime(System.currentTimeMillis()); request.setUpdateBy(AuthUtils.getUser().getUsername()); @@ -254,7 +254,7 @@ public class PanelGroupService { DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, sourceType, request.getId(), request.getPid(), null, sourceType); } this.removePanelAllCache(panelId); - return panelId; + return extPanelGroupMapper.findShortOneWithPrivileges(panelId, String.valueOf(AuthUtils.getUser().getUserId())); } public void move(PanelGroupRequest request) { @@ -294,14 +294,17 @@ public class PanelGroupService { public void deleteCircle(String id) { Assert.notNull(id, "id cannot be null"); - sysAuthService.checkTreeNoManageCount("panel", id); PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(id); SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.DELETE, sourceType, panel.getId(), panel.getPid(), null, null); + String nodeType = panel.getNodeType(); + if ("folder".equals(nodeType)) { + sysAuthService.checkTreeNoManageCount("panel", id); + } //清理view 和 view cache - extPanelGroupMapper.deleteCircleView(id); - extPanelGroupMapper.deleteCircleViewCache(id); + extPanelGroupMapper.deleteCircleView(id, nodeType); + extPanelGroupMapper.deleteCircleViewCache(id, nodeType); // 同时会删除对应默认仪表盘 - extPanelGroupMapper.deleteCircle(id); + extPanelGroupMapper.deleteCircle(id, nodeType); storeService.removeByPanelId(id); shareService.delete(id, null); panelLinkService.deleteByResourceId(id); diff --git a/frontend/src/components/canvas/utils/utils.js b/frontend/src/components/canvas/utils/utils.js index 220e083b0f..c39fd6efa2 100644 --- a/frontend/src/components/canvas/utils/utils.js +++ b/frontend/src/components/canvas/utils/utils.js @@ -8,7 +8,7 @@ import { import { ApplicationContext } from '@/utils/ApplicationContext' import { uuid } from 'vue-uuid' import store from '@/store' -import { AIDED_DESIGN, MOBILE_SETTING, PANEL_CHART_INFO, TAB_COMMON_STYLE, PAGE_LINE_DESIGN } from '@/views/panel/panel' +import { AIDED_DESIGN, MOBILE_SETTING, PAGE_LINE_DESIGN, PANEL_CHART_INFO, TAB_COMMON_STYLE } from '@/views/panel/panel' import html2canvas from 'html2canvasde' export function deepCopy(target) { @@ -271,3 +271,135 @@ export function findCurComponentIndex(componentData, curComponent) { } return curIndex } + +export function deleteTreeNode(nodeId, tree, nodeTarget) { + if (!nodeId || !tree || !tree.length) { + return + } + for (let i = 0, len = tree.length; i < len; i++) { + if (tree[i].id === nodeId) { + if (nodeTarget) { + nodeTarget['target'] = tree[i] + } + tree.splice(i, 1) + return + } else if (tree[i].children && tree[i].children.length) { + deleteTreeNode(nodeId, tree[i].children, nodeTarget) + } + } +} + +export function moveTreeNode(nodeInfo, tree) { + const nodeTarget = { target: null } + deleteTreeNode(nodeInfo.id, tree, nodeTarget) + if (nodeTarget.target) { + nodeTarget.target.pid = nodeInfo.pid + insertTreeNode(nodeTarget.target, tree) + } +} + +export function updateTreeNode(nodeInfo, tree) { + if (!nodeInfo) { + return + } + for (let i = 0, len = tree.length; i < len; i++) { + if (tree[i].id === nodeInfo.id) { + tree[i].name = nodeInfo.name + tree[i].label = nodeInfo.label + if (tree[i].isDefault) { + tree[i].isDefault = nodeInfo.isDefault + } + return + } else if (tree[i].children && tree[i].children.length) { + updateTreeNode(nodeInfo, tree[i].children) + } + } +} + +export function toDefaultTree(nodeId, tree) { + if (!nodeId) { + return + } + for (let i = 0, len = tree.length; i < len; i++) { + if (tree[i].id === nodeId) { + tree[i].isDefault = true + return + } else if (tree[i].children && tree[i].children.length) { + toDefaultTree(nodeId, tree[i].children) + } + } +} + +export function insertTreeNode(nodeInfo, tree) { + if (!nodeInfo) { + return + } + if (nodeInfo.pid === 0 || nodeInfo.pid === '0') { + tree.push(nodeInfo) + return + } + for (let i = 0, len = tree.length; i < len; i++) { + if (tree[i].id === nodeInfo.pid) { + if (!tree[i].children) { + tree[i].children = [] + } + tree[i].children.push(nodeInfo) + return + } else if (tree[i].children && tree[i].children.length) { + insertTreeNode(nodeInfo, tree[i].children) + } + } +} + +export function insertBatchTreeNode(nodeInfoArray, tree) { + if (!nodeInfoArray || nodeInfoArray.size === 0) { + return + } + const pid = nodeInfoArray[0].pid + for (let i = 0, len = tree.length; i < len; i++) { + if (tree[i].id === pid) { + if (!tree[i].children) { + tree[i].children = [] + } + tree[i].children = tree[i].children.concat(nodeInfoArray) + return + } else if (tree[i].children && tree[i].children.length) { + insertBatchTreeNode(nodeInfoArray, tree[i].children) + } + } +} + +export function updateCacheTree(opt, treeName, nodeInfo, tree) { + if (opt === 'new' || opt === 'copy') { + insertTreeNode(nodeInfo, tree) + } else if (opt === 'move') { + moveTreeNode(nodeInfo, tree) + } else if (opt === 'rename') { + updateTreeNode(nodeInfo, tree) + } else if (opt === 'delete') { + deleteTreeNode(nodeInfo, tree) + } else if (opt === 'newFirstFolder') { + tree.push(nodeInfo) + } else if (opt === 'batchNew') { + insertBatchTreeNode(nodeInfo, tree) + } else if (opt === 'toDefaultPanel') { + toDefaultTree(nodeInfo.source, tree) + } + localStorage.setItem(treeName, JSON.stringify(tree)) +} + +export function formatDatasetTreeFolder(tree) { + if (tree && tree.length) { + for (let len = tree.length - 1; len > -1; len--) { + if (tree[len].modelInnerType !== 'group') { + tree.splice(len, 1) + } else if (tree[len].children && tree[len].children.length) { + formatDatasetTreeFolder(tree[len].children) + } + } + } +} + +export function getCacheTree(treeName) { + return JSON.parse(localStorage.getItem(treeName)) +} diff --git a/frontend/src/views/dataset/add/AddApi.vue b/frontend/src/views/dataset/add/AddApi.vue index 1224414b3c..8001c55ee1 100644 --- a/frontend/src/views/dataset/add/AddApi.vue +++ b/frontend/src/views/dataset/add/AddApi.vue @@ -9,7 +9,7 @@ class="arrow-right" @click="showLeft = true" > - +

{{ - `${$t('dataset.preview_show')} 1000 ${$t('dataset.preview_item')}` - }} + `${$t('dataset.preview_show')} 1000 ${$t('dataset.preview_item')}` + }}