|
|
@@ -0,0 +1,157 @@
|
|
|
+# 整站与游戏维护子类-总后台前端修改单(2026-11-10)
|
|
|
+
|
|
|
+## 改动
|
|
|
+
|
|
|
+1. **维护可以细到子类**:除了整站和 9 个大类,现在可以单独维护大类下的某一项:
|
|
|
+ - 三方平台:某个大类下的某个平台,例如「电子 / PG电子」「真人 / BBIN」;
|
|
|
+ - F1 彩票:某个彩种,例如「F1彩票 / 加拿大28」「F1彩票 / 极速赛车」;
|
|
|
+ - F1 体育:某个体育项,例如「F1体育 / 足球」「F1体育 / 篮球」。
|
|
|
+2. **维护列表改为树形**:顶层只有整站和大类,子类放在所属大类的 `children` 里。
|
|
|
+3. **子类新增「支持内嵌」开关**:控制会员端能否内嵌打开该平台 / 彩种 / 体育项,默认支持,和维护开关互不影响。
|
|
|
+4. **新增菜单「F1体育列表」**:和现有的「彩票列表」一样,可以增删改体育项(足球、篮球、乒乓球、排球、板球、网球……)。
|
|
|
+
|
|
|
+接口地址、权限 URI 都没有变;维护的保存、启停、日志用法不变。
|
|
|
+
|
|
|
+规则:
|
|
|
+
|
|
|
+- 生效顺序:整站 → 子类 → 大类。大类维护时,其下所有子类都不可进入;只开某个子类时,只拦这一项。
|
|
|
+- 子类记录由后端自动生成(打开列表时补齐),默认关闭。前端不需要「新增」按钮,也不能删除。
|
|
|
+- 维护不影响游戏管理里的「展示 / 不展示」,会员端照常展示,只在进入或下注时提示维护。
|
|
|
+- Telegram 机器人的 28 下注也按这里的设置拦截(加拿大28 或极速28,看当前 `pc28_switch`),前端无需处理。
|
|
|
+
|
|
|
+## 一、整站与游戏维护
|
|
|
+
|
|
|
+### 1. 列表 `GET /admin/maintenance`
|
|
|
+
|
|
|
+本节内容与已发的[维护列表按层级返回-前端修改单](维护列表按层级返回-前端修改单.md)一致,已按那份改过的只需补上 `embeddable` 列。
|
|
|
+
|
|
|
+返回仍是 `{total, data: []}`,但 **`data` 只有整站和大类**,分页和 `total` 也只按这一层算。每个顶层行新增:
|
|
|
+
|
|
|
+| 字段 | 说明 |
|
|
|
+|---|---|
|
|
|
+| `children` | 该大类下的子类数组,每项是完整的设置记录(字段同详情);整站为 `[]` |
|
|
|
+| `children_count` | 该大类下子类总数,不受筛选影响 |
|
|
|
+| `matched` | 这一行本身是否符合筛选;`false` 表示只是因为有子类命中才显示 |
|
|
|
+
|
|
|
+所有记录(顶层和子类)新增:
|
|
|
+
|
|
|
+| 字段 | 说明 |
|
|
|
+|---|---|
|
|
|
+| `scope_level` | `site` / `category` / `subcategory` |
|
|
|
+| `parent_scope` | 子类的大类代码,如 `third:2`;整站和大类为 `null` |
|
|
|
+| `scope_name` | 子类为「大类 / 名称」,如 `电子 / PG电子`、`F1体育 / 篮球` |
|
|
|
+| `embeddable` | 子类为 `1`(支持内嵌)或 `0`;整站和大类为 `null` |
|
|
|
+
|
|
|
+```json
|
|
|
+{"total": 10, "data": [
|
|
|
+ {"id": 1, "scope_code": "site", "scope_name": "整站", "scope_level": "site", "parent_scope": null, "embeddable": null,
|
|
|
+ "enabled": 0, "matched": true, "children_count": 0, "children": [], "...": "其余字段同详情"},
|
|
|
+ {"id": 3, "scope_code": "third:2", "scope_name": "电子", "scope_level": "category", "parent_scope": null, "embeddable": null,
|
|
|
+ "enabled": 0, "matched": true, "children_count": 2, "children": [
|
|
|
+ {"id": 21, "scope_code": "third:2:pg", "scope_name": "电子 / PG电子", "scope_level": "subcategory", "parent_scope": "third:2",
|
|
|
+ "embeddable": 1, "enabled": 1, "state": "active", "...": "其余字段同详情"},
|
|
|
+ {"id": 22, "scope_code": "third:2:jdb", "scope_name": "电子 / JDB", "scope_level": "subcategory", "parent_scope": "third:2",
|
|
|
+ "embeddable": 0, "enabled": 0, "state": "disabled", "...": "其余字段同详情"}
|
|
|
+ ]}
|
|
|
+]}
|
|
|
+```
|
|
|
+
|
|
|
+页面建议:
|
|
|
+
|
|
|
+- 表格改为可展开的树:大类行显示「子类 N 个」(`children_count`),展开显示 `children`。
|
|
|
+- 子类行和大类行用同样的列(范围、平台、状态、开关、时间、操作),子类行多一列「支持内嵌」(显示 `embeddable`)。
|
|
|
+- `matched=false` 的大类行置灰,表示它本身不符合筛选,只是作为容器显示。
|
|
|
+
|
|
|
+筛选参数:
|
|
|
+
|
|
|
+| 参数 | 变化 | 说明 |
|
|
|
+|---|---|---|
|
|
|
+| `parent_scope` | 新增 | 大类代码,只返回该大类及其子类 |
|
|
|
+| `scope_code` | 可传子类 | 传大类只返回该大类;传子类(如 `third:2:pg`)返回它的大类(`matched=false`),`children` 里只有这一个子类 |
|
|
|
+| `platform` / `enabled` / `state` / `language` | 规则变化 | 大类和子类分别判断:大类本身符合或有子类符合就显示,`children` 里只放符合的子类 |
|
|
|
+
|
|
|
+范围筛选下拉可以用两级:先选大类(`options.categories`),再选子类(`options.subcategories` 里 `parent` 等于该大类的项)。
|
|
|
+
|
|
|
+### 2. 选项 `GET /admin/maintenance/options`
|
|
|
+
|
|
|
+新增:
|
|
|
+
|
|
|
+- `subcategories`:`[{value, label, parent}]`,如 `{"value": "third:2:pg", "label": "电子 / PG电子", "parent": "third:2"}`。
|
|
|
+- `defaults.embeddable`:`1`。
|
|
|
+
|
|
|
+### 3. 编辑弹窗 `POST /admin/maintenance/submit`
|
|
|
+
|
|
|
+子类和大类用同一个弹窗、同一套字段。子类额外显示一个开关「支持内嵌」:
|
|
|
+
|
|
|
+| 参数 | 必填 | 说明 |
|
|
|
+|---|---:|---|
|
|
|
+| `embeddable` | 否 | **仅子类**可传,`1` 支持内嵌、`0` 不支持;不传则不改 |
|
|
|
+
|
|
|
+```json
|
|
|
+{"id": 22, "embeddable": 0}
|
|
|
+```
|
|
|
+
|
|
|
+- 「支持内嵌」与维护开关互不影响:维护关闭时也能单独保存这一项,不需要填时间和文案。
|
|
|
+- 整站或大类传 `embeddable` 会返回校验错误「只有子类可以设置是否支持内嵌」,这两类行不要显示这个开关。
|
|
|
+- 开关下方提示:「关闭后,会员端点击该项时用新窗口打开,不在页面内嵌。」
|
|
|
+
|
|
|
+`POST /admin/maintenance/status` 启停、`GET /admin/maintenance/detail` 详情用法不变;详情同样带 `scope_level`、`parent_scope`、`embeddable`。
|
|
|
+
|
|
|
+### 4. 操作日志
|
|
|
+
|
|
|
+不用改。修改「支持内嵌」也会记录,`old_values` / `new_values` 里多一个 `embeddable`。
|
|
|
+
|
|
|
+## 二、新增菜单:F1体育列表
|
|
|
+
|
|
|
+放在「彩票列表」旁边,页面照「彩票列表」做。
|
|
|
+
|
|
|
+### 1. 读取 `GET /admin/config/sportList`
|
|
|
+
|
|
|
+返回体育项数组,已按 `sort` 从大到小排好:
|
|
|
+
|
|
|
+```json
|
|
|
+[
|
|
|
+ {"type": 1, "code": "football", "name": "足球", "status": 1, "sort": 0},
|
|
|
+ {"type": 2, "code": "basketball", "name": "篮球", "status": 1, "sort": 0},
|
|
|
+ {"type": 3, "code": "tabletennis", "name": "乒乓球", "status": 1, "sort": 0},
|
|
|
+ {"type": 4, "code": "volleyball", "name": "排球", "status": 1, "sort": 0},
|
|
|
+ {"type": 5, "code": "cricket", "name": "板球", "status": 1, "sort": 0},
|
|
|
+ {"type": 6, "code": "tennis", "name": "网球", "status": 1, "sort": 0}
|
|
|
+]
|
|
|
+```
|
|
|
+
|
|
|
+| 字段 | 说明 |
|
|
|
+|---|---|
|
|
|
+| `type` | 编号,可自定 |
|
|
|
+| `code` | 体育代码,1-32 位小写字母或数字,不能重复。**新增后不要再改**,改了会变成另一个体育项,原来的维护设置不再对它生效 |
|
|
|
+| `name` | 名称 |
|
|
|
+| `status` | `1` 显示、`0` 隐藏(隐藏后会员端不展示,仍可在维护里设置) |
|
|
|
+| `sort` | 排序,越大越靠前 |
|
|
|
+
|
|
|
+### 2. 保存 `POST /admin/config/setField`
|
|
|
+
|
|
|
+和彩票列表一样整份提交:
|
|
|
+
|
|
|
+| 参数 | 必填 | 说明 |
|
|
|
+|---|---:|---|
|
|
|
+| `field` | 是 | 固定 `sport_list` |
|
|
|
+| `val` | 是 | 整份列表的 JSON 字符串;新增、删除、排序改完后一次提交 |
|
|
|
+
|
|
|
+```json
|
|
|
+{"field": "sport_list", "val": "[{\"type\":1,\"code\":\"football\",\"name\":\"足球\",\"status\":1,\"sort\":10},{\"type\":2,\"code\":\"basketball\",\"name\":\"篮球\",\"status\":1,\"sort\":0}]"}
|
|
|
+```
|
|
|
+
|
|
|
+错误提示:
|
|
|
+
|
|
|
+| `msg` | 原因 |
|
|
|
+|---|---|
|
|
|
+| `体育列表格式错误` | `val` 不是数组 |
|
|
|
+| `体育代码只能是1-32位小写字母或数字` | `code` 为空或格式不对 |
|
|
|
+| `体育代码 xxx 重复` | 两项 `code` 相同 |
|
|
|
+| `体育名称不能为空` | |
|
|
|
+
|
|
|
+页面建议:编辑已有项时 `code` 只读;新增时校验格式。新增的体育项在下次打开维护列表时出现在「F1体育」下,默认关闭。
|
|
|
+
|
|
|
+## 三、彩票列表(提醒,不用改)
|
|
|
+
|
|
|
+彩票列表的页面和接口不变。维护里的「F1彩票」子类直接来自这份列表,按 `game` 和 `params.type` 对应(例如 `game=lhc`、`params.type=1` 对应「新澳门六合彩」)。修改某个彩种的 `game` 或 `params.type` 等于换成另一个彩种,原来的维护设置不再对它生效;改名称、排序、显示状态没有影响。
|