Files
Neo-ZQYY/docs/prd/specs/P15-miniapp-real-api-switch.md
Neo 6f8f12314f feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 00:03:48 +08:00

179 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P15 — 小程序前后端联调Mock → 真实 API 切换
> 创建时间2026-03-22
> 状态:草案
> 优先级P0dev-trace-log 的前置依赖)
> 关联 Specdev-trace-log调试工具链
---
## 一、背景
小程序前端已完成 H5 → 原生迁移h5-miniprogram-migration spec和格式统一P13 spec
26 个后端接口已全部实现API 契约文档确认)。但当前 `services/api.ts` 所有函数返回空 Mock 数据,
`request` 导入已注释,前端与后端之间没有真实的 HTTP 通信。
本 PRD 覆盖"前后端联调"中 dev-trace-log 未涵盖的部分:将小程序从 Mock 数据切换到真实后端接口。
## 二、目标用户与场景
- 用户:开发者(前后端联调阶段)
- 场景:小程序连接本地 FastAPI 后端localhost验证登录、审核、任务、AI 模块的完整数据流
## 三、切换范围
### 3.1 本期切换P0
| 模块 | 涉及页面 | 涉及接口 |
|------|---------|---------|
| 认证 | login、apply、reviewing、no-permission | AUTH-1~5login、dev-login、me、refresh、apply |
| 任务 | task-list、task-detail4 变体) | TASK-1~4列表、详情、操作、绩效概览 |
| 审核 | reviewing、apply | AUTH-3me状态判断、AUTH-5apply |
| AI | chat、chat-history | CHAT-1~3对话列表、发送消息/SSE、历史记录 |
### 3.2 本期不做
| 模块 | 页面 | 原因 |
|------|------|------|
| 看板 | board-finance、board-customer、board-coach | 用户明确排除 |
| 助教 | coach-detail | 非优先联调模块 |
| 客户 | customer-detail、customer-service-records | 非优先联调模块 |
| 备注 | notes | 非优先联调模块 |
| 绩效 | performance、performance-records | 非优先联调模块 |
| 个人 | my-profile | 非优先联调模块 |
## 四、需求清单
### REQ-1API 环境配置
**描述**:创建统一的 API 配置模块,支持开发/测试/生产环境切换。
**验收标准**
- 创建 `apps/miniprogram/miniprogram/config/api.ts`
- 定义 `API_BASE_URL` 常量,开发环境指向 `http://localhost:8000`
- 支持通过构建变量或条件编译切换环境
- `utils/request.ts` 从配置模块读取 base URL禁止硬编码
### REQ-2恢复真实 API 调用
**描述**:将 `services/api.ts` 从 Mock 数据恢复为真实 HTTP 请求。
**验收标准**
- 取消 `request` 导入的注释
- 移除 `delay()` 辅助函数
- 移除所有空 Mock 数据返回
- P0 模块认证、任务、审核、AI的 service 函数改为调用 `request()` 发起真实 HTTP 请求
- 非 P0 模块暂时保留 Mock添加 `// TODO: P15 后续批次切换` 注释)
### REQ-3请求层统一封装
**描述**:确保 `utils/request.ts` 提供完整的请求封装能力。
**验收标准**
- 自动附加 `Authorization: Bearer <token>` 请求头(从 Storage 读取)
- 统一解析响应格式 `{ code: 0, data: ... }` / `{ code: number, message: string }`
- code ≠ 0 时抛出业务错误(含 code 和 message
- 网络异常(超时、断连)抛出网络错误(区分于业务错误)
- Token 过期401自动尝试 refreshrefresh 失败跳转登录页
- 请求超时设置(默认 30sAI 接口 120s
### REQ-4错误处理与用户反馈
**描述**:切换到真实接口后,网络错误、超时、空数据等场景需要有明确的用户反馈。
**验收标准**
- 网络错误:显示"网络连接失败,请检查网络后重试"+ 重试按钮
- 请求超时:显示"请求超时,请稍后重试"+ 重试按钮
- 业务错误code ≠ 0显示后端返回的 message
- 鉴权失败401/403跳转登录页或显示无权限页
- 空数据:显示对应的空态页面(已有四态框架,确保正确触发)
- 所有错误场景记录到 console开发环境便于调试
- 页面级 `pageState` 四态loading/empty/error/normal在真实 API 场景下正确流转
### REQ-5数据格式适配验证
**描述**:验证前端数据结构与后端接口返回的数据结构一致,不一致处做适配。
**验收标准**
- 后端响应统一 camelCaseResponseWrapperMiddleware 已处理)
- 前端类型定义(`services/api.ts` 中的 interface与后端实际返回字段一一对应
- 分页格式对齐:`{ items: T[], total, page, pageSize }`
- 金额字段number 类型,保留 2 位小数,前端通过 `formatMoney()` 展示
- 时间字段ISO 8601 字符串,前端通过 `formatDateShort()` / `formatDateFull()` 展示
- 不一致处在 service 层做适配转换,不在页面层处理
### REQ-6SSE 流式对接AI 模块)
**描述**AI 对话模块的 SSE 流式响应需要特殊处理,不能用普通 HTTP 请求。
**验收标准**
- `services/api.ts` 中 chat 相关函数使用 SSE 方式调用后端
- 支持流式接收 token 并实时渲染到对话界面
- SSE 连接异常时显示错误提示并允许重试
- SSE 超时处理AI 响应可能较慢,超时阈值 120s
- 流式过程中显示"正在思考..."loading 态
### REQ-7登录流程对接
**描述**:小程序登录流程从 Mock 切换到真实微信登录 → 后端换 Token 流程。
**验收标准**
- 开发环境使用 `POST /api/xcx/dev-login`openid 模拟登录)
- 登录成功后将 access_token 和 refresh_token 存入 Storage
- `app.ts``checkAuthStatus()` 调用真实 `GET /api/xcx/me` 判断用户状态
- 根据用户 statusnew/pending/approved/rejected/disabled正确路由到对应页面
- Token 过期自动 refreshrefresh 失败清除 Storage 并跳转登录页
## 五、数据流
```
小程序页面
↓ 调用 service 函数
services/api.ts
↓ 调用 request()
utils/request.ts
↓ wx.request() + Authorization header
↓ 响应解析 + 错误处理
FastAPI 后端 (localhost:8000)
↓ ResponseWrapperMiddleware (camelCase)
↓ { code: 0, data: ... }
返回页面 → 更新 data → 渲染
```
## 六、依赖与约束
| 依赖项 | 状态 | 说明 |
|--------|------|------|
| 后端 26 个接口 | ✅ 已实现 | API 契约文档确认 |
| API 契约文档 | ✅ 已就绪 | `docs/miniprogram-dev/API-contract.md` |
| 前端类型定义 | ✅ 已定义 | `services/api.ts` 中的 interface |
| 四态框架 | ✅ 已实现 | loading/empty/error/normal |
| 格式化工具函数 | ✅ 已实现 | P13 spec 已完成 |
| request.ts 封装 | ⚠️ 需验证 | 文件存在但当前未使用 |
| dev-trace-log | 🔜 并行开发 | 联调时提供调试可视化 |
## 七、验收标准(整体)
1. 登录流程dev-login → 获取 token → 自动路由到正确页面
2. 任务列表:真实数据加载、分页、筛选正常工作
3. 任务详情4 种变体页面正确渲染真实数据
4. AI 对话SSE 流式响应实时渲染,错误时有提示
5. 错误场景断网、超时、401、403、空数据均有正确的用户反馈
6. 非 P0 模块:保持 Mock 不受影响
## 八、风险
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 后端接口返回格式与前端类型不一致 | 页面渲染异常 | REQ-5 要求逐字段验证 |
| 微信开发者工具不支持 localhost | 无法联调 | 使用 dev-login 绕过微信登录;配置开发者工具"不校验合法域名" |
| SSE 在小程序中的兼容性 | AI 模块无法工作 | 需验证 wx.request 的 enableChunked 或使用 requestTask |
| Token 过期处理不完善 | 用户体验中断 | REQ-3 要求自动 refresh |
## 九、与 dev-trace-log 的关系
本 PRD 是 dev-trace-log 的前置依赖:
- 没有真实 API 调用 → trace 系统无数据可采集
- 建议并行推进:先完成 REQ-1~3基础设施再逐模块切换REQ-7 → REQ-2 → REQ-4~6
- 切换过程中使用 dev-trace-log 的 span 链路验证每个接口的完整处理流程