daShangDao_newAdmin/DYNAMIC_MENU_GUIDE.md
2026-06-15 17:26:14 +08:00

155 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 动态菜单系统使用指南
## 概述
本系统实现了基于后端权限数据的动态菜单功能,不同用户根据其权限展示不同的后台菜单栏。
## 实现原理
### 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
<!-- 单个权限 -->
<el-button v-permission="'user:add'">添加用户</el-button>
<!-- 多个权限(任意一个) -->
<el-button v-permission="['user:add', 'user:edit']">操作</el-button>
<!-- 所有权限都需要 -->
<el-button v-permission-all="['user:add', 'user:edit']">高级操作</el-button>
```
## 注意事项
1. **权限初始化**: 系统在启动时会自动初始化用户权限,确保权限数据可用。
2. **菜单刷新**: 如果用户权限发生变化,需要重新登录或刷新页面以获取最新菜单。
3. **图标缺失**: 如果菜单项的图标在 `iconMap` 中不存在,会使用默认的 `Setting` 图标。
4. **路径匹配**: 确保菜单项的 `path` 字段与路由配置中的路径一致。
## 扩展功能
### 1. 添加新菜单类型
可以在权限过滤逻辑中添加对新菜单类型的支持。
### 2. 自定义菜单样式
可以在 `DynamicSidebar.vue` 的样式部分自定义菜单外观。
### 3. 菜单缓存
可以考虑添加菜单数据缓存机制减少API调用次数。