11 KiB
开发说明
文档版本:v1.14 最后更新:2026-04-03 20:10:25
1. 环境变量
参考 .env.example。
当前最关键的变量:
APP_ENVHTTP_ADDRDATABASE_URLJWT_ACCESS_SECRETAUTH_SMS_PROVIDERAUTH_DEV_SMS_CODEWECHAT_MINI_APP_IDWECHAT_MINI_APP_SECRETWECHAT_MINI_DEV_PREFIXLOCAL_EVENT_DIRASSET_BASE_URLASSET_PUBLIC_BASE_URLASSET_BUCKET_ROOTOSSUTIL_PATHOSSUTIL_CONFIG_FILE
2. 本地启动
cd D:\dev\cmr-mini\backend
.\start-backend.ps1
如果你想固定跑开发工作台常用端口 18090,直接执行:
cd D:\dev\cmr-mini\backend
.\scripts\start-dev.ps1
默认会设置:
APP_ENV=developmentHTTP_ADDR=:18090DATABASE_URL=postgres://postgres:asdf*123@192.168.100.77:5432/cmr20260401?sslmode=disableAUTH_SMS_PROVIDER=consoleWECHAT_MINI_DEV_PREFIX=dev-
启动后可直接打开:
当前 workbench 已覆盖两类调试链:
- 用户主链:
bootstrap -> auth -> entry/home -> event play/launch -> session -> result - 后台运营链:
maps/playfields/resource-packs -> admin event source -> build -> publish -> rollback - 第一阶段生产骨架联调台:
places -> map-assets -> tile-releases -> course-sources -> course-sets -> course-variants -> runtime-bindings - 第三刀最小接线验证:
runtimeBinding -> release -> launch.runtime - 第四刀发布闭环验证:
runtimeBinding -> publish(runtimeBindingId) -> release -> launch.runtime - 活动运营域第二阶段验证:
presentation -> content bundle -> publish(presentationId, contentBundleId, runtimeBindingId) -> release - 活动运营域第二阶段第二刀验证:
event detail / play / launch -> presentation + content bundle 摘要 - 活动运营域第二阶段第三刀验证:
release 摘要闭环 + content bundle import - 活动运营域第二阶段第四刀验证:
presentation import -> event 默认 active 绑定 -> publish 空参继承 - workbench 一键验证增强:
一键默认绑定发布与一键补齐 Runtime 并发布 /dev/bootstrap-demo现在也会回填最小生产骨架:place / map asset / tile release / course source / course set / course variant / runtime binding
2.1 当前推荐验证方式
如果目标是验证“从测试数据准备到 release 继承是否完整”,优先使用 workbench 的一键流,而不是手工逐个点按钮。
当前推荐顺序:
Bootstrap Demo一键补齐 Runtime 并发布一键标准回归
当前这条一键链会自动完成:
- demo event / source / build / release 准备
- presentation 导入
- content bundle 导入
- event 默认 active 绑定保存
- 最小生产骨架准备:
placemap assettile releasecourse sourcecourse setcourse variantruntime binding
- publish
- release 回读校验
play / launch / result / history回归汇总- demo 活动残留 ongoing session 清理:
- 会把 demo event 下历史遗留的
launched / runningsession 自动改成cancelled
- 会把 demo event 下历史遗留的
当前日志能力:
- 每一步都会写到“响应日志”
- 失败时会直接输出:
- 错误消息
- stack
- 最后一次 curl
- 成功时“预期结果”面板会直接给出:
Release IDPresentationContent BundleRuntime Binding判定
- 成功跑完标准回归后,“回归结果汇总”会直接给出:
发布链PlayLaunchResultHistorySession ID总判定
3. 当前开发约定
3.1 开发阶段先不用 Redis
当前第一版全部依赖:
- PostgreSQL
- JWT
- refresh token 持久化
Redis 后面只在需要性能优化、限流或短期票据缓存时再接。
3.2 开发环境短信
当前默认可走 console provider。
用途:
- 本地联调无需接真实短信供应商
3.3 微信小程序开发态
当前支持 dev- 前缀 code。
适合:
- 后端联调
- workbench 快速验证
3.4 本地配置目录
当前支持从根目录 event 导入本地配置文件。
相关环境变量:
LOCAL_EVENT_DIRASSET_BASE_URL
作用:
LOCAL_EVENT_DIR决定本地 source config 从哪里读ASSET_BASE_URL决定 preview build 时如何把相对资源路径归一化成可运行 URLASSET_PUBLIC_BASE_URL决定 publish 时如何把公开 URL 映射到 OSS 对象 keyASSET_BUCKET_ROOT决定发布对象上传到哪个 bucket 根路径OSSUTIL_PATH和OSSUTIL_CONFIG_FILE决定 backend 发布 manifest 时使用哪个 OSS 客户端
4. Migration
当前 migration 文件在 migrations。
执行原则:
- 按编号顺序执行
- schema 变更只通过新增 migration 完成
- 不直接改线上已执行 migration
5. 开发工作台
POST /dev/bootstrap-demo
它会保证 demo 数据存在:
tenant_demomini-demoevt_demo_001rel_demo_001card_demo_001
GET /dev/workbench
这是当前最重要的联调工具。
可以直接测试:
- 登录
- 入口解析
- 首页聚合
- event play
- 第一阶段生产骨架对象
- 配置导入、preview build、publish build
- launch
- session start / finish
- result
- profile
补充说明:
publish build现在会真实上传manifest.json和asset-index.json到 OSS- 如果上传失败,接口会直接报错,不再出现“数据库里已有 release,但 OSS 上没有对象”的假成功
Save Event Defaults会把当前 event 的默认 active 绑定写入:currentPresentationIdcurrentContentBundleIdcurrentRuntimeBindingId
- 之后
Publish Build如果不显式填写这三项,会优先继承 event 默认 active 绑定
并且支持:
- quick flow
- scenario 保存/导入/导出
- curl 导出
- request history
当前第一阶段生产骨架联调台只做:
listcreatedetailbinding
明确不做:
- 正式后台 UI
editdeletebatch- 审核流
活动运营域第二阶段当前也只做最小动作:
listcreatedetailpublish 绑定import
6. 当前推荐联调顺序
场景一:小程序快速进入
bootstrap-demologin/wechat-minime/entry-homeevents/{id}/playevents/{id}/launchsessions/{id}/startsessions/{id}/finishsessions/{id}/result
场景二:APP 主身份
auth/sms/sendauth/login/smsme/entry-homelaunchsessionresult
场景三:微信轻账号绑定手机号
login/wechat-miniauth/sms/sendwithscene=bind_mobileauth/bind/mobileme/profile
场景四:配置发布到可启动 release
bootstrap-demodev/events/{eventPublicID}/config-sources/import-localdev/config-builds/previewdev/config-builds/publishevents/{id}events/{id}/launch
场景五:第一阶段生产骨架最小闭环
在 /dev/workbench 的 后台运营 模式中,按下面顺序操作:
List Places或Create Place- 在该
Place下Create Map Asset - 在该
MapAsset下Create Tile Release Create Course Source- 在该
MapAsset下Create Course Set - 在该
CourseSet下Create Variant Create Runtime Binding
成功后应能拿到这些 ID:
placeIdmapAssetIdtileReleaseIdcourseSourceIdcourseSetIdcourseVariantIdruntimeBindingId
建议第一次联调时用这组最小规则:
Place先建 1 个- 每个
Place先只建 1 个MapAsset - 每个
MapAsset先只建 1 个TileRelease - 每个
CourseSet先只建 1 个默认CourseVariant RuntimeBinding先只绑定当前正在验证的Event
这条链当前只验证对象关系闭环,不验证:
- 发布链切换
launch返回运行对象字段EventPresentationContentBundle
场景六:第三刀最小接线验证
在 /dev/workbench 的 后台运营 模式中,先完成“场景五”,再按下面顺序操作:
Get Pipeline- 确认当前
Release ID - 填或复用
Runtime Binding ID Bind RuntimeGet Release- 切回
前台联调 - 对同一个
event执行Launch
场景七:活动运营域第二阶段最小闭环
在 /dev/workbench 的 后台运营 模式中,按下面顺序操作:
Get EventCreate PresentationCreate BundleAssemble SourceBuild Source- 在发布区填:
Runtime Binding IDPresentation IDContent Bundle ID
Publish BuildGet Release
成功后应能在 release 返回中看到:
runtimepresentationcontentBundle
并且这 3 类绑定当前都已固化到 event_release。
成功后应能看到:
GET /admin/releases/{releasePublicID}返回runtimePOST /events/{eventPublicID}/launch返回launch.runtime
当前阶段的约束是:
- 只新增
runtime字段块 - 不改旧的:
resolvedReleasebusinessvariant
- release 如果没挂
runtimeBindingId,则launch.runtime为空
场景八:活动运营域第二阶段第三刀验证
在 /dev/workbench 的 后台运营 模式中,先完成“场景七”,再按下面顺序操作:
Create Presentation或直接复用现有Presentation IDImport BundleGet BundleGet PipelinePublish BuildGet Release- 切回
前台联调 Event DetailEvent PlayLaunch
成功后应能同时看到这三组摘要:
release.presentation.templateKey / versionrelease.contentBundle.bundleType / versionrelease.runtime.placeId / mapId / tileReleaseId / courseVariantId
同时客户端消费侧应保持一致:
GET /events/{eventPublicID}GET /events/{eventPublicID}/playPOST /events/{eventPublicID}/launch
当前 Content Bundle Import 只做统一导入入口,不做复杂资源平台:
- 输入:
titlebundleTypesourceTypemanifestUrlversionassetManifest
- 输出:
bundleIdbundleTypeversionassetManifeststatus
场景七:第四刀发布闭环验证
在 /dev/workbench 的 后台运营 模式中,先完成“场景五”,再按下面顺序操作:
Create Runtime BindingGet Pipeline- 确认
Build ID - 在发布区填
Runtime Binding ID Publish BuildGet Release- 切回
前台联调 - 对同一个
event执行Launch
成功后应能看到:
POST /admin/builds/{buildID}/publish返回带runtimeGET /admin/releases/{releasePublicID}返回同一条runtimePOST /events/{eventPublicID}/launch返回同一条launch.runtime
当前第四刀的兼容要求是:
- 旧的“先
publish,再bind runtime”路径继续可用 - 新的“
publish时直接传runtimeBindingId”优先推荐 - 不修改旧的:
resolvedReleasebusinessvariant
7. 当前后续开发建议
文档整理完之后,后面建议按这个顺序继续:
- 抽出更通用的
play context -> launch模型 - 补赛事与报名层
- 补页面配置和白标首页
- 再考虑实时网关票据
不要跳回去把玩法规则塞进 backend。