路由菜单与权限控制
路由菜单与权限控制
后端菜单决定宿主向当前身份开放哪些业务入口,远端路由表决定这些地址加载哪个页面。按钮权限和资源权限分别控制页面动作与具体资源。
路由组织
所有管理端路由位于 /ai/**。菜单页以 leaf 声明,工作区以 workspace 声明;创作入口与项目页按成果类型成对注册。
| 页面 | 地址示例 | 侧栏归属 |
|---|---|---|
| 应用列表 | /ai/app | 编排台 |
| 流程详情 | /ai/app/workflow/:id | /ai/app |
| 知识库详情 | /ai/knowledge/:id | /ai/knowledge |
| 创作项目 | /ai/studio/writing/:id | /ai/studio/writing |
远端返回扁平叶子路由,路径以传入的 routePrefix 拼接,名称以 ai- 开头,meta.remote 为 ai。meta.i18n 对应 route 语言键;详情页通过 activeMenu 指回列表。
菜单配置
AI 菜单与按钮初始数据位于后端 doc/sql/03-bladex.mysql.ai.ext.create.sql。宿主登录后取得当前角色菜单,遇到 /ai 前缀才装载 AI 远端。
开发外壳读取 src/dev/menus.json,按钮展示读取 src/dev/fixtures.ts。新增入口时同步开发菜单与远端路由,宿主菜单仍由后端配置。
三类权限
| 层次 | 作用 | 示例 |
|---|---|---|
| 菜单 | 显示入口与触发远端装载 | 编排台、知识库 |
| 按钮 | 控制新增、编辑、删除等动作 | ai_app_add、ai_app_edit |
| 资源 | 判断当前身份对具体资源的使用、编辑与管理等级 | 某个应用或知识库 |
页面使用 useCrudPermission('ai_app') 取得标准 CRUD 权限,单个动作使用 hasPermission('ai_app_publish') 等实际登记的权限码。具体操作还需通过后端资源检查。
标签与刷新
宿主使用统一标签页管理远端页面。带资源 ID 的详情页按路径区分资源,activeMenu 维持列表菜单高亮。返回列表后,通过 platform.router.closeTab?.() 关闭详情标签。
菜单页是否缓存由宿主按后端菜单 is_open === 2 回填。缓存页面切换标签不会卸载,持有流式连接或定时器时按实际业务处理激活与停用。
定位问题
- 没有入口:检查当前顶部菜单、角色菜单与菜单路径。
- 入口存在但远端装载失败:检查注册表、manifest、契约与共享依赖。
- 工作区打开后返回无权访问:检查资源归属、租户和授权等级。
- 详情刷新 404:检查宿主动态路由初始化与服务器的 SPA 回落规则。
源码定位:Saber-AI src/remote.ts;Saber src/federation/installer.ts、src/router/tab.ts;后端菜单脚本与 ACL 模块。
