# 01 — 接口契约

> **这是前后端共享的唯一真相来源。** 修改本文件 = 修改协议，必须同步更新所有端。

---

## 契约生命周期（任务拆分时决定）

契约由**任务拆分时先开工的那一端**负责起草。这是任务产出物之一，不是额外工作。

```
任务拆分阶段：
  ┌─ 任务A：后端-用户管理CRUD ──→ 产出：接口契约（后端起草）
  │                                        + 后端代码
  │
  └─ 任务B：前端-用户管理页面 ──→ 拿到契约后对接

反过来：
  ┌─ 任务A：前端-首页改版 ──→ 产出：接口契约（前端起草）
  │                                   + 前端页面
  │
  └─ 任务B：后端-首页数据接口 ──→ 按契约实现
```

**铁律**：
- 拆分任务时明确标注：**本任务包含接口契约起草**
- 契约随任务一起交付，不单独走审批
- 后开工的一方拿到契约后，发现问题直接跟起草方沟通修改
- 联调时对照本文件，不一致的以本文件为准

### 分仓库时契约放哪

```
Monorepo（推荐）：        分仓库：
项目根/                  后端仓库/              前端仓库/
└── rules/               ├── rules/              ├── rules/
    └── 01-接口契约.md    │   └── 01-接口契约.md  │   └── 01-接口契约.md
                          ← git submodule 引用同一份 →
```

---

## 返回格式（不变式）

```json
// ✅ 唯一正确格式
{ "code": 200, "message": "success", "data": { ... } }
{ "code": 500, "message": "错误原因", "data": null }

// ❌ 永远不许出现
return data;                           // 裸对象
return "ok";                           // 裸字符串
{ "success": true, "result": {...} }   // 自造格式
```

---

## 分页格式（不变式）

```json
{ "list": [...], "total": 100, "pages": 10, "current": 1, "size": 10 }
```

---

## 接口命名约定

| 前缀 | 用途 | 示例 |
|------|------|------|
| `/admin/**` | 管理后台 | `/admin/user/list` |
| `/app/**` | 移动端/H5/小程序 | `/app/task/list` |
| `/auth/**` | 登录注册（共享） | `/auth/login` |
| `/open/**` | 对外开放接口 | `/open/callback` |

---

## 状态值映射表

**← 改这里 = 改协议，必须同步后端 + 所有前端。**

| 含义 | 后端值 | 前端显示 | 前端 CSS 类 |
|------|--------|----------|------------|
| [状态1] | [值] | [文字] | [class] |
| [状态2] | [值] | [文字] | [class] |

---

## 字段名桥接表

同一个概念在不同端字段名不同时，在此登记：

| 概念 | 后端字段 | 前端A字段 | 前端B字段 |
|------|----------|-----------|-----------|
| | | | |

---

## 契约同步铁律

```
改后端接口 → grep 所有前端 → 逐个同步 → 两端都通过才算完成

步骤：
1. 改之前：grep -r "接口路径" 所有前端目录/
2. 改后端 → 编译通过
3. 逐个改前端 → 构建通过
4. 更新本文件的映射表（如有新增状态值/字段差异）
```
