zhangyan 6cd16f08dd 推进活动系统最小成品闭环与游客体验 10 hours ago
..
cmd 94a1f0ba78 Add backend foundation and config-driven workbench 6 days ago
docs 6cd16f08dd 推进活动系统最小成品闭环与游客体验 10 hours ago
internal 6cd16f08dd 推进活动系统最小成品闭环与游客体验 10 hours ago
migrations 6cd16f08dd 推进活动系统最小成品闭环与游客体验 10 hours ago
scripts 0e28f70bad 完善多赛道联调与全局产品架构 5 days ago
.env.example a70dc8d5d0 完善后端联调链路与模拟器多通道支持 6 days ago
README.md 6cd16f08dd 推进活动系统最小成品闭环与游客体验 10 hours ago
go.mod 94a1f0ba78 Add backend foundation and config-driven workbench 6 days ago
go.sum 94a1f0ba78 Add backend foundation and config-driven workbench 6 days ago
start-backend.ps1 0e28f70bad 完善多赛道联调与全局产品架构 5 days ago

README.md

Backend

文档版本:v1.41 最后更新:2026-04-07 18:15:01

这套后端现在已经能支撑一条完整主链:

entry -> auth -> home/cards -> event play -> launch -> session -> result

当前已实现接口总数:

  • 116

开发环境补充说明:

  • /admin/ops-workbench/ops/admin/*APP_ENV != production 时默认免登录可用。
  • 即使浏览器里残留旧的玩家 token、过期 token 或非 ops token,运维链也会自动回退到 dev ops 上下文。
  • 生产环境不变,仍然必须使用正式 ops token。
  • 运维后台当前采用“左侧流程导航 + 中间单主视图 + 右侧状态/日志”结构,不再把地图、路线、活动、发布动作平铺在一个长页面里。
  • 资源总览 先展示关键统计与当前运行时信息;地图页只保留关联活动数量和摘要,活动明细统一放到 活动管理 / 活动编排
  • 地图 / 地点管理 当前按“地图列表优先”组织:
    • 先看地图列表
    • 右上角只放 添加地图 / 添加地点
    • 地点编辑区改成省/市两级选择
    • 一张地图只属于一个地点,一个地点可挂多张地图

新增的游客模式公开接口:

  • GET /public/experience-maps
  • GET /public/experience-maps/{mapAssetPublicID}
  • GET /public/events/{eventPublicID}
  • GET /public/events/{eventPublicID}/play
  • POST /public/events/{eventPublicID}/launch

这组接口用于支撑“未登录游客只体验默认活动”的最小链路。

新增的地图资源与默认体验活动接口:

  • GET /experience-maps
  • GET /experience-maps/{mapAssetPublicID}

这组接口用于支撑“地图列表下的默认活动”最小产品化需求。

新增的运维地图管理接口:

  • GET /ops/admin/region-options
  • GET /admin/map-assets
  • PUT /admin/map-assets/{mapAssetPublicID}
  • GET /ops/admin/map-assets
  • PUT /ops/admin/map-assets/{mapAssetPublicID}
  • GET /ops/admin/course-sources
  • GET /ops/admin/course-sources/{sourcePublicID}
  • GET /ops/admin/course-sets/{courseSetPublicID}
  • POST /ops/admin/events
  • PUT /ops/admin/events/{eventPublicID}

这组接口用于把运维后台收成统一主流程:

  • 地图管理:列表 / 新增 / 编辑 / 详情 / 关联活动
  • KML / 赛道管理:围绕当前地图查看赛道集和默认路线
  • 活动管理:列表 / 新增 / 修改 / 详情 / 默认绑定 / 发布
  • 运维后台 UI 当前也已按“左侧导航 + 单主视图 + 右侧常驻状态栏”收口,不再把所有功能平铺在一个长页面里
  • 主区当前已改成宽屏自适应,不再固定窄宽度浪费屏幕空间

并且已经按“配置驱动游戏”收口:

  • 业务对象是 event
  • 运行配置对象是 event_release
  • 真正进入游戏时客户端消费的是 manifest_url
  • session 会固化当时实际绑定的 release

当前还要明确一条业务规则:

  • 玩家进入游戏,必须基于“已发布 release”
  • event 默认绑定、活动草稿配置、未发布 presentation / content bundle 都不能直接作为玩家正式进入依据
  • 当前 currentPresentation / currentContentBundle 在玩家链路里表示的是:
    • 当前已发布 release 实际绑定的展示版本摘要
    • 当前已发布 release 实际绑定的内容包摘要
  • 它们不是 event 草稿默认值摘要
  • 当前 play.canLaunchlaunch 也已按同一套规则收口:
    • 只有当当前发布 release 同时具备:
    • manifest
    • runtime
    • presentation
    • content bundle 时,玩家才允许正式进入
  • 游客模式当前只允许进入:
    • is_default_experience = true 的活动
    • 且必须基于当前已发布 release
  • 游客模式当前不开放:
    • /me/entry-home
    • /me/results
    • 用户历史成绩与报名态
  • 游客模式 launch 会复用正式 session 模型,但返回:
    • launch.source = public-default-experience
    • launch.business.isGuest = true

当前 workbench 里新增的“当前 Launch 实际配置摘要”仅用于调试:

  • 它会由 backend 代读当前 launch 对应的 manifest
  • 用来显示:
    • configUrl
    • releaseId
    • manifestUrl
    • schemaVersion
    • playfield.kind
    • game.mode
  • 这块只服务联调排查,不参与正式客户端运行链路
  • 正式客户端仍应直接消费 launch 返回的:
    • launch.config.configUrl
    • launch.resolvedRelease.manifestUrl

当前 workbench 里新增的“前端调试日志”也仅用于联调:

  • frontend 可将页面侧调试日志 POST/dev/client-logs
  • backend 会临时保留最近 200 条日志,供 workbench 查看与清空
  • 这块只用于联调排查,不替代正式生产日志体系

当前 demo 真实输入第一刀也已经接入:

  • workbench 的玩法切换会自动填入 backend 内置的:
    • game manifest
    • presentation schema
    • content manifest
  • 这些 demo 资源通过 backend 提供的 dev 路由读取:
    • GET /dev/demo-assets/manifests/{demoKey}
    • GET /dev/demo-assets/presentations/{demoKey}
    • GET /dev/demo-assets/content-manifests/{demoKey}

当前 workbench 的 Bootstrap 语义也已经拆开:

  • Bootstrap Demo(只准备数据)
    • 只准备 demo 测试数据和基础已发布态,不额外重新发布当前玩法
  • Bootstrap + 发布当前玩法
    • 先准备 demo,再对当前选中的玩法执行一遍“发布活动配置(自动补 Runtime)”
  • 这两条路由只服务联调,不进入正式客户端发布链
  • 当前三条标准 demo 在 Bootstrap Demo(只准备数据) 后都会直接具备:
    • 当前 release
    • runtime
    • presentation
    • content bundle
  • 也就是说,frontend 当前从首页选顺序赛、积分赛、多赛道时,已经可以直接走“当前已发布 release”语义联调入口、详情和 canLaunch
  • 当前联调样例文案也已从 Demo ... 收口为中文活动样例,便于前端和总控直接对口排查
  • 当前 manual 多赛道 demo 也已切到 4 条正式 OSS KML:
    • gotomars/kml/lxcb-001/2026-04-07/route01.kml
    • gotomars/kml/lxcb-001/2026-04-07/route02.kml
    • gotomars/kml/lxcb-001/2026-04-07/route03.kml
    • gotomars/kml/lxcb-001/2026-04-07/route04.kml
  • 资源目录约束同步明确:
    • 正式资源目录只认 OSS / CDN
    • 本地 tmp/ 仅作为临时收件箱,不参与正式发布源
  • 当前运维入口第一期已开始落地,先开放两条最小录入链:
    • POST /admin/ops/tile-releases/import
    • POST /admin/ops/course-sets/import-kml-batch
  • 当前目标是先把:
    • 地图瓦片版本录入
    • KML 批量录入并组装为 course set / variants 收成可重复执行的运维入口,而不是继续依赖手工脚本或改代码上传 OSS
  • 当前运维入口第二期已起步,开始支持统一资源纳管:
    • GET /admin/assets
    • POST /admin/assets/register-link
    • POST /admin/assets/upload
    • GET /admin/assets/{assetPublicID}
  • 当前边界:
    • 允许“上传文件”与“登记外链”两种录入模式
    • backend 负责 OSS 存储和资源对象登记
    • 运维后台当前开始使用独立鉴权链:
    • /ops/auth/*
    • /ops/admin/*
    • 设计目标:
    • 运维账号与前端玩家账号完全分离
    • 生产环境走手机号验证码注册/登录
    • 后续可扩多租户与角色分级
    • 已新增独立运维入口:
    • GET /admin/ops-workbench
    • 当前开始把“调试后台”和“运维后台”拆开:
    • /dev/workbench 继续只做联调、回归、日志与摘要
    • /admin/ops-workbench 只做资源录入、OSS 纳管、地图/KML 导入
    • 当前开发环境为了录资源和调发布方便,运维后台默认免登录放行:
    • 可直接打开 /admin/ops-workbench
    • 可直接调用 /ops/admin/*
    • 只有主动验证运维账号链路时,才需要使用 /ops/auth/*
    • Import Tile Release / Import KML Batch 当前已从调试工作台主操作区迁到:
    • /admin/ops-workbench
    • /dev/workbench 当前只保留运维后台入口说明与跳转,不再承载正式资源录入操作
    • /admin/ops-workbench 当前已收成 5 块结构:
    • 资源总览
    • 地图资源管理
    • 资源录入
    • 赛道集管理
    • 活动绑定
    • 发布中心
    • 当前地图资源管理第一刀已接进运维后台:
    • 读取地点列表
    • 新建地点
    • 读取地点详情
    • 新建地图资源
    • 读取地图详情
    • 查看当前瓦片版本与默认活动摘要

当前活动卡片列表最小产品化第一刀也已经进入 backend:

  • /cards
  • /home
  • /me/entry-home

这三处当前已统一补齐最小活动卡片摘要字段:

  • summary
  • status
  • statusCode
  • timeWindow
  • ctaText
  • isDefaultExperience
  • eventType
  • currentPresentation
  • currentContentBundle

当前口径:

  • 卡片摘要与详情页继续共用同一套“当前发布 release 摘要”语义
  • currentPresentation / currentContentBundle 仍表示:
    • 当前已发布 release 实际绑定的展示版本摘要
    • 当前已发布 release 实际绑定的内容包摘要
  • isDefaultExperience 当前由卡片显式字段控制
  • timeWindow / ctaText 当前先按后端派生规则提供,允许后续继续演进

当前“准备页地图预览 V1”也已开始接入,但仍保持只读增强项边界:

  • 当前只把预览字段挂在:
    • GET /events/{eventPublicID}
    • GET /events/{eventPublicID}/play
  • 当前新增字段为:
    • preview.mode
    • preview.baseTiles.tileBaseUrl
    • preview.baseTiles.zoom
    • preview.baseTiles.tileSize
    • preview.viewport.width / height
    • preview.viewport.minLon / minLat / maxLon / maxLat
    • preview.variants[].controls
    • preview.variants[].legs
    • preview.selectedVariantId
  • 当前只服务准备页只读地图预览:
    • 不进入正式 launch 主链
    • 不单独造新的地图资源体系
  • 非 demo / 非带预览元数据的活动允许返回空
  • workbench 当前也已新增固定摘要卡:
    • 准备页地图预览状态
    • 用于直接查看当前活动回出的 preview 关键字段

文档导航

快速启动

  1. 配置环境变量,参考 .env.example
  2. 按顺序执行 migrations
  3. 启动服务
cd D:\dev\cmr-mini\backend
.\start-backend.ps1

当前重点

  • 统一登录:短信 + 微信小程序
  • 多入口:tenant + entry_channel
  • 首页聚合:/home/cards/me/entry-home
  • 配置驱动启动:/events/{id}/play/events/{id}/launch
  • 局生命周期:start / finish / detail
  • 局后结果:/sessions/{id}/result/me/results
  • 第一阶段生产骨架:places / map-assets / tile-releases / course-sources / course-sets / course-variants / runtime-bindings
  • 第三刀最小接线:runtimeBinding -> eventRelease -> launch.runtime
  • 第四刀发布闭环:publish(runtimeBindingId) -> eventRelease -> launch.runtime
  • 活动运营域第二阶段:event_presentations / content_bundles / event_release -> presentation,bundle,runtime
  • 活动运营域第二阶段第二刀:event detail / event play / launch -> presentation,bundle 摘要
  • 活动运营域第二阶段第三刀:release 摘要闭环 + content bundle import
  • 活动运营域第二阶段第四刀:presentation import + event 默认 active 绑定 + publish 默认继承
  • 开发工作台:/dev/workbench
    • 用户主链调试
    • 资源对象与 Event 组装调试
    • Build / Publish / Rollback 调试
    • Release / RuntimeBinding 最小挂接验证
    • Event Presentation / Content Bundle 最小挂接验证
    • Content Bundle Import 最小导入验证
    • Presentation Import / Event 默认绑定 / Publish 默认继承验证
    • Runtime 自动补齐 + 默认绑定发布一键验证
    • Bootstrap Demo 自动回填最小生产骨架 ID
    • 一键测试环境:可从空白状态自动准备 demo event、source/build/release、presentation、content bundle、place、map asset、tile release、course source、course set、course variant、runtime binding,并输出逐步日志与预期判定
    • 一键标准回归:在标准发布链跑通后,继续自动验证 play / launch / result / history
    • 真实输入替换第一刀:Bootstrap Demo 已改用真实可访问的 KML 与地图资源 URL
    • manual 多赛道 demo:已切到真实 c01.kml / c02.kml 输入
    • 前端调试日志:
    • POST /dev/client-logs
    • GET /dev/client-logs
    • DELETE /dev/client-logs
    • 显式玩法入口:
    • 顺序赛:evt_demo_001
    • 积分赛:evt_demo_score_o_001
    • 多赛道:evt_demo_variant_manual_001