docs/api目录文档分类和补全

---------

Co-authored-by: guke <guke@autohome.com.cn>
Reviewed-on: #111
This commit was merged in pull request #111.
This commit is contained in:
2026-07-03 15:00:37 +08:00
parent ee132aa93b
commit a563c1ca4b
102 changed files with 2418 additions and 217 deletions
+26
View File
@@ -0,0 +1,26 @@
# POST /api/v1/user/avatar — 上传头像
> 所属:User 组(前缀 `/api/v1/user` | 鉴权:Bearer access_token | [← 返回 API 索引](../README.md)
## 入参
**multipart/form-data**:
| 字段 | 类型 | 说明 |
|---|---|---|
| `file` | file | 头像图片,**仅 JPEG / PNG / WebP**,**≤ 5 MB** |
> 服务端**按文件头魔数嗅探真实类型**(`FF D8 FF` / `89 50 4E 47` / `RIFF…WEBP`),不信任 Content-Type 与文件名;不在三种之内的一律拒。
## 出参
响应 `200`:`UserOut`(`avatar_url` 字段已更新为新地址,形如 `/media/avatars/u<uid>_<rand>.jpg`)。结构见 [API 索引](./README.md#复用数据结构)。
> 返回**相对路径**——客户端按自己的 `BASE_URL` 拼绝对地址(dev 下 `10.0.2.2`/LAN IP 都可能,服务端不知道客户端怎么访问到自己)。读图走 [/media 静态服务](./README.md#media-静态服务) 的 `GET /media/...`。
## 错误码
- `400` 空文件 / 超过 5 MB / 非 JPEG/PNG/WebP
- `401` 未带 token / token 无效或过期 / 用户被禁用
- `422``file` 字段
## 说明
- **旧头像清理**:落库成功后才删旧文件,避免"删了新的没存上"的丢图风险;非本服务托管的 URL(如微信头像)不动
- **文件名服务端随机生成** `u<user_id>_<16 位 hex>.<ext>`,杜绝路径穿越与覆盖
- 存储目录:`settings.MEDIA_ROOT/avatars/`,默认 `data/media/avatars/`(生产 nginx 注意把它放共享卷或对象存储,见 [后端技术实现.md](../后端技术实现.md))
+18
View File
@@ -0,0 +1,18 @@
# DELETE /api/v1/user — 注销账号
> 所属:User 组(前缀 `/api/v1/user` | 鉴权:Bearer access_token | [← 返回 API 索引](../README.md)
## 入参
无(身份取自 Header token)
## 出参
响应 `200`:`{ "ok": true }`
## 错误码
- `401` 未带 token / token 无效或过期 / 用户被禁用(已注销账号再次调返 401,因 `status=deleted` 不再 active)
## 说明
- **软删除 + 匿名化**:`status="deleted"` + `phone="deleted_<id>"`(释放 phone 唯一约束,允许同号码重新注册成全新账号)+ `nickname`/`avatar_url` 清空。行保留用于审计 / 关联表外键完整性
- **头像文件物理删除**:本服务托管的头像文件(`/media/avatars/...`)同时删盘;微信头像等外部 URL 不动
- **后续登录**:`status=deleted` 的行登录接口校验不过,所以"注销账号"后旧 token 仍能用直到自然过期(2h),但一过期就再也换不出新 token。客户端应在调本接口后立刻清本地 token
- **未来若加 jti 黑名单**:本接口应同时把当前 access/refresh 加入黑名单实现"立即吊销"
+67
View File
@@ -0,0 +1,67 @@
# 新手引导状态(onboarding 族)
> 所属:User 组(前缀 `/api/v1/user` | 鉴权:全部 Bearer | [← 返回 API 索引](../README.md)
按(账号, 设备)维度跟踪新手引导完成状态,跨卸载重装持久。运营可在 admin 删记录触发重走。
---
## GET /onboarding/status — 查新手引导是否已完成
已登录用户启动时查:该(账号, 设备)走过引导没。`false` → 客户端应重走。
### 入参(query
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `device_id` | string | ❌(≤64 位) | 硬件级 ANDROID_ID;空 = 按未完成处理(不误跳过) |
Mock 请求:
```
GET /api/v1/user/onboarding/status?device_id=android_abc123def456
```
### 出参
响应 `200`:`OnboardingStatusResponse`
| 字段 | 类型 | 说明 |
|---|---|---|
| `completed` | bool | 该(设备+账号)是否已走过新手引导 |
Mock 出参:
```json
{"completed": true}
```
---
## POST /onboarding/complete — 标记新手引导完成
走完新手引导时调一次。按(当前账号, device_id)落一条完成标记,幂等(重复调用不报错)。
### 入参
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `device_id` | string | ✅ | 硬件级 ANDROID_ID(与登录请求一致) |
Mock 入参:
```json
{
"device_id": "android_abc123def456"
}
```
### 出参
```json
{"ok": true}
```
---
## 说明
- 替代原 `force_onboarding`(按用户)→ 改设备维度后,运营删记录即触发重走
- 幂等:重复标记不报错
- `device_id` 为空时 `status` 一律返回未完成
+20
View File
@@ -0,0 +1,20 @@
# PATCH /api/v1/user/profile — 修改昵称
> 所属:User 组(前缀 `/api/v1/user` | 鉴权:Bearer access_token | [← 返回 API 索引](../README.md)
## 入参
请求体 JSON:
| 字段 | 类型 | 说明 |
|---|---|---|
| `nickname` | string | 昵称,**1-16 字**(前后空格自动 strip,strip 后为空判 400) |
## 出参
响应 `200`:`UserOut`(返回更新后的完整用户对象,`nickname` 字段已更新)。结构见 [API 索引](./README.md#复用数据结构)。
## 错误码
- `401` 未带 token / token 无效或过期 / 用户被禁用
- `422` 字段校验失败(`nickname` 缺失 / 长度超 16 字 / 全空白)
## 说明
- **服务端持久化**:写入 `user.nickname` 列。这是昵称的唯一数据源——客户端之前的本地缓存退登即丢,改完后下次登录走 [`/auth/me`](./auth-me.md) 与登录响应回传仍生效
- **strip 行为**:服务端会先去除前后空白再校验长度,所以 `" bob "` 等价于 `"bob"`