Files
senmesh-zc/backend/docs/接口文档-用户管理与记录查询.md

499 lines
16 KiB
Markdown
Raw Permalink Normal View History

# 前端接口文档 —— 用户管理增强 & 机构账号查询 & 按手机号查询文件记录
> 版本:v1.2(2026-10-27,新增 1.4 修改用户姓名、1.5 批量创建机构用户)
> 适用后端:s-file(alita-bjy-uygur)
> Swagger 分组:「用户」「用户文件」
---
## 0. 通用约定
### 0.1 请求与认证
- 所有接口均需**登录后调用**,认证 token 按现有方式携带(header 或 cookie,与系统其他接口一致)。
- 新增接口均要求**平台管理员(超管)身份**(`uc_user.supeiror = true`),非管理员调用统一返回失败,提示「当前用户无操作权限」。
### 0.2 统一返回结构 `AlitaResult<T>`
```json
{
"requestId": "xxx",
"code": "200",
"success": true,
"msg": null,
"data": { ... }
}
```
| 字段 | 说明 |
|---|---|
| code | `"200"` 成功;业务失败时 success=false,msg 为错误提示(如「不能禁用当前登录账号」) |
| success | 是否成功 |
| data | 业务数据,失败时为 null |
### 0.3 分页请求与返回
分页查询接口通过 **URL query 参数** 传递分页信息,返回结构 `Page<T>`:
```
pageNo 第几页,默认 1
pageSize 页宽,默认 20,上限 1000
needPage 是否分页,默认 true(无需传)
```
```json
{
"pageNo": 1,
"pageSize": 20,
"pageCount": 5,
"totalCount": 88,
"entityList": [ ... ]
}
```
### 0.4 通用枚举(前后端共用)
**用户状态 `status`**
| 值 | 含义 |
|---|---|
| 1 | 待激活 |
| 2 | 已激活 |
| 3 | 已注销 |
**是否启用 `enabled`**:`true` 启用,`false` 禁用。
**文件状态 `fileStatus`**
| 值 | 含义 |
|---|---|
| 1 | 正常 |
| 2 | 失效 |
| 11 | 解析中 |
| 12 | 待审核 |
| 13 | 传输中 |
| 14 | 失败 |
**记录类型 `recordType`**(本文档 3.4 节专用)
| 值 | 含义 |
|---|---|
| 1 | 上传记录 |
| 2 | 发送记录(本端发起文件传输) |
| 3 | 接收记录(本端接收文件传输) |
> 发送/接收与部署侧有关,但**前端无需关心**:传入 `recordType` 后,后端按部署配置(内网/外网)自动映射到对应的 `root_type`;返回列表中每条记录也已回填 `recordType` / `recordTypeDesc`。
---
## 1. 用户管理:启用 / 禁用 / 注销
### 1.1 启用用户
将被禁用的账号重新启用(幂等:已启用的账号重复调用仍返回成功)。
- **URL**:`POST /user/enable`
- **权限**:平台管理员
- **Body**(application/json)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | Long | 是 | 目标用户 id |
- **返回**:`AlitaResult<Boolean>`,data 为 `true`
- **失败场景**:用户不存在;账号已注销(提示「已注销账号不可启用」);非管理员
**请求示例**
```json
POST /user/enable
{ "userId": 10086 }
```
**返回示例**
```json
{ "code": "200", "success": true, "data": true }
```
### 1.2 禁用用户
禁用账号,禁用后该用户无法登录/使用系统(后端登录态校验会实时读取启用状态,被禁用用户下次请求即被拒绝)。幂等:已禁用的账号重复调用仍返回成功。
- **URL**:`POST /user/disable`
- **权限**:平台管理员
- **Body**(application/json)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | Long | 是 | 目标用户 id |
- **返回**:`AlitaResult<Boolean>`,data 为 `true`
- **失败场景**:
- 用户不存在
- `userId` 为当前登录人(提示「不能禁用当前登录账号」)
- 目标是超级管理员(提示「不能禁用超级管理员账号」)
- 目标已注销(提示「已注销账号无需禁用」)
**请求示例**
```json
POST /user/disable
{ "userId": 10086 }
```
### 1.3 注销用户(管理员直接注销)
管理员将账号直接置为**已注销**(status=3)并同步禁用(enabled=false),**不进入注销申请审批流程**。注销后账号不可恢复、不可登录。幂等:已注销账号重复调用返回成功。
- **URL**:`POST /user/admin_cancel`
- **权限**:平台管理员
- **Body**(application/json)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | Long | 是 | 目标用户 id |
- **返回**:`AlitaResult<Void>`,data 为 null
- **失败场景**:
- 用户不存在
- `userId` 为当前登录人(提示「不能注销当前登录账号」)
- 目标是超级管理员(提示「不能注销超级管理员账号」)
- 并发重复操作(提示「该用户正在注销,请勿重复操作」)
**请求示例**
```json
POST /user/admin_cancel
{ "userId": 10086 }
```
> **与既有接口的区别**:既有 `POST /user/cancel` 为机构内注销(限定当前登录机构、且要求目标账号启用中),供原「注销申请/同意」流程使用,保持不变;本接口供系统管理员在用户管理页面跨机构直接注销。
### 1.4 修改用户姓名
修改用户账号的真实姓名(`real_name`)。平台超管可修改全部用户;机构管理员仅可修改本机构用户(同一账号属于多个机构时,改的是账号本身,各机构下展示同步生效)。
- **URL**:`POST /user/modify_real_name`
- **权限**:平台超管(全部用户)/ 机构管理员(限本机构用户)
- **Body**(application/json)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| userId | Long | 是 | 目标用户 id |
| realName | String | 是 | 新姓名,2-30 位,仅支持中文或英文姓名 |
- **返回**:`AlitaResult<Boolean>`,data 为 `true`
- **失败场景**:
- 用户不存在
- 目标已注销(提示「已注销账号不可修改姓名」)
- 姓名格式错误(提示「姓名格式错误!(长度2-30位,仅支持中文或英文姓名)」)
- 与原姓名一致(提示「姓名与原姓名一致,无需修改!」)
- 机构管理员操作非本机构用户(提示「只能操作本机构的用户」)
**请求示例**
```json
POST /user/modify_real_name
{ "userId": 10086, "realName": "张三" }
```
**返回示例**
```json
{ "code": "200", "success": true, "data": true }
```
> **与既有接口的区别**:既有 `POST /user/modify_org_user_info` 为超管编辑企业用户完整信息(账号名/姓名/启用状态一起校验更新);本接口仅更新姓名,供用户管理页与机构账号页的「修改姓名」入口使用。
### 1.5 批量创建机构用户
一次性提交多条「手机号 + 姓名」创建机构用户。**单条失败不影响其他条目**(每条独立事务),返回与入参**顺序一一对应**的逐条结果,前端据此展示失败项。
- **URL**:`POST /user/batch_create_org_user`
- **权限**:登录用户(机构取当前登录机构,与单条创建 `POST /user/create_org_user` 一致)
- **Body**(application/json,对象数组,单次最多 **500** 条)
数组元素字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| phone | String | 是 | 手机号 |
| realName | String | 否 | 姓名 |
- **返回**:`AlitaResult<List<OrgUserCreateResultDTO>>`
**OrgUserCreateResultDTO 字段**
| 字段 | 类型 | 说明 |
|---|---|---|
| phone | String | 手机号(回显入参) |
| realName | String | 姓名(回显入参) |
| success | Boolean | 是否创建成功 |
| userId | Long | 用户 id,失败时为 null |
| msg | String | 失败原因,成功时为 null |
**请求示例**
```json
POST /user/batch_create_org_user
[
{ "phone": "13800000001", "realName": "张三" },
{ "phone": "13800000002", "realName": "李四" }
]
```
**返回示例**
```json
{
"code": "200",
"success": true,
"data": [
{ "phone": "13800000001", "realName": "张三", "success": true, "userId": 1001, "msg": null },
{ "phone": "13800000002", "realName": "李四", "success": false, "userId": null, "msg": "手机号已存在,不能重复添加" }
]
}
```
- **失败场景**(整体请求失败):列表为空;超过 500 条(提示「单次批量创建不能超过500条」)。单条业务失败(手机号格式不正确、手机号已存在等)不使请求失败,体现在对应条目的 `success/msg` 中。
---
## 2. 系统管理员:查看各机构下的账号信息
### 2.1 分页查询机构账号
按机构维度查看账号信息。一行 = 一个机构下的一个账号(同一账号属于多个机构时会出现多行)。不传 `orgId` 时查询全部机构,传 `orgId` 时查看指定机构。
- **URL**:`GET /user/page/org_account`
- **权限**:平台管理员
- **参数**(URL query)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orgId | Long | 否 | 机构 id,不传查全部机构 |
| orgNameLike | String | 否 | 机构名称,模糊匹配 |
| usernameLike | String | 否 | 账号,模糊匹配 |
| realNameLike | String | 否 | 真实姓名,模糊匹配 |
| phoneLike | String | 否 | 手机号,模糊匹配 |
| enabled | Boolean | 否 | 是否启用:true/false |
| status | Integer | 否 | 用户状态:1 待激活 / 2 已激活 / 3 已注销 |
| createTimeStart | String | 否 | 创建时间起,格式 `yyyy-MM-dd HH:mm:ss` |
| createTimeEnd | String | 否 | 创建时间止,格式 `yyyy-MM-dd HH:mm:ss` |
| pageNo / pageSize | Integer | 否 | 分页参数,默认 1 / 20 |
- **返回**:`AlitaResult<Page<OrgAccountDTO>>`
**OrgAccountDTO 字段**
| 字段 | 类型 | 说明 |
|---|---|---|
| orgId | Long | 机构 id |
| orgName | String | 机构名称 |
| administrator | Boolean | 是否该机构的管理员 |
| userId | Long | 用户 id(可传给 1.1/1.2/1.3 接口做启停/注销操作) |
| username | String | 账号 |
| nickname | String | 昵称 |
| realName | String | 真实姓名 |
| phone | String | 手机号 |
| email | String | 邮箱 |
| userType | Integer | 用户类型:1 企业用户 / 2 个人用户 |
| enabled | Boolean | 是否启用 |
| status | Integer | 状态:1 待激活 / 2 已激活 / 3 已注销 |
| createTime | String | 创建时间 `yyyy-MM-dd HH:mm:ss` |
- **排序规则**:机构 id 升序,机构管理员排前面,同机构内按用户 id 倒序。
**请求示例**
```
GET /user/page/org_account?orgNameLike=教育&phoneLike=138&enabled=false&pageNo=1&pageSize=20
```
**返回示例**
```json
{
"code": "200",
"success": true,
"data": {
"pageNo": 1,
"pageSize": 20,
"pageCount": 1,
"totalCount": 2,
"entityList": [
{
"orgId": 12,
"orgName": "XX市教育局",
"administrator": true,
"userId": 1001,
"username": "admin_xx",
"nickname": "张三",
"realName": "张三",
"phone": "13800000001",
"email": "zhang@xx.gov.cn",
"userType": 1,
"enabled": false,
"status": 2,
"createTime": "2026-08-01 10:00:00"
},
{
"orgId": 12,
"orgName": "XX市教育局",
"administrator": false,
"userId": 1002,
"username": "user_xx01",
"nickname": "李四",
"realName": "李四",
"phone": "13800000002",
"email": null,
"userType": 1,
"enabled": true,
"status": 2,
"createTime": "2026-08-03 14:30:00"
}
]
}
}
```
---
## 3. 按手机号查询文件记录(上传 / 发送 / 接收)
### 3.1 分页查询
输入手机号,精确匹配该手机号名下(可能是多个账号)的全部文件记录,可按记录类型筛选。
- **URL**:`GET /user_file/record/page_by_phone`
- **权限**:平台管理员
- **参数**(URL query)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| phone | String | **是** | 用户手机号,精确匹配,同一手机号关联的所有账号均会命中 |
| recordType | Integer | 否 | 1 上传记录 / 2 发送记录 / 3 接收记录,**不传查全部三类** |
| fileNameLike | String | 否 | 文件名,模糊匹配 |
| fileType | String | 否 | 文件类型:`1` 文件 / `2` 文件夹 |
| fileStatus | String | 否 | 文件状态:1 正常 / 2 失效 / 11 解析中 / 12 待审核 / 13 传输中 / 14 失败 |
| createTimeBegin | String | 否 | 记录时间起,格式 `yyyy-MM-dd HH:mm:ss` |
| createTimeEnd | String | 否 | 记录时间止,格式 `yyyy-MM-dd HH:mm:ss` |
| pageNo / pageSize | Integer | 否 | 分页参数,默认 1 / 20 |
- **返回**:`AlitaResult<Page<UserFileRecordDTO>>`
**UserFileRecordDTO 字段**(继承用户文件全部字段,以下为主要字段)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 记录 id |
| phone | String | 归属手机号 |
| username | String | 归属账号 |
| realName | String | 归属真实姓名 |
| userType | Integer | 归属用户类型:1 企业用户 / 2 个人用户 |
| recordType | Integer | 记录类型:1 上传 / 2 发送 / 3 接收 |
| recordTypeDesc | String | 记录类型描述(「上传记录」「发送记录」「接收记录」) |
| userId | Long | 归属用户 id |
| rootType | String | 原始根类型:1 普通 / 2 内穿外 / 3 外传内(调试用,前端一般用 recordType 即可) |
| fileType | String | 文件大类:1 文件 / 2 文件夹 |
| fileName | String | 文件名 |
| fileCode | String | 物理文件编码 |
| fileSize | Long | 文件大小(字节) |
| fileStatus | String | 文件状态:1 正常 / 2 失效 / 11 解析中 / 12 待审核 / 13 传输中 / 14 失败 |
| createTime | String | 记录时间(上传/发送/接收发起时间)`yyyy-MM-dd HH:mm:ss` |
| endTime | String | 有效期(分享类记录使用),可能为 null |
| fileCategory | String | 文件种类(文档/图片/视频等,按后缀归类) |
| maxRiskLevel | String | 最高风险等级:1 重度 / 2 中度 / 3 轻度,可能为 null |
- **排序**:记录 id 倒序(即时间倒序)。
- **失败场景**:phone 为空;recordType 非法(提示「记录类型不合法,仅支持1上传/2发送/3接收」);非管理员。
**请求示例**
```
GET /user_file/record/page_by_phone?phone=13800000001&recordType=2&pageNo=1&pageSize=10
```
**返回示例**
```json
{
"code": "200",
"success": true,
"data": {
"pageNo": 1,
"pageSize": 10,
"pageCount": 1,
"totalCount": 2,
"entityList": [
{
"id": 9001,
"phone": "13800000001",
"username": "user_xx01",
"realName": "李四",
"userType": 1,
"recordType": 2,
"recordTypeDesc": "发送记录",
"userId": 1002,
"rootType": "2",
"fileType": "2",
"fileName": "2026年预算材料_20260912103000",
"fileCode": null,
"fileSize": null,
"fileStatus": "1",
"createTime": "2026-09-12 10:30:00",
"endTime": null,
"fileCategory": null,
"maxRiskLevel": null
},
{
"id": 8802,
"phone": "13800000001",
"username": "user_xx01",
"realName": "李四",
"userType": 1,
"recordType": 1,
"recordTypeDesc": "上传记录",
"userId": 1002,
"rootType": "1",
"fileType": "1",
"fileName": "工作总结.docx",
"fileCode": "fc_3a7d92",
"fileSize": 1048576,
"fileStatus": "1",
"createTime": "2026-09-10 09:12:00",
"endTime": null,
"fileCategory": "文档",
"maxRiskLevel": null
}
]
}
}
```
> **记录类型口径说明**(便于前端理解,无需处理):
> - 上传记录:用户在网盘中上传的文件/文件夹(rootType=1)。
> - 发送记录:用户发起的文件传输(文件夹整体外发,传输中状态为 13,完成后变 1,失败为 14)。
> - 接收记录:对端传来的文件在本端解包后归属到该手机号用户的记录(若开启风险审查,先为 12 待审核,通过后为 1)。
---
## 4. 错误处理建议
前端统一按 `success=false` 判定失败并 toast `msg`;特殊 code 沿用系统既有约定(`401` 未登录等,与现有接口一致)。
涉及本批接口的典型业务错误文案:
| 场景 | msg |
|---|---|
| 非平台管理员操作 | 当前用户无操作权限 |
| 启用已注销账号 | 已注销账号不可启用 |
| 禁用/注销自己 | 不能禁用当前登录账号 / 不能注销当前登录账号 |
| 禁用/注销超管 | 不能禁用超级管理员账号 / 不能注销超级管理员账号 |
| recordType 非法 | 记录类型不合法,仅支持1上传/2发送/3接收 |
| phone 为空 | 手机号不能为空 |
| 修改姓名格式错误 | 姓名格式错误!(长度2-30位,仅支持中文或英文姓名) |
| 修改姓名与原值相同 | 姓名与原姓名一致,无需修改! |
| 机构管理员越机构操作 | 只能操作本机构的用户 |