2.8 KiB
2.8 KiB
Task 3:前端权限数据与菜单路由兼容
实现
- AppStore 新增
permissionCodes: string[],在权限响应过滤前保存全部非空权限码并去重。 - 动态菜单在进入
buildTree前严格筛选type === 1;路由转换入口与子路由递归同时防御性过滤非菜单节点。 clearServerMenu()同步清空serverMenu与permissionCodes,现有退出登录链路无需改动即可完成权限清理。- 新增
usePermissionCodesHook,统一提供响应式权限码集合与hasPermission(code),不解析角色名称。 - 删除权限响应、树构建、路由转换及视图模块映射的相邻调试输出和无用导入。
变更文件
src/store/modules/app/index.tssrc/store/modules/app/types.tssrc/router/menu-data.tssrc/hooks/usePermissionCodes.ts
验证
pnpm exec prettier src/store/modules/app/index.ts src/store/modules/app/types.ts src/router/menu-data.ts src/hooks/usePermissionCodes.ts --write- 结果:成功,随后冻结源码。
- 首轮
pnpm exec vue-tsc --noEmit --incremental false- 结果:全仓 828 条错误,改动文件 1 条;定位为 Hook 中 Pinia 索引签名导致
permissionCodes.value被推断为unknown。 - 处理:仅在 Hook 响应式边界补充显式
string[]类型,重新格式化并再次冻结源码。
- 结果:全仓 828 条错误,改动文件 1 条;定位为 Hook 中 Pinia 索引签名导致
- 最终
pnpm exec vue-tsc --noEmit --incremental false- 结果:退出码 2,全仓错误行 827,与已确认基线一致;四个改动文件错误行 0,本次新增类型错误为 0。
pnpm build -- --outDir C:\Users\27105\AppData\Local\Temp\front-kb-task3-build-20260721- 结果:退出码 0,Vite 7.3.1 成功转换 9055 个模块并完成生产构建。
- 清理:临时构建目录已删除;误启动的默认
dist产物也已删除,仓库内无构建产物残留。
- 内联 Node + 最小 Vite SSR 加载器模拟
type=1菜单和type=2按钮权限响应,直接调用实际buildTree与transformMenuToRoutes。- 结果:
permission_codes=kb:article:list,kb:article:create、menu_permissions=1、routes=1、empty_path=false、redirect=false、button_in_routes=false,退出码 0。
- 结果:
git diff --check- 结果:退出码 0。
自审
- 完整权限码在菜单过滤前保存,按钮权限不会因菜单过滤丢失。
type=2不进入树构建,也无法从递归路由转换入口生成空路径或重定向路由。- 退出登录继续沿用现有
userStore.logoutCallBack() -> appStore.clearServerMenu(),权限码同步清空。 - Hook 仅按权限码精确匹配,不依赖用户角色;未新增测试文件,未修改生产固定密钥或无关路由。
Concerns
- 全仓类型检查仍因已确认的 827 条基线错误返回退出码 2;本任务四个改动文件错误为 0,生产构建成功。