本文用于整理当前这类“配置驱动型地图游戏应用”的后台管理建议,面向:
目标是解决一个核心问题:
配置文件会越来越大,如何在后台可维护、可复用、可审核、可发布、可回滚。
最稳的方案不是“数据库直接存一大份 game.json 给客户端读”,而是:
数据库管理编辑态,发布时编译成运行态静态配置文件。
也就是两套形态:
这条路线最适合当前项目。
不建议把后台做成:
jsonbgame.json这样后面会遇到这些问题:
建议后台和数据库先固定这 5 个核心对象:
Map地图底座。
负责:
Playfield玩法空间对象定义。
负责:
说明:
Playfield 是上位概念course 只是其中一种特化形式GameMode玩法模板。
负责:
也就是:
game.modesessionpunchscoringguidancevisibilityfinishtelemetryfeedbackResourcePack资源包。
负责:
Event最终活动实例。
负责引用:
MapPlayfieldGameModeResourcePack并允许少量活动级覆盖。
一句话:
Event = Map + Playfield + GameMode + ResourcePack + EventOverrides
建议每个核心对象都分成:
主表存稳定元信息:
idslugnamestatuscurrent_version_idcreated_atupdated_atversion 表存每个版本的具体内容:
idparent_idversion_noschema_versioncontent_jsonbcreated_bycreated_atchange_note建议至少有:
mapsmap_versionsplayfieldsplayfield_versionsgame_modesgame_mode_versionsresource_packsresource_pack_versionseventsevent_versions版本表的价值非常大:
如果没有版本表,后面后台管理一定会越来越难维护。
推荐策略是:
jsonb例如主表中:
slugnamestatus放结构化列。
而玩法具体配置、资源清单、覆盖字段,放在 content_jsonb。
这样兼顾:
后台不要直接给运营一个大 JSON 编辑框作为主要方式。
推荐做法:
按模块表单化编辑。
最后由 Go 中间层负责装配成最终配置 JSON。
也就是:
后台是“编辑结构化对象”,不是“手工拼最终运行文件”。
发布时建议按下面流程:
Event VersionMap VersionPlayfield VersionGameMode VersionResourcePack Version客户端只读:
不要让客户端直接查数据库 API 动态拼。
建议增加:
event_releases字段例如:
idevent_idevent_version_idrelease_nomanifest_urlpublished_bypublished_atstatus它的作用:
Go 中间层不要只做 CRUD。
建议它至少承担这 4 类职责:
把:
MapPlayfieldGameModeResourcePackEvent Overrides装配成最终配置结构。
一句话:
Go 中间层本质上是配置编译器。
建议尽量做强校验。
至少包括:
以及玩法特定约束,例如:
punch.radiusMeters > 0skip.radiusMeters > punch.radiusMeters这样能把很多错误挡在发布前。
当前你已经有类似目录:
map/kml/event/这很好,可以继续保留。
建议把它理解成:
也就是后台发布后,Go 中间层继续生成:
event/classic-sequential.jsonevent/score-o.jsonmap/...kml/...客户端保持现有读取方式不变。
建议按这个顺序落地:
先建 5 个核心对象模型:
MapPlayfieldGameModeResourcePackEvent为每个对象补版本表。
Go 中间层实现“装配成最终 JSON”。
实现“发布到 OSS/CDN”。
后台逐步从 JSON 编辑过渡到模块化表单编辑。
这类配置驱动应用最稳的后台方案是:
PostgreSQL 管结构化、可版本化的编辑态对象;Go 中间层负责校验、装配和发布;客户端只消费发布后的静态 JSON。
这样才能做到: