# 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. 更新本文件的映射表(如有新增状态值/字段差异) ```