2.5 KiB
2.5 KiB
操作日志:平台角色菜单树与授权导航修复
操作时间: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 警告;修正后无新增控制台警告。
- 当前平台账户列表没有普通角色账号,因此未创建临时数据,也未执行普通账号真实登录;该链路由后端授权测试和前端登录落点检查覆盖。