跳转至

用户(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:用户选择框执行模块

请求参数

无。

请求示例

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

响应

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

请求示例

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

响应

结构:统一 Resource。 data:UserNode,用户信息。

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

响应

结构:统一 Resource。 data:string,头像 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" }

响应

结构:统一 Resource。 data:null。

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

响应

结构:统一 Resource。 data:boolean,密码匹配为 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...

响应

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

失败示例(未设置印章):

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

响应

结构:统一 Resource。 data:string,固定为 "新建成功"。

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

响应

结构:统一 Resource。 data:string,固定为 "删除成功"。

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

响应

结构:统一 Resource。 data:string,固定为 "删除成功"。

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

响应

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

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

响应

结构:统一 Resource。 data:JSONObject,被删除的意见对象;用户或意见不存在时为 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...

响应

结构:统一 Resource。 data:JSONObject,更新后的意见对象 { "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 } } }

响应

结构:统一 Resource。 data:null。

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