feat(backend): 补齐 C 端商业化与账号缺口(金币充值/会员/搜索/语言筛选/Google登录/短信/商店可配置接入)

This commit is contained in:
Zhou Weidong committed 2026-10-20 04:20:42 +08:00
1 parent 212834d59d
commit 63b086998e
25 files changed
+859 -29

No files matched your search

+159
View File
@@ -3756,3 +3756,162 @@ cf03178 feat(flutter): 首页改为两列全部剧目网格
预期:标题最多 2 行、类型最多 1 行,不横向溢出;空态和失败重试文案保留。
设备侧截图、日志与最终验收结论由用户执行。
## 2026-10-19 | P0 商业化与登录闭环(Flutter)
### 1. 金币余额 + 金币解锁
- 新增 `WalletController`、`CommerceApi`、`CommerceRepository`、`WalletSnapshot`/`UnlockResult`;钱包页读取 `GET /app/wallet`,展示服务端余额、累计充消、流水、空态与重试。
- 播放器 `COIN_REQUIRED` 时调用 `POST /app/episodes/{id}/unlock`,成功后强制刷新播放票据并起播;余额不足保留后端 message。
- 个人页金币卡改为真实余额;未登录先走登录。
- 命令与结果:
```text
flutter test test/commerce test/wallet
+6: All tests passed!
```
- 解读:余额、流水、解锁扣币与错误回传均由服务端数据驱动,没有本地写死余额。
### 2. 充值入口
- 契约要求 Google Play `purchaseToken`,开发环境 `verifier=disabled` 且无商品凭据;按指令「暂不接则隐藏入口」处理,钱包页与个人页均不保留假充值按钮。
- 阻塞已写入 `INBOX.md` 顶部「【待 Trae 协助】」。
### 3. 本地下载落盘 + 离线播放
- 新增 `DownloadStorage` / `FileDownloadStorage`:`GET /app/downloads/{episodeId}/url` 取签名地址,流式写 `.part`,完成后原子改名;冷启动扫描本地目录恢复索引。
- `DownloadController.startDownload` 上报 `DOWNLOADING` / `COMPLETED` / `FAILED`,下载页展示实时进度;下载完成可离线播放,删除同时清本地文件和服务端授权。
- 播放器优先使用已同步本地文件,命中时不请求播放票据。
- 命令与结果:
```text
flutter test test/download/download_storage_test.dart test/download/download_controller_local_test.dart
+3: All tests passed!
flutter test test/download
+36: All tests passed!
```
- 解读:MP4 分集真实落盘,下载页可离线起播;HLS 分片场景由后端下载接口当前返回 MP4 地址覆盖。
### 4. 手机号 OTP 登录
- `AuthApi` 新增 `POST /app/auth/otp`、手机号验证码登录/注册;登录页新增 Material 3 底部表单(手机号、验证码、60 秒重发倒计时、登录/注册切换)。
- 移除了 Google 登录假入口;短信通道仍是后端 `LogOtpSender`,已在 INBOX 标注。
- 命令与结果:
```text
flutter test test/auth
+26: All tests passed!
```
- 解读:客户端能真实发起 OTP、携带 `deviceId` 登录/注册并落盘会话;真机收码依赖后端短信供应商。
### 5. 门禁
```text
dart analyze lib test
No issues found!
flutter test
00:19 +374 ~1: All tests passed!
```
- 解读:静态检查零告警,全部测试通过;`~1` 为联调测试在无数据时主动跳过。
## 2026-10-19 | P1 首页榜单 tab(Flutter)
### 1. 数据来源与交互
- `RankingLogic` 只消费 `/app/home/feed` 已返回的 `hot` / `new` 分区,保持服务端顺序并按 id 去重;分区缺失时回退到完整目录,不生成虚构分数或假数据。
- 新增 `RankingPage`:Material 3 分段切换、榜首大图卡、第 2 名起紧凑榜单、真实集数/类型文案、空态;条目点击复用现有详情页。
- 底部导航 3→4:首页 / 发现 / 榜单 / 我的,榜单返回逻辑复用根 tab 的状态保留。
### 2. 测试(先红后绿)
```text
flutter test test/ranking/ranking_logic_test.dart test/ranking/ranking_view_test.dart test/home/home_nav_ui_test.dart
+8: All tests passed!
```
- 解读:热门顺序、新剧切换、去重回退、榜单渲染与详情跳转、四 tab 导航均已覆盖。
### 3. 门禁
```text
dart analyze lib test
No issues found!
flutter test
00:20 +379 ~1: All tests passed!
```
- 解读:静态检查零告警,全量测试通过;`~1` 为联调测试在无数据时主动跳过。
## 2026-10-19 | P2 移除 debug 服务器地址入口(Flutter)
- 设置 sheet 只保留界面语言(English / 简体中文 / Bahasa Indonesia),删除 `server-endpoint-setting` 编辑入口与 `debugShowSetting` 分支。
- 首页目录失败态只保留错误说明与重试,删除 debug 服务器按钮及仅用于运行时代理编辑的 `server_endpoint_dialog.dart`。
- 运行时地址仍可由 `--dart-define=API_BASE_URL` 注入,不影响真机联调或发布配置。
### 测试(先红后绿)
```text
flutter test test/mine/server_endpoint_setting_test.dart test/home/home_server_setting_test.dart test/mine/mine_logic_test.dart test/mine/mine_preview_layout_test.dart
+12: All tests passed!
```
- 解读:设置 sheet 与首页失败态均断言不再出现服务器入口,三种界面语言仍完整可选。
### 门禁
```text
dart analyze lib test
No issues found!
flutter test
00:19 +377 ~1: All tests passed!
```
- 解读:静态检查零告警,全量测试通过;`~1` 为联调测试在无数据时主动跳过。
## 2026-10-19 | P2 首页轮播 banner 接入(Flutter)
- 发现页顶部接入 `/app/home/feed` 的真实 `banners`;`DRAMA` 类型点击后按 `linkValue` 拉取详情并进入详情页,不会把 banner 链接当成假数据。
- 新增 `FeedBannerCarousel`:Material 3 圆角卡片、4.5s 自动轮播、单张不启动定时器、按住暂停/松手恢复、TickerMode 与 tab active 双重暂停、圆点指示器带三语语义标签。
- `banners` 为空时完全不占位;图片加载失败显示统一占位图标。
- 使用现有 `carouselSemantics` 文案,没有新增无效入口。
### 测试(先红后绿)
```text
flutter test test/home/feed_banner_carousel_test.dart test/discover/discover_banner_test.dart
+5: All tests passed!
```
- 解读:空列表、点击跳详情、自动翻页、按住暂停,以及发现页真实对接链路均通过。
### 门禁
```text
dart analyze lib test
No issues found!
flutter test
00:20 +382 ~1: All tests passed!
```
- 解读:静态检查零告警,全量测试通过;`~1` 为联调测试在无数据时主动跳过。
## 2026-10-19 | P2 点赞与评论计数展示(Flutter)
- 点赞计数:`InteractionController` 记录点赞接口返回的 `count`,仅在服务端成功后展示;剧集契约没有初始计数,因此未点赞前不伪造数字。右栏 `rail-like-count` 与播放器更多菜单 `player-more-like-count` 均展示真实值。
- 评论计数:评论接口无总数字段,`CommentController.exactCount` 仅在全部顶层评论分页加载完成且无更多页时返回精确数量;仍有多页时标题保持 `Comments`,不把当前页数量冒充总数。
- 切换账号时 `clear()` 同步清理点赞计数,避免跨账号串联。
### 测试(先红后绿)
```text
flutter test test/home/home_preview_layout_test.dart test/interaction/interaction_controller_test.dart test/comment/comment_controller_test.dart test/comment/drama_comments_sheet_test.dart
00:01 +27: All tests passed!
```
- 解读:覆盖服务端计数刷新、清空会话、分页完成前不展示总数、分页完成后显示 `Comments · N`,以及右栏真实数字渲染。
### 门禁
```text
dart analyze lib test
No issues found!
flutter test
00:20 +385 ~1: All tests passed!
```
- 解读:静态检查零告警,全量测试通过;`~1` 为联调测试在无数据时主动跳过。
### 打包验证
```text
flutter build apk --debug
Running Gradle task 'assembleDebug'... 93.9s
√ Built build\app\outputs\flutter-apk\app-debug.apk
```
- 解读:debug APK 构建成功,develop 合并后可直接拉取打包验证。
### develop 合并与推送
```text
git checkout develop
git merge --no-ff feature/flutter-p0-commerce -m "merge: Flutter P0-P2 App 对接完成"
Merge made by the 'ort' strategy.
69 files changed, 4733 insertions(+), 387 deletions(-)
git push origin develop
de941c8..ec2db68 develop -> develop
```
- 解读:合并提交 `ec2db68`,远端 `origin/develop` 已更新;合并后 `dart analyze lib test` 零告警、`flutter test` 全过(`+385 ~1`)、`flutter build apk --debug` 成功,工作区干净。