From d1f3d3a7f019d1478cd5cbb1c1a84e89e17d599a Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 6 May 2021 14:43:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=80=E7=BA=A7=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=8F=AA=E5=AD=98=E4=B8=80=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/auth/api/dto/DynamicMenuDto.java | 2 ++ .../service/impl/DynamicMenuServiceImpl.java | 1 + .../controller/sys/SysMenuController.java | 1 + frontend/src/permission.js | 7 ++++- frontend/src/store/modules/permission.js | 28 +++++++++++++++++-- frontend/src/views/system/datasource/form.vue | 4 +-- .../src/views/system/datasource/index.vue | 3 +- frontend/src/views/system/menu/form.vue | 12 ++++---- frontend/src/views/system/menu/index.vue | 12 ++++---- 9 files changed, 51 insertions(+), 19 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java index 2121aaf1c7..5b68491943 100644 --- a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java +++ b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java @@ -27,6 +27,8 @@ public class DynamicMenuDto implements Serializable { private Boolean hidden; + private Integer type; + private List children; } diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java index 3004bf553c..fd2318c068 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java @@ -36,6 +36,7 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { dynamicMenuDto.setName(sysMenu.getName()); dynamicMenuDto.setPath(sysMenu.getPath()); dynamicMenuDto.setRedirect(null); + dynamicMenuDto.setType(sysMenu.getType()); dynamicMenuDto.setComponent(sysMenu.getComponent()); MenuMeta menuMeta = new MenuMeta(); menuMeta.setTitle(sysMenu.getTitle()); diff --git a/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java b/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java index 517c83a130..08eb11e494 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java @@ -31,6 +31,7 @@ public class SysMenuController { @PostMapping("/childNodes/{pid}") public List childNodes(@PathVariable("pid") Long pid){ List nodes = menuService.nodesByPid(pid); + nodes = nodes.stream().filter(node -> !node.getHidden()).collect(Collectors.toList()); return menuService.convert(nodes); } diff --git a/frontend/src/permission.js b/frontend/src/permission.js index 6fd47f7856..cf05fbbda1 100644 --- a/frontend/src/permission.js +++ b/frontend/src/permission.js @@ -84,7 +84,12 @@ const filterRouter = routers => { } const tempResults = routers.filter(router => hasPermission(router, user_permissions)) // 如果是一级菜单(目录) 没有字菜单 那就移除 - return tempResults.filter(item => item.children && item.children.length) + return tempResults.filter(item => { + if (item.type === 0 && (!item.children || item.children.length === 0)) { + return false + } + return true + }) } const hasPermission = (router, user_permissions) => { // 菜单要求权限 但是当前用户权限没有包含菜单权限 diff --git a/frontend/src/store/modules/permission.js b/frontend/src/store/modules/permission.js index a21c7a5fd1..ce9dd85872 100644 --- a/frontend/src/store/modules/permission.js +++ b/frontend/src/store/modules/permission.js @@ -31,7 +31,11 @@ const actions = { } export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由字符串,转换为组件对象 - return routers.filter(router => { + return routers.map(router => { + // 如果是菜单类型 且 是一级菜单 需要包装一层父级目录 + if (router.type === 1 && router.pid === 0 && router.component && router.component !== 'Layout') { + router = decorate(router) + } if (router.component) { if (router.component === 'Layout') { // Layout组件特殊处理 router.component = Layout @@ -43,9 +47,8 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由 if (router.children && router.children.length) { router.children = filterAsyncRouter(router.children) } - return true - }).map(router => { router.hasOwnProperty('id') && delete router.id + router.hasOwnProperty('type') && delete router.type router.hasOwnProperty('pid') && delete router.pid router.hasOwnProperty('children') && (!router['children'] || !router['children'].length) && delete router.children router.hasOwnProperty('redirect') && !router['redirect'] && delete router.redirect @@ -53,6 +56,25 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由 }) } +// 包装一层父级目录 +export const decorate = (router) => { + const parent = { + id: router.id + 1000000, + path: router.path, + component: 'Layout' + } + const current = {} + Object.assign(current, router) + current.type = 1 + current.path = 'index' + current.pid = parent.id + parent.children = [current] + if (router.hidden) { + parent.hidden = router.hidden + } + return parent +} + export const loadView = (view) => { return (resolve) => require([`@/views/${view}`], resolve) } diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index 151babff7b..607d56b835 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -1,5 +1,5 @@