Skip to content

应用菜单使用说明

构建时间2026-06-26 20:10:33(Asia/Shanghai)来源项目中间件文档 / 中间件后端来源仓../cl-midserver-2026来源提交号69b951a07311e75887b57e0400d888f89dd72cac
查看文档来源信息
  • 来源目录:addons/sys_base/docs
  • 来源文件:功能说明/应用菜单使用说明.md
## 功能用途 用于查看和维护当前模块 `app_menu` 在指定应用范围下的正式菜单版本、当前生效版本和运行态结果。

app_menu 还作为移动端/应用端角色授权的数据源。发布完成后,需要在角色授权抽屉的“应用菜单授权”页签为角色配置对应应用范围下的页面和动作权限。

入口位置

  • PCWEB 应用菜单

使用前提

  1. 当前模块已经接入正式菜单清单治理链路。
  2. 打开应用菜单页需要页面权限 app.menu.publish
  3. 执行上传、提交版本、发布、切换当前版本等管理操作,需要动作权限 app.menu.publish.manage
  4. 配置角色应用菜单授权前,目标应用范围必须已经存在成功发布的 app_menu

页面结构

  1. 首页默认展示当前模块、当前应用范围下的当前生效应用菜单;当只选择单个具体应用或单个接入 AppID 时,首页按该应用实际运行态匹配已发布版本,匹配顺序与移动端一致。
  2. 页面会明确展示当前模块、清单类型和生效范围,避免误读当前查看对象。
  3. 发布工作台负责处理版本操作,首页不再混入上传治理入口。

正式操作流程

  1. 进入应用菜单页,先确认当前应用范围。
  2. 首页会读取当前应用范围下的当前生效版本及结构化菜单结果;如果按 AppID 查看但实际命中按应用 UUID 发布的版本,摘要区会显示实际命中的发布范围。
  3. 如需调整,进入发布工作台,选择 JSON 清单后立即执行本地结构检查和服务端预校验。
  4. 如果存在阻断项,页面展示字段、原因和修复建议,保存草稿按钮保持不可用;例如根字段写成 seeds 时,应改为正式字段 menuSeeds 后重新选择文件。
  5. 预校验通过后,页面展示程序解析结果和与当前生效版本的差异,再允许保存草稿。
  6. 按“保存草稿 -> 提交版本 -> 发布”完成正式发布。
  7. 如需让历史版本重新生效,可在版本列表中执行“切换为当前版本”。
  8. 切换成功后,该应用范围的运行态菜单会立即按目标版本生效。
  9. 发布完成后,进入角色管理页,打开目标角色授权抽屉。
  10. 在“应用菜单授权”页签选择与发布一致的应用范围,勾选移动端页面和动作后保存。
  11. 移动端调用 /sys_base/public/auth/getAppMenuAuthority 获取当前用户已授权的应用菜单结果。

下游与应用端接入流程

  1. 下游先在本模块 app_menu 清单中声明移动端或应用端页面、动作、菜单树和默认页。
  2. 如果清单只对部分应用生效,必须使用 appScope.scopeMode=app_uuidsapp_idsapp_model_uuids 明确范围;不要把只给单个应用使用的菜单发布成 all_apps
  3. 管理员在 PCWEB 应用菜单页按同一 appScope 上传、提交并发布 app_menu
  4. 管理员在角色管理页打开目标角色,在“应用菜单授权”页签选择同一 appScope,保存该角色在移动端或应用端可见的页面和动作。
  5. 应用端登录后先持有当前用户系统 token;服务端或应用端安全层再使用当前应用 permanent key 调用 /sys_base/public/auth/exchangeTempKey 换取 tempKey。
  6. 应用端可以通过 /sys_base/platform/user/getUserInfoappMenuDefaultPage 判断当前上下文是否已经配置应用菜单首页。
  7. 应用端调用 /sys_base/public/auth/getAppMenuAuthority 时,请求体传 token,Header 传 X-App-Key: <tempKey>app-id: <当前应用UUID>addons-type: <当前模块标识>
  8. 应用端只根据返回的 tree 渲染菜单,根据 pageCodes 判断页面进入权限,根据 actionCodesmenuFlags 控制按钮、入口和业务动作;真正的后端接口访问仍由当前 token 对应角色的 Casbin 权限决定。
  9. 当返回 published=false 或权限数组为空时,应用端应按“当前无可用菜单或无权限”处理,不显示未授权入口,也不回退到 PCWEB 菜单、代码清单或历史本地菜单。

清单编写要求

  1. pageCode 必须是移动端或应用端稳定页面编码,不能直接复用 PCWEB 后台页面码表达另一类页面。
  2. routeNameroutePath 面向应用端路由注册表使用;中间件只保存和返回,不负责下发具体页面组件实现。
  3. actionCode 必须覆盖页面内需要独立授权的按钮、操作入口或业务动作;只配置页面可见不代表页面内所有动作都可用。
  4. menuFlag 用于菜单树节点和动作授权标识归集,同一清单内应保持唯一、稳定、可读。
  5. defaultPage 必须指向同一 app_menu 内存在的页面;应用端拿到默认页后仍要确认该页面在当前返回权限中可见。
  6. 菜单承载节点根字段固定为 menuSeeds,不能写成 seeds 或其他临时字段名。

应用端消费规则

  1. tree 是已经按当前角色授权过滤后的菜单树,应用端优先用它渲染导航。
  2. pageCodes 是当前用户可进入的页面集合,应用端路由守卫应以它为准。
  3. actionCodes 是当前用户可执行的动作集合,应用端按钮和业务操作应以它为准。
  4. menuFlags 包含已授权菜单标识和动作授权标识,可用于兼容需要按菜单标识判断的应用端实现。
  5. defaultPage 表示命中清单声明的应用端默认页;如果该默认页没有出现在当前授权结果中,应用端应进入无权限页或让用户选择其他已授权页面。

联调检查清单

  1. 确认当前应用已在模块应用信息中登记,app-id 使用应用 UUID。
  2. 确认发布 app_menu 时的 appScope 与角色授权页选择的 appScope 一致。
  3. 确认角色已绑定当前模块和当前应用,否则用户登录上下文可能无法进入该应用范围。
  4. 确认调用运行态接口前已经用 permanent key 换取 tempKey,不能把 permanent key 直接作为 X-App-Key
  5. 确认应用端使用的是 /sys_base/public/auth/getAppMenuAuthority 获取完整应用菜单授权;getUserInfo.appMenuDefaultPage 只用于读取当前上下文首页摘要,不返回完整菜单树、页面码或动作码。

版本列表说明

  1. 版本列表按“当前生效”“待发布”“历史已发布”“草稿”“已阻断”展示状态。
  2. 当前生效版本会在摘要区和版本列表中明确标识。
  3. 版本详情优先展示程序解释后的菜单结构和差异摘要,原始 JSON 只保留为辅助导出入口。

运行规则

  1. 应用菜单继续按“模块 + 应用范围”隔离读取与发布。
  2. 切换当前版本本质上会追加一条新的成功发布记录,并立即影响该范围的运行态读取结果。
  3. 普通角色缺少页面权限或动作权限时,由后端正式拒绝访问。
  4. 应用菜单授权结果与 PCWEB 系统菜单授权结果在菜单树、默认页和持久化表上相互独立,同一角色可以拥有不同的后台权限和移动端权限;但两类清单中的 grantApis 都会在授权保存或菜单发布后合并进该角色运行态 Casbin。
  5. 移动端运行态和应用菜单首页的单应用查看,均按当前应用匹配已发布应用菜单范围,顺序为具体应用 UUID、具体接入 AppID、应用模型、全部应用。
  6. 未发布、未匹配或未授权时,移动端返回空权限,不回退到系统菜单、代码清单或历史应用菜单表。
  7. 下游服务用当前角色 token 访问业务接口时,权限检查应走统一 Casbin;不要在业务接口中按请求临时查询应用菜单授权表。
  8. 保存草稿前后端都会校验菜单清单;存在 blocking 阻断项时不会创建新的草稿版本。

维护提示

  1. 如果当前范围没有菜单,先确认该范围是否已有成功发布记录。
  2. 如果版本无法切换为当前版本,先确认该版本是否为已提交或历史已发布版本。
  3. 如果当前范围看起来不对,先核对页面顶部选择的查看范围、摘要区显示的实际命中范围,再核对版本详情中的 appScope
  4. 如果移动端用户看不到菜单,先核对角色“应用菜单授权”页签选择的 appScope 是否与发布范围一致。

CL 正式文档平台