# 前后端联调清单 > 文档版本:v1.0 > 最后更新:2026-04-02 ## 1. 目的 这份清单只回答三件事: 1. 小程序当前已经具备哪些接后端的前置能力 2. backend 当前已经提供了哪些可联调接口 3. 哪些链路已经能接,哪些链路还缺适配 本文不讨论未来大而全后台方案,只服务当前联调落地。 ## 2. 当前结论 当前状态可以概括成一句话: > backend 业务主链已经可联调;小程序地图运行内核也已经成型;两边之间还缺一层业务接入和会话上报适配。 也就是说: - 登录、活动详情、launch、session、result 这一条后端链已经可用 - 小程序地图页已经支持携带 `configUrl / releaseId / sessionId / sessionToken` - 但小程序当前仍主要走本地 demo / 直连 OSS manifest - 真正的“后端 launch -> 地图页 -> session start/finish/result”还没有正式接上 ## 3. 小程序当前已具备的联调基础 ## 3.1 启动信封已经成型 地图页不是只吃一个 `configUrl`,而是吃一份启动信封: - [gameLaunch.ts](D:/dev/cmr-mini/miniprogram/utils/gameLaunch.ts) 当前结构: - `config.configUrl` - `config.configLabel` - `config.configChecksumSha256` - `config.releaseId` - `config.routeCode` - `business.source` - `business.competitionId` - `business.eventId` - `business.launchRequestId` - `business.participantId` - `business.sessionId` - `business.sessionToken` - `business.sessionTokenExpiresAt` - `business.realtimeEndpoint` - `business.realtimeToken` 这意味着: - backend `launch` 返回的数据结构已经能自然装进小程序地图启动链 - 地图页并不需要重构启动模型,只需要把业务页接到 `GameLaunchEnvelope` ## 3.2 地图页已经支持远端 manifest 启动 - [map.ts](D:/dev/cmr-mini/miniprogram/pages/map/map.ts) 当前地图页会: 1. 解析 `GameLaunchEnvelope` 2. 调 `loadRemoteMapConfig(configUrl)` 3. 编译 runtime profile 4. 启动 `MapEngine` 所以只要后端能给出: - `manifestUrl` - `releaseId` - `configChecksumSha256` 地图页就可以直接跑。 ## 3.3 会话态字段已经进入地图页 地图页当前已经能接收并持有: - `sessionId` - `sessionToken` - `sessionTokenExpiresAt` 这说明后面接: - `POST /sessions/{id}/start` - `POST /sessions/{id}/finish` 不需要再改地图启动协议。 ## 3.4 故障恢复也已经具备会话上下文承载 故障恢复快照当前会保留: - `launchEnvelope` - 运行态快照 这意味着一旦接入后端 session 后,恢复链也可以继续沿用同一份 `launchEnvelope`。 ## 4. backend 当前已具备的联调基础 ## 4.1 路由主链已落地 - [router.go](D:/dev/cmr-mini/backend/internal/httpapi/router.go) 当前已实现: - `POST /auth/login/wechat-mini` - `GET /me/entry-home` - `GET /events/{eventPublicID}/play` - `POST /events/{eventPublicID}/launch` - `POST /sessions/{sessionPublicID}/start` - `POST /sessions/{sessionPublicID}/finish` - `GET /sessions/{sessionPublicID}/result` - `GET /me/results` ## 4.2 launch 返回结构已贴近客户端 - [核心流程.md](D:/dev/cmr-mini/backend/docs/核心流程.md) - [接口清单.md](D:/dev/cmr-mini/backend/docs/接口清单.md) 当前 `launch` 返回重点: - `launch.resolvedRelease.releaseId` - `launch.resolvedRelease.manifestUrl` - `launch.resolvedRelease.manifestChecksumSha256` - `launch.business.sessionId` - `launch.business.sessionToken` 这和小程序 `GameLaunchEnvelope` 基本是同一语义。 ## 4.3 session 运行态和结果态已分离 - [session_service.go](D:/dev/cmr-mini/backend/internal/service/session_service.go) 当前已经区分: - 业务登录态:`access_token` - 局内运行态:`sessionToken` 这对地图页是对的,因为地图页真正需要的是: - 进入前有业务 token - 进入后局内动作用 sessionToken ## 4.4 开发 workbench 已可用于联调 - [dev_handler.go](D:/dev/cmr-mini/backend/internal/httpapi/handlers/dev_handler.go) 当前 workbench 已能串: - bootstrap - auth - entry/home - event play / launch - session start / finish / detail - result 查询 这对前后端联调非常有价值,说明后端已经不是“只看文档”阶段。 ## 5. 当前已经能接的链路 ## 5.1 P0:登录与业务页前置链 可接: 1. 小程序 `wx.login` 2. `POST /auth/login/wechat-mini` 3. 拿到 `accessToken` 4. 调 `GET /me/entry-home` 5. 调 `GET /events/{eventPublicID}/play` 当前缺口: - 小程序还没有正式业务页 API 适配层 - 还没有统一 token 持久化与请求封装 ## 5.2 P0:launch 进入地图 可接: 1. 前置业务页拿到 event play 2. 调 `POST /events/{eventPublicID}/launch` 3. 把返回结果映射成 `GameLaunchEnvelope` 4. `navigateTo('/pages/map/map?...')` 当前缺口: - 还没有一层 `backend launch -> GameLaunchEnvelope` 的适配函数 - 当前 `gameLaunch.ts` 仍偏 demo/static config 驱动 ## 5.3 P0:finish 回传结果 可接: 1. 地图页结束一局 2. 提取结果摘要 3. 用 `sessionId + sessionToken` 调 `POST /sessions/{id}/finish` 4. 业务页或结果页再查 `GET /sessions/{id}/result` 当前缺口: - 小程序本地结果页已经有摘要,但还没有正式调用 backend finish - finish payload 和本地 `resultSummary` 之间还需要一层映射 ## 6. 当前还不能说已经接通的链路 ## 6.1 配置后台 source/build/release backend 当前已经有: - 表结构 - 文档模型 但还没有真正开放: - `config source` - `build` - `release assets` - `preview launch` 也就是说: **配置后台链还不能联调,只能联业务主链。** ## 6.2 body profile / 遥测个体化 小程序已经有: - 身体数据入口 - 遥测 runtime profile backend 文档里也规划了: - 用户身体资料 但当前接口清单里还没有明确的 body profile 读接口落到小程序链上,所以这条还不能算当前联调主线。 ## 7. 当前最大的接口适配缺口 我认为目前最大缺口只有 4 个: ### 7.1 业务 API 客户端缺失 小程序当前缺: - 统一 `request` 封装 - token 持久化 - access token 刷新 - backend DTO -> 小程序 view model 适配 ### 7.2 launch 适配层缺失 需要一层明确的转换: `LaunchResponse -> GameLaunchEnvelope` 这里最适合单独做成一个小模块,而不是散落在页面里。 ### 7.3 session finish 映射缺失 地图页当前本地已经有: - 用时 - 分数 - 完成点数 - 里程 - 速度 - 最大心率 但还没有一个稳定函数把它映射为 backend finish payload。 ### 7.4 业务结果页与地图结果页还未打通 现在地图页已经有自己的结果页。 后面要决定: - 地图页结果页先本地展示,再异步回传 - 还是 finish 成功后跳业务结果页 这件事需要前后端统一策略。 ## 8. 推荐联调顺序 建议按下面顺序推进,不要跳步: ### 第一步:接微信小程序登录 目标: - 小程序拿到 `accessToken` - 能请求鉴权接口 ### 第二步:接 event play 目标: - 小程序业务页能拿到: - `event` - `resolvedRelease` - `play.canLaunch` - `play.ongoingSession` ### 第三步:接 launch -> map 目标: - 从后端 launch 返回直接进入地图 - 不再靠 demo preset 手工切配置 ### 第四步:接 start / finish / result 目标: - 开赛后能回传 start - 结束后能回传 finish - 结果页能查 backend result ### 第五步:再考虑 ongoing session 恢复 目标: - backend ongoing session - 本地故障恢复 两条链统一口径 ## 9. 当前已落地的小程序联调适配 小程序侧当前已经补了第一批适配层: - [backendAuth.ts](D:/dev/cmr-mini/miniprogram/utils/backendAuth.ts) - [backendApi.ts](D:/dev/cmr-mini/miniprogram/utils/backendApi.ts) - [backendLaunchAdapter.ts](D:/dev/cmr-mini/miniprogram/utils/backendLaunchAdapter.ts) - [index.ts](D:/dev/cmr-mini/miniprogram/pages/index/index.ts) 当前已具备: - 后端 base URL 本地持久化 - access / refresh token 本地持久化 - 微信小程序登录请求封装 - `event play` 请求封装 - `launch -> GameLaunchEnvelope` 适配 - 从首页直接 `launch` 进入地图 - 地图页 `session start / finish` 上报接入 因此当前主链已从“可分析”进入“可实测”。 ## 10. 我建议的最近行动项 如果开始联调,我建议先做这 3 件事: 1. 新增小程序 `backendApi` 请求层 先只包 auth / event play / launch / session finish 2. 新增 `launchAdapter` 把 backend launch 响应稳定转成 `GameLaunchEnvelope` 3. 新增 `finishAdapter` 把地图页结果摘要稳定转成 backend finish payload 这三件做完,前后端主链就能真正接起来。 ## 11. 一句话结论 当前最真实的进度判断是: > backend 业务后端主链已经进入可联调阶段;小程序地图运行内核也已经具备承接能力;下一步最值钱的是补小程序业务 API 层和 launch/finish 两个适配器。