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/index.vue | 38 +++++++++++++++++++++++++++++++++++++- 1 files changed, 37 insertions(+), 1 deletions(-) diff --git a/laboratory/src/layouts/components/ElMenu/index.vue b/laboratory/src/layouts/components/ElMenu/index.vue index 13e7658..4bf4a21 100644 --- a/laboratory/src/layouts/components/ElMenu/index.vue +++ b/laboratory/src/layouts/components/ElMenu/index.vue @@ -18,9 +18,43 @@ <script> import routers from "../../../router"; import MenuItem from "./MenuItem.vue"; +import { mapState } from "vuex"; + +// 递归过滤菜单 +function filterMenusByPrivilege(menus, flatMenus) { + return menus + .filter(menu => { + // 没有 privilege 字段的菜单默认显示,有 privilege 字段的要判断权限 + if (menu.meta && menu.meta.privilege) { + return flatMenus.includes(menu.meta.privilege); + } + return true; + }) + .map(menu => { + // 递归处理 children + if (menu.children && menu.children.length > 0) { + return { + ...menu, + children: filterMenusByPrivilege(menu.children, flatMenus) + }; + } + return menu; + }) + .filter(menu => { + // 过滤掉 children 为空的父级菜单 + if (menu.children && menu.children.length === 0) { + return false; + } + return true; + }); +} + export default { components: { MenuItem, + }, + computed: { + ...mapState(["flatMenus"]), }, data() { return { @@ -30,11 +64,13 @@ mounted() { // 获取所有定义的一级菜单和多级菜单 // 过滤掉登录路由和重定向路由,只获取主布局下的路由 - this.routersList = routers.options.routes.filter(route => + const allMenus = routers.options.routes.filter(route => route.path !== '/login' && route.path !== '/' && !route.meta?.hide ); + // 权限过滤 + this.routersList = filterMenusByPrivilege(allMenus, this.flatMenus); }, }; </script> -- Gitblit v1.7.1