个人设置(UserSetupController)¶
提供当前登录用户的密码更新、个人信息维护、流程代理(代理人)配置的增删改查、所属企业域查询与切换等「个人设置」域能力。
- 接口类型:REST 资源(
@Component+ 类级@RequestMapping(produces = APPLICATION_JSON_VALUE),继承自@RestController的AbstractRuntimeController,方法返回值由 Spring 以 JSON 序列化输出) - 基址:
${myapps.context-path.runtime:}/api/runtime - Tag:个人设置执行模块
公共说明¶
- 鉴权(据源码
RuntimeMvcConfig+RestSecurityHandlerInterceptor):基址位于/api/runtime/**,不在豁免名单(豁免名单仅覆盖/api/runtime/login.*、/api/runtime/dingding/authlogin、/api/runtime/synchronization.*、/runtime/sync/.*等,详见 login.md「公共说明 · 鉴权」)。拦截器对非/rest/路径走Security.getUserIdFromToken(request),未取到再尝试Security.getDebugUserIdFromToken(request),两者皆无则拒绝访问。所有端点均需 accessToken(或 debugToken),可通过 Cookie / 请求头 / query 参数任一方式传递。 - 路径变量
{applicationId}:仅出现在/usersetups/proxys*系列端点上,经 DES 加密(按当前执行用户密钥),服务端DesUtil.decryptTextByUserId(applicationId, getUser().getId())解密。 - 响应结构:所有端点返回统一
Resource(见 ../index.md「统一响应结构」)。 - 密码编码(据源码):
POST /usersetups/password请求体中三个密码字段采用「尾 2 字符前移 + BASE64 解码」的简单扰动,服务端Security.decodeBASE64(rp + lp)还原为明文后再加密落库;新密码最后以Security.encodeToBASE64加密并同样做「前 2 字符后移」处理。 - HTTP 状态码:所有端点类级标注
@ResponseStatus(HttpStatus.OK),成功统一返回 200;业务错误由响应体errcode体现(密码相关错误统一返回errcode=4001)。
1. 更新密码¶
更新当前登录用户的登录密码;支持「密码二次确认」「原密码校验」「历史密码防重用」「密码长度与策略」校验,校验失败统一返回 errcode=4001。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/usersetups/password(完整:{runtime-context}/api/runtime/usersetups/password) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonStr | body | string(JSON) | 是 | 请求包体(见下) |
请求体¶
{
"oldPassword": "<扰动后的 BASE64 串:尾 2 字符前移 + BASE64>",
"newpassword": "<同上扰动规则>",
"confirmPassword": "<同上扰动规则>"
}
请求示例¶
POST /api/runtime/usersetups/password HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{
"oldPassword": "<扰动串>",
"newpassword": "<扰动串>",
"confirmPassword": "<扰动串>"
}
响应¶
结构:统一 Resource。
data:string,固定为空串 ""。
成功示例:
失败示例(二次确认不一致):
{ "errcode": 4001, "errmsg": "{*[cn.myapps.core.personalsettings.basic.lable.ComfirmAndPasswordNotSame]*}", "data": null, "errors": null }
失败示例(原密码错误):
{ "errcode": 4001, "errmsg": "{*[cn.myapps.core.personalsettings.basic.lable.originalPasswordError]*}", "data": null, "errors": null }
失败示例(与历史密码重复):
失败示例(密码长度不足):
失败示例(不符合密码策略):
说明:失败
errmsg中出现的{*[...]*}是平台资源文件占位符(未解析时原样返回),实际响应可能已被国际化替换;密码策略文案由后台LoginConfig.LOGIN_PASSWORD_LEGALTYPE配置组装(如「英文大写/英文小写/特殊符号/数字」)。
2. 更新个人信息¶
更新当前登录用户的姓名、邮箱、电话、头像。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/usersetups/detail(完整:{runtime-context}/api/runtime/usersetups/detail) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonStr | body | string(JSON) | 是 | 请求包体(见下) |
请求体¶
请求示例¶
POST /api/runtime/usersetups/detail HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "name": "张三", "email": "zhangsan@example.com", "telephone": "13800000000", "avatar": "/resource/avatar/..." }
响应¶
结构:统一 Resource。
data:string,固定为空串 ""。
3. 获取代理列表¶
分页获取当前用户的流程代理配置列表(按流程名称过滤)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/usersetups/proxys(完整:{runtime-context}/api/runtime/{applicationId}/usersetups/proxys) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id(DES 加密密文) |
| flowName | query | string | 否 | 流程名称(模糊过滤) |
| pageNo | query | string | 否 | 当前页 |
| linesPerPage | query | string | 否 | 每页显示条数 |
请求示例¶
GET /api/runtime/__APPID__/usersetups/proxys?flowName=报销&pageNo=1&linesPerPage=10 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:DataPackage<WorkflowProxyVO>,分页封装的代理集合;当应用类型为系统应用时返回空 DataPackage。
{
"errcode": 0,
"errmsg": "ok",
"data": {
"datas": [
{
"id": "...",
"flowId": "...",
"flowName": "报销流程",
"agents": "<代理人用户Id>",
"agentsName": "<代理人姓名>",
"proxyMode": 1,
"startProxyTime": "2026-08-01 00:00:00",
"endProxyTime": "2026-08-31 23:59:59",
"applicationid": "__APPID__"
}
],
"rowCount": 1,
"pageNo": 1,
"linesPerPage": 10
},
"errors": null
}
4. 获取代理¶
按代理 Id 获取单条流程代理配置。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/usersetups/proxys/{id}(完整:{runtime-context}/api/runtime/{applicationId}/usersetups/proxys/{id}) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id(DES 加密密文) |
| id | path | string | 是 | 代理Id |
请求示例¶
GET /api/runtime/__APPID__/usersetups/proxys/__PROXYID__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:WorkflowProxyVO,代理对象。
{
"errcode": 0,
"errmsg": "ok",
"data": { "id": "__PROXYID__", "flowId": "...", "flowName": "报销流程", "agents": "...", "proxyMode": 1 },
"errors": null
}
5. 获取流程列表¶
获取指定应用下可代理的流程列表(用于代理配置时选择流程),支持按主题过滤。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/usersetups/proxys/flows(完整:{runtime-context}/api/runtime/{applicationId}/usersetups/proxys/flows) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id(DES 加密密文) |
| subject | query | string | 否 | 流程主题(按包含匹配过滤) |
请求示例¶
GET /api/runtime/__APPID__/usersetups/proxys/flows?subject=报销 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:Map<String, String>,键为流程Id、值为流程主题;按插入顺序保留(LinkedHashMap)。
{
"errcode": 0,
"errmsg": "ok",
"data": { "<flowId-1>": "报销流程", "<flowId-2>": "请假流程" },
"errors": null
}
6. 保存代理¶
新增或更新流程代理配置。当 flowId/flowName 为分号分隔的多值时按多个流程分别写库;为空时落到一条「所有流程」代理。新增时进行流程级唯一校验,冲突返回 errcode=40014。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/usersetups/proxys/save(完整:{runtime-context}/api/runtime/{applicationId}/usersetups/proxys/save) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id(DES 加密密文) |
| id | query | string | 否 | 代理Id(更新时传入;新建时为空) |
| content | body | string(JSON) | 是 | 代理配置 JSON(见下) |
请求体¶
{
"flowName": "<流程主题;多值分号分隔;为空表示所有流程>",
"flowId": "<流程Id;多值分号分隔>",
"description": "<描述>",
"state": "<状态>",
"agents": "<代理人用户Id>",
"agentsName": "<代理人姓名>",
"owner": "<所有者用户Id,可空,空则取当前登录用户>",
"startProxyTime": "2026-08-01 00:00:00",
"endProxyTime": "2026-08-31 23:59:59",
"proxyMode": 1
}
请求示例¶
POST /api/runtime/__APPID__/usersetups/proxys/save?id=__PROXYID__ HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{
"flowId": "__FLOWID1__;__FLOWID2__",
"flowName": "报销流程;请假流程",
"agents": "__AGENT_USERID__",
"agentsName": "李四",
"startProxyTime": "2026-08-01 00:00:00",
"endProxyTime": "2026-08-31 23:59:59",
"proxyMode": 1
}
响应¶
结构:统一 Resource。
data:string,固定为空串 ""。
成功示例:
失败示例(该流程代理配置已存在):
7. 删除代理¶
按代理 Id 数组批量删除流程代理配置。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/{applicationId}/usersetups/proxys(完整:{runtime-context}/api/runtime/{applicationId}/usersetups/proxys) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 软件Id(DES 加密密文) |
| jsonStr | body | string(JSON) | 是 | 代理 Id 的 JSON 数组字符串 |
请求体¶
请求示例¶
DELETE /api/runtime/__APPID__/usersetups/proxys HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
["__PROXYID1__", "__PROXYID2__"]
响应¶
结构:统一 Resource。
data:string,固定为空串 ""。
8. 获取用户所属企业域¶
按当前登录用户的登录账号 + 密码匹配,返回该账号可登录且处于激活状态的企业域集合(用于多域用户切换域)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/usersetups/domains(完整:{runtime-context}/api/runtime/usersetups/domains) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:List<DomainVO>,激活状态的企业域集合。
{
"errcode": 0,
"errmsg": "ok",
"data": [ { "id": "...", "name": "默认域", "status": 1 } ],
"errors": null
}
9. 切换企业域¶
按企业域名称切换当前登录用户到该域下的同名账号,重新生成 token 并通过 Cookie 下发(accessToken、isFromLogin)。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/usersetups/domains/switch(完整:{runtime-context}/api/runtime/usersetups/domains/switch) - 鉴权:是(需 accessToken,据源码)
- Tag:个人设置执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domain | query | string | 是 | 目标企业域名称 |
请求示例¶
PUT /api/runtime/usersetups/domains/switch?domain=默认域 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:string,切换后新签发的 token;同时响应头 Set-Cookie 写入 accessToken=<token> 与 isFromLogin=1。