42 lines
2.5 KiB
Markdown
42 lines
2.5 KiB
Markdown
# 操作日志:平台角色菜单树与授权导航修复
|
||
|
||
操作时间:2026-08-17
|
||
操作类型:修改
|
||
影响模块:平台总后台角色菜单、平台账号登录导航、服务端菜单鉴权
|
||
|
||
## 操作前状态
|
||
|
||
- 角色菜单使用扁平多选框,父菜单与叶子菜单看似可以独立选择。
|
||
- 服务端实际只保存叶子菜单,导致父菜单勾选不落库、子菜单选中时父菜单不显示半选。
|
||
- 普通账号取得个人菜单编码后仍需读取 `/platform_menu`,但该请求又要求“平台菜单”业务权限,形成权限死循环并错误进入无权限页。
|
||
|
||
## 具体操作
|
||
|
||
- 新增专用角色菜单树,父菜单支持全选、全清和半选展示,子菜单显示完整路径。
|
||
- 表单只提交叶子菜单;允许清空全部权限,并在提交前二次警告。
|
||
- 放行已认证平台账号读取当前角色自己的菜单列表,响应继续按角色过滤;菜单详情和写操作不放宽。
|
||
- 服务端忽略具有子菜单的导航父节点,同时保留无子菜单顶级页面作为有效业务权限。
|
||
- 补充后端访问规则测试和前端静态契约检查。
|
||
|
||
## 行为变化
|
||
|
||
- 修改前:父子菜单状态不一致,普通业务角色可能已分配权限但无法加载导航。
|
||
- 修改后:父菜单只表达叶子权限的聚合状态;普通账号可加载自己的授权导航,未授权兄弟菜单仍不可见、不可访问。
|
||
|
||
## 风险评估
|
||
|
||
- 不修改数据库结构和公共写接口,历史叶子数据继续兼容。
|
||
- `GET /platform_menu` 仅放宽为“读取自身授权导航”,服务端仍根据 JWT 角色过滤,不开放详情和写权限。
|
||
- 清空权限会使该角色账号无法进入业务页,前端已增加明确确认提示。
|
||
|
||
## 验证结果
|
||
|
||
- 后端 `go test ./internal/logic/platform/platform ./internal/logic/platform ./internal/routers`:通过。
|
||
- 前端 `pnpm run menu-permission-tree:check`:通过。
|
||
- 前端 `pnpm run auth-landing:check`:通过。
|
||
- 前端 `pnpm run type:check`:通过。
|
||
- 前端 `pnpm run build`:通过。
|
||
- Codex 浏览器人工验证:父级半选、全选、全清、完整路径搜索和清空权限二次确认均通过;测试过程已取消弹窗,未写入角色权限。
|
||
- 浏览器复验修正了菜单数据返回前数组未初始化的瞬时 Vue 警告;修正后无新增控制台警告。
|
||
- 当前平台账户列表没有普通角色账号,因此未创建临时数据,也未执行普通账号真实登录;该链路由后端授权测试和前端登录落点检查覆盖。
|