From 7781b565db049b6c4150113abbddf46e798c900d Mon Sep 17 00:00:00 2001 From: 董国庆 <364620639@qq.com> Date: 星期四, 19 六月 2025 18:46:55 +0800 Subject: [PATCH] 修改bug,加权限 --- laboratory/src/layouts/components/ElMenu/MenuItem.vue | 38 ++++++++++++++++++++++++++++++++++---- 1 files changed, 34 insertions(+), 4 deletions(-) diff --git a/laboratory/src/layouts/components/ElMenu/MenuItem.vue b/laboratory/src/layouts/components/ElMenu/MenuItem.vue index e2e4d81..8ecc689 100644 --- a/laboratory/src/layouts/components/ElMenu/MenuItem.vue +++ b/laboratory/src/layouts/components/ElMenu/MenuItem.vue @@ -3,7 +3,7 @@ <!-- <div v-if="!item.meta.hide && menus.includes(item.meta.privilege)"> --> <div v-if="item.meta && item.meta.title && !item.meta.hide"> <!-- 根菜单 --> - <MenuLink :to="resolvePath()" v-if="!item.children"> + <MenuLink :to="resolvePath()" v-if="!filteredChildren || filteredChildren.length === 0"> <el-menu-item :index="resolvePath()"> <i :class="(item.meta && item.meta.icon) || ''"></i> <span slot="title">{{ (item.meta && item.meta.title) || '' }}</span> @@ -16,8 +16,8 @@ <i :class="(item.meta && item.meta.icon) || ''"></i> <span slot="title">{{ (item.meta && item.meta.title) || '' }}</span> </template> - <!-- 这里递归去展示多级菜单 --> - <menu-item v-for="(route, index) in item.children" :key="index" :item="route" + <!-- 递归展示多级菜单,已过滤无权限的children --> + <menu-item v-for="(route, index) in filteredChildren" :key="index" :item="route" :fatherPath="resolvePath(route.path)"> </menu-item> </el-submenu> @@ -29,6 +29,32 @@ import { mapState } from "vuex"; import path from "path"; import MenuLink from "./MenuLink.vue"; + +function filterMenusByPrivilege(menus, flatMenus) { + if (!menus) return []; + return menus + .filter(menu => { + if (menu.meta && menu.meta.privilege) { + return flatMenus.includes(menu.meta.privilege); + } + return true; + }) + .map(menu => { + if (menu.children && menu.children.length > 0) { + return { + ...menu, + children: filterMenusByPrivilege(menu.children, flatMenus) + }; + } + return menu; + }) + .filter(menu => { + if (menu.children && menu.children.length === 0) { + return false; + } + return true; + }); +} export default { // 做组件递归时必须定义一个name。然后递归时的组件名就是这里的name值 @@ -50,7 +76,11 @@ }, computed: { - ...mapState(["menus"]), + ...mapState(["flatMenus"]), + filteredChildren() { + // 只对children做权限过滤 + return filterMenusByPrivilege(this.item.children, this.flatMenus); + } }, data() { return {}; -- Gitblit v1.7.1