设计时软件管理(ApplicationDesignTimeController)¶
软件(应用)设计时资源管理:软件的增删改查、启用/禁用、概览 PDF 导出、平台模式回调日志与 git 操作日志查询、索引重建,以及软件数据源的连通性测试与初始化。
- 接口类型:REST 资源
- 基址:
${myapps.context-path.designer:}/api/designtime(类级@RequestMapping,@Component继承AbstractDesignTimeController) - Tag:设计时-软件模块
公共说明¶
- 鉴权:是(需 designerToken)。所有端点继承自
AbstractDesignTimeController,通过Security.getDesignerIdFromToken(request)从 designerToken JWT 中解析设计器用户;getUser()返回基于 JWT claimusername加载的SuperUserVO。鉴权机制详见 index.md「鉴权说明」。 - 路径变量:
{applicationId}、{datasourceId}、{id}均为**明文设计时 ID**(与 designer 其他控制器一致,非 runtime 的 DES 加密密文)。 - 路径前缀差异(据源码):本控制器同时存在
/applications/...(复数)与/application/...(单数)两套前缀,调用时须严格按各端点写明的小写形式(源码历史遗留,未做统一)。 - 响应:统一
Resource(见 ../index.md「统一响应结构」)。成功errcode=0;异常默认errcode=500,errmsg为异常信息;保存类接口校验失败(如重名、名称为空)返回errcode=40001;数据源连通失败返回errcode=502。 - HTTP 方法:受
CommonSecurityFilter限制,仅允许GET/POST/HEAD/OPTIONS。 - 请求体约定:多数 POST/PUT/DELETE 接收原始 JSON 字符串(
@RequestBody String content),由服务端用JSONObject.fromObject/JSONArray.fromObject解析。 - 权限模型:列表查询时,超级管理员(
SuperUserVO.isSuperAdmin())可看全部;其他用户仅可见其applicationList中授权的软件。新建/更新软件后,若当前用户为开发者(isDeveloper()),会自动把该软件 Id 追加到该用户的授权列表。
1. 获取软件列表¶
分页获取当前用户可见的软件列表(超级管理员看全部;其他用户仅看授权列表)。可按 searchword 关键字过滤。注意:源码形参 searchword 仅在超级管理员分支通过 appService.queryByName(searchword) 生效;非超级管理员分支不过滤。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/applications(完整:{designer-context}/api/designtime/applications) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| searchword | query | string | 否 | 按名称查询关键字(仅超级管理员生效) |
| type | query | integer | 否 | 类型(@Parameter 声明但实现未使用,缺省 0) |
| pageNo | query | integer | 否 | 当前页数(缺省 1) |
| linesPerPage | query | integer | 否 | 每页行数(缺省 10) |
说明:源码
@Parameter还声明了category,但方法签名未声明该@RequestParam,实际不会被读取。
请求示例¶
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:DataPackage<Application>(含分页字段 rowCount/linesPerPage/pageNo 与 datas)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"rowCount": 2,
"linesPerPage": 10,
"pageNo": 1,
"datas": [
{ "id": "...", "name": "OA", "description": "办公自动化", "type": 1, "...": "..." }
]
},
"errors": null
}
2. 获取软件详情¶
按 applicationId 查询单个软件,返回精简后的字段集(id、name、description、type、activated、orderNo、uri、url/token/encodingAESkey(仅 BPM 平台型)、datasourceName、category、brief、ico)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/applications/{applicationId} - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
响应¶
data:JSONObject,结构如上字段集;找不到时 data 为 null(errcode=500,errmsg 为异常信息)。
{
"errcode": 0,
"errmsg": "ok",
"data": {
"id": "...",
"name": "OA",
"description": "办公自动化",
"type": 1,
"activated": true,
"orderNo": 1,
"uri": "",
"url": "",
"token": "",
"encodingAESkey": "",
"datasourceName": "默认数据源",
"category": "OA",
"brief": "...",
"ico": "..."
},
"errors": null
}
3. 获取软件 README 文档¶
按 applicationId 返回该软件工作目录下 README.md 的文本内容。文件不存在时返回空字符串。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/application/{applicationId}/readme(注意:单数application) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
请求示例¶
响应¶
data:String,README.md 文本(UTF-8)。失败时 errcode=40001(该端点异常包为 40001,与其他端点不同)。
4. 新建软件¶
创建软件。请求体反序列化为 Application 后做重名/名称为空校验,通过则分配设计时序列号并保存;若当前用户为开发者,将软件 Id 追加到该用户授权列表;并创建该软件工作目录的 pid、url 索引占位文件。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/applications - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| content | body | string(JSON) | 是 | 软件对象 JSON |
请求体¶
对应 Application 对象 JSON(name 必填,type、category、brief、ico、数据源列表等可选)。
响应¶
data:JSONObject,仅含 id(新建软件Id)。校验失败时 errcode=40001,errmsg 为「软件名称不能为空!」或「该软件名称已存在!」。
5. 更新软件¶
按 applicationId 更新软件基本字段(克隆后修改,避免脏字段写回)。当原软件为 BPM 平台型(Application.BPM_PLATFORM_TYPE)时一并更新 url/token/encodingAESkey。保存成功后通过 Feign 调用 RuntimeFeignService.clearDataSourceCache 清理数据源缓存(失败被吞掉)。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/applications/{applicationId} - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
| content | body | string(JSON) | 是 | 软件对象 JSON(须含 name/description/type/activated/orderNo/category/brief/ico;BPM 平台型另须 url/token/encodingAESkey) |
请求体¶
{
"name": "OA",
"description": "...",
"type": 1,
"activated": true,
"orderNo": 1,
"category": "OA",
"brief": "...",
"ico": "...",
"url": "", "token": "", "encodingAESkey": ""
}
响应¶
data:null(成功)。校验失败时 errcode=40001。
6. 删除软件(可批量)¶
按软件 Id 数组批量删除软件(含工作目录),并清理所有超级用户对该软件 Id 的授权引用。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/applications - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| content | body | string(JSON) | 是 | 软件 Id 数组(JSON 数组字符串,由 JSONArray.fromObject 解析为 List<String>) |
请求体¶
响应¶
data:null(成功)。
7. 生成应用概览 PDF¶
按 applicationId 调用 ApplicationUtil.createOverview 生成 PDF 概览文件,并返回二进制流。
- 接口类型:REST 资源(二进制响应)
- 请求方式:
GET - 请求路径:
/applications/{applicationId}/overview - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
请求示例¶
响应¶
结构:非统一 Resource,直接返回二进制 PDF 流。
- Content-Type:application/octet-stream
- Content-Disposition:form-data; name="attachment"; filename="appOverview<时间戳>.pdf"
- 状态码:201 Created(成功或失败均为 201;失败时 body 为空)
说明:该端点异常时返回
ResponseEntitybody 为null,仍带 201 状态码,调用方需按 body 是否为空判断。
8. 获取平台模式回调日志¶
按 applicationId 返回该软件的所有平台模式回调日志(CallBackLogStorage.getAll)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/applications/{applicationId}/getCallBackLogs - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
请求示例¶
响应¶
data:Collection<CallBackLog>。
9. 获取 git 操作记录日志¶
按资源 Id(表单/视图/模块等任意设计时资源 Id)定位其所属软件的 git 目录,遍历 commit 历史中 message 头部包含该 Id 的提交,返回操作记录列表。每条 commit message 约定为 <resourceId>--<操作描述> 格式(按 -- 拆分)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/applications/records/{id} - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | path | string | 是 | 资源Id(用于定位所属软件并过滤 commit) |
请求示例¶
响应¶
data:List<Map>,每项 {id, username, message, time}。未定位到软件目录时为空数组。
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "id": "<commit hash>", "username": "<作者>", "message": "<操作描述>", "time": "2026-08-04 12:34:56" }
],
"errors": null
}
10. 重构索引文件¶
重建软件的设计时索引(url、pid 文件与 DesignTimeIndexCacheManager.initCache)。applicationName 缺省时遍历工作目录下所有 <name>.application 目录并逐个重建;指定时仅重建该软件。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/indexs/rebuild - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationName | query | string | 否 | 软件名称(缺省时全量重建) |
请求示例¶
响应¶
data:null(成功)。HTTP 状态码固定 200 OK(@ResponseStatus(HttpStatus.OK))。
11. 获取工作空间软件列表(按文件系统)¶
直接扫描工作空间根目录下所有 <name>.application 子目录,解析其内的 <name>.application 文件,返回软件清单(与数据库无关,用于索引重建前的探测)。id 字段恒为空字符串。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/indexs/applications - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
无。
请求示例¶
响应¶
data:JSONArray,每项 {id, name, description}(id 恒为 "",description 缺省时回退为软件名)。HTTP 状态码固定 200 OK。
{
"errcode": 0,
"errmsg": "ok",
"data": [ { "id": "", "name": "OA", "description": "办公自动化" } ],
"errors": null
}
12. 禁用软件¶
按 applicationId 将软件 activated 置为 false 并保存。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/application/{applicationId}/inactivate(注意:单数application) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
请求示例¶
响应¶
data:String,成功时为 "success"。
13. 启用软件¶
按 applicationId 将软件 activated 置为 true 并保存。启用前会对该软件的所有数据源逐个执行 testDB();任一失败返回 errcode=502。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/application/{applicationId}/activate(注意:单数application) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
请求示例¶
响应¶
data:String,成功时为 "success"。数据源连通失败时 errcode=502,errmsg 形如 [<数据源名>]datasource connected failed!。
14. 测试软件数据源连通性¶
按 applicationId + datasourceId 加载数据源并执行 testDB()。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/application/{applicationId}/datasource/{datasourceId}/test(注意:单数application) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
| datasourceId | path | string | 是 | 数据源Id |
请求示例¶
响应¶
data:String。连通成功:errcode=0、errmsg="ok"、data="success";连通失败:仍返回 errcode=0,但 errmsg="error"、data="bad connection:<数据源 url>"。异常时 errcode=500。
15. 初始化软件数据源¶
按 applicationId + datasourceId 初始化数据源:仅支持 MySQL(DataSource.DB_MYSQL)。若连通失败先建库(createDB());若库为空则从软件工作目录的 database/<数据源名>.sql 还原。非 MySQL 类型返回 errcode=502,errmsg 为数据源 url。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/application/{applicationId}/datasource/{datasourceId}/init(注意:单数application) - 鉴权:是(需 designerToken)
- Tag:设计时-软件模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id |
| datasourceId | path | string | 是 | 数据源Id |
请求示例¶
响应¶
data:null(成功)。非 MySQL 返回 errcode=502。