跳转至

用户(UserController)

提供当前登录用户的个人信息、头像、皮肤、签章管理、常用意见、个人视图配置,以及按部门/企业域查询用户等能力。基址为 /api/runtime/users(不含 {applicationId},故多数端点不需要应用级 DES 解密)。

  • 接口类型:REST 资源(@Controller + 类级 produces = APPLICATION_JSON_VALUE,继承自 @RestControllerAbstractRuntimeController,方法返回值由 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:用户选择框执行模块

请求参数

无。

请求示例

GET /api/runtime/users/myprofile HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataUserNode,个人信息(含基础属性、视图设置 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)

请求示例

GET /api/runtime/users/profile?id=__USERID__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataUserNode,用户信息。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "id": "__USERID__", "name": "张三" },
  "errors": null
}

3. 获取用户头像

根据用户 Id 获取该用户的头像 URI。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/{id}/avatar(完整:{runtime-context}/api/runtime/users/{id}/avatar
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
id path string 用户Id

请求示例

GET /api/runtime/users/__USERID__/avatar HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resourcedatastring,头像 URI;用户不存在时 errcode=500

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "/resource/avatar/...", "errors": null }

失败示例(用户不存在)

{ "errcode": 500, "errmsg": "用户不存在!", "data": null, "errors": null }


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) 请求包体

请求体

{ "skin": "<皮肤标识>" }

请求示例

POST /api/runtime/users/skin HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "skin": "compact" }

响应

结构:统一 Resourcedatanull

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

6. 前台解锁

前台锁定状态下校验用户密码,返回校验结果(用于解锁当前会话)。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/unlock(完整:{runtime-context}/api/runtime/users/unlock
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
pwd body string(JSON) 包体 JSON,含 pwd(明文密码)

请求体

{ "pwd": "<明文密码>" }

请求示例

PUT /api/runtime/users/unlock HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "pwd": "my-password" }

响应

结构:统一 Resourcedataboolean,密码匹配为 true,否则为 false(均走 success,errcode=0)。

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

7. 获取登录用户签章列表

获取当前登录用户的全部签章配置。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/signs(完整:{runtime-context}/api/runtime/users/signs
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

无。

请求示例

GET /api/runtime/users/signs HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataJSONArray,签章对象数组;当前用户无签章时为 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...

响应

结构:统一 ResourcedataJSONObject,命中签章对象(成功时附加 <userId>signroot 字段记录免密截止时间)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "id": "sign-001", "password": "<加密密码>", "__signroot__": "..." },
  "errors": null
}

失败示例(未设置印章)

{ "errcode": 40001, "errmsg": "您还没有设置印章,请使用“印章管理”功能上传并设置印章!", "data": null, "errors": null }

失败示例(密码错误)

{ "errcode": 40001, "errmsg": "操作失败,印章密码错误!", "data": null, "errors": null }

失败示例(印章不存在)

{ "errcode": 40001, "errmsg": "操作失败,印章不存在!", "data": null, "errors": null }


9. 新建签章

为当前登录用户新增一个签章(密码会经 Security.encryptPassword 加密后存档)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/signs(完整:{runtime-context}/api/runtime/users/signs
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
jsonStr body string(JSON) 签章对象 JSON(含 password 明文,服务端会加密)

请求体

{ "id": "sign-001", "password": "<明文密码>", "rootTime": 3 }

请求示例

POST /api/runtime/users/signs HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "id": "sign-001", "password": "sign-pwd", "rootTime": 3 }

响应

结构:统一 Resourcedatastring,固定为 "新建成功"

{ "errcode": 0, "errmsg": "ok", "data": "新建成功", "errors": null }

10. 删除签章

按签章 Id 删除当前登录用户的指定签章。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/signs/{id}(完整:{runtime-context}/api/runtime/users/signs/{id}
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
id path string 签章Id

请求示例

DELETE /api/runtime/users/signs/sign-001 HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resourcedatastring,固定为 "删除成功"

{ "errcode": 0, "errmsg": "ok", "data": "删除成功", "errors": null }

11. 批量删除签章

按签章 Id 数组批量删除当前登录用户的签章。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/signs(完整:{runtime-context}/api/runtime/users/signs
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
jsonStr body string(JSON) 签章 Id 的 JSON 数组字符串

请求体

["sign-001", "sign-002"]

请求示例

DELETE /api/runtime/users/signs HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

["sign-001", "sign-002"]

响应

结构:统一 Resourcedatastring,固定为 "删除成功"

{ "errcode": 0, "errmsg": "ok", "data": "删除成功", "errors": null }

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

响应

结构:统一 ResourcedataJSONArray,每个元素为 { "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...

响应

结构:统一 ResourcedataJSONObject,新增的意见对象 { "id": "<uuid>", "content": "<opinion>" }

{ "errcode": 0, "errmsg": "ok", "data": { "id": "...", "content": "情况属实" }, "errors": null }

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

响应

结构:统一 ResourcedataJSONObject,被删除的意见对象;用户或意见不存在时为 null

{ "errcode": 0, "errmsg": "ok", "data": { "id": "__OPID__", "content": "同意" }, "errors": 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...

响应

结构:统一 ResourcedataJSONObject,更新后的意见对象 { "id": "<opId>", "content": "<opinion>" };用户或意见不存在时为 null

{ "errcode": 0, "errmsg": "ok", "data": { "id": "__OPID__", "content": "已核实" }, "errors": 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 包装

[
  { "id": "...", "name": "张三", "loginno": "zhangsan", "domainid": "__DOMAINID__" }
]

18. 保存个人视图配置

保存当前登录用户的个人视图配置(如列宽、排序等个性化设置)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/views/settings(完整:{runtime-context}/api/runtime/users/views/settings
  • 鉴权:是(需 accessToken,据源码)
  • Tag:用户选择框执行模块

请求参数

参数名 位置 类型 必填 说明
content body string 配置信息(原样写入 UserVO.viewSettings

请求体

任意配置字符串(通常是 JSON 文本)。

{ "view-001": { "columnWidth": { "field1": 120 } } }

请求示例

POST /api/runtime/users/views/settings HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "view-001": { "columnWidth": { "field1": 120 } } }

响应

结构:统一 Resourcedatanull

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