87 lines
3.4 KiB
Markdown
87 lines
3.4 KiB
Markdown
# K96 剧场页服务端分类分页
|
||
|
||
## 目标
|
||
|
||
- `/app/feed` 支持按分类过滤,并与内容类型过滤叠加。
|
||
- 剧场页「全部」展示全部已上线短剧,任意分类展示该分类全部已上线短剧。
|
||
- 列表使用游标分页,切分类优先命中缓存,支持静默刷新、加载更多和失败重试。
|
||
|
||
## 分支
|
||
|
||
- FruitServer:`feat/k96-feed-category`
|
||
- ReelShort:`feat/k96-theater-feed`
|
||
|
||
## A. FruitServer
|
||
|
||
1. `AppCatalogController.feed` 增加可选 `Long categoryId` 并传给服务层。
|
||
2. `AppCatalogService.feed` 增加 `categoryId`,传给
|
||
`DramaService.listPublishedFeed`。
|
||
3. `DramaService.listPublishedFeed` 增加 `categoryId`:
|
||
- 非空时使用 `DramaMultiTagSupport.applyCategoryIdTokens`
|
||
按 `category_ids` 整词匹配。
|
||
- 游标 marker 必须同时满足已上线、内容类型命中和分类命中,否则返回空列表。
|
||
4. 补充服务层、控制器契约测试:
|
||
- 仅 categoryId。
|
||
- categoryId + types。
|
||
- 分类游标翻页。
|
||
- marker 分类不命中返回空。
|
||
5. 更新 `docs/api-phase1.md` 的 `/app/feed` 参数和分类过滤说明。
|
||
|
||
门禁:`mvn test` 全模块通过。
|
||
|
||
## B. ReelShort
|
||
|
||
### B1. API 与仓库
|
||
|
||
- `CatalogApi.feed` 增加可选 `String? categoryId`,非空才拼 query。
|
||
- `CatalogRepository.fetchFeed` 同步参数,HTTP 实现透传。
|
||
|
||
### B2. TheaterFeedController
|
||
|
||
- 新增 `lib/core/data/services/theater_feed_controller.dart`。
|
||
- 按 `String? categoryId` 独立缓存状态:
|
||
`dramas / cursor / hasMore / loaded / loading / loadingMore / lastError /
|
||
requestSeq / inFlight`。
|
||
- `select(id)` 同步切分类;有数据先渲染并静默刷新,无数据时加载。
|
||
- `loadMore` 游标追加并按 id 去重;`hasMore=false` 停止。
|
||
- `refreshCurrent` 失败保留旧数据;切换回失败分类自动重试。
|
||
- 单请求 10 秒超时,响应写回发起分类,requestSeq 仅处理同分类顺序。
|
||
|
||
### B3. 剧场接入
|
||
|
||
- `DiscoverPage` 创建并持有 TheaterFeedController,初始请求「全部」。
|
||
- 「全部」和分类 chips 的网格统一读取 `theater.dramas`,不再使用
|
||
`categories.feed.dramas` / `dramasOf`。
|
||
- `_selectCategory` 同时更新 `DiscoverLogic.selectedCategoryId` 和
|
||
`theater.select(categoryId)`。
|
||
- 滚动剩余不足 400px 时触发 `loadMore`;搜索模式不触发剧场分页。
|
||
- 下拉刷新并行执行 `categories.load()` 和 `theater.refreshCurrent()`。
|
||
- 无缓存首屏显示转圈;空、失败和重试保持既有剧场视觉。
|
||
|
||
### B4. 测试
|
||
|
||
- TheaterFeedController:
|
||
- 全部使用空 categoryId,分类使用对应 id。
|
||
- 缓存切回不闪烁。
|
||
- 分页去重、hasMore=false 停止。
|
||
- 失败保留旧数据、失败分类切回自动重试。
|
||
- 剧场 widget:
|
||
- 点击分类请求对应 categoryId。
|
||
- 接近底部触发下一页。
|
||
- 搜索、下拉刷新与既有布局不回归。
|
||
|
||
门禁:`dart analyze lib test` 零告警、`flutter test` 全过、
|
||
`flutter build apk --debug` 成功。
|
||
|
||
## Git
|
||
|
||
- FruitServer 提交:`feat(app): 推荐流支持分类过滤`
|
||
- ReelShort 提交:`feat(theater): 剧场分类列表服务端分页`
|
||
- 两仓库作者:`Zhou Weidong <502333560@qq.com>`,禁止 `git add -A`。
|
||
- 各自 `--no-ff` 合回 `develop` 并 push,两仓库 PROGRESS 留痕。
|
||
|
||
## 约束
|
||
|
||
- 全程中文;不改 specs、ReelShortWeb,不改首页 K94/K95 已交付逻辑。
|
||
- 不安装或操作真机;完成后停住等待验收。
|