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