完善后端联调链路与模拟器多通道支持

This commit is contained in:
2026-04-01 18:48:59 +08:00
parent 94a1f0ba78
commit a70dc8d5d0
51 changed files with 4037 additions and 197 deletions

233
f2b.md Normal file
View File

@@ -0,0 +1,233 @@
# F2B 协作清单
本文档由前端维护,用于记录:
- 前端当前联调状态
- 需要后端确认或配合的事项
- 已明确的接口契约与运行时语义
约定:
- `f2b.md` 由前端维护
- `b2f.md` 由后端维护
- 双方只维护自己的文件
- 边界不清的事项,先写入文档,再由你确认
---
## 1. 当前前端联调状态
当前小程序侧已经接通:
- 微信小程序登录
- 首页聚合
- 活动页 `play`
- `launch -> 地图页`
- `session start`
- `session finish`
- `session result`
- 故障恢复提示与恢复继续
- 故障恢复放弃
当前已确认不再是 backend 阻塞项:
- `evt_demo_001` 的 release manifest 现在可正常加载
- 地图页已经能正常拉起
- 模拟定位 / 模拟日志的通道与连接问题,当前主要在小程序与模拟器侧处理
---
## 2. 前端已按当前契约实现
### 2.1 launch 契约
前端当前按以下字段消费:
- `launch.resolvedRelease.releaseId`
- `launch.resolvedRelease.manifestUrl`
- `launch.resolvedRelease.manifestChecksumSha256`
- `launch.config.configUrl`
- `launch.config.configLabel`
- `launch.config.releaseId`
- `launch.config.routeCode`
- `launch.business.sessionId`
- `launch.business.sessionToken`
- `launch.business.sessionTokenExpiresAt`
当前前端约束:
- 正式联调只认后端 `launch` 下发的 release / manifest
- 不再回退到本地 `event/*.json` 样例路径
- 如果 `manifestUrl` 无效,会直接在地图页报错
### 2.2 session 生命周期
前端当前已接:
- 进入运行态后自动上报 `session start`
- 正常结束时上报 `finish(finished)`
- 超时结束时上报 `finish(failed)`
- 主动退出时上报 `finish(cancelled)`
### 2.3 故障恢复
前端当前已接:
- 检测到未正常结束对局时,弹出“继续恢复 / 放弃”
- 点击“继续恢复”时恢复本地运行时快照
- 点击“放弃”时:
- 清理本地恢复快照
- 并使用**恢复快照中的旧 sessionId/sessionToken** 向后端补报 `finish(cancelled)`
当前实现口径:
- 放弃恢复不会阻塞用户
- 即使 backend 上报失败,前端也会继续放弃本地恢复
- 失败时前端会明确提示“后端取消上报失败”
---
## 3. 需要 backend 当前确认 / 配合
## 3.1 固定 session 三态语义
请 backend 明确并固定:
- `finished`
- `failed`
- `cancelled`
前端当前使用口径:
- 正常打终点完成 -> `finished`
- 超时结束 -> `failed`
- 主动退出 / 放弃恢复 -> `cancelled`
如果 backend 计划使用其他语义,请先在 `b2f.md` 明确,不要直接改单接口行为。
## 3.2 确认“放弃恢复 -> cancelled”是官方语义
前端现在已经启用:
- 点击“放弃恢复”时,调用 `POST /sessions/{id}/finish`
- 参数:`status=cancelled`
请 backend 确认:
1. 这是否就是官方的“放弃恢复 / 放弃本局”语义
2.`sessionToken` 是否允许在恢复放弃场景继续调用 `finish(cancelled)`
3. `cancelled` 后是否保证不再作为 `ongoingSession` 出现在:
- `/me/entry-home`
- `/events/{eventPublicID}/play`
## 3.3 保证 start / finish 幂等
请 backend 明确:
- `start` 重复调用是否安全
- `finish` 重复调用是否安全
前端建议口径:
- `start`:如果 session 已在运行态,返回成功和当前 session
- `finish`:如果 session 已进入终态,返回成功和当前 session/result
原因:
- 联调重试
- 页面重进
- 故障恢复补报
- 用户重复点击
这些都很容易触发重复请求。
## 3.4 回归确认 ongoing session 口径一致
请 backend 回归确认以下接口对 ongoing session 的口径一致:
- `/me/entry-home`
- `/events/{eventPublicID}/play`
- `/sessions/{sessionPublicID}/result`
重点确认:
1. `cancelled` 后不再继续出现在 ongoing 入口
2. `failed` 后不再继续出现在 ongoing 入口
3. `finished` 后结果摘要和首页摘要保持一致
## 3.5 保持 launch 返回契约稳定
当前前端已经按既定结构接好 `launch`
请 backend
- 保持字段名稳定
- 如需调整字段名或层级,先在 `b2f.md` 里给出变更说明
- 尤其不要在未通知前端的情况下,改变:
- `resolvedRelease.manifestUrl`
- `business.sessionId`
- `business.sessionToken`
---
## 4. P1 后续建议
## 4.1 用户身体数据接口
前端已经有 telemetry profile 合并能力。
backend 后续建议提供:
- 当前用户 body profile 查询接口
建议至少包含:
- `birthDate``heartRateAge`
- `weightKg`
- `restingHeartRateBpm`
- `maxHeartRateBpm`(可选)
## 4.2 result 摘要字段容错
前端当前 finish 可能上报:
- `finalDurationSec`
- `finalScore`
- `completedControls`
- `totalControls`
- `distanceMeters`
- `averageSpeedKmh`
- `maxHeartRateBpm`
请 backend
- 对可选字段做空值容忍
- 不要因某个非关键字段缺失导致整局 finish 失败
## 4.3 workbench 增加恢复相关调试项
建议 backend workbench 后续增加:
- 将 session 标记为 `cancelled`
- 查询当前用户 ongoing session
- 查看最近一局状态流转
这样更利于故障恢复联调。
---
## 5. 当前前端需要 backend 反馈的最小集合
backend 现在只要先在 `b2f.md` 回 3 件事,前后端主链就能更稳:
1. `finished / failed / cancelled` 三态最终语义
2. 放弃恢复时 `finish(cancelled)` 是否是正式方案
3. `start / finish` 是否按幂等处理
---
## 6. 一句话结论
当前前端最需要 backend 配合的,不是更多新接口,而是:
> 先把 session 生命周期语义、放弃恢复语义和 ongoing session 口径完全定稳。