You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
16 KiB
435 lines
16 KiB
广东保伦电子股份有限公司
|
|
|
|
产品接口说明书
|
|
|
|
|
|
|
|
|
|
产品名称:
|
|
产品型号:
|
|
撰 写 人:
|
|
所属部门:
|
|
审 核:
|
|
文件标题 文档编号
|
|
|
|
当前版本
|
|
产品接口说明书
|
|
生效日期
|
|
|
|
文档密级:机密
|
|
文档状态:[√] 草案 [ ] 正式发布 [ ] 正在修订
|
|
|
|
|
|
变更履历
|
|
|
|
|
|
序号 版本 变更描述 修订人/日期 审核/日期 批准/日期
|
|
目录
|
|
一、 概述................................................................................................................................... 4
|
|
1.1 编写目的................................................................................................................. 4
|
|
1.2 适用范围................................................................................................................. 4
|
|
1.3 术语说明................................................................................................................. 4
|
|
二、 通用规范........................................................................................................................... 4
|
|
2.1 基础 URL 与接口风格............................................................................................. 4
|
|
2.2 认证......................................................................................................................... 5
|
|
2.3 请求约定................................................................................................................. 6
|
|
2.4 统一响应格式......................................................................................................... 7
|
|
2.5 分页......................................................................................................................... 8
|
|
2.6 通用业务状态码..................................................................................................... 9
|
|
2.7 信封例外:文件导出........................................................................................... 10
|
|
2.8 数据字典............................................................................................................... 10
|
|
2.9 链路追踪............................................................................................................... 11
|
|
一、概述
|
|
1.1 编写目的
|
|
本文档面向前端开发,定义业务中台后端所有接口共同遵守的全局规范与开发契约,包括认证方式、请求与响
|
|
|
|
应格式、分页结构、错误码体系等跨接口恒成立的规则。
|
|
|
|
具体业务接口的入参/出参字段,以后续接口文档为准;本文档描述的规则对所有接口恒成立。
|
|
|
|
|
|
1.2 适用范围
|
|
本文档适用于所有参与业务中台前端设计、开发、测试的团队及个人。
|
|
|
|
|
|
1.3 术语说明
|
|
JWT Token:登录后签发的身份令牌,后续所有请求以请求头 Authorization: Bearer {token} 携带。
|
|
|
|
数据字典:由后台统一维护的 label/value 键值对,用于下拉框等可配置选项的数据源。
|
|
|
|
Trace Id:单次请求的全链路日志标识,通过响应头 X-Trace-Id 返回,用于问题排查。
|
|
|
|
|
|
二、通用规范
|
|
2.1 基础 URL 与接口风格
|
|
项 约定
|
|
|
|
Base URL 按环境提供:http://{host}:{port}(开发/测试/生产地址由后端
|
|
|
|
另行下发)
|
|
|
|
字符集 UTF-8
|
|
|
|
URL 形态 /api/{模块}/{资源或动作},如 /api/auth/login/dingtalk、
|
|
|
|
/api/customer/customers/page
|
|
|
|
接口风格 非严格 RESTful:单条详情用 GET,其余(含分页查询、
|
|
|
|
保存、删除)一律 POST + 动作后缀(/page、/saveOrUpdate、/delete
|
|
|
|
等)
|
|
|
|
为什么不用严格 RESTful(PUT / DELETE / 语义化 URL):
|
|
|
|
1. 解决 GET 传输复杂查询的天然缺陷
|
|
|
|
管理系统的查询条件通常复杂:多选过滤、日期范围、嵌套条件、批量 ID 数组……这些塞在 GET query 里
|
|
|
|
受 URL 长度限制,难以表达结构化参数。
|
|
|
|
2. 权限控制、日志审计与限流便利性
|
|
系统绕不开按钮级/接口级的权限控制和操作日志审计。/save、/delete 这种 URL 自身就说明操作,「一个操
|
|
|
|
作一个 URL」意味着权限点位、审计规则、网关限流都只需匹配 URL 字符串。
|
|
|
|
|
|
2.2 认证
|
|
(1)登录:通过钉钉扫码登录换取 token:
|
|
|
|
POST /api/auth/login/dingtalk
|
|
|
|
Content-Type: application/x-www-form-urlencoded
|
|
|
|
|
|
|
|
|
|
authCode=xxxxxx
|
|
|
|
成功后 data 中返回:
|
|
|
|
{
|
|
|
|
"code": 0,
|
|
|
|
"success": true,
|
|
|
|
"message": "success",
|
|
|
|
"data": {
|
|
|
|
"token": "eyJhbGciOiJIUzI1NiJ9.xxx.yyy",
|
|
|
|
"userInfo": { "userId": "1946xxxxxxxxxxxxx", "nickname": "张三" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(2)携带 token:除登录接口外,所有请求都必须携带请求头:
|
|
|
|
Authorization: Bearer {token}
|
|
|
|
(3)token 生命周期:
|
|
|
|
• token 由后端滑动续期:只要持续在用,剩余有效期不足一半时后端自动续满。
|
|
|
|
• token 字符串自签发起固定不变(字符串内不含过期时间,有效期由服务端管理),续期发生在服务端内
|
|
|
|
部,前端无感知、无需替换本地 token。
|
|
|
|
• 前端不需要定时刷新 token,也没有 refresh token 机制。
|
|
|
|
• 收到 HTTP 401(响应体 code=40103)即代表未登录或登录已过期,此时才清除本地 token 并跳转登
|
|
|
|
录页。
|
|
|
|
(4)登出:POST /api/auth/logout(携带 token)。登出后该 token 立即失效(即使 JWT 本身未过期)。
|
|
|
|
(5)当前用户:GET /api/auth/me(携带 token)。
|
|
2.3 请求约定
|
|
(1)读操作(查询单条 / 列表 / 详情)
|
|
|
|
• 方法:GET
|
|
|
|
• 参数:全部放 URL query,如 GET /api/auth/dict/items?dictCode=customer_source
|
|
|
|
(2)写操作(保存 / 删除 / 登录等)与分页查询
|
|
|
|
• 方法:POST
|
|
|
|
• Content-Type:默认 application/x-www-form-urlencoded;仅文件上传接口使用 multipart/form-data。
|
|
|
|
• 参数:全部为表单字段,不使用 JSON body。
|
|
|
|
POST /api/auth/system/menus/save
|
|
|
|
Content-Type: application/x-www-form-urlencoded
|
|
|
|
Authorization: Bearer {token}
|
|
|
|
|
|
|
|
|
|
parentId=0&menuName=客户管理&menuType=2&path=/customer&sort=1&visible=true
|
|
|
|
(3)复杂字段:JSON 字符串嵌表单
|
|
|
|
当某个入参是对象或数组时,前端将其 JSON.stringify 后作为一个普通表单字段传递(是「各复杂字段各自
|
|
|
|
stringify」,不是整个 body 打包成一个 JSON):
|
|
|
|
POST /api/customer/customers/save
|
|
|
|
Content-Type: application/x-www-form-urlencoded
|
|
|
|
Authorization: Bearer {token}
|
|
|
|
|
|
|
|
|
|
name=测试客户&ownerId=1946xxx&contacts=[{"name":"李四","phone":"13800000000"},{"name":"王五
|
|
|
|
","phone":"13900000000"}]
|
|
上例中 contacts 字段的值是 JSON 数组字符串(实际发送时需 URL 编码)。哪些字段是 JSON 字符串字段、
|
|
|
|
其内部结构长什么样,以接口文档中该接口的参数说明为准。
|
|
|
|
(4)数据类型约定
|
|
|
|
类型 约定
|
|
|
|
ID(含所有雪花 ID) 一律按字符串收发。后端返回时已序列化为字符串(超出 JS
|
|
|
|
Number 安全范围,转 Number 会丢精度),前端回传原样传字
|
|
|
|
符串即可
|
|
|
|
日期时间 yyyy-MM-dd HH:mm:ss,时区 GMT+8
|
|
|
|
日期 yyyy-MM-dd
|
|
|
|
时间 HH:mm:ss
|
|
|
|
布尔 true / false
|
|
|
|
|
|
2.4 统一响应格式
|
|
所有接口(文件导出除外,见 2.7)返回统一 JSON 结构:
|
|
|
|
{
|
|
|
|
"code": 0,
|
|
|
|
"success": true,
|
|
|
|
"message": "success",
|
|
|
|
"data": { }
|
|
|
|
}
|
|
|
|
字段 类型 说明
|
|
|
|
code number 结果码,0 为成功,其余见 2.6 通用
|
|
|
|
业务状态码
|
|
|
|
success boolean 是否成功
|
|
|
|
message string 提示信息。失败时为面向用户的中文
|
|
|
|
提示,前端可直接 toast 展示,无需自行
|
|
|
|
映射文案
|
|
|
|
data any 业务数据,可能为 null(如保存/删除
|
|
|
|
类接口成功时,对于列表查询,空列表返
|
|
|
|
回 [] 而不是 null),前端须判空
|
|
|
|
判定规则:
|
|
• 判成功:只看 success === true。
|
|
|
|
• 判失败后的分支处理(跳登录、回填表单等):再看 code。
|
|
|
|
HTTP 状态码:业务失败(参数错误、业务规则不满足等)HTTP 状态码仍是 200,只能通过响应体的
|
|
|
|
success/code 判断。仅以下场景 HTTP 状态码非 200:
|
|
|
|
HTTP 场景 响应体 code
|
|
|
|
401 未登录 / 登录过期 40103
|
|
|
|
403 已登录但无权限 40301
|
|
|
|
404 接口路径不存在 40401
|
|
|
|
500 系统内部异常 50001
|
|
|
|
即使 HTTP 状态码非 200,响应体仍然是统一信封结构,前端全局拦截器可统一解析。
|
|
|
|
|
|
2.5 分页
|
|
(1)入参(POST 表单字段,所有分页接口通用),各业务分页接口在此基础上追加自己的过滤字段:
|
|
|
|
字段 类型 默认 说明
|
|
|
|
current number 1 当前页码,从 1 开始
|
|
|
|
size number 10 每页条数,上限 500,超
|
|
|
|
出自动收敛为 500
|
|
|
|
orderBy string - 排序字段,驼峰或下划线
|
|
|
|
均可(如 createTime)。仅允
|
|
|
|
许字母、数字、下划线,含非
|
|
|
|
法字符时排序被忽略
|
|
|
|
asc boolean false 是否升序,默认 false(新
|
|
|
|
数据在前)
|
|
|
|
(2)出参(data 为统一分页结构)
|
|
|
|
{
|
|
|
|
"code": 0,
|
|
|
|
"success": true,
|
|
|
|
"message": "success",
|
|
|
|
"data": {
|
|
|
|
"content": [ { "id": "1946xxx", "name": "测试客户" } ],
|
|
|
|
"total": 57,
|
|
"size": 10,
|
|
|
|
"current": 1,
|
|
|
|
"pages": 6,
|
|
|
|
"empty": false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
字段 类型 说明
|
|
|
|
content array 当前页数据列表
|
|
|
|
total number 总条数
|
|
|
|
size number 每页条数
|
|
|
|
current number 当前页码(从 1 开始)
|
|
|
|
pages number 总页数
|
|
|
|
empty boolean 是否空结果(total == 0),前端无需
|
|
|
|
再判断 content.length
|
|
|
|
|
|
2.6 通用业务状态码
|
|
错误码分段规则(新业务模块会按段扩展,前端按段兜底处理即可):
|
|
|
|
区间 含义
|
|
|
|
400xx 参数类错误
|
|
|
|
401xx 认证/身份类错误
|
|
|
|
403xx 权限类错误
|
|
|
|
404xx 资源不存在
|
|
|
|
405xx 请求方式错误
|
|
|
|
500xx 系统/外部调用错误
|
|
|
|
6xxxx 业务错误
|
|
标准通用状态码列表:
|
|
|
|
code 含义 前端处理建议
|
|
|
|
0 成功 -
|
|
|
|
40001 请求参数缺失或格式错误 展示 message(含具体字段信息)
|
|
|
|
40002 无效的请求体 展示 message
|
|
|
|
40101 API 签名验证失败 展示 message
|
|
|
|
40102 请求时间戳已过期 展示 message
|
|
|
|
40103 未登录或登录已过期 清除本地 token,跳转登录页
|
|
|
|
40301 操作权限不足 提示无权限,不跳登录
|
|
|
|
40401 请求的资源不存在 展示 message
|
|
|
|
40501 错误的请求方式 检查 GET/POST 是否用反
|
|
|
|
50001 系统内部错误 提示「系统繁忙,请稍后重试」,报
|
|
|
|
障时附 X-Trace-Id(见 2.9)
|
|
|
|
50002 外部服务调用失败 同上
|
|
|
|
60001 通用业务错误 直接展示 message
|
|
|
|
61001 不支持的登录方式 展示 message
|
|
|
|
61002 三方授权失败(钉钉 authCode 无效/ 提示重新扫码
|
|
|
|
过期)
|
|
|
|
61003 账号已被禁用 展示 message
|
|
|
|
-1 未知错误 展示 message
|
|
|
|
|
|
2.7 信封例外:文件导出
|
|
Excel 导出类接口不返回 JSON 信封,直接返回二进制流:
|
|
|
|
• 成功:响应头含 Content-Disposition: attachment;filename=xxx.xlsx(文件名已 URL 编码),响应体为文
|
|
|
|
件流,前端按 blob 接收后触发下载。
|
|
|
|
• 失败:响应体是 JSON 错误信封(统一结构)。
|
|
|
|
因此前端处理导出接口时先检测响应的 Content-Type:
|
|
|
|
• application/json → 按信封解析并提示 message;
|
|
|
|
• 其他 → 按 blob 下载。
|
|
|
|
|
|
2.8 数据字典
|
|
• 字典项分 label / value 两部分:label 是前端展示值(如「官网注册」),value 是存储值(如 "1")。
|
|
提交和回显一律用 value,label 仅用于展示。
|
|
|
|
• 下拉框数据源是否走字典接口,以原型标注为准:
|
|
|
|
- 原型标注了字典编码(dictCode)的 → 调 GET /api/auth/dict/items?dictCode=xxx 获取 label/value 列
|
|
|
|
表;
|
|
|
|
- 是/否、启用/禁用等简单枚举 → 前端直接硬编码,不走字典。
|
|
|
|
|
|
2.9 链路追踪
|
|
• 每个响应都带响应头 X-Trace-Id,标识本次请求的全链路日志。
|
|
|
|
• 前端报障时请附上出错请求的 X-Trace-Id,后端可据此直接定位日志。
|
|
|
|
• 前端也可主动在请求头传 X-Trace-Id(无则后端自动生成)。
|
|
|