本文用于整理一套更适合“配置项变化很频繁”的后台方案。
适用前提:
核心目标是:
在保证后端稳定的前提下,让前端和玩法配置可以持续快速迭代。
这版方案的核心思想只有一句:
后端管理“容器、版本、引用、发布”,不要深度管理每个细字段。
也就是说:
推荐分成 3 层:
后台管理系统面向的是“对象”,不是最终运行文件。
建议核心对象仍然是:
MapPlayfieldGameModeResourcePackEventGo 中间层负责:
装配完成后,生成静态 JSON 上传到 OSS/CDN。
客户端只读取:
数据库建议只存两类数据:
结构化列保存:
idslugnamestatuscurrent_version_idcreated_atupdated_at使用 jsonb 保存:
content_jsonb也就是说,每个对象都建议拆成:
例如:
maps / map_versionsplayfields / playfield_versionsgame_modes / game_mode_versionsresource_packs / resource_pack_versionsevents / event_versions这套结构最适合承接频繁变化的配置字段。
配置频繁变化时,版本表非常重要:
如果没有版本表,配置演进到后面会越来越难控。
后端建议强管理下面这 4 件事:
例如:
例如:
只做真正稳定的校验:
把编辑态对象装配成最终运行态 JSON。
后端不要把下面这些写死:
这些变化太频繁,应该优先放在 jsonb 内容里,由前端消费。
一句话:
后端不要成为“所有细字段的业务解释器”。
建议分成 3 层校验。
所有配置都校验:
schemaVersionmapplayfieldgame只校验稳定公共字段,例如:
game.mode 必须存在game.punch.radiusMeters > 0按 game.mode 分发,例如:
classic-sequential validatorscore-o validator但这里有个重要原则:
未识别字段默认允许透传。
也就是说:
后台不要追求“一开始把所有字段都做成完美表单”。
建议分成两类:
做正式表单:
先保留模块化 JSON 编辑区:
game.sequencegame.guidancegame.visibilitygame.feedbackplayfield.controlOverrides等这些字段稳定后,再逐步升级成正式表单。
这会比一开始硬做全表单更现实。
建议增加一层:
event_releases推荐字段:
idevent_idevent_version_idrelease_nomanifest_urlpublished_bypublished_atstatus发布流程:
event_version客户端只消费:
Go 中间层建议承担 4 类职责:
负责把:
MapPlayfieldGameModeResourcePackEvent Overrides装配成最终运行态配置。
负责:
负责:
负责:
一句话:
Go 中间层本质上是配置编译器,不只是 CRUD 服务。
因为当前项目的真实情况就是:
如果后端每次都跟着细字段改表、改结构、改接口,成本会非常高。
这套方案可以避免:
数据库结构稳定,配置内容灵活。
后端强管理对象关系,不强管理每个细字段。
未知字段默认允许透传。
客户端消费细规则,后端负责发布与校验。
最终运行态永远是静态 JSON。
如果当前静态目录是:
map/kml/event/这套可以继续保留。
理解方式是:
也就是说后台发布后,继续生成:
event/classic-sequential.jsonevent/score-o.jsonmap/...kml/...客户端现有读取逻辑无需推翻。
建议按下面顺序推进:
先建 5 个核心对象:
MapPlayfieldGameModeResourcePackEvent为每个对象补 version 表。
Go 中间层先做最小装配功能。
实现发布到 OSS/CDN。
后台逐步把稳定字段表单化。
把易变字段继续保留为 JSON 编辑区。
这套更适合频繁变化配置项的后台方案是:
PostgreSQL 存“版本化对象 + jsonb 内容”,Go 中间层做“装配 + 校验 + 发布”,客户端只读静态发布结果。