跳转至

设计时菜单管理(MenuController)

菜单设计时资源管理:菜单的增删改查、批量复制,按表单/视图生成菜单,全量菜单树查询,以及菜单图标库的浏览与删除。

  • 接口类型:REST 资源
  • 基址${myapps.context-path.designer:}/api/designtime/applications(类级 @RequestMappingproduces = APPLICATION_JSON_VALUE
  • Tag:设计时-菜单模块

公共说明

  • 鉴权:是(需 designerToken)。控制器继承自 AbstractDesignTimeController(基类为 @RestController),通过 Security.getDesignerIdFromToken(request) 从 designerToken JWT 中解析设计器用户。鉴权机制详见 index.md「鉴权说明」。
  • 路径变量{applicationId}{menuId}{formId}{viewId} 均为**明文设计时 ID**(与 designer 其他控制器一致,非 runtime 的 DES 加密密文)。
  • 响应:统一 Resource(见 ../index.md「统一响应结构」)。成功 errcode=0;异常默认 errcode=500errmsg 为异常信息;保存类接口校验失败(同级菜单重名、与上级同名、上级菜单已删除等)返回 errcode=40001
  • HTTP 方法:受 CommonSecurityFilter 限制,仅允许 GET/POST/HEAD/OPTIONS
  • 请求体约定:多数 POST/PUT/DELETE 接收原始 JSON 字符串(@RequestBody String content)或 JSON 字符串数组(@RequestBody String[]),由服务端用 JSONObject.fromObject/JsonPath 解析。

1. 获取菜单列表

按应用Id与父级Id获取子菜单列表。isMobile=true 时返回移动端菜单(按 MOBILE_MENU 后缀过滤),否则返回 PC 菜单。parentId 为空时回退取应用根下子菜单。每项额外带 hasChild(无子集时为 true,配合前端渲染)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/{applicationId}/menus(完整:{designer-context}/api/designtime/applications/{applicationId}/menus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
isMobile query boolean 是否移动端
parentId query string 父级菜单Id(缺省回退为应用Id)

说明:parentId 形参未标注 @RequestParam,由 Spring MVC 按请求参数绑定,故可缺省。

请求示例

GET /api/designtime/applications/{applicationId}/menus?isMobile=false&parentId= HTTP/1.1

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataList<Map>,每项 {id, name, superior, uri, applicationId, permissionType, hasChild}

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    { "id": "...", "name": "菜单名称", "superior": "...", "uri": "...", "applicationId": "...", "permissionType": "...", "hasChild": true }
  ],
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


2. 获取菜单详情

按菜单Id获取完整菜单对象。当菜单为旧版报表菜单(linkType=09moduleid 为空)时,服务端将其 actionContent 重写为报表Id、moduleid 重写为报表的父级Id,以兼容旧数据。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/{applicationId}/menus/{menuId}
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
menuId path string 菜单Id

响应

dataResourceVO 完整对象。

{ "errcode": 0, "errmsg": "ok", "data": { "id": "...", "name": "...", "linkType": "...", "actionContent": "...", "...": "..." }, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


3. 复制菜单

将一组菜单复制到指定目标上级菜单下。当 isMobile=true 时按移动端格式落地(isMobile=false);否则按 PC 端格式落地(isMobile=true),并对非法 linkType 做清空处理。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/{applicationId}/menus/copy
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
destid query string 目标上级菜单Id(可为空字符串,表示复制到应用根下)
isMobile query string 是否移动端("true"/"false" 字符串,决定落地的 isMobile 标记)
ids body string 待复制菜单Id数组

请求体

["<menuId1>", "<menuId2>"]

响应

dataString,固定为 "成功复制菜单"

{ "errcode": 0, "errmsg": "ok", "data": "成功复制菜单", "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


4. 新建菜单

在指定应用下新建菜单。请求体反序列化为 ResourceVO,校验同级菜单重名、与上级同名、上级菜单是否已删除等。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/{applicationId}/menus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
isMobile query string 是否移动端("true"/"false"
content body string(JSON) 菜单对象 JSON

请求体

对应 ResourceVO 的 JSON(含 namesuperiorlinkTypeactionContent 等)。

响应

dataJSONObject,仅含 id(新建菜单Id)。校验失败时 errcode=40001errmsg 为校验信息(如「上级菜单已删除!」「同级菜单名称已存在!」「名称不可以跟上级相同!」「菜单名称不能为空!」)。

{ "errcode": 0, "errmsg": "ok", "data": { "id": "<menuId>" }, "errors": null }
失败示例
{ "errcode": 40001, "errmsg": "同级菜单名称已存在!", "data": null, "errors": null }


5. 更新菜单

按菜单Id更新菜单对象(含同级/与上级同名等校验)。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/{applicationId}/menus/{menuId}
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
menuId path string 菜单Id
content body string(JSON) 菜单对象 JSON

响应

datanull(成功)。校验失败时 errcode=40001

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 40001, "errmsg": "<校验信息>", "data": null, "errors": null }


6. 删除菜单(可批量)

按菜单Id数组批量删除菜单(含路径信息收集与删除日志记录)。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/{applicationId}/menus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
content body string(JSON) 菜单Id数组(JSON 数组字符串,由 JsonPath 解析为 List<String>

请求体

["<menuId1>", "<menuId2>"]

响应

datanull(成功)。

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


7. 根据表单创建菜单

按指定表单快速生成一个链接到该表单的菜单。请求体提供 namesuperior(上级菜单Id,可空)、showType"mobile" 表示移动端,其他为 PC 端)。表单不存在时返回 errcode=500,菜单校验失败抛出 {*[page.name.notexist]*}

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/{applicationId}/form/{formId}/menus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
formId path string 表单Id
content body string(JSON) name/superior/showType 的对象

请求体

{ "name": "<菜单名称>", "superior": "<上级菜单Id或空字符串>", "showType": "pc" }

响应

datanull(成功)。

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "{*[页面已失效,请重新打开!]*}", "data": null, "errors": null }


8. 根据视图创建菜单

按指定视图快速生成一个链接到该视图的菜单。请求体与「根据表单创建菜单」一致;视图不存在时返回 errcode=500

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/{applicationId}/view/{viewId}/menus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
viewId path string 视图Id
content body string(JSON) name/superior/showType 的对象

请求体

{ "name": "<菜单名称>", "superior": "<上级菜单Id或空字符串>", "showType": "pc" }

响应

datanull(成功)。

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "{*[页面已失效,请重新打开!]*}", "data": null, "errors": null }


9. 获取所有菜单

返回应用下的全部菜单树(按 _orderby=orderno 排序)。showType 取值 pc/mobile/其他:pc 仅返回 .menu 文件后缀的 PC 菜单;mobile 仅返回直接挂在应用根下的移动端菜单;其他值返回 PC + 移动端菜单合并。type 形参非空时才执行查询,否则返回单条 {id:"", value:"无"}

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/{applicationId}/menu/getAllMenus
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
showType query string 类型:pc/mobile/其他
type query string 菜单类型;非空时才执行查询
currentMenuId query string 当前菜单Id(缺省 "",用于深度搜索时排除自身子树)
name query string 菜单名称(未实际参与过滤,仅声明形参)

说明:name 形参未标注 @RequestParam

请求示例

GET /api/designtime/applications/{applicationId}/menu/getAllMenus?showType=pc&type=menu&currentMenuId= HTTP/1.1

响应

dataList<Map>,每项 {id, value}value 为带层级缩进的菜单显示名)。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    { "id": "<menuId>", "value": "一级菜单" },
    { "id": "<menuId>", "value": "  二级菜单" }
  ],
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


10. 获取图标集合

浏览指定应用下的图标库目录。path 形参为空时列出平台公共图标目录(/uploads/lib/icon);非空时列出应用资源目录 /<appName>/resources<path>。每个图标项含名称、路径、文件类型、尺寸、大小等。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/{applicationId}/icons
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
path query string 资源子目录(缺省=平台公共图标目录)

说明:path 通过 getParams().getParameterAsString("path") 获取,非 @RequestParam 形参。

请求示例

GET /api/designtime/applications/{applicationId}/icons?path= HTTP/1.1

响应

dataCollection<IconLibFile>,每项 {name, path, fileType, size?, length?, width?}fileType=1=图片,2=目录;图片项额外带 size/length/width)。注意:服务端异常时该接口直接返回 null(非统一 Resource)。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    { "name": "folder", "path": "/uploads/lib/icon/folder", "fileType": 2 },
    { "name": "logo.png", "path": "/uploads/lib/icon/logo.png", "fileType": 1, "size": "64 x 64", "length": "12.3 KB", "width": 64 }
  ],
  "errors": null
}

11. 删除自定义图标

按图标路径数组删除自定义图标文件。路径以 /resources 开头时解析到应用工作区资源目录,否则解析到平台存储根目录。任一图标文件不存在时返回 errcode=4001

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/{applicationId}/icon
  • 鉴权:是(需 designerToken)
  • Tag:设计时-菜单模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id
path body string 图标路径数组

请求体

["/uploads/lib/icon/old.png", "/resources/<appName>/icons/custom.png"]

响应

dataString,固定为 "删除成功"。图标不存在时 errcode=4001errmsg="图标不存在"

{ "errcode": 0, "errmsg": "ok", "data": "删除成功", "errors": null }
失败示例
{ "errcode": 4001, "errmsg": "图标不存在", "data": null, "errors": null }