# 后台管理最小方案
> 文档版本：v1.1
> 最后更新：2026-04-03 11:02:42

## 1. 目标

后台第一版不是做一个“大而全配置表单”，而是先做一套最小可运营壳，解决这 3 个问题：

1. 共享资源能被对象化管理
2. `event` 能引用这些资源并组装配置
3. 能从 source -> build -> release 完成发布

一句话：

> 后台第一版管理的是“资源对象 + 引用关系 + 发布流程”，不是“直接编辑一个越来越大的 JSON 文件”。

## 2. 设计边界

### 2.1 后台应该管理什么

- 地图对象
- 赛场 / KML 对象
- 资源包对象
- Event 基础信息
- Event 对资源对象的引用
- Build / Release 发布记录

### 2.2 后台不应该一开始就做什么

- 把所有配置项做成一个超大表单
- 把玩家运行时设置也塞进发布配置
- 把前端运行时编译逻辑搬到后端后台
- 直接按 `event` 管理所有资源文件

### 2.3 与未来 APP 的关系

后台配置不是“小程序后台”，而是统一配置运营后台。

所以第一版开始就要坚持：

- 资源对象平台级复用
- `release / manifest` 终端中立
- 同一份发布结果同时服务小程序和未来 APP

## 3. 第一版建议模块

### 3.1 地图管理

作用：

- 管理可复用地图对象和版本

建议字段：

- 地图名称
- 地图编码
- 版本号
- `mapmeta` 文件
- 瓦片根路径
- 覆盖范围
- 状态
- 备注

第一版动作：

- 新建地图
- 新建地图版本
- 查看地图版本详情
- 停用某个版本

### 3.2 赛场 / KML 管理

作用：

- 把 KML / GeoJSON / 控制点数据做成独立可复用对象

建议字段：

- 赛场名称
- 赛场编码
- 版本号
- 原始文件
- 控制点数量
- 边界摘要
- 状态
- 备注

第一版动作：

- 上传 KML
- 新建赛场版本
- 查看赛场版本详情
- 停用某个版本

### 3.3 资源包管理

作用：

- 管理内容页、音频、主题等共享资源

建议字段：

- 资源包名称
- 资源包编码
- 版本号
- 内容页入口
- 音频包入口
- 主题配置入口
- 状态
- 备注

第一版动作：

- 新建资源包
- 新建资源包版本
- 查看资源包版本详情

### 3.4 Event 组装

作用：

- 管理业务活动本身，并引用共享资源对象

建议字段：

- Event 名称
- Event 编码 / public id
- 简介
- 状态
- 当前选用地图版本
- 当前选用赛场版本
- 当前选用资源包版本
- 当前玩法模式
- 少量覆盖项
- 展示定义（`EventPresentation`）
- 内容包（`ContentBundle`）

第一版只开放少量覆盖项：

- 标题
- 摘要
- 路线编码
- 玩法模式
- 少量规则开关

不要第一版就开放：

- 全量 `presentation.*`
- 全量 `telemetry.*`
- 全量 `debug.*`

### 3.5 Build / Release 管理

作用：

- 把 source config 变成 preview build，再发布成正式 release

页面需要看到：

- source 列表
- build 列表
- build 状态
- release 列表
- 当前生效 release
- 当前绑定的 `presentation / bundle / runtime`
- 发布人
- 发布时间

第一版动作：

- 从 source 生成 build
- 查看 build 产物
- 发布 build
- 回滚当前 release
- 查看 release 当前绑定的 `presentation / bundle / runtime`

## 4. 后台第一版页面建议

按最小闭环，建议先做 6 个页面：

1. 地图列表页
2. 赛场 / KML 列表页
3. 资源包列表页
4. Event 列表与编辑页
5. Build / Release 列表页
6. 发布详情页

这 6 页够把“资源录入 -> Event 组装 -> 发布 -> launch”跑通。

补充：

- 当前第二阶段已经把 `EventPresentation` 和 `ContentBundle` 收成正式最小对象
- `EventRelease` 现在允许同时绑定：
  - `presentation`
  - `content bundle`
  - `runtime binding`

## 5. 对象模型建议

后台第一版建议围绕这些对象展开：

- `Map`
- `MapVersion`
- `Playfield`
- `PlayfieldVersion`
- `ResourcePack`
- `ResourcePackVersion`
- `Event`
- `EventConfigSource`
- `EventConfigBuild`
- `EventRelease`

关键原则：

- 共享资源按对象库管理
- `event` 只做引用和少量覆盖
- `release` 固化具体版本引用

## 6. 一条完整后台工作流

```mermaid
flowchart LR
  A["录入地图版本"] --> D["Event 选择地图版本"]
  B["录入赛场版本"] --> D
  C["录入资源包版本"] --> D
  D --> E["保存 Source Config"]
  E --> F["生成 Preview Build"]
  F --> G["检查 Manifest / Asset Index"]
  G --> H["发布 Release"]
  H --> I["前台 Launch 使用新 Release"]
```

## 7. 第一版后端接口需求

后台真正开做前，后端最好先补齐下面这批接口：

### 7.1 地图对象

- `GET /admin/maps`
- `POST /admin/maps`
- `GET /admin/maps/{id}`
- `POST /admin/maps/{id}/versions`

### 7.2 赛场对象

- `GET /admin/playfields`
- `POST /admin/playfields`
- `GET /admin/playfields/{id}`
- `POST /admin/playfields/{id}/versions`

### 7.3 资源包对象

- `GET /admin/resource-packs`
- `POST /admin/resource-packs`
- `GET /admin/resource-packs/{id}`
- `POST /admin/resource-packs/{id}/versions`

### 7.4 Event 组装

- `GET /admin/events`
- `POST /admin/events`
- `GET /admin/events/{id}`
- `PUT /admin/events/{id}`
- `POST /admin/events/{id}/source`

当前状态：

- 已实现
- 当前 `source` 组装方式是：
  - 选择 `map version`
  - 选择 `playfield version`
  - 可选选择 `resource pack version`
  - 传 `gameModeCode`
  - 可传少量 `overrides`
  - backend 直接生成一版可进入现有 build 流程的 source config

### 7.5 Build / Release

- `GET /admin/events/{id}/sources`
- `POST /admin/sources/{id}/build`
- `GET /admin/builds/{id}`
- `POST /admin/builds/{id}/publish`
- `POST /admin/events/{id}/rollback`

当前状态：

- 已实现
- 当前已可用：
  - `GET /admin/events/{eventPublicID}/pipeline`
  - `POST /admin/sources/{sourceID}/build`
  - `GET /admin/builds/{buildID}`
  - `POST /admin/builds/{buildID}/publish`
  - `POST /admin/events/{eventPublicID}/rollback`
- 当前 rollback 方式：
  - 显式传 `releaseId`
  - 只允许切回同一 event 下的已发布 release

## 8. 第一版不要做的事

为了避免项目被后台表单拖死，第一版明确不做：

- 全量 schema 可视化编辑器
- 拖拽式配置搭建器
- 复杂权限系统
- 资源批量编排器
- 多层审批流

这些都应该等“最小配置运营闭环”跑通后再说。

## 9. 建议开发顺序

建议按下面顺序推进：

1. 先补资源对象模型和接口
2. 再补 Event 引用组装接口
3. 再补 Build / Release 运营接口
4. 最后再做后台页面

原因：

- 没有稳定后端对象模型，后台页面会反复推翻
- 先把对象和发布链条定住，前后端才不会互相拖拽

当前进度：

1. 资源对象模型和 `/admin/maps`、`/admin/playfields`、`/admin/resource-packs` 已完成
2. `Event` 组装接口 `/admin/events`、`/admin/events/{id}/source` 已完成
3. `pipeline/build/publish` 后台聚合接口已完成
4. `rollback` 已完成
5. 下一步是把这批接口接进 workbench 或正式后台页面

## 10. 一句话结论

是的，后面需要一版后台管理界面。

但第一版不应该是“配置大全编辑器”，而应该是：

> 共享资源管理 + Event 组装 + Build / Release 发布 的最小运营后台。

