05-API接口契约.md
5.68 KB
05-API接口契约
BasePath: /api
端口: 8080
全局约定
响应格式
{"code": 200, "message": "操作成功", "data": {}, "timestamp": 1700000000000}
错误码
| 范围 | 含义 |
|---|---|
| 200 | 成功 |
| 400xx | 客户端参数错误 |
| 401xx | 认证/授权错误 |
| 403xx | 权限不足 |
| 404xx | 资源不存在 |
| 500xx | 服务端内部错误 |
鉴权
所有业务接口走 JWT Bearer。客户端在 Authorization: Bearer <accessToken> 头中携带访问令牌。
- 登录
POST /api/usr/auth/login返回accessToken(8 小时)+refreshToken(7 天) - 临期前端用 refresh token 换新 access token:
POST /api/usr/auth/refresh - 注销
POST /api/usr/auth/logout服务端把 token 加入 Redis 吊销名单 - 未携带 / 过期 / 已吊销 → 401,对应错误码
40101 未登录/40102 Token 已过期/40103 Token 已吊销
分页参数
统一查询入参:
| 字段 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
pageNum |
int | 否 | 1 | 当前页码,从 1 开始 |
pageSize |
int | 否 | 20 | 每页条数;上限 100 |
orderBy |
string | 否 | tCreateDate DESC |
排序表达式,列名 + 方向 |
响应包装:
{
"code": 200, "message": "ok",
"data": {
"records": [ ... ],
"total": 1234,
"pageNum": 1,
"pageSize": 20
},
"timestamp": 1700000000000
}
接口清单
(各模块接口段落见下方,由 downstream-gen 按 REQ 填入)
module_usr — USR 用户管理
REQ-USR-001 用户登录
- Method: POST
-
Path:
/api/usr/auth/login - Auth: 公开(无需 JWT)
-
请求:
json { "userName": "admin", "password": "P@ssw0rd", "companyVersion": "STANDARD" }-
userName(string, 必填, 3-50 位) -
password(string, 必填, 明文传输,由 TLS 保证机密性;后端用 BCrypt/Argon2 比对哈希) -
companyVersion(string, 必填, 枚举STANDARD/PRO/FLAGSHIP)
-
-
响应:
json { "code": 200, "message": "ok", "data": { "accessToken": "eyJ...", "refreshToken": "eyJ...", "expiresIn": 28800, "user": { "iIncrement": 1, "sUserName": "admin", "sUserType": "SUPER_ADMIN", "sLanguage": "zh-CN", "permissionCodes": ["USR:ADD", "USR:EDIT", "USR:DELETE", "USR:VIEW"] } }, "timestamp": 1700000000000 }
错误码
-
40001— 用户名或密码错误(不区分两者,防爆破) -
40301— 账号已锁定,请稍后再试 -
40302— 账号已作废 -
40010— 参数校验失败(用户名 / 密码 / 版本字段为空或格式不合法)
REQ-USR-002 新增用户
- Method: POST
-
Path:
/api/usr/users -
Auth: JWT;要求权限码
USR:ADD -
请求:
json { "userNo": "U10001", "userName": "zhangsan", "employeeId": 12, "userType": "NORMAL", "language": "zh-CN", "modifyDoc": false, "permissionIds": [3, 5, 8] }-
userNo/userName必填且系统内唯一 -
employeeId可空(非员工账号) -
userType枚举NORMAL/SUPER_ADMIN(仅超级管理员可创建超级管理员) -
language枚举zh-CN/en-US/zh-TW -
permissionIds权限分类 ID 数组,可为空 - 初始密码后端固定生成(
666666),不在请求体中
-
-
响应:
json { "code": 200, "message": "ok", "data": { "userNo": "U10001", "iIncrement": 42 }, "timestamp": 1700000000000 }
错误码
-
40001— 用户名 / 用户号已存在 -
40010— 参数校验失败 -
40310— 普通用户无权创建超级管理员 -
40411— 关联职员不存在 -
40412— 关联权限分类不存在
REQ-USR-003 修改用户
- Method: PUT
-
Path:
/api/usr/users/{iIncrement} -
Auth: JWT;要求权限码
USR:EDIT -
请求:
json { "employeeId": 12, "userType": "NORMAL", "language": "en-US", "modifyDoc": true, "void": false, "permissionIds": [3, 5] }-
userName不可修改,故请求体不包含 -
void = true等价于禁用(软删除) -
permissionIds全量覆盖(先 DELETE 后 INSERT,事务内)
-
-
响应:
json { "code": 200, "message": "ok", "data": { "iIncrement": 42 }, "timestamp": 1700000000000 }
错误码
-
40404— 目标用户不存在 -
40310— 不可修改超级管理员(非超级管理员调用) -
40311— 不可禁用 / 修改自己 -
40411— 关联职员不存在 -
40412— 关联权限分类不存在 -
40010— 参数校验失败
REQ-USR-004 查询用户
- Method: GET
-
Path:
/api/usr/users -
Auth: JWT;要求权限码
USR:VIEW -
请求: query string
-
searchField枚举userName/employeeName/userNo/departmentName/userType/void/lastLoginDate/creator -
matchMode枚举CONTAINS/NOT_CONTAINS/EQUALS -
searchValue字符串,空则不过滤 -
includeVoid布尔,默认 false(不返回已作废用户) -
pageNum/pageSize/orderBy通用分页参数
-
-
响应: 分页结构,
records[]元素:json { "iIncrement": 42, "sUserName": "zhangsan", "employeeName": "张三", "sUserNo": "U10001", "departmentName": "技术部", "sUserType": "NORMAL", "sLanguage": "zh-CN", "bVoid": false, "tLastLoginDate": "2026-05-13 09:12:33", "sCreator": "admin", "tCreateDate": "2025-12-01 10:00:00" }- 不返回
sPasswordHash/iLoginFailCount/tLockUntil
- 不返回
错误码
-
40010— 参数校验失败(pageSize > 100/matchMode不合法 /searchField不合法)