feat: 实现导航页基础功能

- 添加导航条目和分类数据模型
- 实现导航卡片网格展示
- 支持点击卡片打开链接
- 添加主题样式(渐变色、卡片阴影)
- 区分系统默认和自定义条目
- 添加分类统计信息"
This commit is contained in:
2026-09-19 23:17:36 +08:00
parent 1c98340fc5
commit 039ea70edf
26 changed files with 796 additions and 2583 deletions
+8 -11
View File
@@ -1,7 +1,7 @@
# 后端数据结构设计:网站与分组
> 本文是设计稿,已按此实现。代码在 `backend/`,接口与运行方式见
> [backend/README.md](../backend/README.md)。
> 本文是设计稿。实现时按「侧栏结构和网站绑定到一个文件、删除时同步清理」调整过,
> 现状见 [backend/README.md](../backend/README.md)。
## 1. 需求与边界
@@ -158,17 +158,14 @@ pub enum SiteSource {
```
backend/data/
├── site.json # 站点名与搜索框提示,只读
├── system-categories.json # 内置分组,只读,项目维护者手写
├── system-sites.json # 内置网站,只读
├── user-categories.json # 提交时创建的分组,可写
└── user-sites.json # 提交 / 推送的网站,可写
└── nav.json # 站点信息 + 分组结构(含网站),一份文档
```
- 读:启动时全量加载进内存,之后都从内存读,不再碰磁盘。
- 写:只写 `user-*.json` 两个文件。**代码里不存在写 `system-*.json` 的路径**,
「不可修改」靠结构保证,而不是靠每处调用都记得判断。
- 写盘用「先写临时文件再改名」,避免写到一半断电把文件写坏。
- 读:启动时加载进内存,之后都从内存读,不再碰磁盘。
- 写:整份文档一起写回,但改的只会是 `source != system` 的那部分。
- 网站直接挂在分组的 `sites` 里,不再自己记 `categoryId`——
归属由位置表达,删掉分组不会留下指向空处的引用。
- 删除网站时,如果它所在的用户分组空了,会在**同一次写入**里一起清掉。
- JSON 用 2 空格缩进、保留中文原文,方便直接看 diff。
### 5.1 启动时的自检