设计时菜单管理(MenuController)¶
菜单设计时资源管理:菜单的增删改查、批量复制,按表单/视图生成菜单,全量菜单树查询,以及菜单图标库的浏览与删除。
- 接口类型:REST 资源
- 基址:
${myapps.context-path.designer:}/api/designtime/applications(类级@RequestMapping,produces = 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=500,errmsg为异常信息;保存类接口校验失败(同级菜单重名、与上级同名、上级菜单已删除等)返回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 按请求参数绑定,故可缺省。
请求示例¶
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:List<Map>,每项 {id, name, superior, uri, applicationId, permissionType, hasChild}。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "id": "...", "name": "菜单名称", "superior": "...", "uri": "...", "applicationId": "...", "permissionType": "...", "hasChild": true }
],
"errors": null
}
2. 获取菜单详情¶
按菜单Id获取完整菜单对象。当菜单为旧版报表菜单(linkType=09 且 moduleid 为空)时,服务端将其 actionContent 重写为报表Id、moduleid 重写为报表的父级Id,以兼容旧数据。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/menus/{menuId} - 鉴权:是(需 designerToken)
- Tag:设计时-菜单模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id |
| menuId | path | string | 是 | 菜单Id |
响应¶
data:ResourceVO 完整对象。
{ "errcode": 0, "errmsg": "ok", "data": { "id": "...", "name": "...", "linkType": "...", "actionContent": "...", "...": "..." }, "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数组 |
请求体¶
响应¶
data:String,固定为 "成功复制菜单"。
4. 新建菜单¶
在指定应用下新建菜单。请求体反序列化为 ResourceVO,校验同级菜单重名、与上级同名、上级菜单是否已删除等。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/menus - 鉴权:是(需 designerToken)
- Tag:设计时-菜单模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id |
| isMobile | query | string | 是 | 是否移动端("true"/"false") |
| content | body | string(JSON) | 是 | 菜单对象 JSON |
请求体¶
对应 ResourceVO 的 JSON(含 name、superior、linkType、actionContent 等)。
响应¶
data:JSONObject,仅含 id(新建菜单Id)。校验失败时 errcode=40001,errmsg 为校验信息(如「上级菜单已删除!」「同级菜单名称已存在!」「名称不可以跟上级相同!」「菜单名称不能为空!」)。
5. 更新菜单¶
按菜单Id更新菜单对象(含同级/与上级同名等校验)。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/{applicationId}/menus/{menuId} - 鉴权:是(需 designerToken)
- Tag:设计时-菜单模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id |
| menuId | path | string | 是 | 菜单Id |
| content | body | string(JSON) | 是 | 菜单对象 JSON |
响应¶
data:null(成功)。校验失败时 errcode=40001。
6. 删除菜单(可批量)¶
按菜单Id数组批量删除菜单(含路径信息收集与删除日志记录)。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/{applicationId}/menus - 鉴权:是(需 designerToken)
- Tag:设计时-菜单模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id |
| content | body | string(JSON) | 是 | 菜单Id数组(JSON 数组字符串,由 JsonPath 解析为 List<String>) |
请求体¶
响应¶
data:null(成功)。
7. 根据表单创建菜单¶
按指定表单快速生成一个链接到该表单的菜单。请求体提供 name、superior(上级菜单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 的对象 |
请求体¶
响应¶
data: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 的对象 |
请求体¶
响应¶
data: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¤tMenuId= HTTP/1.1
响应¶
data:List<Map>,每项 {id, value}(value 为带层级缩进的菜单显示名)。
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "id": "<menuId>", "value": "一级菜单" },
{ "id": "<menuId>", "value": " 二级菜单" }
],
"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形参。
请求示例¶
响应¶
data:Collection<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 | 是 | 图标路径数组 |
请求体¶
响应¶
data:String,固定为 "删除成功"。图标不存在时 errcode=4001,errmsg="图标不存在"。