用户(UserController)¶
提供当前登录用户的个人信息、头像、皮肤、签章管理、常用意见、个人视图配置,以及按部门/企业域查询用户等能力。基址为 /api/runtime/users(不含 {applicationId},故多数端点不需要应用级 DES 解密)。
- 接口类型:REST 资源(
@Controller+ 类级produces = APPLICATION_JSON_VALUE,继承自@RestController的AbstractRuntimeController,方法返回值由 Spring 以 JSON 序列化输出) - 基址:
${myapps.context-path.runtime:}/api/runtime/users - 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 参数任一方式传递;执行用户从令牌还原,无userCode参数。 - 响应结构:多数端点返回统一
Resource(见 ../index.md「统一响应结构」)。下列端点返回类型非Resource,由 Spring 直接序列化为 JSON 数组/对象,不含errcode/errmsg/data/errors包装: GET /users/userAvatar:返回UserVO。GET /users/department/{departmentid}/users:返回Collection<UserVO>(JSON 数组)。GET /users/domain/{domainid}/users:返回Collection<UserVO>(JSON 数组)。- 密码加密:
PUT /users/unlock请求体中的pwd与签章相关密码均通过Security.encryptPassword/decryptPassword加解密。 - HTTP 状态码:所有端点类级标注
@ResponseStatus(HttpStatus.OK),成功统一返回 200;业务错误由响应体errcode体现。
1. 获取个人信息¶
获取当前登录用户的完整个人信息(基于 WebUser 重新构建,并在开启「首次登录改密」策略时回填 isFirstLogin)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/myprofile(完整:{runtime-context}/api/runtime/users/myprofile) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:UserNode,个人信息(含基础属性、视图设置 viewSettings,可选 isFirstLogin)。
{
"errcode": 0,
"errmsg": "ok",
"data": {
"id": "...",
"name": "张三",
"loginno": "zhangsan",
"domainid": "...",
"viewSettings": "...",
"isFirstLogin": false
},
"errors": null
}
2. 获取用户信息¶
根据用户 Id 获取该用户的个人信息(非当前登录用户)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/profile(完整:{runtime-context}/api/runtime/users/profile) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | query | string | 否 | 用户Id(源码 @RequestParam(required=false)) |
请求示例¶
响应¶
结构:统一 Resource。
data:UserNode,用户信息。
3. 获取用户头像¶
根据用户 Id 获取该用户的头像 URI。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{id}/avatar(完整:{runtime-context}/api/runtime/users/{id}/avatar) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | path | string | 是 | 用户Id |
请求示例¶
响应¶
结构:统一 Resource。
data:string,头像 URI;用户不存在时 errcode=500。
成功示例:
失败示例(用户不存在):
4. 获取用户信息(含敏感字段)¶
根据用户 Id 获取完整的 UserVO(含登录密码、签章等敏感字段,仅内部/前台受信场景调用)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/userAvatar(完整:{runtime-context}/api/runtime/users/userAvatar) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | query | string | 否 | 用户Id(源码 @RequestParam(required=false)) |
请求示例¶
GET /api/runtime/users/userAvatar?id=__USERID__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:非统一 Resource。控制器直接返回 UserVO,由 Spring 序列化为 JSON 对象,无 errcode/errmsg 包装。
{
"id": "__USERID__",
"name": "张三",
"loginno": "zhangsan",
"loginpwd": "<加密密码串>",
"avatar": "...",
"domainid": "..."
}
5. 更新皮肤¶
更新当前登录用户的皮肤配置(请求体接收 JSON 字符串,目前实现未真正写入 skin 字段,仅触发个人信息更新)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/skin(完整:{runtime-context}/api/runtime/users/skin) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonStr | body | string(JSON) | 是 | 请求包体 |
请求体¶
请求示例¶
POST /api/runtime/users/skin HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "skin": "compact" }
响应¶
结构:统一 Resource。
data:null。
6. 前台解锁¶
前台锁定状态下校验用户密码,返回校验结果(用于解锁当前会话)。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/unlock(完整:{runtime-context}/api/runtime/users/unlock) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| pwd | body | string(JSON) | 是 | 包体 JSON,含 pwd(明文密码) |
请求体¶
请求示例¶
PUT /api/runtime/users/unlock HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "pwd": "my-password" }
响应¶
结构:统一 Resource。
data:boolean,密码匹配为 true,否则为 false(均走 success,errcode=0)。
7. 获取登录用户签章列表¶
获取当前登录用户的全部签章配置。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/signs(完整:{runtime-context}/api/runtime/users/signs) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:JSONArray,签章对象数组;当前用户无签章时为 null。
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "id": "sign-001", "password": "<加密密码>", "rootTime": 3 }
],
"errors": null
}
8. 根据id获取登录用户签章¶
按签章 Id 获取当前登录用户的指定签章,支持密码盖章与基于 rootTime 的免密盖章(在免密有效期内)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/signs/{id}(完整:{runtime-context}/api/runtime/users/signs/{id}) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | path | string | 是 | 签章Id |
| password | query | string | 是 | 签章密码(明文,与 Security.decryptPassword 解出的存储密码比对) |
| rootTime | query | string | 否 | 根时间(免密盖章时传入,格式 yyyy-MM-dd HH:mm:ss) |
请求示例¶
GET /api/runtime/users/signs/sign-001?password=sign-pwd&rootTime=2026-08-05%2010:00:00 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,命中签章对象(成功时附加 <userId>signroot 字段记录免密截止时间)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": { "id": "sign-001", "password": "<加密密码>", "__signroot__": "..." },
"errors": null
}
失败示例(未设置印章):
失败示例(密码错误):
失败示例(印章不存在):
9. 新建签章¶
为当前登录用户新增一个签章(密码会经 Security.encryptPassword 加密后存档)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/signs(完整:{runtime-context}/api/runtime/users/signs) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonStr | body | string(JSON) | 是 | 签章对象 JSON(含 password 明文,服务端会加密) |
请求体¶
请求示例¶
POST /api/runtime/users/signs HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "id": "sign-001", "password": "sign-pwd", "rootTime": 3 }
响应¶
结构:统一 Resource。
data:string,固定为 "新建成功"。
10. 删除签章¶
按签章 Id 删除当前登录用户的指定签章。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/signs/{id}(完整:{runtime-context}/api/runtime/users/signs/{id}) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | path | string | 是 | 签章Id |
请求示例¶
响应¶
结构:统一 Resource。
data:string,固定为 "删除成功"。
11. 批量删除签章¶
按签章 Id 数组批量删除当前登录用户的签章。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/signs(完整:{runtime-context}/api/runtime/users/signs) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonStr | body | string(JSON) | 是 | 签章 Id 的 JSON 数组字符串 |
请求体¶
请求示例¶
DELETE /api/runtime/users/signs HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
["sign-001", "sign-002"]
响应¶
结构:统一 Resource。
data:string,固定为 "删除成功"。
12. 获取常用意见配置¶
按用户 Id 获取常用审批意见列表;首次访问自动初始化为「同意/批准/OK」三项并落库。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{userId}/commonOpinions(完整:{runtime-context}/api/runtime/users/{userId}/commonOpinions) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| userId | path | string | 是 | 用户Id |
请求示例¶
GET /api/runtime/users/__USERID__/commonOpinions HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONArray,每个元素为 { "id": "<uuid>", "content": "<意见文本>" }。
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "id": "...", "content": "同意" },
{ "id": "...", "content": "批准" },
{ "id": "...", "content": "OK" }
],
"errors": null
}
13. 添加常用意见¶
向指定用户的常用意见集合追加一条;当 opinion 为空时仅返回新建的占位对象,不落库。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{userId}/commonOpinions(完整:{runtime-context}/api/runtime/users/{userId}/commonOpinions) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| userId | path | string | 是 | 用户Id |
| opinion | query | string | 否 | 意见文本 |
请求示例¶
POST /api/runtime/users/__USERID__/commonOpinions?opinion=情况属实 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,新增的意见对象 { "id": "<uuid>", "content": "<opinion>" }。
14. 删除常用意见¶
按意见 Id 从指定用户的常用意见集合中移除一条。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/{userId}/commonOpinions/{opId}(完整:{runtime-context}/api/runtime/users/{userId}/commonOpinions/{opId}) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| userId | path | string | 是 | 用户Id |
| opId | path | string | 是 | 意见Id |
请求示例¶
DELETE /api/runtime/users/__USERID__/commonOpinions/__OPID__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,被删除的意见对象;用户或意见不存在时为 null。
15. 修改常用意见¶
按意见 Id 更新指定用户的某条常用意见文本。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/{userId}/commonOpinions/{opId}(完整:{runtime-context}/api/runtime/users/{userId}/commonOpinions/{opId}) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| userId | path | string | 是 | 用户Id |
| opId | path | string | 是 | 意见Id |
| opinion | query | string | 否 | 新的意见文本 |
请求示例¶
PUT /api/runtime/users/__USERID__/commonOpinions/__OPID__?opinion=已核实 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,更新后的意见对象 { "id": "<opId>", "content": "<opinion>" };用户或意见不存在时为 null。
16. 根据部门拿用户¶
按部门 Id 查询该部门下的用户集合。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/department/{departmentid}/users(完整:{runtime-context}/api/runtime/users/department/{departmentid}/users) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| departmentid | path | string | 是 | 部门Id |
请求示例¶
GET /api/runtime/users/department/__DEPTID__/users HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:非统一 Resource。控制器直接返回 Collection<UserVO>,由 Spring 序列化为 JSON 数组,无 errcode/errmsg 包装。
[
{ "id": "...", "name": "张三", "loginno": "zhangsan", "domainid": "..." },
{ "id": "...", "name": "李四", "loginno": "lisi", "domainid": "..." }
]
17. 根据企业域拿用户¶
按企业域 Id 查询该域下的用户集合。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/domain/{domainid}/users(完整:{runtime-context}/api/runtime/users/domain/{domainid}/users) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| domainid | path | string | 是 | 企业域Id |
请求示例¶
GET /api/runtime/users/domain/__DOMAINID__/users HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:非统一 Resource。控制器直接返回 Collection<UserVO>,由 Spring 序列化为 JSON 数组,无 errcode/errmsg 包装。
18. 保存个人视图配置¶
保存当前登录用户的个人视图配置(如列宽、排序等个性化设置)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/views/settings(完整:{runtime-context}/api/runtime/users/views/settings) - 鉴权:是(需 accessToken,据源码)
- Tag:用户选择框执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| content | body | string | 是 | 配置信息(原样写入 UserVO.viewSettings) |
请求体¶
任意配置字符串(通常是 JSON 文本)。
请求示例¶
POST /api/runtime/users/views/settings HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "view-001": { "columnWidth": { "field1": 120 } } }
响应¶
结构:统一 Resource。
data:null。