# 动态菜单系统使用指南 ## 概述 本系统实现了基于后端权限数据的动态菜单功能,不同用户根据其权限展示不同的后台菜单栏。 ## 实现原理 ### 1. 后端接口 - **接口地址**: `/admin/permission/user/tree` - **请求方法**: GET - **返回数据**: 用户权限菜单树结构 ### 2. 数据结构 ```json { "code": 200, "message": "OK", "data": [ { "id": 1, "name": "系统管理", "code": null, "type": 1, "path": "/system", "component": "", "icon": "Setting", "sort": 1, "status": 1, "children": [ { "id": 11, "name": "配置列表", "code": "settled:config:list", "type": 2, "path": "/settledConfig/list", "component": "/SettledConfig/List", "icon": "", "sort": 1, "status": 1, "children": [] } ] } ] } ``` ### 3. 权限类型说明 - **type: 1** - 目录(一级菜单) - **type: 2** - 菜单(二级菜单) - **type: 3** - 接口权限(按钮权限) ## 核心组件 ### 1. DynamicSidebar.vue 动态侧边栏组件,负责: - 获取用户权限菜单数据 - 根据权限过滤菜单项 - 渲染菜单树结构 - 处理图标映射 ### 2. 权限过滤逻辑 ```javascript const filterMenuByPermission = (menuItems: any[]): any[] => { return menuItems.map(item => { // 递归过滤子菜单 if (item.children && item.children.length > 0) { const filteredChildren = filterMenuByPermission(item.children) return { ...item, children: filteredChildren } } return item }).filter(item => { // 目录类型:检查是否有可显示的子菜单 if (item.type === 1) { return item.children && item.children.length > 0 } // 菜单类型:检查权限 if (item.type === 2) { return item.code ? hasPermission(item.code) : true } return false }) } ``` ## 使用方法 ### 1. 后端配置 确保后端接口 `/admin/permission/user/tree` 返回正确的权限菜单数据。 ### 2. 前端配置 系统已自动配置,无需额外设置。布局组件会自动使用 `DynamicSidebar` 组件。 ### 3. 图标配置 在 `DynamicSidebar.vue` 中的 `iconMap` 对象中添加新图标: ```javascript const iconMap = { 'Setting': Setting, 'Shop': Shop, 'Notebook': Notebook, // 添加新图标 'NewIcon': NewIconComponent } ``` ## 权限控制 ### 1. 菜单级权限 通过后端返回的菜单树数据控制,只返回用户有权限的菜单项。 ### 2. 路由级权限 在路由配置中使用 `meta.permission` 字段: ```javascript { path: '/user/list', component: () => import('@/views/User/List.vue'), meta: { title: '用户列表', permission: 'user:list:view' } } ``` ### 3. 按钮级权限 使用权限指令: ```html 添加用户 操作 高级操作 ``` ## 注意事项 1. **权限初始化**: 系统在启动时会自动初始化用户权限,确保权限数据可用。 2. **菜单刷新**: 如果用户权限发生变化,需要重新登录或刷新页面以获取最新菜单。 3. **图标缺失**: 如果菜单项的图标在 `iconMap` 中不存在,会使用默认的 `Setting` 图标。 4. **路径匹配**: 确保菜单项的 `path` 字段与路由配置中的路径一致。 ## 扩展功能 ### 1. 添加新菜单类型 可以在权限过滤逻辑中添加对新菜单类型的支持。 ### 2. 自定义菜单样式 可以在 `DynamicSidebar.vue` 的样式部分自定义菜单外观。 ### 3. 菜单缓存 可以考虑添加菜单数据缓存机制,减少API调用次数。