refactor(db): 删除旧分区展示块与兼容字段
- v23 迁移删除 section_block 表,以及 node 的 view_mode / empty_text / show_in_sidebar / allow_groups
- 重建 node 表并保留 44 条内容、15 个分组、5 张卡片,外键检查通过
- 种子库直接生成 card / card_group,不再依赖 section_block
- 删除旧 /api/catalog、/api/categories、/api/groups/{id} 与 categories 模块
- 分组接口不再接收/返回 format,前端 GroupNode 同步移除
- README/HANDOFF 更新到 v23;管理页提示改为『格式由每条内容决定』
This commit is contained in:
@@ -201,19 +201,15 @@ cargo run -- --root ./sites --host 0.0.0.0 --port 3000
|
||||
| `parent_key` | TEXT? | 父节点编码:分组指向所属分区,分区为 NULL |
|
||||
| `title` | TEXT | 展示名:分区标题 / 分组小标题 |
|
||||
| `kind` | TEXT | `section` 顶层分区 / `group` 分区下的分组 |
|
||||
| `view_mode` | TEXT? | 仅分区:`apps` / `posters` / `articles`,决定渲染形态 |
|
||||
| `bar_color` | TEXT? | 仅分区:标题左侧 4×16 色条颜色(如 `#3858f6`) |
|
||||
| `icon` | TEXT? | 分组图标:可以是字符(`🎬`),也可以是 iconfont 图标名(`film_line`) |
|
||||
| `bar_color` | TEXT? | 标题左侧色条颜色(如 `#3858f6`) |
|
||||
| `icon` | TEXT? | 图标:可以是字符(`🎬`),也可以是 iconfont 图标名(`film_line`) |
|
||||
| `preview_limit` | INTEGER? | 分组在卡片里的默认预览条数;为空时按类型取默认 |
|
||||
| `empty_text` | TEXT? | 分组为空时的提示文案 |
|
||||
| `show_in_sidebar` | INTEGER | 是否出现在侧栏,`0` / `1`;0 表示只当首页卡片/内容,不进导航 |
|
||||
| `allow_groups` | INTEGER | 是否允许新建子分组,`0` / `1`;与类型无关,后台开关 |
|
||||
| `enabled` | INTEGER | 是否启用,`0` / `1`;**唯一可见性来源**,停用后侧栏与卡片都不再出现该子树 |
|
||||
| `enabled` | INTEGER | 是否启用,`0` / `1`;停用后侧栏与卡片都不再出现该子树 |
|
||||
| `sort` | INTEGER | 同级顺序,越小越靠前 |
|
||||
|
||||
两条约束写在表上:
|
||||
|
||||
- `CHECK`:`section` 必须 `parent_key IS NULL` 且有 `view_mode`;`group` 必须有父节点且无 `view_mode`;
|
||||
- `CHECK`:`section` 必须 `parent_key IS NULL`;`group` 必须有父节点;
|
||||
- `key` 唯一(UNIQUE),全局不重复。
|
||||
|
||||
#### entry —— 内容条目(网站 / 电影 / 文章共用)
|
||||
@@ -223,6 +219,7 @@ cargo run -- --root ./sites --host 0.0.0.0 --port 3000
|
||||
| `id` | INTEGER | 主键,库内唯一标识(自动分配) |
|
||||
| `key` | TEXT | 业务编码,全局唯一(如 `github` / `movie-1`);详情页按它查找 |
|
||||
| `node_key` | TEXT | 直接所属容器,外键 → `node.key`:应用是分组,海报 / 图文是分区本身 |
|
||||
| `format` | TEXT | 展示格式:`apps` / `posters` / `articles`;逐条设置,同一分组可混合 |
|
||||
| `name` | TEXT | 名称:网站名 / 电影名 / 文章标题 |
|
||||
| `description` | TEXT? | 一句话简介,列表卡片的副标题 |
|
||||
| `icon` | TEXT? | 字符图标,封面缺失时的占位 |
|
||||
@@ -251,7 +248,7 @@ WHERE COALESCE(p.parent_key, p.key) = 'recommend';
|
||||
好处是没有冗余列可以写错——条目不会出现「声称属于 A 区、实际挂在 B 区分组下」的情况;
|
||||
`node_key` 还有 `ON UPDATE CASCADE`,改编码时条目自动跟随。
|
||||
|
||||
三种内容共用一张表,只是**用到的字段不同**,形态由所属分区的 `view_mode` 决定:
|
||||
三种内容共用一张表,只是**用到的字段不同**,形态由每条自己的 `entry.format` 决定:
|
||||
|
||||
| 类型 | 常用字段 |
|
||||
| --- | --- |
|
||||
@@ -308,8 +305,8 @@ card_group 卡片包含哪些分组 + 每个分组的预览条数与先后
|
||||
主键 `(card_id, group_key)`:同一张卡片里一个分组只出现一次。
|
||||
一张卡片可以混合展示多个分组(不同格式也能混),顺序与条数各自独立。
|
||||
|
||||
旧版的 `section_block` 表仍保留在库里(`CREATE TABLE IF NOT EXISTS` 不会删表),
|
||||
但只作为从旧库迁移到 `card` / `card_group` 的来源,新代码不再读写它。
|
||||
旧版的 `section_block` 表已在 v23 迁移中删除;旧库升级时会先把数据回填到
|
||||
`card` / `card_group`,再删表,不会丢内容。
|
||||
|
||||
### 表关系
|
||||
|
||||
@@ -347,7 +344,7 @@ card 1 ──── n card_group ──── 1 node(勾选的分组 + 每个
|
||||
| 应用详情 | `entry`(apps) | `name` `description` `icon` `href` `cover` `banner` `badge` `comment` `views` `likes` |
|
||||
| 海报详情 | `entry` + `entry_tag` | `name`(→`title`)`cover` `comment` `summary` `href` + `tags` |
|
||||
| 图文详情 | `entry` + `entry_tag` | `name`(→`title`)`description` `cover` `body` + `meta` |
|
||||
| 侧栏导航 | `node` | 走 `parent_key` 的分组树,`show_in_sidebar = 0` 与 `enabled = 0` 的节点跳过;「本地服务」由前端排除 |
|
||||
| 侧栏导航 | `node` | 走 `parent_key` 的分组树,`enabled = 0` 的节点跳过;「本地服务」由前端排除 |
|
||||
| 本地服务 | 不在库里 | 由 `/api/projects` 扫描托管目录后在前端拼接 |
|
||||
|
||||
### 侧栏导航
|
||||
@@ -370,13 +367,13 @@ CES 现场报道(根分组,无子分组 → 直接打开)
|
||||
- 有子分组时渲染成可折叠节点,子项就是子分组;
|
||||
- 没有子分组时整行是链接;
|
||||
- 名字一律用 `node.title`,没有别名,也没有跨分区的收纳层;
|
||||
- `show_in_sidebar = 0` 的节点不出现;`enabled = 0` 的节点连同整棵子树都不出现;
|
||||
- `enabled = 0` 的节点连同整棵子树都不出现;
|
||||
- 顺序取 `node.sort`(在「分组管理」里改「排序权重」);
|
||||
- 「本地服务」是前端拼出来的分类,侧栏按 key 直接排除。
|
||||
|
||||
### 首页卡片
|
||||
|
||||
一张卡片 = 一个标题 + 一组勾选的分组,内容不混排:
|
||||
一张卡片 = 一个标题 + 一组勾选的分组,分组各自渲染、可以混合格式:
|
||||
|
||||
```sql
|
||||
-- 看看「常用推荐」这张卡片勾了哪些分组、各自几条
|
||||
@@ -502,7 +499,6 @@ GET /api/catalog2
|
||||
"key": "pin",
|
||||
"title": "常用推荐",
|
||||
"icon": "🔖",
|
||||
"format": "apps",
|
||||
"enabled": true,
|
||||
"sort": 1,
|
||||
"entries": [{ "id": "1", "name": "1", "format": "apps" }],
|
||||
@@ -520,11 +516,9 @@ GET /api/catalog2
|
||||
}
|
||||
```
|
||||
|
||||
「本地服务」卡片**不在**这个接口里,它由 `/api/projects` 扫描托管目录后在前端拼接。
|
||||
「本地服务」卡片在 `cards` 里也有一行 `local-service`,但内容由 `/api/projects` 运行时生成。
|
||||
侧栏不再单独下发,前端直接用 `groups` 派生。
|
||||
|
||||
`GET /api/catalog` 是旧版结构(`categories` 数组),仅为兼容保留。
|
||||
|
||||
### 订阅内容库变化
|
||||
|
||||
```http
|
||||
|
||||
Reference in New Issue
Block a user