docs(plans): 合并 K7 实施回执

This commit is contained in:
Zhou Weidong committed 2026-10-17 16:51:33 +08:00
commit 9c6aaed645
3 files changed
+278 -1

No files matched your search

+91
View File
@@ -0,0 +1,91 @@
# 2026-10-17 K7 首页轮播图 + 站内信通知
## 一、目标与边界
本批只完成 Flutter 客户端两项能力:
- K7-A:增强现有 `CoverCarousel`,继续使用 `feed.banners` 和 3D 翻转风格,
增加自动轮播、交互暂停、指示器、失败占位和语义。
- K7-B:新增匿名站内信分页页,接入 `GET /app/notices`,在我的页增加通知入口。
- K7-C:补轮播/通知/响应式与 locale 时间测试。
不做已读未读、红点、FCM、通知设置、`/app/config noticeEnabled`、首页铃铛、
新 banner 接口、后端、Web 或 specs 修改。
## 二、契约口径
### Banner
- 数据源:`GET /app/home/feed` / `GET /app/discover/feed` 的 `banners[]`。
- 无独立接口;空列表继续 `SizedBox.shrink()`。
- 点击继续沿用 `linkType=DRAMA` + `linkValue` 的现有 `onOpen`。
### Notices
- `GET /app/notices?pageIndex=1&pageSize=20`,匿名。
- 响应:`{total, list:[{id,title,content,type,publishAt,expireAt}]}`。
- ID 全部按字符串;`total` 是数字。
- `list.length` 用于判断当前页是否有数据;是否加载更多按
“已加载数量 < total”判断。
- `type` 原样展示,不建立客户端枚举映射。
## 三、预计影响文件
轮播:
- `lib/pages/discover/widgets/cover_carousel.dart`
- `lib/pages/discover/discover_view.dart`
- `lib/core/widgets/remote_image.dart`(可选失败图标参数)
- `test/discover/cover_carousel_test.dart`
通知:
- `lib/core/data/models/notice.dart`
- `lib/core/data/remote/notice_api.dart`
- `lib/core/data/repositories/notice_repository.dart`
- `lib/core/data/services/notices_controller.dart`
- `lib/pages/notices/notices_page.dart`
- `lib/pages/mine/mine_view.dart`
- `lib/app.dart`(NoticeRepository Provider)
- `test/notice/**`
- `lib/l10n/app_{en,zh,id}.arb` 与生成文件
## 四、实现口径
### 轮播
- `Timer.periodic` 4.5s;单张不创建定时器;`dispose` 取消。
- 使用 `TickerMode.of(context)`/`Visibility` 语义监听页面可见性;
不可见时取消,恢复时重新启动。
- pointer down 暂停,up/cancel 恢复;拖拽时沿用现有 3D 翻转。
- 指示器采用底部圆点,使用 `AppColors.onPrimary` + `muted` 低透明度。
- 语义标签进入三语 arb。
- 图片失败使用现有 `RemoteImage` 并显示图标占位。
### 通知
- `NoticesController` 管理首屏、分页、加载更多、刷新、错误。
- `NoticesPage` 深色页,保留 K5/K6 主题与 Haptics 不触发滑动振动。
- 列表项标题/类型/时间/两行摘要;点击打开详情 Dialog。
- 详情 `content` 用可滚动 `Text` 保留 `\n`,长内容不溢出。
- `publishAt` / `expireAt` 使用现有 `formatLocalizedDateTime`。
- 我的页 `_menuCard` 增加通知入口,匿名可进入。
## 五、TDD 顺序
1. 轮播:自动切页、单张无 Timer、指示器、触摸暂停、点击回调、失败占位。
2. 通知 API/model:分页字段、字符串 ID、时间解析。
3. Controller:首屏、追加、加载更多条件、空/失败/刷新。
4. NoticesPage:三态、列表、分页、详情、长内容、小屏。
5. 我的页入口与三语文案。
6. 门禁:`dart analyze lib test`、`flutter test`、
`flutter build apk --debug`。
## 六、风险与待确认
- 自动轮播 Timer 与 3D AnimationController 并存,需避免 dispose 后 setState。
- 页面用 `IndexedStack` 保持状态,需通过 `TickerMode` 判断真实可见性。
- `total` 可能在分页期间变化,以本次响应 total 与已加载数量比较。
- 详情长内容必须可滚动,避免小屏 overflow。
- `noticeEnabled` 属 `/app/config`,本批不接;通知入口暂时常驻,已登记后续。
- 无独立 banner 接口和已读接口,不自行扩展契约。
+114 -1
View File
@@ -20,7 +20,7 @@
---
## [待处理] 2026-10-17 | K7 首页轮播图 + 站内信通知
## [已处理·待用户验收] 2026-10-17 | K7 首页轮播图 + 站内信通知
**用户指令(2026-10-17)**:「现在做首页轮播图及站内信通知」。
@@ -105,6 +105,119 @@
- 每步「叙述 + 命令 + 原始输出 + 解读」追加到 `docs/plans/PROGRESS.md`;完成后停住写回执。
- 提交作者与提交者统一 `Zhou Weidong <502333560@qq.com>`。
### 七、K7 完成回执(2026-10-17)
**结论**:K7-A 轮播增强、K7-B 站内通知、K7-C 测试验收均完成并停止。
未新增接口,未改后端/Web/specs。
#### 7.1 首页轮播
- 保持 `feed.banners` 数据源和 `CoverCarousel` 3D 翻转风格。
- 4.5s 自动轮播;单张不启动 Timer。
- 触摸/拖拽期间暂停,松手恢复。
- `active=false` 或 `TickerMode` 不可见时暂停;dispose 取消 Timer。
- 底部圆点指示器使用 `onPrimary` / `muted` K5 token,带三语语义标签。
- 图片失败复用 `RemoteImage` 并显示图标占位。
- 点击继续调用原有 `onOpen`。
#### 7.2 站内通知
- 新增 `notice.dart`、`notice_api.dart`、`notice_repository.dart`、
`notices_controller.dart` 和 `NoticesPage`。
- `GET /app/notices?pageIndex&pageSize=20`,匿名访问。
- ID 按字符串解析,`total` 按数字解析。
- 首屏、加载更多、空态、失败重试、下拉刷新均已接入;
已加载数量 `< total` 时才展示加载更多。
- 列表展示标题、原始 `type`、locale 时间、两行摘要。
- 详情弹窗展示完整 `content`,保留换行并支持长内容滚动。
- 我的页新增“通知”入口;匿名可进入,无登录闸。
- `noticeEnabled` 属 `/app/config`,本批未接,登记后续。
真实 8081 匿名接口验证:
```
$ curl -sS 'http://127.0.0.1:8081/app/notices?pageIndex=1&pageSize=20'
{"code":0,"message":"ok","data":{"total":0,"list":[]}}
```
#### 7.3 门禁原始结果
```
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test test/discover/cover_carousel_test.dart test/notice
All tests passed!
$ flutter test
00:14 +284 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 6.9s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
`~1` 是既有 live watch 用例在 8081 未启动时按机制跳过。
新增覆盖:
- 自动轮播、单张无 Timer、交互暂停、active/TickerMode、圆点、图片占位、onOpen。
- 通知 API 字符串 ID、controller 分页/空/失败/刷新。
- NoticesPage 首屏、加载更多、加载/空/失败三态、详情换行、印尼时间。
- 320×568 长标题/长内容不溢出;我的页匿名通知入口。
#### 7.4 Git
- 功能提交:`b870956665f5268070c691533cc2a334f2aa7f59`
`feat(flutter): 增加轮播自动播放与站内通知`
- `--no-ff` 合并:`3e8703b`,已推送
`b7b1c50..3e8703b develop -> develop`
- author/committer 均为 `Zhou Weidong <502333560@qq.com>`;未操作 `main`。
#### 7.5 用户真机验证步骤与预期
1. 打开发现页顶部轮播,等待 4.5 秒。
预期:自动翻到下一张,圆点同步变化;单张 banner 不会自动循环。
2. 按住/拖动轮播超过 4.5 秒后松手。
预期:按住期间不自动翻页;松手后恢复自动轮播;拖拽仍保持 3D 翻转。
3. 暂时断开图片源或使用失败封面。
预期:显示深色占位和图片失败图标,不白屏。
4. 点击当前 banner。
预期:按原有 DRAMA 跳转逻辑进入详情。
5. 进入“我的 → 通知”,未登录也可访问。
预期:显示通知列表;空数据时显示“暂无通知”;断网时显示失败及重试。
6. 有超过 20 条通知时点击“加载更多”。
预期:下一页追加到列表,无重复;已加载数量达到 total 后按钮消失。
7. 下拉刷新,再点击一条长通知。
预期:刷新后列表回到第一页;详情显示标题、发布时间和完整正文;
正文换行保留且长内容可滚动。
8. 切换 Bahasa Indonesia 查看通知时间。
预期:时间按印尼 Material 格式显示。
设备侧截图与真机结果由用户执行。
#### 7.6 已知边界
- 无已读/未读、红点、FCM、通知设置。
- 不接 `/app/config noticeEnabled`,通知入口当前常驻。
- 无独立 banner 接口,未新增首页铃铛。
---
## [已处理·待用户验收] 2026-10-17 | K6 客户端 UI:登录页 + 底部导航优化
+73
View File
@@ -2028,3 +2028,76 @@ ac706a4..b7b1c50 develop -> develop
```
解读:修复已合并推送;用户设备特定 error 仍需设备日志确认。
---
## 2026-10-17 K7 首页轮播与站内通知(【Codex】)
### 21.1 K7 计划与首次红灯
叙述:先写 `docs/plans/2026-10-17-K7.md`,从干净 `develop b7b1c50`
创建 `feature/flutter-k7-carousel-notices`。
首次轮播/通知测试:
```
No named parameter with the name 'active'
Error when reading 'lib/core/data/models/notice.dart': No such file or directory
Error when reading 'lib/core/data/remote/notice_api.dart': No such file or directory
00:00 +0 -3: Some tests failed.
```
解读:轮播增强、通知数据层和页面尚不存在,红灯符合预期。
### 21.2 轮播绿灯
实现 Timer、交互暂停、active/TickerMode、圆点、失败占位与语义后:
```
$ flutter test test/discover/cover_carousel_test.dart
00:00 +7: All tests passed!
```
### 21.3 通知实现与定向绿灯
实现 Notice model/API/repository/controller/Page、我的页入口和三语文案后,
真实匿名接口返回:
```
$ curl -sS 'http://127.0.0.1:8081/app/notices?pageIndex=1&pageSize=20'
{"code":0,"message":"ok","data":{"total":0,"list":[]}}
```
通知与轮播定向测试:
```
$ flutter test test/discover/cover_carousel_test.dart test/notice
All tests passed!
```
期间修正 320px 下类型/时间同一行 3.5px 溢出,改为双 Flexible。
### 21.4 K7 最终门禁
```
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:14 +284 ~1: All tests passed!
$ flutter build apk --debug
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
### 21.5 Git
```
b870956665f5268070c691533cc2a334f2aa7f59
feat(flutter): 增加轮播自动播放与站内通知
b7b1c50..3e8703b develop -> develop
```
解读:K7 已合并推送;author/committer 均为 Zhou Weidong。