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 -8
View File
@@ -23,14 +23,14 @@ flutter build web --dart-define=NAVIUS_API_BASE=https://api.example.com
后端没起来时页面会显示「加载失败」和具体原因,并给一个「重试」按钮。
侧栏底部的「提交网站」会打开提交表单:填完直接进后端的用户分组(不需要审核),
提交成功后页面会静默重新拉一次数据,新站点立刻出现在侧栏里。
侧栏底部的「提交网站」直接跳到后端配好的收集入口(`nav.json` 的 `site.submitUrl`,
填 Mattermost 地址即可)。页面上不再有提交表单——收集和讨论都在 Mattermost 里做,
网站数据由后端接口写入。
用户提交 / 接口推送进来的站点(后端返回的 `editable == true`)在卡片悬停时右上角
会露出「编辑 / 删除」:编辑复用同一个表单(预填现有内容)走 `PATCH`,
删除会先确认再走 `DELETE`,两个操作成功后都会静默刷新。系统内置的卡片没有这两个入口。
**页面上没有编辑和删除入口**:卡片只管展示和跳转,用户提交的站点照样由后端接口
(`PATCH` / `DELETE`)维护,只是不从这里操作。
站点名和搜索框提示也来自后端(`data/site.json`),前端不再写死。
站点名、搜索框提示、提交入口地址都来自后端(`nav.json` 的 `site`),前端不再写死。
## 常用命令
@@ -60,8 +60,8 @@ flutter build web # 构建产物输出到 build/web
- mock 实现:`lib/features/home/data/mock_home_repository.dart`(测试用)
接口对应关系:读 `GET /api/nav`、提交 `POST /api/sites`、编辑 `PATCH /api/sites/{id}`、
删除 `DELETE /api/sites/{id}`。表单在 `presentation/widgets/site_form_dialog.dart`
(新增和编辑共用),设计见 [docs/submit-site-form.md](../docs/submit-site-form.md)。
删除 `DELETE /api/sites/{id}`。仓库契约里四个方法都在,界面目前只用到「读」和
「跳转到提交入口」,另外三个留给后台工具或以后再做界面时用。
接口返回的分组树在 `http_home_repository.dart` 里映射成前端模型:分组变成侧栏导航,
**只有挂着网站的分组才进内容区**(空分组留在侧栏,点了没有对应内容——和原型一致),