跳转至

个人设置(UserSetupController)

提供当前登录用户的密码更新、个人信息维护、流程代理(代理人)配置的增删改查、所属企业域查询与切换等「个人设置」域能力。

  • 接口类型:REST 资源(@Component + 类级 @RequestMapping(produces = APPLICATION_JSON_VALUE),继承自 @RestControllerAbstractRuntimeController,方法返回值由 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": "<扰动串>"
}

响应

结构:统一 Resourcedatastring,固定为空串 ""

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "", "errors": null }

失败示例(二次确认不一致)

{ "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 }

失败示例(与历史密码重复)

{ "errcode": 4001, "errmsg": "{*[ModifyPasswordNotSame]*}:<N>", "data": null, "errors": null }

失败示例(密码长度不足)

{ "errcode": 4001, "errmsg": "{*[PasswordLengthCanNotLow]*}<N>", "data": null, "errors": null }

失败示例(不符合密码策略)

{ "errcode": 4001, "errmsg": "密码必须包含英文大写和数字", "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) 请求包体(见下)

请求体

{
  "name": "<姓名>",
  "email": "<邮箱>",
  "telephone": "<电话>",
  "avatar": "<头像 URI / Base64>"
}

请求示例

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/..." }

响应

结构:统一 Resourcedatastring,固定为空串 ""

{ "errcode": 0, "errmsg": "ok", "data": "", "errors": null }

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...

响应

结构:统一 ResourcedataDataPackage<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...

响应

结构:统一 ResourcedataWorkflowProxyVO,代理对象。

{
  "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...

响应

结构:统一 ResourcedataMap<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
}

响应

结构:统一 Resourcedatastring,固定为空串 ""

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "", "errors": null }

失败示例(该流程代理配置已存在)

{ "errcode": 40014, "errmsg": "该流程的代理配置信息已存在:报销流程", "data": null, "errors": null }


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 数组字符串

请求体

["__PROXYID1__", "__PROXYID2__"]

请求示例

DELETE /api/runtime/__APPID__/usersetups/proxys HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

["__PROXYID1__", "__PROXYID2__"]

响应

结构:统一 Resourcedatastring,固定为空串 ""

{ "errcode": 0, "errmsg": "ok", "data": "", "errors": null }

8. 获取用户所属企业域

按当前登录用户的登录账号 + 密码匹配,返回该账号可登录且处于激活状态的企业域集合(用于多域用户切换域)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/usersetups/domains(完整:{runtime-context}/api/runtime/usersetups/domains
  • 鉴权:是(需 accessToken,据源码)
  • Tag:个人设置执行模块

请求参数

无。

请求示例

GET /api/runtime/usersetups/domains HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataList<DomainVO>,激活状态的企业域集合。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [ { "id": "...", "name": "默认域", "status": 1 } ],
  "errors": null
}

9. 切换企业域

按企业域名称切换当前登录用户到该域下的同名账号,重新生成 token 并通过 Cookie 下发(accessTokenisFromLogin)。

  • 接口类型: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...

响应

结构:统一 Resourcedatastring,切换后新签发的 token;同时响应头 Set-Cookie 写入 accessToken=<token>isFromLogin=1

{ "errcode": 0, "errmsg": "ok", "data": "<new-token>", "errors": null }