2026-08-04 18:59:21 +08:00
|
|
|
|
# 跨层契约思考指南
|
|
|
|
|
|
|
|
|
|
|
|
本仓库的最小链路是:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
FastAPI 路由
|
|
|
|
|
|
→ Pydantic response model
|
|
|
|
|
|
→ 同源 /api/v1 代理
|
|
|
|
|
|
→ requestJson<T>
|
|
|
|
|
|
→ feature *.types.ts / *.api.ts
|
|
|
|
|
|
→ React Query hook
|
|
|
|
|
|
→ 页面加载、错误、成功状态
|
2026-08-04 16:47:58 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
以系统状态为例,链路对应:
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
- 后端:`interfaces/http/router.py` 挂载 `/api/v1/system/status`,`interfaces/http/system.py` 返回 `SystemStatusResponse`。
|
|
|
|
|
|
- 后端测试:`tests/test_system_http.py` 断言状态码和完整 JSON。
|
|
|
|
|
|
- 前端:`features/system/api/system.api.ts` 使用 `/api/v1/system/status`,`system.types.ts` 描述字段,`system.query.ts` 管理缓存。
|
|
|
|
|
|
- 页面测试:`system-status-page.test.tsx` 断言“运行正常”和环境文本。
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
## 修改 HTTP 字段前
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
1. 找到后端响应模型、路由和现有契约测试。
|
|
|
|
|
|
2. 找到 feature API 函数、TypeScript 类型、query hook 和页面分支。
|
|
|
|
|
|
3. 确认开发 Vite 代理和生产 Nginx 仍覆盖该路径;浏览器代码保持同源路径。
|
|
|
|
|
|
4. 同步更新后端 HTTP 测试和前端行为测试,再运行两端质量命令。
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
## 常见跨层遗漏
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
- 只修改 Pydantic 字段,没有修改 `*.types.ts`,导致 UI 仍读取旧形状。
|
|
|
|
|
|
- 把 `/api/v1` 改成后端绝对 URL,绕过 `vite.config.ts` 和 Nginx 的同源代理。
|
|
|
|
|
|
- 在页面内直接 `fetch`,绕过 `requestJson` 的 `ApiError` 和 `AbortSignal`。
|
|
|
|
|
|
- 用 Zustand 缓存服务器响应,造成 React Query 缓存与全局 store 的双重事实来源。
|
|
|
|
|
|
- 只测试请求成功,没有测试 `isPending`、`isError` 或字段缺失时的安全展示。
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
## 边界验证
|
2026-08-04 16:47:58 +08:00
|
|
|
|
|
2026-08-04 18:59:21 +08:00
|
|
|
|
提交前至少回答:输入在哪里解析?错误在哪里转换?状态由谁拥有?字段是否在后端、客户端类型和 UI 测试中一致?如果答案不清楚,先补充契约或拆分边界,再实现功能。
|