feat(admin, admin-ui): 实现RuoYi风格后台菜单管理,优化媒体资源处理
新增服务端菜单校验与归一化逻辑,完善菜单相关Schema;前端实现条件渲染的菜单编辑器,支持搜索式图标选择器与父级树过滤。新增媒体URL统一处理工具修复管理端本地静态资源路径映射问题,更新全部相关文档、技术决策记录与测试用例。本次变更不影响WonderQ-MiniAPP端。
This commit is contained in:
@@ -180,6 +180,20 @@ type SiteModule =
|
||||
|
||||
后端先按当前管理员角色计算可见菜单,再过滤停用菜单与不可见目录/页面;按钮菜单作为页面节点的 `children` 返回,但不会被前端注册为页面路由。`profile.menus` 继续保留以兼容旧管理端,`routers` 才是 `WonderQ-Admin-UI-Vue` 动态导航和动态路由注册的权威来源。前端只能将 `component` 映射到预注册组件白名单,未知组件不得执行或加载。
|
||||
|
||||
### 菜单管理新增/编辑
|
||||
|
||||
`GET /api/admin/system/menus` 返回平铺 `items` 和按 `parentId` 组装的 `tree`。每个节点包含 `parentId`、`name`、`type`、`path`、`component`、`permission`、`icon`、`sortOrder`、`isVisible`、`isActive` 和 `children`,用于菜单工作台、角色授权树和新增/编辑菜单的父级选择。
|
||||
|
||||
`POST /api/admin/system/menus` 与 `PATCH /api/admin/system/menus/{id}` 使用以下菜单类型规则:
|
||||
|
||||
- `directory`(目录):必须有路由地址;不使用组件路径和权限标识。
|
||||
- `page`(页面):必须有路由地址和预注册组件路径;可填写权限标识。
|
||||
- `button`(按钮):必须填写权限标识;路由地址、组件路径和菜单图标必须为空,按钮不能作为其他菜单的父级。
|
||||
|
||||
顶级菜单的 `parentId` 为 `null`。父级必须存在且为目录或页面;更新菜单时不能选择自身或其子孙节点,服务端也会重复校验该规则。名称和文本字段会去除首尾空格;权限标识重复返回 `409`,类型字段缺失或不符合规则返回 `422`。菜单新增、编辑、删除和排序继续写入审计日志并清理权限菜单缓存。
|
||||
|
||||
Vue 管理端的父级树只展示目录/页面,编辑当前菜单时排除当前分支;图标选择器使用 `@element-plus/icons-vue` 的受控白名单,支持名称搜索、清空和未知值回退默认图标,不执行服务端返回的组件或图标路径。
|
||||
|
||||
角色数据范围使用以下五个编码:`all`(全部)、`dept`(当前部门)、`dept_and_children`(当前部门及子部门)、`custom_dept`(自定义部门)、`self`(本人)。运营资源通过 `deptId` 和 `createdById` 归属字段执行查询过滤。
|
||||
|
||||
登录按 IP 与账号组合执行 Redis 限流,默认 60 秒最多 5 次;权限菜单缓存默认 300 秒。Redis 故障不能放行权限检查,缓存不可用时只能重新读取数据库,认证会话和限流不可用时返回 `503`。
|
||||
|
||||
Reference in New Issue
Block a user