跳转至

菜单执行(MenuController)

菜单执行接口:按当前用户权限与多语言设置返回当前应用可见的菜单树(含移动端菜单、视图/统计图/报表/大屏/OLAP 等链接资源的 actionContent 经 DES 加密、视图统计行数等)。

  • 接口类型:REST 资源(@Component 继承 AbstractRuntimeController;类级 produces = MediaType.APPLICATION_JSON_VALUE,方法返回类型为 Resource,由 Spring Jackson 序列化为 JSON,据源码)
  • 基址${myapps.context-path.runtime:}/api/runtime/{applicationId}
  • Tag:菜单执行模块

公共说明

  • 鉴权(据源码):类级基址位于 /api/runtime/**,在 RestSecurityHandlerInterceptor 覆盖范围内,且不在豁免名单(豁免仅覆盖 /api/runtime/login.*/api/runtime/dingding/authlogin/api/runtime/synchronization.*、URI 以 /showjrxml 结尾、含 /getCustomColumnsInfos、含 /accessToken、含 /macro、以 /clear 结尾、含 /pages/ 等,详见 login.md「公共说明 · 鉴权」)。拦截器走 Security.getUserIdFromToken(request),未取到再尝试 Security.getDebugUserIdFromToken(request),两者皆无则拒绝。故需 accessToken(或 debugToken),可通过 Cookie / 请求头 / query 参数任一方式传递。控制器内 getUser()(继承自 AbstractRuntimeController)必须能取到非空 WebUser,否则在 DesUtil.decryptTextByUserId(applicationId, getUser().getId()) 时即抛 NPE。
  • 路径变量 {applicationId}:必填,经 DES 加密(按当前执行用户密钥),服务端在方法入口处 DesUtil.decryptTextByUserId(applicationId, getUser().getId()) 解密。
  • 响应结构:本控制器响应使用统一 Resource(见 ../index.md「统一响应结构」)。
  • 资源 Id 加密:菜单链接类型为视图/统计图/报表/大屏/OLAP(LINKTYPE_VIEW/LINKTYPE_CHART/LINKTYPE_REPORT/LINKTYPE_BIGSCREEN/LINKTYPE_OLAP)时,其 actionContent 字段在返回前由 DesUtil.encryptTextByUserId(..., getUser().getId()) 加密。

1. 获取菜单

返回当前用户在指定应用下可见的菜单树(含 PC 端 / 移动端),按用户角色过滤、按多语言规则翻译、对菜单链接对应的视图/统计图等资源 Id 进行 DES 加密。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/menus(完整:{runtime-context}/api/runtime/{applicationId}/menus
  • 鉴权:是(需 accessToken,据源码)
  • Tag:菜单执行模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
isMobile query boolean 是否移动端,默认 false;为 true 时读取移动端菜单模型(MOBILE_MENU_PATH_SUFFIX/MOBILE_MENU_FILE_SUFFIX

请求示例

GET /api/runtime/__APPID__/menus?isMobile=false HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataList<ResourceVO>,菜单树(顶级菜单持 children,由 getTreeMenus(...) 递归构建)。每个 ResourceVOid/name/description/linkType/actionContent/showType/permissionType/children/totalRow 等字段。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    {
      "id": "__MENUID__",
      "name": "{*[label^name^true^__APPID__]*}",
      "description": "{*[label^name^true^__APPID__]*}",
      "linkType": "01",
      "actionContent": "__ENC_VIEWID__",
      "showType": 0,
      "permissionType": "PUBLIC",
      "children": []
    }
  ],
  "errors": null
}

失败示例

{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }