# 动态菜单系统使用指南
## 概述
本系统实现了基于后端权限数据的动态菜单功能,不同用户根据其权限展示不同的后台菜单栏。
## 实现原理
### 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调用次数。