ApplicationAuthtimeController(软件/应用管理)¶
管理企业域下的软件绑定:企业域已绑定/未绑定软件分页列表、添加/移除软件、软件排序;软件列表、软件数据源列表查询;导出菜单-角色权限关系、角色-用户权限关系(Excel),导出软件基础数据 SQL 文件。
- 类级基址:
${myapps.context-path.manager:}/api/authtime(完整路径:{manager-context}/api/authtime<相对路径>) - Tag:软件管理模块
- 控制器源码:
obpm-manager/src/main/java/cn/myapps/manager/authtime/controller/application/ApplicationAuthtimeController.java - 公共说明:
- 类继承
BaseAuthTimeController,通过其success(errmsg, data)/error(errcode, errmsg, errors)返回统一Resource(字段errcode/errmsg/data/errors,结构见 ../index.md「统一响应结构」)。 - 多数端点在
try/catch内捕获Exception并e.printStackTrace()后返回errcode=500、errmsg=e.getMessage()、data=null(HTTP 状态码 200);业务校验失败常用errcode=1(如「未选择软件」)。 exportBaseData返回void,直接写二进制流到响应输出流(非统一Resource),异常向上抛由 Spring 默认异常处理。exportRoleMenuAuthority/exportRoleUserAuthority返回Resource,但实现先把 Excel 写入响应输出流再return success("ok", "成功"),此时响应已提交,返回值实际不被写入响应体(响应体为 Excel 二进制;异常分支虽返回errcode=500的Resource,但若响应头已写出,客户端仍可能拿到部分 Excel 流)。- 鉴权说明见 index.md「鉴权说明」(adminToken JWT)。
- 路径变量:
domainid/domainId为企业域 id;applicationid/applicationId为软件 id。 - 控制器源码未声明类级
@Tag,本文档按所属业务域命名为「软件管理模块」。
1. 企业域软件列表¶
分页查询指定企业域已绑定的(且已启用的)软件列表,支持按 name 模糊过滤。结果在内存中分页。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/domain/{domainid}/applications/bind(完整:{manager-context}/api/authtime/domain/{domainid}/applications/bind) - 鉴权:是(需管理员 adminToken,详见 index.md「鉴权说明」)
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域 id |
| content | body | JSON | 是 | 过滤包体(字段见下) |
| _pagelines | query | string | 否 | 每页条数,缺省 10 |
| _currpage | query | string | 否 | 当前页码,缺省 1 |
请求体¶
JSON 对象(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 否 | 软件名称模糊关键词(包含匹配) |
请求示例¶
POST /api/authtime/domain/__P1UD2yVWpnFpUedONr/applications/bind?_currpage=1&_pagelines=20 HTTP/1.1
Content-Type: application/json
{ "name": "协同" }
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:DataPackage<Application>,字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| linesPerPage | int | 每页条数 |
| pageCount | int | 总页数 |
| pageNo | int | 当前页码 |
| rowCount | int | 总记录数 |
| datas | array\<Application> | 已绑定且已启用的软件数组 |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"linesPerPage": 20,
"pageCount": 1,
"pageNo": 1,
"rowCount": 1,
"datas": [ { "id": "__APP01", "name": "协同办公" } ]
},
"errors": null
}
2. 查询未添加软件列表¶
分页查询指定企业域**未绑定**的(且已启用的)软件列表,支持按 name 模糊过滤。结果在内存中分页。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/domain/{domainid}/applications/unbind(完整:{manager-context}/api/authtime/domain/{domainid}/applications/unbind) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域 id |
| content | body | JSON | 是 | 过滤包体(字段见下) |
| _pagelines | query | string | 否 | 每页条数,缺省 10 |
| _currpage | query | string | 否 | 当前页码,缺省 1 |
请求体¶
JSON 对象(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 否 | 软件名称模糊关键词 |
请求示例¶
POST /api/authtime/domain/__P1UD2yVWpnFpUedONr/applications/unbind?_currpage=1&_pagelines=20 HTTP/1.1
Content-Type: application/json
{ "name": "" }
响应¶
结构:统一 Resource。
data:DataPackage<Application>(结构同「企业域软件列表」)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"linesPerPage": 20,
"pageCount": 1,
"pageNo": 1,
"rowCount": 2,
"datas": [ { "id": "__APP02", "name": "客户管理" } ]
},
"errors": null
}
3. 移除软件¶
从企业域移除已绑定软件,并同步清理该软件-企业域下的角色(RoleHelper.removeRole)。isAll=true 时移除该企业域下所有已绑定软件;否则按 ids 数组移除,ids 为空返回 errcode=1。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/domain/{domainid}/application(完整:{manager-context}/api/authtime/domain/{domainid}/application) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域 id |
| isAll | query | boolean | 否 | 是否移除全部已绑定软件,缺省 false |
| ids | body | string[] | 否 | 待移除的软件 id 数组(isAll=false 时必填,空数组返回 errcode=1) |
请求体¶
application/json,字符串数组(isAll=true 时可省略):
请求示例¶
DELETE /api/authtime/domain/__P1UD2yVWpnFpUedONr/application?isAll=false HTTP/1.1
Content-Type: application/json
[ "__APP01" ]
响应¶
结构:统一 Resource。
data:字符串 "移除成功"。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
isAll=false 且 ids 为空 |
1 | 未选择软件 |
null |
| 成功 | 0 | ok | 移除成功 |
| 抛异常 | 500 | <异常信息> |
null |
成功示例:
失败示例:4. 添加软件¶
向企业域批量添加软件绑定,并为每个软件授权默认角色(RoleHelper.authRole)。ids 为空返回 errcode=1。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/domain/{domainid}/application(完整:{manager-context}/api/authtime/domain/{domainid}/application) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域 id |
| ids | body | string[] | 是 | 待添加的软件 id 数组(空数组返回 errcode=1) |
请求体¶
application/json,字符串数组:
请求示例¶
PUT /api/authtime/domain/__P1UD2yVWpnFpUedONr/application HTTP/1.1
Content-Type: application/json
[ "__APP01" ]
响应¶
结构:统一 Resource。
data:字符串 "添加成功"。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
ids 为空 |
1 | 未选择软件 |
null |
| 成功 | 0 | ok | 添加成功 |
| 抛异常 | 500 | <异常信息> |
null |
注:源码注释中标注「添加软件时执行数据初始化」的一段已被注释掉,当前实现不再在添加软件时执行 SQL 初始化。
成功示例:
失败示例:5. 查找数据源列表¶
按软件 id 查询该软件下配置的数据源列表。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/application/{applicationId}/datasource/list(完整:{manager-context}/api/authtime/application/{applicationId}/datasource/list) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件 id |
请求示例¶
响应¶
结构:统一 Resource。
data:Collection<DataSource>(数据源列表,元素含数据源名称、类型、连接配置等)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": [ { "id": "__DS01", "name": "默认数据源", "type": "mysql" } ],
"errors": null
}
6. 查询软件列表¶
查询所有已启用的非系统软件(type != Application.SYSTEM_TYPE),支持按 name 模糊过滤。由于文件系统扫描时软件文件名为 *.application,当 name 是 application 的子串时会再做一次软件名包含校验,避免误命中。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/applications(完整:{manager-context}/api/authtime/applications) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| name | query | string | 否 | 软件名称模糊关键词(缺省视作空串) |
请求示例¶
响应¶
结构:统一 Resource。
data:List<Application>(已启用的非系统软件数组)。
成功示例:
失败示例:7. 导出菜单角色权限关系¶
按软件 id 导出该软件的「菜单-角色」权限关系为 Excel 文件(文件名 角色&菜单.xls),含 PC 与移动端菜单;公共权限菜单标注「所有用户可用」,未分配角色的菜单标注「此菜单未进行角色权限分配」。
- 接口类型:REST 资源(二进制流)
- 请求方式:
GET - 请求路径:
/domain/applications/{applicationid}/exportrolemenuauthority(完整:{manager-context}/api/authtime/domain/applications/{applicationid}/exportrolemenuauthority) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationid | path | string | 是 | 软件 id |
请求示例¶
响应¶
- Content-Type:
appliction/excel(源码原样拼写,注意拼写) - Content-Disposition:
attachment;fileName=<URL 编码后的「角色&菜单.xls」> - 状态码:200(成功)
- 响应体:Excel 二进制流(无统一
Resource)
注:方法签名返回
Resource,实现先把 workbook 写入响应输出流再return success("ok", "成功"),此时响应已提交,返回值实际不被写入响应体。异常分支虽返回errcode=500的Resource,但若响应头已写出,客户端仍可能拿到部分 Excel 流或损坏响应。
成功示例:
HTTP 200
Content-Type: appliction/excel
Content-Disposition: attachment;fileName=%E8%A7%92%E8%89%B2%26%E8%8F%9C%E5%8D%95.xls
<Excel 二进制流>
若响应头未写出,返回统一 Resource:{ "errcode":500, "errmsg":"<异常信息>", "data":null, "errors":null }
若响应头已写出,客户端可能拿到部分 Excel 流或损坏响应。
8. 导出角色用户权限关系¶
按企业域 + 软件导出该软件的「角色-部门-用户」权限关系为 Excel 文件(文件名 角色&用户.xls),以角色与部门为准列举该部门下的用户名称。部门按层级结构名展示,跨企业域的部门会被过滤。
- 接口类型:REST 资源(二进制流)
- 请求方式:
GET - 请求路径:
/domain/{domainid}/applications/{applicationid}/exportroleuserauthority(完整:{manager-context}/api/authtime/domain/{domainid}/applications/{applicationid}/exportroleuserauthority) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域 id(部门按此过滤跨域) |
| applicationid | path | string | 是 | 软件 id |
请求示例¶
响应¶
- Content-Type:
appliction/excel(源码原样拼写,注意拼写) - Content-Disposition:
attachment;fileName=<URL 编码后的「角色&用户.xls」> - 状态码:200(成功)
- 响应体:Excel 二进制流(无统一
Resource)
注:同「7. 导出菜单角色权限关系」,方法返回的
Resource实际不被写入响应体。
成功示例:
HTTP 200
Content-Type: appliction/excel
Content-Disposition: attachment;fileName=%E8%A7%92%E8%89%B2%26%E7%94%A8%E6%88%B7.xls
<Excel 二进制流>
若响应头未写出,返回统一 Resource:{ "errcode":500, "errmsg":"<异常信息>", "data":null, "errors":null }
若响应头已写出,客户端可能拿到部分 Excel 流或损坏响应。
9. 导出基础数据¶
按企业域 + 软件导出该软件的基础数据 SQL 文件:定位到软件 workspace 目录上级的 database 子目录,遍历其中第一个以 .sql 结尾的文件并以下载流返回;目录不存在或无 .sql 文件时响应体写入纯文本 暂无数据。
- 接口类型:REST 资源(二进制流)
- 请求方式:
GET - 请求路径:
/domain/{domainId}/applications/{applicationId}/data/export(完整:{manager-context}/api/authtime/domain/{domainId}/applications/{applicationId}/data/export) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainId | path | string | 是 | 企业域 id(路径变量,方法签名持有但实际逻辑未直接使用) |
| applicationId | path | string | 是 | 软件 id |
请求示例¶
响应¶
- Content-Type:
application/x-download; charset=UTF-8 - Content-Disposition:
attachment;filename="<URL 编码后的 SQL 文件名>"(命中.sql文件时设置) - 状态码:200
- 响应体:命中时为 SQL 文件二进制;未命中时为纯文本
暂无数据
| 条件 | 行为 |
|---|---|
database 目录存在且含 .sql 文件 |
设置 Content-Disposition 为该文件名,写入文件字节 |
目录不存在 / 无 .sql 文件 |
不设置 Content-Disposition,响应体写入纯文本 暂无数据 |
| 抛异常 | 由 Spring 默认异常处理(HTTP 500,无统一 Resource 体) |
注:本端点返回
void,无try/catch,异常向上抛。
成功示例:
HTTP 200
Content-Type: application/x-download; charset=UTF-8
Content-Disposition: attachment;filename="init-data.sql"
<SQL 文件二进制>
10. 软件排序¶
按软件 id 列表(逗号分隔的 JSON 数组文本)整体覆盖企业域的软件绑定顺序(直接写入 DomainVO.bindApplicatons)。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/domain/{domainId}/applications/sort(完整:{manager-context}/api/authtime/domain/{domainId}/applications/sort) - 鉴权:是
- Tag:软件管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainId | path | string | 是 | 企业域 id |
| ids | body | string | 是 | 软件 id 列表的 JSON 数组文本,如 ["__APP01","__APP02"],原样写入 bindApplicatons |
请求体¶
application/json,字符串(控制器以 String 接收,原样写入域对象 bindApplicatons):
注:源码未对入参做非空/格式校验,调用方需自行保证传入合法的 JSON 数组文本。
请求示例¶
PUT /api/authtime/domain/__P1UD2yVWpnFpUedONr/applications/sort HTTP/1.1
Content-Type: application/json
"[\"__APP01\",\"__APP02\"]"
响应¶
结构:统一 Resource。
data:null。
注:本端点方法签名
throws Exception,未捕获异常时由 Spring 默认异常处理(HTTP 500,无统一Resource体)。
成功示例:
失败示例: