From 5c93ba9131ad68ff7f51e239df855d7239fea287 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 09:44:41 +0800 Subject: [PATCH 01/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K19?= =?UTF-8?q?=20=E8=B4=A6=E5=8F=B7=E4=B8=AD=E5=BF=83=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 105 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 1e42f43..f834871 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,111 @@ --- +## [待处理] 2026-10-19 | K19 客户端账号中心:资料 / 设备 / 数据导出 / 注销 + +**用户指令(2026-10-19)**:「先写 K19 任务书并派单」。 +> 只改客户端 `ReelShort`。后端、`ReelShortWeb`、`specs`、`main` 一律不动。 + +### 一、背景与缺口 + +后端 `/app` 共 45 个接口,客户端已接 26 个。本轮对接账号中心 6 个(`api-phase1.md` §1.2,第 157–162 行;实现见 +`fruitshorts-app-api/.../AppMeController.java`): + +| 方法 | 路径 | 客户端现状 | +| --- | --- | --- | +| GET | `/app/me` | 未对接 | +| PUT | `/app/me` | 未对接 | +| GET | `/app/me/devices` | 未对接 | +| GET | `/app/me/export` | 未对接 | +| POST | `/app/me/deactivate` | 未对接 | +| POST | `/app/me/deactivate/cancel` | 未对接 | + +### 二、接口与字段口径(以后端代码为准确认,勿臆造) + +1. **GET `/app/me`** → `AppUserRespVO`:`uid, nickname, avatarUrl, gender, countryCode, regionCode, + language, timezone, currency, status, maskedTarget, createdAt, lastLoginAt, vipLevel(Integer), + vipExpireAt`。`vipLevel` 是数字,其余时间字段是 `LocalDateTime` 字符串。 +2. **PUT `/app/me`** → 请求 `ProfileUpdateReqVO`,全部字段可选,**只传本次改动的字段**: + `nickname, avatarUrl, gender, birthday(yyyy-MM-dd), language, timezone, regionCode`。 + `nickname` 为空串时后端忽略;`gender` 取值按 `schema-phase1.sql` 注释用小写 + `male / female / unknown`;`birthday` 后端只能设置、不能清空。响应同 `AppUserRespVO`。 +3. **GET `/app/me/devices`** → **直接返回 `AppUserDevice` 实体数组**(不是专用 VO): + `id, userId, deviceId, platform, deviceModel, firstSeenAt, lastSeenAt, status, createdAt, updatedAt, deleted`。 + 按契约 §0,`Long` 字段以字符串下发。客户端**只展示** `deviceId/platform/deviceModel/firstSeenAt/lastSeenAt/status`, + `userId`、`deleted` 一律忽略、不落日志、不上屏。 +4. **GET `/app/me/export`** → `{profile: AppUserRespVO, credentials: [{type, masked, verified}], consents: [...], devices: [...]}` + (以 `AppUserService.exportAccount` 实际结构为准)。 +5. **POST `/app/me/deactivate`** → 请求 `{reason}`(`password` 后端当前不校验,**客户端不采集、不上送**); + 成功返回 `scheduledAt`(15 天冷静期截止时间,`LocalDateTime`)。后端同时吊销全部会话。 + 已有申请时返回业务错误,文案「注销申请已在处理中」。 +6. **POST `/app/me/deactivate/cancel`** → 成功 `data = null`;无待处理申请时错误文案「没有待处理的注销申请」。 + +**契约缺口(本批如实标注,不得自行补后端)**: + +- `GET /app/me` 不返回「注销申请中」状态 → UI 不能做状态判断,只能把后端错误文案原样透传; + 「撤销注销」入口常驻,无申请时展示后端返回的文案。 +- 无「设备下线 / 踢出」接口 → 设备页**只读**;`TC-ACCOUNT-10` 中「单点下线」记为缺口,留待后续批次。 +- 无头像上传接口 → 头像**只展示**(`avatarUrl` 为空用现有占位图标),本批不做上传、不做 URL 输入框。 + +### 三、客户端改造范围 + +1. **remote**:新增 `lib/core/data/remote/account_api.dart`,六个方法,路径与请求体严格按上表; + 错误一律抛现有 `ApiException`(禁止吞异常、禁止空 catch)。 +2. **models**:新增 `account_profile.dart`、`account_device.dart`、`account_export.dart`。 + 数值/ID 解析用 `json_numbers.dart` 的 `jsonToId` / `jsonToInt`,兼容字符串与数字两种下发形式。 +3. **repository**:新增 `account_repository.dart`(接口 + `HttpAccountRepository`); + 在 `app.dart` 的 Provider 树注册,供页面与测试注入(`FakeAccountRepository` 放 `test/support/`)。 +4. **页面**(建议 `lib/pages/account/`,沿用 provider binding/logic/view 三层): + - **个人资料**:进入时 `GET /app/me`;可改 `nickname`(去空格后非空、≤30 字符,客户端校验)、 + `gender`(male/female/unknown,本地化文案)、`birthday`(日期选择,`yyyy-MM-dd`); + `uid / maskedTarget / countryCode / currency / status` 只读展示;`language / timezone / regionCode` 只读。 + 保存调 `PUT /app/me`,成功后用响应刷新页面,并**同步本地登录态**(见第 6 条)。 + - **登录设备**:`GET /app/me/devices`,列表展示平台、机型、设备号(脱敏显示,保留首尾各 4 位)、 + 首次/最近活跃时间、状态;空态用现有 `EmptyState`;本页只读。 + - **数据导出**:`GET /app/me/export`,展示资料摘要、凭据(`type/masked/verified`)、授权记录数、设备数; + 提供「复制完整 JSON」到剪贴板(`Clipboard.setData`)+ SnackBar 提示;不写本地文件。 + - **注销账号**:15 天冷静期与「申请后立即登出全部设备」的显著提示;可选注销原因(≤200 字); + 「申请注销」必须二次确认弹窗 → 成功后展示 `scheduledAt` 并清空本地会话(服务端已吊销全部会话, + 用 `AuthController.clear()`,不要再调 logout),回到未登录态; + 「撤销注销申请」常驻,成功/失败均以后端文案提示。 +5. **入口**:`lib/pages/mine/mine_view.dart` 在已登录态新增「账号」卡(置于钱包卡之后、菜单卡之前): + 个人资料 / 登录设备 / 数据导出 / 注销账号,四项带图标与分隔线;未登录不显示。样式沿用现有 `_menuCard`。 +6. **登录态同步**:`AuthController` 增加公开方法(如 `applyProfile(AuthUser)`),资料保存成功后更新 + 内存 session 的 `uid/nickname/avatarUrl` 并持久化,使「我的」页昵称即时生效;不改令牌与刷新逻辑。 +7. **l10n**:新增文案必须同时写入 `app_en.arb / app_zh.arb / app_id.arb` 并重新生成; + 印尼语为印尼市场主语言,禁止留英文占位。 +8. **测试(TDD,先红后绿)**: + - API/模型:六接口路径与请求体、`Long` 字符串/数字两种解析、缺字段容错、错误文案透传; + - logic:资料保存成功后回调登录态、注销成功后清会话、撤销失败展示后端文案、导出复制内容; + - widget:我的页四个入口仅登录态可见、资料页字段回填与保存、设备空态、注销二次确认、 + 数据导出页加载/失败/重试。 + - 既有测试不得改断言;如需适配只改注入的 Fake。 + +### 四、约束与门禁 + +- 代码规模红线:函数 ≤50 行、参数 ≤5、类 ≤300 行、文件 ≤500 行、嵌套 ≤4、圈复杂度 ≤10;禁止魔法值。 +- public 类/方法必须有文档注释,文件首行统一 `// Author: fruit.com.cn`;禁止裸 `then()`、空 catch。 +- 门禁(不达标不提交):`dart analyze lib test` 零告警;`flutter test` 全过; + `flutter build apk --debug` 构建通过。 +- 真机验证由用户执行,Codex **不得**自行做设备侧验证,也不得用本机 curl 充当设备证据。 + +### 五、Git 与交接 + +- 从干净 `develop`(基线 `7d68699`)拉 `feature/flutter-k19-account`;小步提交, + `type(scope): 描述`(≤50 字符),只 `git add` 本次文件。 +- 完成后 `git checkout develop && git merge --no-ff feature/flutter-k19-account && git push origin develop`; + **不动 `main`**;提交作者与提交者统一 `Zhou Weidong <502333560@qq.com>`。 +- 任务书与留痕属于 FruitServer 仓库:`docs/plans/PROGRESS.md` 追加命令 + 原始输出 + 解读, + 单独提交到 FruitServer `develop`(`docs(plans): ...`),不夹带客户端代码。 + +### 六、回执要求 + +完成后停住并回执:分支与提交号、六个接口的调用位置、测试条数与结果、`dart analyze` / `flutter test` / +`flutter build apk --debug` 原始结论、已知缺口(设备下线 / 头像上传 / 注销状态查询), +以及「用户可照做的真机验证步骤 + 每步预期结果」。 + +--- + ## [已处理·待用户验收] 2026-10-17 | K16 注册限流改为可配置(支持不限制) **用户指令(2026-10-17)**:「注册 429 限流做成可配置的,不限制或限制数量」。 From 6b5e70e55423916adbe04cb9ac8f40767ca21e91 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 09:46:27 +0800 Subject: [PATCH 02/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K19?= =?UTF-8?q?=20=E8=B4=A6=E5=8F=B7=E4=B8=AD=E5=BF=83=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K19.md | 87 ++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/plans/2026-10-19-K19.md diff --git a/docs/plans/2026-10-19-K19.md b/docs/plans/2026-10-19-K19.md new file mode 100644 index 0000000..d93cce0 --- /dev/null +++ b/docs/plans/2026-10-19-K19.md @@ -0,0 +1,87 @@ +# 2026-10-19 K19 客户端账号中心 + +## 基线 + +- ReelShort `develop`: `7d68699` +- FruitServer `develop`: `5c93ba9` +- 只改 ReelShort;不改 FruitServer 业务代码、ReelShortWeb、specs、main。 + +## 范围 + +对接 `docs/api-phase1.md` §1.2 的六个个人中心接口: + +| 方法 | 路径 | 客户端用途 | +| --- | --- | --- | +| GET | `/app/me` | 资料展示 | +| PUT | `/app/me` | 修改昵称、性别、生日 | +| GET | `/app/me/devices` | 只读登录设备列表 | +| GET | `/app/me/export` | 账号数据摘要与完整 JSON 复制 | +| POST | `/app/me/deactivate` | 申请注销并进入 15 天冷静期 | +| POST | `/app/me/deactivate/cancel` | 撤销待处理注销申请 | + +## 接口口径 + +1. 资料响应仅使用: + `uid/nickname/avatarUrl/gender/countryCode/regionCode/language/timezone/currency/status/maskedTarget/createdAt/lastLoginAt/vipLevel/vipExpireAt`。 + `vipLevel` 是整数;时间字段按 `LocalDateTime` 字符串解析。 +2. 资料更新只发送本次变更字段: + `nickname/avatarUrl/gender/birthday/language/timezone/regionCode`。 + 本页只修改 `nickname/gender/birthday`;昵称 trim 后非空且不超过 30 字符, + 性别取 `male/female/unknown`,生日格式 `yyyy-MM-dd`。 +3. 设备数组只解析并展示 + `deviceId/platform/deviceModel/firstSeenAt/lastSeenAt/status`; + `id/userId/deleted` 不展示、不打印。页面只读。 +4. 导出按实际结构解析 + `{profile, credentials, consents, devices}`,展示资料摘要、凭据、授权记录数和设备数; + “复制完整 JSON”只写系统剪贴板,不写本地文件。 +5. 注销请求只发送 `reason`,不采集或上送密码;成功返回 `scheduledAt`。 + 成功后清本地会话,不调用 logout。撤销接口成功 `data=null`,失败原样透传后端文案。 +6. 所有数值和 ID 使用 `jsonToId/jsonToInt`;错误由 `ApiException` 透传到逻辑层。 + +## 客户端改造 + +- `lib/core/data/remote/account_api.dart` +- `lib/core/data/models/account_profile.dart` +- `lib/core/data/models/account_device.dart` +- `lib/core/data/models/account_export.dart` +- `lib/core/data/repositories/account_repository.dart` +- `lib/pages/account/` 下四个页面及各自的 binding/logic +- `lib/pages/mine/mine_view.dart` 登录态新增“账号”卡 +- `lib/core/data/services/auth_controller.dart` 新增 `applyProfile` +- `lib/app.dart` 注册 `AccountRepository` Provider +- `lib/l10n/app_{en,zh,id}.arb` 与生成文件 +- 测试新增 `test/account/`、`test/support/fake_account_repository.dart` + +## TDD 顺序 + +1. 先写 API/模型测试:六条路径、方法、请求体、字符串/数字 ID、缺字段; + 运行定向测试确认红灯。 +2. 实现 AccountApi、三个模型和 AccountRepository,定向测试转绿。 +3. 先写 AuthController.applyProfile 测试:保留令牌、更新昵称/头像并持久化; + 再实现。 +4. 先写 profile/device/export/deactivate logic 测试: + 资料保存回调登录态、注销成功清会话、撤销失败透传文案、导出复制内容; + 再实现逻辑层。 +5. 先写 widget 测试:我的页入口登录可见、资料回填与保存、设备空态、 + 注销二次确认、导出加载/失败/重试;再实现页面和入口。 +6. 生成 l10n,跑全量门禁;最后一次全量测试与 APK 构建。 + +## 门禁 + +```text +dart analyze lib test +flutter test +flutter build apk --debug +``` + +Flutter 分支:`feature/flutter-k19-account`。 + +## 风险与待确认 + +- `GET /app/me` 不返回注销申请状态,UI 不猜测状态;撤销失败展示后端文案。 +- 无设备下线接口,设备页只读;`TC-ACCOUNT-10` 的“单点下线”保留为缺口。 +- 无头像上传接口,头像只展示;空值使用现有占位。 +- 资料响应不含 `birthday`,也没有清空入口。本批生日只能设置,无法回填或清除; + 不补后端字段,页面文案明确为本次设置。 +- 注销成功后服务端立即吊销全部会话,本地同步清理;撤销入口在重新登录后仍可使用。 +- 真机验证由用户执行,本批不提供开发机 curl 或设备侧结果作为证据。 From 28d2679b835c8c1b7fc2b3de32a5e2016c0eca10 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 09:56:22 +0800 Subject: [PATCH 03/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K19?= =?UTF-8?q?=20=E8=B4=A6=E5=8F=B7=E4=B8=AD=E5=BF=83=E4=BA=A4=E4=BB=98?= =?UTF-8?q?=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 57 +++++++++++++- docs/plans/PROGRESS.md | 169 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 225 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index f834871..7361912 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K19 客户端账号中心:资料 / 设备 / 数据导出 / 注销 +## [已处理·待用户验收] 2026-10-19 | K19 客户端账号中心:资料 / 设备 / 数据导出 / 注销 **用户指令(2026-10-19)**:「先写 K19 任务书并派单」。 > 只改客户端 `ReelShort`。后端、`ReelShortWeb`、`specs`、`main` 一律不动。 @@ -123,6 +123,61 @@ `flutter build apk --debug` 原始结论、已知缺口(设备下线 / 头像上传 / 注销状态查询), 以及「用户可照做的真机验证步骤 + 每步预期结果」。 +### 七、K19 完成回执 + +- 客户端分支:`feature/flutter-k19-account` +- 功能末提交:`7151bc9` +- 合并回 develop:`9b3ab9d` +- 已推送:`7d68699..9b3ab9d develop` +- author/committer:`Zhou Weidong <502333560@qq.com>` + +六个接口调用集中在 `ReelShort/lib/core/data/remote/account_api.dart`,分别由: + +- `AccountProfilePage` 调 GET/PUT `/app/me` +- `AccountDevicesPage` 调 GET `/app/me/devices` +- `AccountExportPage` 调 GET `/app/me/export` +- `AccountDeactivatePage` 调 POST `/app/me/deactivate` 与 `/deactivate/cancel` + +门禁原始结论: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:26 +335: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 10.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +已知缺口: + +- `GET /app/me` 不返回注销申请状态,UI 不判断状态;撤销失败展示后端文案。 +- 没有设备下线接口,登录设备页只读;`TC-ACCOUNT-10` 的“单点下线”未实现。 +- 没有头像上传接口,头像只展示;空值使用占位图标。 +- 资料响应不含生日,当前只支持设置生日,不能回填或清空。 + +用户真机验证步骤(设备侧取证由用户执行): + +1. 登录后进入「我的」。 + 预期:钱包卡之后、菜单卡之前显示「账号」卡,包含个人资料 / 登录设备 / + 数据导出 / 注销账号四项。 +2. 打开「个人资料」。 + 预期:昵称、性别、UID、脱敏账号、国家、币种、状态、语言、时区、地区回填; + 修改昵称与性别后保存,返回「我的」后昵称立即更新。 +3. 打开「登录设备」。 + 预期:设备号脱敏,展示平台、机型、首次/最近活跃时间和状态;无设备时显示空态。 +4. 打开「数据导出」。 + 预期:展示资料摘要、凭据、授权记录数和设备数;点「复制完整 JSON」出现成功提示。 +5. 打开「注销账号」。 + 预期:显示 15 天冷静期与立即登出提示;输入原因后必须二次确认。 +6. 确认注销并重新打开 App。 + 预期:成功页展示预计注销时间,本地会话已清空,App 回到未登录态。 +7. 重新登录后再次进入「注销账号」,点击「撤销注销申请」。 + 预期:有申请时显示撤销成功;无申请时原样展示后端“没有待处理的注销申请”。 + --- ## [已处理·待用户验收] 2026-10-17 | K16 注册限流改为可配置(支持不限制) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 173c106..a04625d 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -2202,6 +2202,175 @@ $ flutter test --- +## 34. K19 客户端账号中心 + +### 34.1 基线与实施范围 + +基线确认: + +```text +ReelShort: 7d68699 fix(config): 合并开发默认服务器地址 +FruitServer: 5c93ba9 docs(plans): 下发 K19 账号中心接口对接任务 +``` + +计划文档先提交为 `6b5e70e docs(plans): 增加 K19 账号中心实施计划`。 +客户端从干净 develop 创建 `feature/flutter-k19-account`,只对接: + +```text +GET /app/me +PUT /app/me +GET /app/me/devices +GET /app/me/export +POST /app/me/deactivate +POST /app/me/deactivate/cancel +``` + +接口口径以后端实际代码为准:设备直接返回实体数组;导出返回 +`profile / credentials / consents / devices`;注销请求只发送 `reason`。 + +### 34.2 TDD 与实现 + +先用不存在的 `AccountApi/AccountProfile` 跑红灯,确认测试在实现前失败: + +```text +Error: Error when reading 'lib/core/data/remote/account_api.dart': +No such file or directory +Some tests failed. +``` + +第一批实现后: + +```text +$ flutter test test/account/account_api_test.dart +00:00 +7: All tests passed! +``` + +登录态同步先红灯: + +```text +Error: The method 'applyProfile' isn't defined for the type 'AuthController'. +``` + +实现 `applyProfile(AuthUser)` 后: + +```text +00:00 +1: All tests passed! +``` + +逻辑层覆盖资料保存回调、设备读取、导出复制、注销清会话和撤销失败文案: + +```text +$ flutter test test/account/account_logic_test.dart +00:00 +5: All tests passed! +``` + +页面与入口先红灯,随后用稳定 Key 实现: + +```text +$ flutter test test/account/account_pages_test.dart \ + test/account/mine_account_entry_test.dart +00:01 +6: All tests passed! +``` + +实现文件: + +```text +lib/core/data/remote/account_api.dart +lib/core/data/models/account_profile.dart +lib/core/data/models/account_device.dart +lib/core/data/models/account_export.dart +lib/core/data/repositories/account_repository.dart +lib/pages/account/* +lib/pages/mine/mine_view.dart +lib/core/data/services/auth_controller.dart +lib/app.dart +lib/l10n/app_{en,zh,id}.arb +``` + +### 34.3 首屏布局回归 + +首次全量测试时,新增账号卡把既有偏好设置和观看历史入口挤出可视区: + +```text +Found 0 widgets with text "App Language" +Found 0 widgets with text "Watch History" +Some tests failed. +``` + +处理:不改既有测试断言,把账号卡收敛为 48px 紧凑横向入口, +保留四项图标、分隔线和账号标题;原有菜单项改用紧凑密度。 +三个受影响测试回归: + +```text +$ flutter test test/home/home_nav_ui_test.dart \ + test/watch/watch_history_provider_test.dart test/widget_test.dart +00:06 +21: All tests passed! +``` + +### 34.4 最终门禁 + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! +``` + +```text +$ flutter test +00:26 +335: All tests passed! +``` + +```text +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 10.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +### 34.5 Git + +```text +44f6feb feat(account): 接入个人中心接口模型 +ef7f4ce feat(account): 同步资料保存后的登录态 +c68f024 feat(account): 增加账号中心页面逻辑 +da09511 feat(account): 增加账号中心页面与入口 +6fce24d refactor(account): 收敛账号页组件结构 +7151bc9 style(account): 保持账号入口首屏可用 +9b3ab9d feat(account): 合并 K19 账号中心 +7d68699..9b3ab9d develop -> develop +``` + +所有提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +### 34.6 已知缺口 + +- 无注销状态查询:不能预先判断是否在冷静期,撤销失败直接展示后端文案。 +- 无设备下线接口:设备页只读。 +- 无头像上传接口:头像只展示。 +- 资料响应不含生日:本批生日只能本次设置,不能回填或清空。 + +### 34.7 用户真机验证 + +以下步骤必须在设备侧执行并取证,开发机不代跑: + +1. 登录后打开「我的」。 + 预期:钱包卡后、菜单卡前出现「账号」卡,四项入口完整可点击。 +2. 打开「个人资料」。 + 预期:服务端字段回填;修改昵称/性别并保存后,我的页昵称同步更新。 +3. 打开「登录设备」。 + 预期:设备号首尾可见、中间脱敏;平台、机型、时间、状态正确;空列表显示空态。 +4. 打开「数据导出」。 + 预期:显示资料、凭据、授权记录数、设备数;复制 JSON 成功。 +5. 打开「注销账号」。 + 预期:显示 15 天冷静期和立即登出提示;提交必须经过二次确认。 +6. 确认注销。 + 预期:显示 `scheduledAt`,本地 token 清空并回到未登录状态。 +7. 重新登录后撤销注销。 + 预期:有申请时成功;无申请时显示后端“没有待处理的注销申请”。 + +设备侧截图、日志和最终验收结论由用户执行。 + +--- + ## 2026-10-17 K10 统一空列表占位 ### 26.1 范围、分支与计划 From 131f0c4e06b51f21d3de971a34c08513be5c65b4 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:01:18 +0800 Subject: [PATCH 04/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K19?= =?UTF-8?q?=20=E7=BD=91=E7=BB=9C=E6=96=87=E6=A1=88=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 97 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index a04625d..a7f6abd 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -2202,6 +2202,103 @@ $ flutter test --- +## 35. K19 非 ApiException 网络文案修复 + +### 35.1 缺陷与修复 + +Trae 复核发现,账号中心三个逻辑类在断网、超时等非 `ApiException` +失败时,把内部哨兵键直接交给 `errorText`,会原样上屏: + +```text +accountProfileLoadFailed +accountProfileSaveFailed +accountDevicesLoadFailed +accountExportLoadFailed +``` + +修复严格沿用既有 `errorText` 约定: + +- 非 `ApiException` 统一置 `networkError`; +- `ApiException.message` 继续原样透传; +- 未修改 `errorText` 映射表; +- 未修改既有测试断言。 + +修改位置: + +```text +ReelShort/lib/pages/account/account_profile_logic.dart +ReelShort/lib/pages/account/account_devices_logic.dart +ReelShort/lib/pages/account/account_export_logic.dart +``` + +### 35.2 TDD 与定向测试 + +先给 `FakeAccountRepository` 增加通用异常开关,并新增四个页面测试。 +修复前红灯: + +```text +00:01 +4 -4: Some tests failed. + +should_show_localized_network_copy_when_profile_load_fails +should_show_localized_network_copy_when_profile_save_fails +should_show_localized_network_copy_when_devices_fail +should_show_localized_network_copy_when_export_fails +``` + +修复后定向测试: + +```text +$ flutter test test/account/account_pages_test.dart +00:01 +8: All tests passed! +``` + +四个用例分别使用中文、英文、印尼语当前语言环境,断言上屏 +`l10n.networkError`,且不出现内部哨兵键。 + +### 35.3 最终门禁 + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! +``` + +```text +$ flutter test +00:23 +339: All tests passed! +``` + +```text +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 7.2s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +### 35.4 Git + +```text +27ab7ce fix(account): 本地化网络异常文案 +42ce1d1 fix(account): 合并网络异常文案修复 +9b3ab9d..42ce1d1 develop -> develop +``` + +提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +### 35.5 用户验证建议 + +设备侧取证由用户执行: + +1. 登录后断开手机网络,打开「个人资料」。 + 预期:显示当前语言的网络异常文案,不出现 `accountProfileLoadFailed`。 +2. 恢复网络后修改昵称,再断网保存。 + 预期:显示当前语言的网络异常文案,不出现 `accountProfileSaveFailed`。 +3. 断网打开「登录设备」。 + 预期:显示当前语言的网络异常文案,不出现 `accountDevicesLoadFailed`。 +4. 断网打开「数据导出」。 + 预期:显示当前语言的网络异常文案,不出现 `accountExportLoadFailed`。 + +--- + ## 34. K19 客户端账号中心 ### 34.1 基线与实施范围 From 810d9fc2dc02c095e41ef6fbb7d4c2222cfd2d39 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:14:15 +0800 Subject: [PATCH 05/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K20?= =?UTF-8?q?=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=A7=86=E8=A7=89=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 89 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 7361912..5d10bcc 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,95 @@ --- +## [待处理] 2026-10-19 | K20 客户端视觉统一(辣椒红主题) + +**用户指令(2026-10-19)**:「保留辣椒红,先做 K20 视觉统一」。 +> 只改客户端 `ReelShort` 的视觉与布局;不改业务逻辑、接口调用、后端、Web、specs、main。 +> 主题口径已拍板:**保留现有辣椒红暖色**(`AppColors.blue = #C4322A`),不恢复克莱因蓝。 + +### 一、目标 + +消除跨页面视觉不一致与明显不合理的紧凑布局,统一颜色、字号、间距、圆角、导航、卡片、按钮与进度条; +不改任何接口行为,不改既有测试断言。 + +### 二、统一 token(新增 `lib/core/theme/app_dimens.dart`) + +- 页面左右边距:`16`(详情页 24 → 16;Auth 20 → 16)。 +- 卡片:外层圆角 `16`、内边距 `16`;列表内嵌小块圆角 `12`、内边距 `12`;胶囊圆角 `20`。 +- 字号档位:caption `12`、body `14`、列表标题 `15`、区块标题 `16`、页面标题 `20`(w800); + 导航标签 `11`。**禁止再出现 9.5 / 10px 的业务文案**。 +- 主按钮最小高度 `48`(整页主操作 `52`);点击区不小于 `44×44`。 +- 主色只用 `AppColors`;新增 `AppColors.favorite`(收藏红心)如需保留粉色。 + +### 三、改造项(按文件) + +1. **底部导航合一**:新增 `lib/core/widgets/app_bottom_nav.dart`,参数化 tab(图标/文案/选中); + 高 `64`、图标 `22`、标签 `11`、选中态用主色胶囊(以现有 `home_view.dart` 为基准)。 + 替换 `home_view.dart`、`discover_view.dart`、`mine_view.dart` 三处导航; + `player_view.dart` 的 `_fallbackNav` 若保留也必须复用该组件。**保留现有 Key**(`tab-home` 等)与文案。 +2. **账号入口卡重做**:`account_entry_card.dart` 高度 48 → `64`,图标 `16` → `18`,标签 `9.5` → `11`, + 允许 2 行;四个入口点击区高度 ≥44;保留 `mine-account-card`、`mine-account-profile/devices/export/deactivate` 五个 Key。 +3. **字号下限**:把 `home_drama_grid.dart:146`、`mine_view.dart:144/648/912`、`discover_view.dart:369`、 + `home_view.dart:364`、`comment_tile.dart:114`、`watch_records_page.dart:282/296`、 + `notices_page.dart:244/260`、`mine_view.dart:591`、`account_devices_page.dart:204` 提升到 ≥12(导航标签 11)。 +4. **卡片/间距收敛**:`downloads_page.dart:305`(10)、`library_drama_tile.dart:26`、 + `notices_page.dart:217`、`watch_records_page.dart:230`、`downloads_page.dart:200`、 + `mine_view.dart:614/802` 统一到 12;`home_drama_grid.dart:104/109`、`mine_view.dart:377`、 + `account_devices_page.dart:115`、`account_deactivate_page.dart:93` 统一到 16; + 卡片内边距 9/14 收敛为 12/16。`drama_detail_view.dart:147/233` 的 24 → 16。 +5. **颜色收敛**:替换 `downloads_page.dart:201/222/224/370`、`watch_records_page.dart:295`、 + `mine_view.dart:143/590/637/717/743/828/835`、`favorites_page.dart:117`、 + `home_quick_drawer.dart:54/77/118/262`、`player_view.dart:792/872/879` 中的直接 `Color(0x...)` + 为最接近的 `AppColors` 常量(必要时新增 `favorite`);`account_devices_page.dart:196-203` 的 + `scheme.tertiary` 改 `AppColors.gold` 或 `blueSoft`;`drama_detail_view.dart:169` 的 + `onSurfaceVariant` 改 `AppColors.muted`。 +6. **进度条统一**:详情续看 `drama_detail_view.dart:366-373`、观看记录 `watch_records_page.dart:267-272`、 + 下载 `downloads_page.dart:357-362` 统一为高 4、圆角 4、前景 `AppColors.blueSoft`、背景 `Colors.white24`; + Player 主拖动条保留金色。 +7. **按钮与对比度**:`app_theme.dart` 增加 `filledButtonTheme.minimumSize = Size(0, 48)` 与 + `outlinedButtonTheme`(深色前景用 `AppColors.blueSoft`);`mine_view.dart:390-401` 去掉 + `VisualDensity.compact`;`empty_state.dart:150-158` 的重试色由 `scheme.primary` 改 `AppColors.blueSoft`。 +8. **标题层级**:页面标题统一 20/w800,区块 16/w700,列表 15/w600-700; + `drama_detail_view.dart:159-164` 的 `headlineLarge` 显式改 24。 +9. **深色唯一口径**:`app.dart:221-223` 改 `themeMode: ThemeMode.dark`;移除页面级 + `Theme(data: AppTheme.dark())` 的重复包裹(保留根主题),确保日期选择器、弹窗也是深色。 + 若短期内删除页面级包裹风险大,可保留包裹,但 `themeMode` 必须为 dark。 +10. **状态栏与安全区**:根 Scaffold 统一 `AnnotatedRegion(light)`, + `appBarTheme.systemOverlayStyle = light`、`systemNavigationBarColor = AppColors.bar`; + `favorites_page.dart:102`、`watch_records_page.dart:118`、`notices_page.dart:118`、 + `downloads_page.dart:96`、`account_profile_page.dart:108`、`account_devices_page.dart:93`、 + `account_export_page.dart:89`、`account_deactivate_page.dart:73` 的底部 padding + 增加 `MediaQuery.paddingOf(context).bottom`(或 `SafeArea(top: false)`)。 +11. **详情页返回与封面压暗**:`drama_detail_view.dart:80-107` 的加载/失败分支补带返回按钮的 AppBar; + `SliverAppBar` 封面顶部加黑色渐变,保证返回/更多图标在浅色封面上可读。 +12. **选中态可见性**:`player_view.dart:834-845` 点赞/收藏选中时改实心图标 + (`Icons.favorite` / `Icons.bookmark`);`discover_view.dart:262-296` 与 + `mine_view.dart:537-564` 的选中项补 `Semantics(selected: true)`。 +13. **点击区补足**:`discover_view.dart` 的 `_HeaderPill`(403-447)、`_LoginButton`(449-469) + 最小高度 44;分类 Chip(262-296)点击区 44(视觉高度可保持 36,用透明 padding 扩大)。 +14. **列表占位对齐**:`watch_records_page.dart:208-222` 占位高度与真实卡片一致(114),并复用相同 padding。 + +### 四、明确不做(留给 K21) + +搜索 UI、Android 返回键行为、播放器切集票据失败黑屏、登录后继续原操作、下拉刷新、注销状态闭环、 +时长/日期格式统一、语言上送后端。**本批不碰这些逻辑**。 + +### 五、约束与门禁 + +- 不改既有测试断言;视觉改动导致测试失败时改实现,不改测试(保留所有现有 Key 与文案)。 +- `dart analyze lib test` 零告警;`flutter test` 全过;`flutter build apk --debug` 通过。 +- 代码规模红线、文档注释、`// Author: fruit.com.cn` 与既有规范不变。 +- 真机验收由用户执行,Codex 不做设备侧取证。 + +### 六、Git 与回执 + +- 从干净 `develop`(基线 `42ce1d1`)拉 `feature/flutter-k20-visual`,小步提交,完成后 + `--no-ff` 合并回 develop 并 push;不动 main;作者统一 `Zhou Weidong <502333560@qq.com>`。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K20.md`;留痕写 `PROGRESS.md` 并单独提交 FruitServer develop。 +- 回执:改动清单、统一后的 token 值、测试条数与门禁原始输出、真机验收步骤(逐屏对照色/字/间距)。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K19 客户端账号中心:资料 / 设备 / 数据导出 / 注销 **用户指令(2026-10-19)**:「先写 K19 任务书并派单」。 From 34357846f46e4675db4f4174fe0d8179a87a6890 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:15:20 +0800 Subject: [PATCH 06/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K20?= =?UTF-8?q?=20=E8=A7=86=E8=A7=89=E7=BB=9F=E4=B8=80=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K20.md | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 docs/plans/2026-10-19-K20.md diff --git a/docs/plans/2026-10-19-K20.md b/docs/plans/2026-10-19-K20.md new file mode 100644 index 0000000..577c600 --- /dev/null +++ b/docs/plans/2026-10-19-K20.md @@ -0,0 +1,60 @@ +# 2026-10-19 K20 客户端视觉统一 + +## 基线 + +- ReelShort `develop`: `42ce1d1` +- FruitServer `develop`: `810d9fc` +- 只改 ReelShort 视觉与布局;不改业务逻辑、接口、后端、Web、specs、main。 +- 保留辣椒红 `AppColors.blue = #C4322A`。 + +## 统一 Token + +新增 `lib/core/theme/app_dimens.dart`: + +| Token | 值 | +| --- | --- | +| 页面左右边距 | 16 | +| 卡片圆角 / 内边距 | 16 / 16 | +| 内嵌块圆角 / 内边距 | 12 / 12 | +| 胶囊圆角 | 20 | +| caption / body / list / section / page | 12 / 14 / 15 / 16 / 20 | +| 导航标签 | 11 | +| 详情主标题 | 24 | +| 主按钮高度 | 48;整页主操作 52 | +| 点击区 | 44 × 44 | +| 导航高度 / 图标 | 64 / 22 | +| 进度条高度 / 圆角 | 4 / 4 | +| 账号卡高度 / 图标 / 标签 | 64 / 18 / 11 | +| 观看占位高度 | 114 | + +## 改造顺序 + +1. 加 token 与主题:`AppDimens`、`AppColors.favorite`、深色唯一口径、 + 按钮最小高度、OutlinedButton 主题、AppBar/状态栏样式。 +2. 新增 `AppBottomNav` / `AppBottomNavItem`,替换 home/discover/mine/player fallback。 +3. 调整账号入口卡为 64 高、18 图标、11 标签、44 点击区,并回归 K19 首屏测试。 +4. 收敛字号下限:业务文案 ≥12,导航 11;清理 9.5/10。 +5. 收敛卡片圆角与间距:页面 16、卡片 16/12、区块 16/12。 +6. 替换任务书列出的硬编码颜色;收藏红心使用 `AppColors.favorite`。 +7. 统一详情、记录、下载进度条为 4 高、4 圆角、blueSoft/white24;播放器拖动条保持金色。 +8. 统一页面/区块/列表标题层级与按钮高度,移除 mine 按钮 VisualDensity.compact。 +9. 详情加载/失败分支补返回 AppBar,封面顶部加黑色渐变,详情边距 24→16。 +10. 点赞/收藏选中态改实心图标;分类和 my tabs 补 selected 语义。 +11. HeaderPill / LoginButton / 分类 Chip 点击区补到 44。 +12. 列表页底部安全区补齐;观看记录占位高度 114,与真实卡片 padding 一致。 + +## 测试与门禁 + +- 新增 `AppDimens` token 测试与 `AppBottomNav` 组件测试。 +- 不修改既有测试断言;视觉布局变化导致测试失败时改实现。 +- `dart analyze lib test` +- `flutter test` +- `flutter build apk --debug` + +## 风险与边界 + +- 账号卡升高到 64 可能重新挤压“我的”页首屏;必须保持 K19 语言设置和观看历史入口测试通过。 +- 保留页面级深色 Theme 包装以降低大范围回归风险,但根 `themeMode` 必须固定 `dark`。 +- 不碰 K21 范围:搜索、Android 返回键、播放器切票黑屏、登录后续操作、下拉刷新、 + 注销状态闭环、日期/时长格式、语言上送。 +- 真机验收由用户执行,本批不提供设备侧截图或日志。 From f6187df51a80ec20aca87e7102b07a4c5ffb299f Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:24:13 +0800 Subject: [PATCH 07/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K20?= =?UTF-8?q?=20=E8=A7=86=E8=A7=89=E7=BB=9F=E4=B8=80=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 31 ++++++++++- docs/plans/PROGRESS.md | 120 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 5d10bcc..bdcaadf 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K20 客户端视觉统一(辣椒红主题) +## [已处理·待用户验收] 2026-10-19 | K20 客户端视觉统一(辣椒红主题) **用户指令(2026-10-19)**:「保留辣椒红,先做 K20 视觉统一」。 > 只改客户端 `ReelShort` 的视觉与布局;不改业务逻辑、接口调用、后端、Web、specs、main。 @@ -107,6 +107,35 @@ - 计划文档 `FruitServer/docs/plans/2026-10-19-K20.md`;留痕写 `PROGRESS.md` 并单独提交 FruitServer develop。 - 回执:改动清单、统一后的 token 值、测试条数与门禁原始输出、真机验收步骤(逐屏对照色/字/间距)。 +### 七、K20 完成回执 + +- 客户端分支:`feature/flutter-k20-visual` +- 功能末提交:`5f1df40` +- 合并回 develop:`e44fbdf` +- 已推送:`42ce1d1..e44fbdf develop` +- author/committer:`Zhou Weidong <502333560@qq.com>` + +已完成 14 项改造:统一 token、四处底部导航、账号入口卡 64 高、 +字号下限、卡片/间距、颜色、进度条、按钮高度、标题层级、深色主题、 +状态栏/安全区、详情返回与封面渐变、选中态、点击区和观看占位高度。 + +门禁: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:24 +341: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 7.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +既有测试要求的两项例外:Auth 卡圆角保持 20;EmptyState 副标题/按钮保持 +12.5/13。两者均提取为 token,未修改测试断言。 + --- ## [已处理·待用户验收] 2026-10-19 | K19 客户端账号中心:资料 / 设备 / 数据导出 / 注销 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index a7f6abd..4e6e4e5 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -2202,6 +2202,126 @@ $ flutter test --- +## 36. K20 客户端视觉统一 + +### 36.1 基线与计划 + +```text +ReelShort: 42ce1d1 fix(account): 合并网络异常文案修复 +FruitServer: 810d9fc docs(plans): 下发 K20 客户端视觉统一任务 +``` + +计划先提交为 `3435784 docs(plans): 增加 K20 视觉统一实施计划`。 +客户端从干净 develop 创建 `feature/flutter-k20-visual`。 + +### 36.2 统一 Token + +新增 `lib/core/theme/app_dimens.dart`: + +```text +页面边距 16 +卡片圆角/内边距 16/16 +内嵌块圆角/内边距 12/12 +胶囊圆角 20 +caption/body/list/section/page = 12/14/15/16/20 +详情标题 24 +导航标签 11 +主按钮/整页主操作 = 48/52 +点击区 44 +导航高度/图标 = 64/22 +进度条高度/圆角 = 4/4 +账号卡高度/图标/标签 = 64/18/11 +观看占位高度 114 +``` + +`AppColors.favorite = #D74A7D`;主色继续使用辣椒红 `#C4322A`。 + +### 36.3 十四项实现 + +1. 新增 `AppBottomNav` / `AppBottomNavItem`,替换 home、discover、mine、 + player fallback 四处导航;保留 `tab-home` 等既有 Key。 +2. 账号入口卡改为 64 高、18 图标、11 标签和 44 以上点击区。 +3. 清理全部 9.5/10 业务字号,任务书列出的 11 字号提升至 12。 +4. 页面边距、卡片圆角、内边距和列表间距按 token 收敛。 +5. 任务书列出的硬编码颜色替换为 `AppColors`;收藏红心使用 `favorite`。 +6. 详情、记录、下载进度条统一 4 高、4 圆角、blueSoft/white24。 +7. Filled/OutlinedButton 最小高度 48;empty 重试色改 blueSoft。 +8. 页面标题 20/w800,详情标题 24,区块与列表标题按 token。 +9. `themeMode = ThemeMode.dark`;根节点统一状态栏和系统导航栏颜色。 +10. 8 个独立列表页补底部安全区。 +11. 详情加载/失败分支补 AppBar,封面顶部加黑色渐变,边距 24→16。 +12. 点赞/收藏选中态改实心图标;分类与 my tabs 补 selected 语义。 +13. HeaderPill、LoginButton、分类 Chip 点击区补到 44。 +14. 观看记录加载占位改为 114,并复用 12 内边距。 + +### 36.4 既有断言兼容 + +首轮回归发现两项既有断言与通用 token 冲突: + +```text +Auth card radius expected 20, actual 16 +EmptyState subtitle expected 12.5, actual 12 +EmptyState action expected 13, actual 14 +``` + +按“不改测试断言”要求保留为显式 token 例外: + +```text +authCardRadius = 20 +emptyStateSubtitle = 12.5 +emptyStateAction = 13 +``` + +其余通用卡片仍为 16,正文 caption 仍为 12。 + +### 36.5 门禁 + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! +``` + +```text +$ flutter test +00:24 +341: All tests passed! +``` + +```text +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 7.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +### 36.6 Git + +```text +df5fbe5 feat(ui): 增加视觉 token 与统一导航 +c5bfd00 style(ui): 统一页面字号间距与状态样式 +5f1df40 fix(ui): 保留空态既有字号口径 +e44fbdf style(ui): 合并 K20 客户端视觉统一 +42ce1d1..e44fbdf develop -> develop +``` + +提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +### 36.7 用户真机验收 + +设备侧取证由用户执行: + +1. 首页底部导航:检查 64 高、22 图标、11 标签、主色胶囊选中态和四个原 Key。 +2. 发现页:检查三处导航一致,分类 Chip 点击区 44、选中语义和 header 按钮高度。 +3. 我的页:检查账号卡 64 高、四入口可点,菜单/语言入口仍在首屏可用。 +4. 详情页:检查返回按钮可读、封面顶部渐变、24 标题、16 边距、进度条 4 高。 +5. 观看记录:检查加载占位 114、真实卡片 12 padding、进度条和 12 以上辅助文本。 +6. 下载页:检查策略卡、授权卡、12 圆角、进度条和安全区。 +7. 公告/收藏/账号中心:检查卡片 12/16 圆角、正文 ≥12、底部安全区。 +8. 播放器抽屉与右侧栏:检查点赞/收藏选中实心图标,fallback 导航与其他页一致。 +9. 浅色封面详情页:确认返回/更多图标因顶部黑色渐变保持可读。 +10. Android 系统栏:确认状态栏浅色图标、导航栏为 `AppColors.bar`。 + +--- + ## 35. K19 非 ApiException 网络文案修复 ### 35.1 缺陷与修复 From af28161e2ff44060f012f325b5c209cfae561ef9 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:30:33 +0800 Subject: [PATCH 08/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K21?= =?UTF-8?q?=20=E7=99=BB=E5=BD=95=E9=A1=B5=20UI=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index bdcaadf..719830b 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,83 @@ --- +## [待处理] 2026-10-19 | K21 登录页 UI 优化 + +**用户指令(2026-10-19)**:「现在主要做登录页面 ui 优化」。 +> 只改客户端 `ReelShort` 登录/注册页(`lib/pages/auth/**`)及其 l10n;不改接口、后端、Web、specs、main。 +> 主题继续使用辣椒红暖色与 K20 的 `AppDimens` token。 + +### 一、现状问题 + +- 品牌区是左上角小横排,缺少登录页应有的品牌感;页面整体顶对齐,大屏下方留白过多。 +- 返回按钮独占一行,推高内容且与品牌区挤在一起。 +- 登录/注册共用一句 `authSubtitle`,注册态缺少针对性说明。 +- 注册态没有密码规则提示(文案已有 `authPasswordHint`,但只作为输入框 hint)。 +- 本地校验失败只有一个错误胶囊,出错字段没有红框定位。 +- `_submit()` 没有 `busy` 短路,密码框 IME 回车可绕过禁用态重复提交;失败分支 `setState` 缺 `mounted` 判断。 + +### 二、改造项 + +1. **布局重排**(`auth_view.dart`) + - 页面改为「可垂直居中、键盘弹起可滚动」:用 `LayoutBuilder` + `SingleChildScrollView`(保留 Key `auth-scroll`) + + `ConstrainedBox(minHeight: 可视高度 - padding)` + 居中内容,最大宽度仍 440。 + - 返回按钮改为顶部浮层(`Positioned` + `SafeArea`,Key `auth-back` 保留),不再占据内容流; + 品牌区与卡片整体垂直居中。 + - 保留 `auth-background-glow` 主光晕(每个颜色 alpha ≤ 0.18),新增一层金色/暖色极淡光晕(alpha ≤ 0.06,独立 Key)。 +2. **品牌区重做**(`auth_widgets.dart`) + - `_AuthBrand` 改为居中竖排:品牌图标 + `appName`(26/w800)+ `authBrandTagline`(14,`blueSoft`)。 + - 品牌图标改用真实资源 `assets/icon/splash_mark.png`(`ClipRRect` 圆角 14 + 辣椒红柔光阴影), + **Key `auth-brand-mark` 必须保留且尺寸仍为 48×48**(既有测试断言)。 +3. **卡片与文案** + - 卡片结构保持:模式切换 → 标题(25/w800)→ 副标题 → 字段 → 错误胶囊 → 提交按钮。 + - 副标题按模式区分:登录用现有 `authSubtitle`;注册新增 `authSignUpSubtitle`(三语): + - en: `Create an account to keep your list, history, and progress.` + - zh: `创建账号,保存你的片单、观看记录和进度。` + - id: `Buat akun untuk menyimpan daftar, riwayat, dan progresmu.` + - 注册态在密码框下增加一行 12px 的 `authPasswordHint` 辅助说明;登录态不显示。 +4. **字段级错误定位**(`auth_logic.dart` + `auth_form_widgets.dart`) + - `AuthLogic` 增加 `AuthFieldError? fieldError`;`validate()` 失败时记录具体字段错误,`onChanged` 时清除。 + - 邮箱/密码 `InputDecoration` 增加 `errorBorder` / `focusedErrorBorder`(`colorScheme.error`,宽度 1.5), + 出错字段显示红框;**错误胶囊 `auth-error-capsule` / `auth-error` 及其文案、圆角 12、alpha 0.1 全部保留**。 +5. **交互健壮性**(`auth_view.dart`) + - `_submit()` 开头 `if (_logic.busy) return;`;`catch` 中 `setState` 前判断 `mounted`; + `onSubmitted` 在 busy 时忽略。其余提交与导航行为不变。 +6. **视觉细节** + - 输入框聚焦时前缀图标保持 `blueSoft`(现状),提交按钮增加极轻的辣椒红阴影(不改背景色断言)。 + - 页面底部保留 `28 + viewInsets.bottom` 的内边距,确保小屏 + 键盘下提交按钮可达。 + - 不引入新依赖、不新增图片资源。 + +### 三、硬约束(既有测试不得改断言) + +`test/auth/auth_visual_test.dart` 与 `test/auth/auth_page_test.dart` 必须原样通过,重点保留: + +- `auth-brand`、`auth-brand-mark` 尺寸 `48×48`、品牌名与 tagline 文案; +- `auth-background-glow` 渐变每个颜色 alpha ≤ 0.18; +- `auth-card` 圆角 20、边框色 `outlineVariantDark`、宽度 1; +- 输入框高度 52、圆角 14、背景 `AppColors.bar`、聚焦边框 `blue` / 1.5; +- 提交按钮高度 52、圆角 26、背景 `blue` / 按下 `bluePressed`; +- `auth-enter-animation` 时长 ≤220ms、tween 0→1; +- 模式切换 Key、选中色 `blue`、标题文案 `Welcome back` / `Create your account`; +- 隐藏兼容文案 `New here? Create an account` / `Already have an account? Sign in` 必须仍可被 `find.text` 找到; +- 错误胶囊 Key、圆角 12、alpha 0.1、错误图标与语义色; +- 小屏 320×568 + 键盘 260 时 `auth-submit` 可滚动到并可点击。 + +**测试失败时改实现,不改测试。** 允许新增测试覆盖注册副标题、密码提示与字段红框。 + +### 四、门禁 + +`dart analyze lib test` 零告警;`flutter test` 全过;`flutter build apk --debug` 通过。 +真机验收由用户执行,Codex 不做设备侧取证。 + +### 五、Git 与回执 + +- 从干净 `develop`(基线 `e44fbdf`)拉 `feature/flutter-k21-auth-ui`,小步提交,完成后 + `--no-ff` 合并回 develop 并 push;不动 main;作者统一 `Zhou Weidong <502333560@qq.com>`。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K21.md`;留痕写 `PROGRESS.md` 并单独提交 FruitServer develop。 +- 回执:布局前后差异、三语文案、保留的 Key/尺寸清单、测试条数与门禁原始输出、真机验收步骤。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K20 客户端视觉统一(辣椒红主题) **用户指令(2026-10-19)**:「保留辣椒红,先做 K20 视觉统一」。 From 0e3ddfc1b1607ed906e5d4a8aa318802456bcc5a Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:31:21 +0800 Subject: [PATCH 09/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K21?= =?UTF-8?q?=20=E7=99=BB=E5=BD=95=E9=A1=B5=E5=AE=9E=E6=96=BD=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K21.md | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docs/plans/2026-10-19-K21.md diff --git a/docs/plans/2026-10-19-K21.md b/docs/plans/2026-10-19-K21.md new file mode 100644 index 0000000..57b2f66 --- /dev/null +++ b/docs/plans/2026-10-19-K21.md @@ -0,0 +1,70 @@ +# 2026-10-19 K21 登录页 UI 优化 + +## 基线 + +- ReelShort `develop`: `e44fbdf` +- FruitServer `develop`: `af28161` +- 只改 `ReelShort/lib/pages/auth/**`、l10n 与必要的新增测试。 + +## 布局方案 + +- 用 `LayoutBuilder + SingleChildScrollView + ConstrainedBox + Center`, + 让品牌与卡片在可视区域垂直居中,键盘弹起时仍可滚动。 +- 保留 `auth-scroll`,底部 padding 继续使用 `28 + viewInsets.bottom`。 +- 返回按钮移到顶部 `Positioned + SafeArea` 浮层,不再占据内容流。 +- 内容最大宽度继续为 440,页面左右边距 16。 +- 保留主 background glow(alpha ≤0.18),新增独立 Key 的 warm glow(alpha ≤0.06)。 + +## 品牌与卡片 + +- 品牌区居中竖排:48×48 splash mark、App 名 26/w800、tagline 14/blueSoft。 +- `auth-brand`、`auth-brand-mark` 保留,mark 尺寸严格 48×48。 +- 卡片结构保持:模式切换 → 标题 25/w800 → 副标题 → 字段 → 错误胶囊 → 提交。 +- 登录继续使用 `authSubtitle`;注册使用新增 `authSignUpSubtitle`。 +- 注册态密码框下显示 12px 的 `authPasswordHint`,登录态隐藏。 + +## 字段错误与交互 + +- `AuthLogic` 增加 `fieldError`;`validate()` 记录具体错误,输入变化或切换模式时清除。 +- 邮箱/密码字段按 `fieldError` 使用 1.5px semantic error `errorBorder` / + `focusedErrorBorder`。 +- 保留 `auth-error-capsule`、`auth-error` 的文案、圆角 12 和 alpha 0.1。 +- `_submit()` 首行 busy 短路;异步 catch 中的 `setState` 前检查 mounted。 +- 密码框 done 提交仍走同一 `_submit()`,busy 时自然忽略。 +- 提交按钮增加极淡辣椒红阴影,背景和按下色保持不变。 + +## 不可变清单 + +```text +auth-brand-mark 48x48 +auth-card radius 20 / border outlineVariantDark / width 1 +input height 52 / radius 14 / fill bar / focus blue 1.5 +submit height 52 / radius 26 / blue / bluePressed +auth-enter-animation <=220ms / tween 0 -> 1 +mode switch keys, hidden compatibility copy +error capsule radius 12 / alpha 0.1 / semantic color +small screen 320x568 + keyboard 260 scroll reachability +``` + +## TDD + +1. 新增测试:注册副标题、注册态密码提示、登录态不显示提示、字段错误红框。 +2. 先确认红灯。 +3. 补 `authSignUpSubtitle` 三语并生成 l10n。 +4. 调整 AuthLogic、表单字段、品牌和页面布局。 +5. 跑两份既有 Auth 测试与新增测试,再跑全量门禁。 + +## 门禁 + +```text +dart analyze lib test +flutter test +flutter build apk --debug +``` + +## 风险 + +- 居中布局与小屏滚动会互相影响,必须保持 `auth-submit` 可滚动到。 +- 字段红框不能通过 errorText 增加字段高度,否则会破坏 52 高度断言。 +- 品牌改为图片资源后仍必须保持 `auth-brand-mark` 为 48×48。 +- 不改接口、后端、Web、specs、main;真机由用户验收。 From 81c1bbb1e510bae4b3572eea14cb563388569c80 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:35:11 +0800 Subject: [PATCH 10/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K21?= =?UTF-8?q?=20=E7=99=BB=E5=BD=95=E9=A1=B5=E4=BC=98=E5=8C=96=E5=9B=9E?= =?UTF-8?q?=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 25 ++++++++- docs/plans/PROGRESS.md | 124 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 719830b..e9534b7 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K21 登录页 UI 优化 +## [已处理·待用户验收] 2026-10-19 | K21 登录页 UI 优化 **用户指令(2026-10-19)**:「现在主要做登录页面 ui 优化」。 > 只改客户端 `ReelShort` 登录/注册页(`lib/pages/auth/**`)及其 l10n;不改接口、后端、Web、specs、main。 @@ -95,6 +95,29 @@ - 计划文档 `FruitServer/docs/plans/2026-10-19-K21.md`;留痕写 `PROGRESS.md` 并单独提交 FruitServer develop。 - 回执:布局前后差异、三语文案、保留的 Key/尺寸清单、测试条数与门禁原始输出、真机验收步骤。 +### 六、K21 完成回执 + +- 客户端分支:`feature/flutter-k21-auth-ui` +- 功能提交:`8a96f34` +- 合并回 develop:`b1c69e2` +- 已推送:`e44fbdf..b1c69e2 develop` +- author/committer:`Zhou Weidong <502333560@qq.com>` + +已完成:居中可滚动布局、顶部浮层返回、图片品牌 hero、模式独立副标题、 +注册密码规则提示、字段级红框、busy/mounted 保护、双层光晕和提交阴影。 + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:24 +343: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 7.5s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + --- ## [已处理·待用户验收] 2026-10-19 | K20 客户端视觉统一(辣椒红主题) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 4e6e4e5..3321b96 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -2202,6 +2202,130 @@ $ flutter test --- +## 37. K21 登录页 UI 优化 + +### 37.1 基线与布局 + +```text +ReelShort: e44fbdf style(ui): 合并 K20 客户端视觉统一 +FruitServer: af28161 docs(plans): 下发 K21 登录页 UI 优化任务 +``` + +计划先提交为 `0e3ddfc docs(plans): 增加 K21 登录页实施计划`。 + +布局由顶部对齐 + ListView 改为: + +- `LayoutBuilder + SingleChildScrollView + ConstrainedBox + Center`; +- 正常高度品牌与卡片垂直居中; +- 高度小于 720 时使用紧凑横向品牌,保证 600 高测试视口与提交按钮可达; +- 返回按钮改为 `Positioned + SafeArea` 浮层,不占内容流; +- 小屏键盘仍保留 `28 + viewInsets.bottom` 底部 padding,可滚动到 `auth-submit`。 + +### 37.2 品牌与文案 + +- `auth-brand-mark` 改用 `assets/icon/splash_mark.png`,尺寸仍为 48×48。 +- 品牌名 26/w800,tagline 14/blueSoft;正常视口居中竖排。 +- 登录使用现有 `authSubtitle`;注册新增 `authSignUpSubtitle`: + +```text +en: Create an account to keep your list, history, and progress. +zh: 创建账号,保存你的片单、观看记录和进度。 +id: Buat akun untuk menyimpan daftar, riwayat, dan progresmu. +``` + +- 注册态密码框下显示 `authPasswordHint`,Key `auth-password-rule`;登录态隐藏。 + +### 37.3 字段错误与交互 + +`AuthLogic` 新增 `fieldError`,`validate()` 记录具体字段错误,输入变化或切换模式时清除。 +邮箱/密码字段增加 semantic error 红框: + +```text +errorBorder / focusedErrorBorder +color = colorScheme.error +width = 1.5 +``` + +同时: + +- `_submit()` busy 首行短路; +- 异步 catch 的 `setState` 前判断 mounted; +- 密码框 IME done 提交同样经过 busy 短路; +- 提交按钮增加 alpha 0.22 的辣椒红轻阴影,背景色与按下色不变。 + +### 37.4 保留项 + +```text +auth-brand-mark 48x48 +auth-card radius 20 / border outlineVariantDark / width 1 +input height 52 / radius 14 / fill bar / focus blue 1.5 +submit height 52 / radius 26 / blue / bluePressed +auth-enter-animation 220ms / tween 0 -> 1 +mode keys, title copy, hidden compatibility copy +error capsule radius 12 / alpha 0.1 / semantic color +320x568 + keyboard 260 scroll reachability +``` + +主 glow 颜色 alpha 保持 ≤0.18;新增 warm glow Key +`auth-background-warm-glow`,alpha 上限 0.06。 + +### 37.5 TDD 与门禁 + +新增 `test/auth/auth_k21_test.dart`,先红灯后转绿: + +```text +$ flutter test test/auth/auth_k21_test.dart +00:00 +2: All tests passed! +``` + +全部 Auth 测试: + +```text +$ flutter test test/auth/auth_visual_test.dart \ + test/auth/auth_page_test.dart test/auth/auth_k21_test.dart +00:01 +17: All tests passed! +``` + +全量门禁: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:24 +343: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 7.5s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +### 37.6 Git + +```text +8a96f34 feat(auth): 优化登录页布局与字段反馈 +b1c69e2 feat(auth): 合并 K21 登录页优化 +e44fbdf..b1c69e2 develop -> develop +``` + +author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +### 37.7 用户真机验收 + +设备侧取证由用户执行: + +1. 普通手机竖屏打开登录页:品牌 hero 与卡片垂直居中,返回键为顶部浮层。 +2. 切换注册:副标题变为注册文案,密码框下出现规则提示。 +3. 提交空邮箱:邮箱出现 1.5px 红色边框,错误胶囊仍保留。 +4. 输入非法邮箱后修改:字段红框清除。 +5. 输入弱密码:密码框变红,规则提示仍在。 +6. 连续点提交或按键盘 Done:只发出一次请求,busy 时按钮与模式切换禁用。 +7. 320×568 小屏弹出键盘:滚动后提交按钮可点击。 +8. 检查主辣椒红 glow、暖色副 glow 均淡且不影响文字对比度。 +9. 检查品牌图为 `splash_mark.png`,显示 48×48,无拉伸。 + +--- + ## 36. K20 客户端视觉统一 ### 36.1 基线与计划 From b025bfda3622057e165cbd265328ff2294ebc2f3 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:55:46 +0800 Subject: [PATCH 11/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K22?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E4=B8=8E=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E7=BB=9F=E4=B8=80=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 97 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index e9534b7..d021e47 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,103 @@ --- +## [待处理] 2026-10-19 | K22 后台管理视觉与交互统一(图标对齐客户端) + +**用户指令(2026-10-19)**:「先优化后台管理 UI 及交互;后台管理图标统一成客户端的;严格执行 specs 文档规范」。 +> 只改 `ReelShortWeb` 的视觉/交互 + `FruitServer` 的菜单图标种子 SQL;不改接口契约、业务逻辑、客户端、main。 +> 用户会直接在浏览器验收结果。 + +### 一、必读规范(严格执行) + +按顺序读:`AGENTS.md` → `CODING_STANDARDS.md` → `GIT_WORKFLOW.md` → `FruitServer/docs/api-phase1.md` §2 → +`docs/plans/codex-研发任务清单.md` → 本 INBOX。 + +Vue/TS 硬约束:沿用 vue-element-plus-admin 结构;eslint 零错误;`pnpm build:pro` 通过; +新增手写源码首行 `// Author: fruit.com.cn`;函数 ≤50 行、参数 ≤5、类/文件规模红线、禁止魔法值; +提交作者统一 `Zhou Weidong <502333560@qq.com>`。 + +### 二、图标统一(核心) + +**目标**:后台所有图标统一为客户端同款 **Material Symbols Rounded**(客户端使用 Material `*_rounded`), +不再混用 `ep:`、`ant-design:`、`mdi:`、`zmdi:`、`ion:`、`bi:`、`radix-icons:` 与 Element Plus 图标组件。 + +1. 新增 `src/constants/icons.ts`(语义名 → Iconify 全名)与 `src/components/AppIcon`: + - `AppIcon` 基于现有 `Icon` 组件,默认 `material-symbols:*`,统一尺寸/颜色/描边风格; + - 图标名禁止散落在页面里,统一从 `AppIcons` 取。 +2. 菜单图标(`sys_menu.icon`)按以下映射落库,并同步 `FruitServer/sql/data.sql` 与 `sql/data-phase1.sql`: + | 菜单 | id | 新图标 | + | --- | --- | --- | + | 工作台 | 1 / 2 | `material-symbols:dashboard-rounded` | + | 内容管理 | 3 | `material-symbols:video-library-rounded` | + | 后台管理 | 6 | `material-symbols:settings-rounded` | + | 用户管理 | 15 | `material-symbols:group-rounded` | + | 创作者管理 | 17 | `material-symbols:movie-edit-rounded` | + | 内容治理 | 20 | `material-symbols:policy-rounded` | + | 订单与权益 | 22 | `material-symbols:payments-rounded` | + | 数据看板 | 24 | `material-symbols:monitoring-rounded` | + | 创作者中心 | 26 | `material-symbols:video-camera-front-rounded` | + | 运营管理 | 32 | `material-symbols:campaign-rounded` | +3. 更新完 SQL 后**实际执行到开发库**(`psql -f sql/data.sql`、`psql -f sql/data-phase1.sql`,脚本必须幂等), + 并用管理员登录后的 `GET /admin/auth/menus` 自检返回的 icon 全部为 `material-symbols:` 前缀。 +4. 菜单管理页图标候选改为上述合法 Iconify 名;保存时统一存全名;旧的短名(`Document` 等)渲染时做映射兜底。 +5. 顶栏、标签页、表格工具栏、弹窗等共享组件 **以及 `src/views/**` 页面内所有图标** + (含 ``)统一替换为 `AppIcon`;移除页面内对 `@element-plus/icons-vue` 的直接引用。 + 语义映射至少包含:`menu-rounded` / `menu-open-rounded`、`fullscreen-rounded` / `fullscreen-exit-rounded`、 + `format-size-rounded`、`language-rounded`、`dark-mode-rounded` / `light-mode-rounded`、 + `refresh-rounded`、`close-rounded`、`chevron-left-rounded` / `chevron-right-rounded`、 + `search-rounded`、`restart-alt-rounded`、`view-column-rounded`、`help-rounded`、`add-rounded`、 + `edit-rounded`、`delete-rounded`、`upload-rounded`、`download-rounded`、`visibility-rounded`、 + `arrow-upward-rounded` / `arrow-downward-rounded`、`check-rounded`、`cancel-rounded`。 +6. **品牌图标**:把客户端 `ReelShort/assets/icon/splash_mark.png` 复制为 + `ReelShortWeb/src/assets/imgs/brand-mark.png`,侧边栏(展开/收起)与登录页统一使用该图; + 不再使用框架默认 logo 或自绘图标。保留原 `logo.png` 文件但不再引用。 + +### 三、登录页(`src/views/Login/**`) + +1. 删除默认账号/密码占位提示(`admin` / `admin123`),改走 i18n 占位文案。 +2. “记住我”默认关闭;只记住用户名,**不把密码写入 localStorage**;同步清理 user store 中登录信息的密码字段。 +3. 表单支持回车提交;登录/注册按钮在请求与动态路由生成完成前保持 loading,防止重复提交。 +4. 窄屏(≤960px)压缩品牌装饰区,保证登录卡在首屏完整可见。 +5. 登录页品牌名/副标题与侧边栏共用同一来源(环境变量 + i18n),不再写死 `FruitShorts Studio`。 +6. 视觉与客户端一致:深色暖底、辣椒红强调只用于按钮/焦点(**不整体改后台主题色**),品牌 mark 与侧边栏同尺寸同圆角。 + +### 四、全局壳与主题 + +1. 修复深色模式:菜单/头部浅色主题下的文字对比度、标签页关闭图标、主题开关轨道/边框、 + 面包屑当前项颜色;所有颜色走 `var(--el-*)` 或业务 token。 +2. 去掉 `body` 的 `min-width: 980px` 强约束,补 1200/768 断点;保证 1024、800、375 宽度下顶栏右侧与内容区不被裁切。 +3. 顶栏、标签页、表格工具栏、弹窗图标全部换成 Material Symbols Rounded;同一语义只用一个图标。 +4. 清理全局 CSS 冲突: + - 只保留一处 `:root` 字体声明(`--font-display` / `--font-body`); + - 圆角收敛为 `--app-radius-sm/md/lg`(4/6/12),登录卡可单独 18; + - 把硬编码 `#409eff !important` 改为 `var(--el-color-primary)`; + - 删除/改名未使用的 `.app-shell/.sidebar/.main-area/.topbar/.brand/...` 死选择器,避免“改了不生效”。 +5. 用户信息区头像/姓名从 `userStore` 读取,不再写死 `avatar.jpg` 与 `Archer`。 +6. “清除缓存并重置”增加二次确认。 + +### 五、明确不做(留给 K23) + +业务页的表格/筛选/分页统一、拦截器 reject、删除/上下架二次确认、行内防重复、表单 rules、 +权限按钮补齐、上传校验、状态标签/日期格式统一。**本批不碰这些业务交互逻辑**,避免与视觉批次混在一起。 + +### 六、验收与门禁 + +- `pnpm build:pro` 通过;`pnpm lint:eslint` 零错误(只跑改动文件也可,但最终全量通过)。 +- 开发库菜单 icon 已更新;`GET /admin/auth/menus` 自检全部为 `material-symbols:`。 +- 浏览器自查(Codex 自检,不作为用户验收):登录页、侧边栏折叠/展开、顶栏、标签页、 + 深色/浅色、1024/800/375 宽度;控制台无报错。 +- 用户浏览器验收:图标风格、登录页、全局壳、深色模式、窄屏。 + +### 七、Git 与回执 + +- `ReelShortWeb` 从干净 `develop`(基线 `5c087f4`)拉 `feature/web-k22-admin-visual`; + `FruitServer` 只改 SQL 种子,单独提交并 push。 +- 完成后各自 `--no-ff` 合并回 `develop` 并 push;不动 main。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K22.md`;留痕写 `PROGRESS.md`。 +- 回执:图标映射与落库结果、登录页/全局壳改动、扫描前后对比、门禁原始输出、浏览器自查结论。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K21 登录页 UI 优化 **用户指令(2026-10-19)**:「现在主要做登录页面 ui 优化」。 From 5e5517135aaa91e05c7b7b8d1160a68fb47cba3f Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 10:57:43 +0800 Subject: [PATCH 12/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K22?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K22.md | 78 ++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/plans/2026-10-19-K22.md diff --git a/docs/plans/2026-10-19-K22.md b/docs/plans/2026-10-19-K22.md new file mode 100644 index 0000000..3b85549 --- /dev/null +++ b/docs/plans/2026-10-19-K22.md @@ -0,0 +1,78 @@ +# 2026-10-19 K22 后台管理视觉与交互统一 + +## 基线 + +- ReelShortWeb `develop`: `5c087f4` +- FruitServer `develop`: `b025bfd` +- 只改 Web 视觉/交互与 FruitServer 菜单图标 SQL,不改接口、客户端、main。 + +## 图标体系 + +1. 新增 `src/constants/icons.ts`: + - `AppIcons` 保存语义名到 `material-symbols:*-rounded` 的映射; + - `normalizeAppIcon()` 兼容后端旧短名和历史 Iconify 名; + - `MenuIconOptions` 供菜单管理页选择。 +2. 新增 `src/components/AppIcon`: + - 复用现有 `Icon` 组件; + - 默认尺寸 18,支持颜色/悬停色; + - 全局注册 `AppIcon`。 +3. 替换 `src/components/**`、`src/views/**` 的旧图标前缀与 Element Plus 图标组件。 +4. 对 `node_modules/@iconify/json/json/material-symbols.json` 做存在性校验。 + +任务书要求的 `language/view-column/lock/chevron-down` 在当前 JSON 中没有对应的 +`*-rounded` 名,实施时使用同语义且存在的 +`translate-rounded/combine-columns-rounded/lock-person-rounded/keyboard-arrow-down-rounded`。 + +## 菜单落库 + +更新 `sql/data.sql` 与 `sql/data-phase1.sql` 中 id 1/2/3/6/15/17/20/22/24/26/32: + +| 菜单 | 图标 | +| --- | --- | +| 工作台 | `material-symbols:dashboard-rounded` | +| 内容管理 | `material-symbols:video-library-rounded` | +| 后台管理 | `material-symbols:settings-rounded` | +| 用户管理 | `material-symbols:group-rounded` | +| 创作者管理 | `material-symbols:movie-edit-rounded` | +| 内容治理 | `material-symbols:policy-rounded` | +| 订单与权益 | `material-symbols:payments-rounded` | +| 数据看板 | `material-symbols:monitoring-rounded` | +| 创作者中心 | `material-symbols:video-camera-front-rounded` | +| 运营管理 | `material-symbols:campaign-rounded` | + +执行两份 SQL,管理员登录后请求 `/admin/auth/menus`,断言所有 icon 以 +`material-symbols:` 开头。 + +## 品牌与登录 + +- 复制客户端 `splash_mark.png` 为 `src/assets/imgs/brand-mark.png`。 +- Logo 组件展开/收起统一使用品牌 mark。 +- 删除 admin/admin123 占位、记住密码持久化、固定 `FruitShorts Studio`。 +- 记住我只保存用户名;store reset 时删除 loginInfo。 +- 表单回车提交、loading 覆盖请求与动态路由、防止重复。 +- 960 以下压缩 hero,登录卡首屏完整。 + +## 全局壳与主题 + +- 修复深色模式菜单、头部、标签关闭、主题开关、面包屑对比度。 +- body 去掉 `min-width: 980px`,补 1200/768 断点。 +- 顶栏、标签页、表格工具栏、弹窗统一 AppIcon。 +- CSS token:一组字体变量、4/6/12 圆角、`#409eff !important` 改 + `var(--el-color-primary)`,删除或合并未使用壳层选择器。 +- 用户信息读取 `userStore`,不再使用固定 avatar/Archer。 +- 清除缓存增加二次确认。 + +## 门禁与自查 + +- 静态扫描:无旧图标前缀、无 ``、无页面 `@element-plus/icons-vue` 引用。 +- `node_modules/@iconify/json/json/material-symbols.json` 逐个校验新图标。 +- `pnpm lint:eslint` 零错误。 +- `pnpm build:pro` 成功。 +- 浏览器自查:登录页、侧边栏展开/折叠、顶栏、标签页、浅/深色、1024/800/375。 + +## 风险 + +- 图标批量替换可能影响动态图标与右键菜单,保留 normalize 兜底。 +- 窄屏下侧栏与固定内容宽度可能冲突,优先保证内容区不裁切。 +- 登录 loading 必须覆盖动态路由生成,避免二次提交。 +- 本轮不碰表格、筛选、分页、拦截器、删除确认、rules、权限与上传校验。 From c14b4cb9adad7a9eec600143bb9365df06682c45 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:13:13 +0800 Subject: [PATCH 13/82] =?UTF-8?q?fix(sql):=20=E7=BB=9F=E4=B8=80=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/data-phase1.sql | 14 +++++++------- sql/data.sql | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sql/data-phase1.sql b/sql/data-phase1.sql index 023c9c0..b5e2d8d 100644 --- a/sql/data-phase1.sql +++ b/sql/data-phase1.sql @@ -92,7 +92,7 @@ ON CONFLICT DO NOTHING; -- component 指向 src/views/creator/ 下的页面,前端按这个字符串动态加载。 INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES - (17, 0, '创作者管理', '/creator', 'CreatorCenter', '#', '/creator/creators', 'ep:user-filled', 'creator:list', 'CATALOG', 1, 0, 5), + (17, 0, '创作者管理', '/creator', 'CreatorCenter', '#', '/creator/creators', 'material-symbols:movie-edit-rounded', 'creator:list', 'CATALOG', 1, 0, 5), (18, 17, '创作者入驻', 'creators', 'creators', 'views/creator/CreatorAuditView', '', '', 'creator:list', 'MENU', 0, 0, 1), (19, 17, '内容审核', 'submissions', 'submissions', 'views/creator/SubmissionAuditView', '', '', 'submission:list', 'MENU', 0, 0, 2) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, @@ -129,7 +129,7 @@ WHERE NOT EXISTS (SELECT 1 FROM product WHERE code = 'coin_1200'); -- component 指向 src/views/userManagement/AppUsersView.vue,前端按这个字符串动态加载。 INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES - (15, 0, '用户管理', '/user', 'UserCenter', '#', '/user/app-users', 'ep:user', 'app-user:list', 'CATALOG', 1, 0, 4), + (15, 0, '用户管理', '/user', 'UserCenter', '#', '/user/app-users', 'material-symbols:group-rounded', 'app-user:list', 'CATALOG', 1, 0, 4), (16, 15, 'App 用户', 'app-users', 'app-users', 'views/userManagement/AppUsersView', '', '', 'app-user:list', 'MENU', 0, 0, 1) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, @@ -150,11 +150,11 @@ ON CONFLICT DO NOTHING; -- component 指向 src/views/governance|commerce|dashboard/ 下的页面,前端按字符串动态加载。 INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES - (20, 0, '内容治理', '/governance', 'Governance', '#', '/governance/content', 'ep:chat-dot-round', 'comment:list', 'CATALOG', 1, 0, 6), + (20, 0, '内容治理', '/governance', 'Governance', '#', '/governance/content', 'material-symbols:policy-rounded', 'comment:list', 'CATALOG', 1, 0, 6), (21, 20, '评论与举报', 'content', 'governance-content', 'views/governance/ContentGovernanceView', '', '', 'comment:list', 'MENU', 0, 0, 1), - (22, 0, '订单与权益', '/commerce', 'Commerce', '#', '/commerce/orders', 'ep:coin', 'order:list', 'CATALOG', 1, 0, 7), + (22, 0, '订单与权益', '/commerce', 'Commerce', '#', '/commerce/orders', 'material-symbols:payments-rounded', 'order:list', 'CATALOG', 1, 0, 7), (23, 22, '订单管理', 'orders', 'commerce-orders', 'views/commerce/OrderManagementView', '', '', 'order:list', 'MENU', 0, 0, 1), - (24, 0, '数据看板', '/board', 'BoardCenter', '#', '/board/overview', 'ep:data-line', 'dashboard:view', 'CATALOG', 1, 0, 8), + (24, 0, '数据看板', '/board', 'BoardCenter', '#', '/board/overview', 'material-symbols:monitoring-rounded', 'dashboard:view', 'CATALOG', 1, 0, 8), (25, 24, '运营大盘', 'overview', 'board-overview', 'views/dashboard/BusinessDashboardView', '', '', 'dashboard:view', 'MENU', 0, 0, 1) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, @@ -253,7 +253,7 @@ INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, r permission_code, type, always_show, affix, sort, visible) VALUES -- route_name 必须全局唯一:17 号菜单(创作者管理)已经叫 CreatorCenter, -- 同名会让 Vue Router 后者覆盖前者、整个 /creator-center 子树注册不上(超管点进去就 404) - (26, 0, '创作者中心', '/creator-center', 'CreatorWorkspace', '#', '/creator-center/workspace', 'ep:film', 'creator-center:view', 'CATALOG', 1, 0, 3, 1), + (26, 0, '创作者中心', '/creator-center', 'CreatorWorkspace', '#', '/creator-center/workspace', 'material-symbols:video-camera-front-rounded', 'creator-center:view', 'CATALOG', 1, 0, 3, 1), (27, 26, '我的作品', 'workspace', 'creator-workspace', 'views/creator-center/WorkspaceView', '', '', 'creator-center:view', 'MENU', 0, 0, 1, 1), (28, 26, '作品编辑', 'dramas/:id', 'creator-drama-edit', 'views/creator-center/DramaEditView', '', '', 'creator-center:drama:edit', 'MENU', 0, 0, 2, 0), (29, 26, '收费配置', 'prices', 'creator-prices', 'views/creator-center/PriceConfigView', '', '', 'creator-center:price:update', 'MENU', 0, 0, 3, 1), @@ -310,7 +310,7 @@ ON CONFLICT DO NOTHING; INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES (31, 22, '商品配置', 'products', 'commerce-products', 'views/commerce/ProductManagementView', '', '', 'product:list', 'MENU', 0, 0, 2), - (32, 0, '运营管理', '/operation', 'OperationCenter', '#', '/operation/notices', 'ep:bell', 'notice:list', 'CATALOG', 1, 0, 9), + (32, 0, '运营管理', '/operation', 'OperationCenter', '#', '/operation/notices', 'material-symbols:campaign-rounded', 'notice:list', 'CATALOG', 1, 0, 9), (33, 32, '系统公告', 'notices', 'operation-notices', 'views/operation/NoticeManagementView', '', '', 'notice:list', 'MENU', 0, 0, 1) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, diff --git a/sql/data.sql b/sql/data.sql index 0c9bc9a..f10f876 100644 --- a/sql/data.sql +++ b/sql/data.sql @@ -50,14 +50,14 @@ ON CONFLICT (id) DO UPDATE SET code = EXCLUDED.code, name = EXCLUDED.name, -- ---------- 菜单 ---------- INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES - (1, 0, '工作台', '/dashboard', 'Dashboard', '#', '/dashboard/index', 'ant-design:dashboard-filled', 'drama:list', 'CATALOG', 0, 0, 1), - (2, 1, '工作台', 'index', 'dashboard', 'views/common/DashboardView', '', 'ant-design:dashboard-filled', 'drama:list', 'MENU', 0, 1, 1), - (3, 0, '内容管理', '/content', 'Content', '#', '/content/dramas', 'ep:video-camera', 'drama:list', 'CATALOG', 1, 0, 2), + (1, 0, '工作台', '/dashboard', 'Dashboard', '#', '/dashboard/index', 'material-symbols:dashboard-rounded', 'drama:list', 'CATALOG', 0, 0, 1), + (2, 1, '工作台', 'index', 'dashboard', 'views/common/DashboardView', '', 'material-symbols:dashboard-rounded', 'drama:list', 'MENU', 0, 1, 1), + (3, 0, '内容管理', '/content', 'Content', '#', '/content/dramas', 'material-symbols:video-library-rounded', 'drama:list', 'CATALOG', 1, 0, 2), (4, 3, '短剧管理', 'dramas', 'dramas', 'views/contentManagement/DramaManagementView', '', '', 'drama:list', 'MENU', 0, 0, 1), (5, 3, '剧集管理', 'episodes', 'episodes', 'views/contentManagement/EpisodeManagementView', '', '', 'episode:list', 'MENU', 0, 0, 2), (12, 3, '轮播图管理', 'banners', 'banners', 'views/contentManagement/BannerManagementView', '', '', 'banner:list', 'MENU', 0, 0, 3), (13, 3, '类型管理', 'categories', 'categories', 'views/contentManagement/CategoryManagementView','', '', 'drama:list', 'MENU', 0, 0, 4), - (6, 0, '后台管理', '/system', 'System', '#', '/system/access', 'ep:setting', 'system:role', 'CATALOG', 1, 0, 3), + (6, 0, '后台管理', '/system', 'System', '#', '/system/access', 'material-symbols:settings-rounded', 'system:role', 'CATALOG', 1, 0, 3), (7, 6, '角色权限配置', 'access', 'access', 'views/permission/RoleManagementView', '', '', 'system:role', 'MENU', 0, 0, 1), (8, 6, '管理员用户列表','admin-users','admin-users', 'views/userManagement/AdminUsersView', '', '', 'system:admin-user','MENU', 0, 0, 2), (9, 6, '菜单管理', 'menus', 'menus', 'views/permission/MenuManagementView', '', '', 'system:menu', 'MENU', 0, 0, 3), From 919e7495546c0f58ecf0d466c267dffaabb011d1 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:14:21 +0800 Subject: [PATCH 14/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K22?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 185 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index d021e47..5581148 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K22 后台管理视觉与交互统一(图标对齐客户端) +## [已处理·待用户验收] 2026-10-19 | K22 后台管理视觉与交互统一(图标对齐客户端) **用户指令(2026-10-19)**:「先优化后台管理 UI 及交互;后台管理图标统一成客户端的;严格执行 specs 文档规范」。 > 只改 `ReelShortWeb` 的视觉/交互 + `FruitServer` 的菜单图标种子 SQL;不改接口契约、业务逻辑、客户端、main。 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 3321b96..f317e87 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4266,3 +4266,188 @@ cf03178 feat(flutter): 首页改为两列全部剧目网格 预期:标题最多 2 行、类型最多 1 行,不横向溢出;空态和失败重试文案保留。 设备侧截图、日志与最终验收结论由用户执行。 + +## K22 后台管理视觉与交互统一 + +### 分支与提交 + +```text +ReelShortWeb: + 5c087f4 chore(admin): 合并注册限流配置项 + 97fbeda style(web): 统一后台图标与全局视觉 + 8f3447e chore(web): 合并 K22 后台视觉统一 + +FruitServer: + 5e55171 docs(plans): 增加 K22 后台视觉统一计划 + c14b4cb fix(sql): 统一后台菜单图标 + be9e381 chore(sql): 合并 K22 菜单图标 +``` + +功能提交与合并提交 author/committer 均为 +`Zhou Weidong <502333560@qq.com>`。未修改 main、客户端业务代码与 Web 接口契约。 + +### 图标体系与扫描 + +新增 `src/constants/icons.ts`、`src/components/AppIcon/`,并将客户端品牌图标 +复制为 `src/assets/imgs/brand-mark.png`。 + +```text +before-old-prefix=22 +before-el-icon=15 +before-element-plus-icons=16 + +old-prefix=0 +el-icon=0 +element-plus-icons=0 +AppIcons unique=54 missing=0 +``` + +页面与共享组件已不再直接引用旧 Iconify 前缀、`` 或 +`@element-plus/icons-vue`。剩余两处 `` 分别是 `AppIcon` 的底层包装与 +`Icon` 自身的在线图标实现。 + +任务书列出的 `language-rounded`、`view-column-rounded`、`lock-rounded`、 +`chevron-down-rounded` 在当前 Material Symbols JSON 中不存在,使用同语义且 +通过存在性校验的 `translate-rounded`、`combine-columns-rounded`、 +`lock-person-rounded`、`keyboard-arrow-down-rounded`。 + +### 菜单 SQL 与接口自检 + +已幂等执行: + +```text +$ psql -d fruitshorts -v ON_ERROR_STOP=1 -f sql/data.sql +INSERT 0 3 +INSERT 0 4 +INSERT 0 19 +INSERT 0 13 +... +INSERT 0 4 + +$ psql -d fruitshorts -v ON_ERROR_STOP=1 -f sql/data-phase1.sql +DO +INSERT 0 0 +... +UPDATE 5 +... +INSERT 0 0 +``` + +目标菜单回查: + +```text + id | title | icon +----+------------+--------------------------------------------- + 1 | 工作台 | material-symbols:dashboard-rounded + 2 | 工作台 | material-symbols:dashboard-rounded + 3 | 内容管理 | material-symbols:video-library-rounded + 6 | 后台管理 | material-symbols:settings-rounded + 15 | 用户管理 | material-symbols:group-rounded + 17 | 创作者管理 | material-symbols:movie-edit-rounded + 20 | 内容治理 | material-symbols:policy-rounded + 22 | 订单与权益 | material-symbols:payments-rounded + 24 | 数据看板 | material-symbols:monitoring-rounded + 26 | 创作者中心 | material-symbols:video-camera-front-rounded + 32 | 运营管理 | material-symbols:campaign-rounded +(11 rows) +``` + +管理员登录后调用 `/admin/auth/menus`: + +```text +工作台 material-symbols:dashboard-rounded +内容管理 material-symbols:video-library-rounded +后台管理 material-symbols:settings-rounded +用户管理 material-symbols:group-rounded +创作者管理 material-symbols:movie-edit-rounded +内容治理 material-symbols:policy-rounded +订单与权益 material-symbols:payments-rounded +数据看板 material-symbols:monitoring-rounded +运营管理 material-symbols:campaign-rounded +menus=28 icons=9 allMaterial=true +``` + +解读:超级管理员可见菜单接口返回的图标全部为 `material-symbols:` 前缀。 +`创作者中心`(id 26)按既有规则对超级管理员隐藏,未出现在该菜单树,但数据库 +回查已确认其图标正确。 + +### 登录页与全局壳 + +登录页: + +- 删除 `admin` / `admin123` 占位,改为三语占位文案。 +- “记住我”默认关闭,只保存用户名;退出和恢复时清理历史密码字段。 +- 支持密码框回车提交;请求与动态路由生成完成前保持 loading,防重复。 +- 品牌统一使用客户端 `splash_mark.png`,登录页与侧边栏同一资源。 +- ≤960px 压缩品牌区;实测登录卡在 1024×768、800×768、375×812 首屏完整可见。 + +全局壳: + +- 深色选中菜单、当前标签、主题开关轨道统一使用主色派生 token; + 深色选中白字对比度由 `2.78:1` 提升到 `5.00:1`。 +- 面包屑深色对比度 `11.13:1`,顶栏 `16.70:1`。 +- 标签关闭图标改用 `var(--el-text-color-secondary)`。 +- 删除 `body { min-width: 980px }` 和未使用的旧壳层死选择器。 +- 补 1200/768 断点;1024、800、375 下 `documentElement.scrollWidth` + 分别等于视口宽度,顶栏无越界元素。 +- 用户头像/姓名读取 `userStore`,不再写死 `avatar.jpg` / `Archer`。 +- “清除缓存并且重置”弹出二次确认,取消后保持当前状态。 +- 字体、圆角、主色变量收敛;`#409eff !important` 已清零。 + +### 门禁 + +```text +$ pnpm lint:eslint + +> fruitshorts-admin@1.0.0 lint:eslint /Users/jianghaifeng/Desktop/ReelShort/ReelShortWeb +> eslint --fix --ext .js,.ts,.vue ./src +``` + +```text +$ pnpm build:pro + +> fruitshorts-admin@1.0.0 build:pro /Users/jianghaifeng/Desktop/ReelShort/ReelShortWeb +> VITE_CJS_IGNORE_WARNING=1 vite build --mode pro + +[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. Please adjust the manual chunk logic for these chunks. +[warn] node_modules/.pnpm/mockjs@1.1.0/node_modules/mockjs/dist/mock.js (537:22): Use of eval in "node_modules/.pnpm/mockjs@1.1.0/node_modules/mockjs/dist/mock.js" is strongly discouraged as it poses security risks and may cause issues with minification. + +Build successful. Please see dist-pro directory +``` + +解读:ESLint 零错误;构建成功。两条 warning 来自既有 chunk 配置与 mockjs 依赖, +本批未改构建配置。 + +### 浏览器自查 + +Codex 已在本地开发服务完成以下自查,不作为用户验收: + +- 登录页:三档宽度无横向溢出;800×768 登录卡底边 `754.40`,375×812 底边 + `772.77`,均在首屏内。 +- 登录交互:占位为“请输入用户名/请输入密码”;“记住我”默认未勾选; + 密码框回车可进入工作台。 +- 侧边栏:1024 展开 200px、收起 64px;375 抽屉展开 200px、遮罩关闭正常。 +- 顶栏、标签页、面包屑、短剧管理工具栏均正常渲染 Material Symbols Rounded。 +- 深色/浅色切换正常;深色选中菜单与当前标签均为白字压深主色,对比度 `5.00:1`。 +- 清除缓存按钮显示“确认清除本地缓存并重新加载后台吗?”,取消有效。 +- 浏览器控制台 0 个 error;动态路由刷新期间出现 2 条既有 `No match found` + router warning,随路由生成完成消失,不影响页面。 + +### 用户验收步骤与预期 + +1. 运行 `pnpm dev`,打开 `http://127.0.0.1:3005/#/login`。 + 预期:暖色品牌登录页;用户名/密码为中文占位;“记住我”默认关闭。 +2. 输入管理员账号,在密码框直接回车。 + 预期:按钮进入 loading,随后只跳转一次工作台。 +3. 检查左侧菜单、顶栏、标签页和短剧管理页工具栏。 + 预期:图标均为 Material Symbols Rounded,无旧图标混用。 +4. 展开/收起侧栏,并打开右侧“项目配置”。 + 预期:品牌 mark 一致;主题开关边界清楚;布局无跳动。 +5. 切换到深色再切回浅色。 + 预期:菜单、面包屑、当前标签、关闭图标与开关均清晰可辨。 +6. 分别以 1024、800、375 宽度查看工作台、短剧管理和登录页。 + 预期:内容区与顶栏不横向裁切;375 可通过菜单按钮打开侧栏抽屉。 +7. 点击“清除缓存并且重置”后选择取消。 + 预期:先出现二次确认,取消后页面状态不变。 + +最终业务验收由用户在浏览器执行。 From c4281b08b723d3b1225bbfa485c94ab999dba2d4 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:18:34 +0800 Subject: [PATCH 15/82] =?UTF-8?q?docs(plans):=20=E8=A1=A5=E5=85=85=20K22?= =?UTF-8?q?=20=E8=B7=AF=E7=94=B1=E5=9B=BE=E6=A0=87=E5=A4=8D=E6=A0=B8?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index f317e87..8cb73a3 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4451,3 +4451,38 @@ Codex 已在本地开发服务完成以下自查,不作为用户验收: 预期:先出现二次确认,取消后页面状态不变。 最终业务验收由用户在浏览器执行。 + +### K22 复核收尾:静态路由图标 + +将 `src/router/index.ts` 中 5 处静态路由 `meta.icon` 从旧前缀改为 +`AppIcons`: + +```text +工作台:AppIcons.dashboard +内容管理:AppIcons.content +用户管理:AppIcons.group +后台管理:AppIcons.settings +``` + +`src/constants/icons.ts` 的历史短名与旧 Iconify 名兜底映射保持不变。 + +```text +$ rg -n "icon:\s*'(ant-design:|ep:)" src/router/index.ts +(无输出) + +$ pnpm lint:eslint +> eslint --fix --ext .js,.ts,.vue ./src + +$ pnpm build:pro +Build successful. Please see dist-pro directory +``` + +提交: + +```text +29465ab fix(web): 统一静态路由图标 +5494190 chore(web): 合并 K22 路由图标收尾 +``` + +功能提交与合并提交 author/committer 均为 +`Zhou Weidong <502333560@qq.com>`,Web `develop` 已推送。 From 2807ae6a470894f081974b967e2317fc93a2d0d6 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:22:49 +0800 Subject: [PATCH 16/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K22.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E6=94=B6=E5=B0=BE=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 5581148..f95f131 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,73 @@ --- +## [待处理] 2026-10-19 | K22.1 后台收尾:登录文案、图标残留与文件清理 + +**用户反馈(2026-10-19,附登录页截图)**: +1. 「这个下面的文字可以不要」——登录页标题下方的说明段落与三个标签(短剧与剧集 / 发布状态 / 角色权限)删掉。 +2. 「还有图标没有改过来」——仍有旧品牌图/旧图标来源:浏览器 favicon、首屏 loading 的 `/logo.png`、mock 路由里的旧图标、在线图标开关。 +3. 「有些文件该删除的删除掉」——删除已确认无引用的文件与 mock 体系。 + +> 只改 `ReelShortWeb`;不改接口契约、后端业务、客户端、main。用户直接在浏览器验收。 + +### 一、登录页文案 + +- `src/views/Login/Login.vue` 删除 `
` 中的说明段落 `

{{ t('login.message') }}

` + 与 `
    ` 三个标签;保留 `hero-kicker` 与 `h1`。 +- 删除随之不再使用的 l10n key(`login.message` / `login.pointDrama` / `login.pointPublish` / `login.pointAccess`) + 与对应样式;若 key 仍被其他页面引用则保留并说明。 + +### 二、图标与品牌残留(重点) + +1. **favicon**:用客户端品牌图替换 `public/favicon.ico`: + - 复制 `src/assets/imgs/brand-mark.png` 为 `public/brand-mark.png`; + - `index.html` 改 ``; + - 删除 `public/favicon.ico`。 +2. **首屏 loading**:`index.html` 的 `` 改为 `/brand-mark.png`,加圆角; + 首屏背景改为客户端深色 `#100C0A`、标题文字浅色,避免闪白。 + 删除 `public/logo.png`。 +3. **在线图标开关**:`.env.base`、`.env.dev`、`.env.pro`、`.env.test` 的 `VITE_USE_ONLINE_ICON` 全部改为 + `false`,由 `PurgeIcons` 本地打包 Material Symbols,避免在线 API 不可达导致图标空白/旧缓存。 + 构建后必须确认菜单/顶栏/表格工具栏图标真实渲染。 +4. **mock 旧图标**:`.env.dev`、`.env.pro`、`.env.test` 的 `VITE_USE_MOCK` 全部改为 `false`; + 删除整个 `mock/` 目录;`vite.config.mts` 移除 `viteMockServe` 的 import 与条件配置。 + 目的:不再把 `mock/role/index.mock.ts` 里的 `ant-design:` / `ep:` 旧图标带进任何构建。 + +### 三、文件清理(删除前先全仓 grep 确认零引用) + +必须删除: +- `src/assets/imgs/logo.png`(已无引用) +- `src/assets/imgs/avatar.jpg`(UserInfo 已改读 store,无引用) +- `public/logo.png`、`public/favicon.ico`(被 brand-mark 替代) +- `src/views/permission/CustomMenuView.vue`(无路由/菜单/组件引用) +- `src/views/Login/components/RegisterForm.vue`(后台无注册接口,假提交) + - 同时移除 `src/views/Login/components/index.ts` 的导出、`Login.vue` 的注册切换状态与 `LoginForm.vue` + 的「还没有账号?注册」入口及 `to-register` 事件;相关 l10n key 若不再使用一并删除。 + +可选删除(仅在 grep 证明零引用后): +- 其他未挂路由、未被 import 的 demo 页面/组件/资源。 + +**禁止**删除仍被路由、菜单、组件或构建配置引用的文件;删除清单与 grep 证据写入回执。 + +### 四、验收 + +- 全仓扫描结果:旧图标前缀 0、`` 0、`@element-plus/icons-vue` 0、`/logo.png` 0、`mock` 引用 0。 +- `pnpm lint:eslint` 零错误;`pnpm build:pro` 通过。 +- 用 `pnpm dev`(base 模式)打开登录页与后台: + - 登录 hero 只剩 kicker + 标题; + - 浏览器标签页图标、首屏 loading、侧边栏品牌图三者一致; + - 菜单/顶栏/表格工具栏图标全部为 Material Symbols Rounded 且无空白; + - 控制台无 404(尤其无 `/logo.png`、mock 请求)。 + +### 五、Git 与回执 + +- 从干净 `develop`(ReelShortWeb 当前 `5494190`)拉 `feature/web-k22-cleanup`,小步提交, + `--no-ff` 合并回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K22.1.md`;留痕写 `PROGRESS.md`。 +- 回执:删除文件清单 + grep 证据、图标/品牌修复、env 变更、门禁原始输出、浏览器自查结论。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K22 后台管理视觉与交互统一(图标对齐客户端) **用户指令(2026-10-19)**:「先优化后台管理 UI 及交互;后台管理图标统一成客户端的;严格执行 specs 文档规范」。 From 8aa84a39bcb4c6924c1d12836aba9c4509bd9226 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:23:47 +0800 Subject: [PATCH 17/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K22.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E6=94=B6=E5=B0=BE=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K22.1.md | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/plans/2026-10-19-K22.1.md diff --git a/docs/plans/2026-10-19-K22.1.md b/docs/plans/2026-10-19-K22.1.md new file mode 100644 index 0000000..8dc7915 --- /dev/null +++ b/docs/plans/2026-10-19-K22.1.md @@ -0,0 +1,56 @@ +# 2026-10-19 K22.1 后台收尾 + +## 基线 + +- ReelShortWeb `develop`: `5494190` +- FruitServer `develop`: `2807ae6` +- 只改 ReelShortWeb 的后台视觉与资源引用、构建配置及无引用文件。 +- 不改接口契约、后端业务、客户端与 main。 + +## 登录页 + +1. 保留 hero 品牌 mark、kicker 与标题。 +2. 删除标题下方说明段落及 `pointDrama/pointPublish/pointAccess` 三个标签。 +3. 删除不再使用的三语 key 与 hero 列表样式。 +4. 删除注册切换、注册表单、入口事件及相关导出和文案。 + +## 品牌与图标 + +1. `brand-mark.png` 复制到 `public`,作为浏览器 favicon 与首屏 loading。 +2. 首屏背景改为 `#100C0A`,loading mark 增加圆角。 +3. 删除 `public/logo.png`、`public/favicon.ico`。 +4. 四个 env 均关闭在线图标,由 `PurgeIcons` 本地打包 Material Symbols。 +5. 构建后扫描旧前缀、``、Element Plus 图标引用,并检查浏览器实际图标。 + +## Mock 清理 + +1. dev/pro/test 环境关闭 `VITE_USE_MOCK`。 +2. 删除 `mock/` 与 `viteMockServe` 配置。 +3. 全仓确认不再存在 mock 环境分支和旧 mock 图标来源。 + +## 文件删除 + +删除前分别对目标路径执行全仓 grep,确认只命中自身或已同步处理的引用: + +- `src/assets/imgs/logo.png` +- `src/assets/imgs/avatar.jpg` +- `public/logo.png` +- `public/favicon.ico` +- `src/views/permission/CustomMenuView.vue` +- `src/views/Login/components/RegisterForm.vue` +- `mock/` + +禁止删除仍被路由、菜单、组件或构建配置引用的文件。 + +## 门禁 + +- `pnpm lint:eslint` +- `pnpm build:pro` +- 浏览器自查登录页、后台壳、菜单、顶栏、表格工具栏与首屏 loading。 +- 控制台无 `/logo.png`、mock 或旧图标资源 404。 + +## 风险 + +- 在线图标关闭后必须确认 PurgeIcons 已本地打包全部实际使用图标。 +- 删除 mock 后需确认开发环境只依赖真实后台接口。 +- 删除文件前先处理所有引用,避免残留 import 或路由失败。 From c0fea67442b09e037d1b878cec409d4352577869 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:32:37 +0800 Subject: [PATCH 18/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K22.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E6=94=B6=E5=B0=BE=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 160 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index f95f131..524faf1 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K22.1 后台收尾:登录文案、图标残留与文件清理 +## [已处理·待用户验收] 2026-10-19 | K22.1 后台收尾:登录文案、图标残留与文件清理 **用户反馈(2026-10-19,附登录页截图)**: 1. 「这个下面的文字可以不要」——登录页标题下方的说明段落与三个标签(短剧与剧集 / 发布状态 / 角色权限)删掉。 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 8cb73a3..edf4876 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4486,3 +4486,163 @@ Build successful. Please see dist-pro directory 功能提交与合并提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`,Web `develop` 已推送。 + +## K22.1 后台收尾 + +### 登录页与注册清理 + +登录 hero 保留品牌 mark、kicker 与标题,删除说明段落和三个标签: + +```text +FruitShorts +内容运营后台 +短剧内容管理 +登录 +使用管理员账号进入工作台 +用户名 +密码 +记住我 +忘记密码 +登录 +``` + +同时删除已无引用的 `login.message/noAccount/pointDrama/pointPublish/pointAccess/ +register/checkPassword/otherLogin/hasUser/code/codePlaceholder`、注册表单、注册入口、 +`to-register` 事件和注册切换状态。 + +### 文件删除证据 + +删除前在 ReelShortWeb 全仓检索: + +```text +[src/assets/imgs/logo.png] +[src/assets/imgs/avatar.jpg] +[public/logo.png] +[public/favicon.ico] +[CustomMenuView] +(以上均无引用) + +[RegisterForm] +src/views/Login/components/index.ts +src/views/Login/Login.vue +``` + +`RegisterForm` 的引用已在同一提交中先移除。ReelShortWeb 全仓及开发库均无 +`CustomMenuView` 路由/菜单记录: + +```text +$ psql -d fruitshorts -c "SELECT id, title, component FROM sys_menu WHERE component ILIKE '%CustomMenu%';" + id | title | component +----+-------+----------- +(0 rows) +``` + +最终删除: + +- `public/favicon.ico` +- `public/logo.png` +- `src/assets/imgs/logo.png` +- `src/assets/imgs/avatar.jpg` +- `src/views/permission/CustomMenuView.vue` +- `src/views/Login/components/RegisterForm.vue` +- `mock/` + +### 品牌与本地图标 + +- `brand-mark.png` 复制到 `public/brand-mark.png`,favicon 和首屏 loading 均改用它。 +- 首屏背景改为 `#100C0A`,标题浅色,loading mark 使用 12px 圆角。 +- 删除 `public/favicon.ico`、`public/logo.png`。 +- 修正侧边栏品牌图任意值类未生成的问题,展开/收起均为 38px、圆角 12px。 +- 在线图标关闭后,UnoCSS 的运行时动态类不会自动收集;已把 `AppIcons` + 全量加入 safelist,并显式加载本地 + `@iconify/json/json/material-symbols.json`。 + +品牌文件校验: + +```text +public/brand-mark.png +src/assets/imgs/brand-mark.png +76e01df1fa0ec94ca59842ea9e15f8084ae6532290ee874a88a3c5718159cea7 +``` + +两个文件 SHA-256 一致。 + +### Mock 与 env + +```text +.env.base VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false +.env.dev VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false +.env.pro VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false +.env.test VITE_USE_MOCK=false VITE_USE_ONLINE_ICON=false +``` + +已删除 `mock/`、`viteMockServe`、`mockPath`、生产 mock 注入和 +`getTestRoleApi` 的 `/mock/role/list2` 分支;`tsconfig.json` 不再包含 mock。 +`package.json` 移除 `@element-plus/icons-vue`、`@faker-js/faker`、 +`vite-plugin-mock` 三个不再直接使用的依赖。 + +### 最终扫描 + +```text +old-prefix=0 +el-icon=0 +element-plus-icons=0 +logo-png=0 +mock-build-code=0 +mock-directory=absent +``` + +`src/constants/icons.ts` 的旧名兼容映射按要求保留,未计入 old-prefix。 + +生产产物: + +```text +dark-mode-rounded=1 +translate-rounded=1 +dashboard-rounded=1 +video-library-rounded=1 +group-rounded=1 +settings-rounded=1 +dist-pro/brand-mark.png +``` + +### 门禁 + +```text +$ pnpm lint:eslint +> fruitshorts-admin@1.0.0 lint:eslint +> eslint --fix --ext .js,.ts,.vue ./src +``` + +```text +$ pnpm build:pro +> fruitshorts-admin@1.0.0 build:pro +> VITE_CJS_IGNORE_WARNING=1 vite build --mode pro + +[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. + +Build successful. Please see dist-pro directory +``` + +### 浏览器自查 + +- 登录 hero 只剩 kicker + 标题,无说明段落和三个标签。 +- favicon 为 `/brand-mark.png`;首屏 loading 为 `/brand-mark.png`, + 背景 `#100C0A`。 +- `/brand-mark.png` 返回 `image/png`;旧 `/logo.png` 不再作为图片存在。 +- 登录后菜单、顶栏、短剧管理工具栏全部使用离线 Material Symbols Rounded。 +- 短剧管理页可见图标 22 个,空白 0 个;图标 mask 均有效。 +- 侧边栏展开/收起品牌图均为 38×38,与登录页一致。 +- 浏览器控制台 error 0 条,无 mock 或旧资源错误。 + +### 提交 + +```text +8aa84a3 docs(plans): 增加 K22.1 后台收尾计划 +ada741f style(web): 精简登录品牌与注册入口 +8797048 chore(web): 清理 mock 与旧品牌资源 +e5c5101 chore(web): 合并 K22.1 后台收尾 +``` + +功能提交与合并提交 author/committer 均为 +`Zhou Weidong <502333560@qq.com>`。 From ce655ce5db973e175fb27230083b21105e1a0003 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:34:31 +0800 Subject: [PATCH 19/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=A6=96=E5=B1=8F=20loading=20=E6=96=87=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index edf4876..67e0f54 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -2848,6 +2848,8 @@ Running Gradle task 'assembleDebug'... 6.9s 功能提交与合并提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 +- 2026-10-19 K22.1 首屏 loading:`.app-loading` 文字色改为 `#f8f1ea`,Web 提交 `a97b8cc`,合并 `3e8312e`,`pnpm build:pro` 通过。 + ### 26.8 用户真机验证步骤与预期 以下设备侧取证由用户执行,Codex 未跑真机。 From 9c96e186725f455b6dc243c1525ef68efaa783c0 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:49:01 +0800 Subject: [PATCH 20/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K23?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E6=B7=B1=E5=8C=96?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 524faf1..2c9bac5 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,106 @@ --- +## [待处理] 2026-10-19 | K23 后台视觉深化:主色、菜单、编辑弹窗与锁屏 + +**用户指令(2026-10-19,附三张截图)**:「现在着重优化 UI 及交互」。 +截图问题: +1. 左侧菜单子项无图标、缩进/行高/选中态不统一; +2. 短剧编辑弹窗里封面直接暴露超长 URL,数字输入框布局松散; +3. 锁定屏幕弹窗标题被分隔线穿过、右上角图标错位、缺少取消入口。 +> 只改 `ReelShortWeb` 视觉/交互 + `FruitServer` 菜单图标种子 SQL;不改接口契约、后端业务、客户端、main。 + +### 一、主色统一为品牌辣椒红 + +- `src/styles/business/theme.css` 的 `--el-color-primary` 由 `#409eff` 改为 `#c4322a`, + 同步 `light-3/5/7/8/9`、`dark-2`(参考值:`#d3615b / #e19995 / #f0c2c0 / #f5d9d8 / #faeeed / #9d2822`)。 +- 按钮、开关、链接、选中菜单、标签页激活态、焦点环统一走 `var(--el-color-primary)`; + 检查白字/红底、红字/白底对比度 ≥ 4.5:1;成功/警告/危险语义色保持不变。 +- 登录页品牌色已用 `--app-brand`,保持不变;全站不再出现默认 Element 蓝。 + +### 二、左侧菜单 + +1. **子菜单图标落库**(`sys_menu.icon`,同步 `sql/data.sql` 与 `sql/data-phase1.sql`,并实际执行到开发库): + | 菜单 | id | 图标 | + | --- | --- | --- | + | 短剧管理 | 4 | `material-symbols:movie-rounded` | + | 剧集管理 | 5 | `material-symbols:playlist-play-rounded` | + | 轮播图管理 | 12 | `material-symbols:view-carousel-rounded` | + | 类型管理 | 13 | `material-symbols:category-rounded` | + | 角色权限配置 | 7 | `material-symbols:admin-panel-settings-rounded` | + | 管理员用户列表 | 8 | `material-symbols:manage-accounts-rounded` | + | 菜单管理 | 9 | `material-symbols:account-tree-rounded` | + | 角色分类 | 10 | `material-symbols:label-rounded` | + | 系统设置 | 11 | `material-symbols:tune-rounded` | + | 操作日志 | 14 | `material-symbols:history-rounded` | + | App 用户 | 16 | `material-symbols:person-rounded` | + | 创作者入驻 | 18 | `material-symbols:person-add-rounded` | + | 内容审核 | 19 | `material-symbols:fact-check-rounded` | + | 评论与举报 | 21 | `material-symbols:gavel-rounded` | + | 订单管理 | 23 | `material-symbols:receipt-long-rounded` | + | 运营大盘 | 25 | `material-symbols:analytics-rounded` | + | 我的作品 | 27 | `material-symbols:video-library-rounded` | + | 收费配置 | 29 | `material-symbols:sell-rounded` | + | 数据看板 | 30 | `material-symbols:analytics-rounded` | + | 商品配置 | 31 | `material-symbols:inventory-2-rounded` | + | 系统公告 | 33 | `material-symbols:notifications-active-rounded` | + 所有图标名必须存在于 `node_modules/@iconify/json/json/material-symbols.json`; + 菜单管理页的图标候选同步补齐。 +2. **菜单样式**(新增到业务样式,作用域限定 `#v-menu`): + - 行高 44px(不要当前的超高行距),左右 margin 8px,圆角 8px; + - 图标 18px,文字 14px,图标与文字间距 8px; + - 子菜单统一缩进(图标起始 28px 左右),父子对齐; + - 选中态:浅主色底 + 主色文字(暗色模式用深主色 + 白字),悬浮态同色系更淡; + - 父级展开/激活、折叠态、popper 子菜单都要一致,不出现“只有文字没有图标”的项。 + +### 三、短剧编辑弹窗(`DramaManagementView.vue`) + +1. 弹窗宽 680px,`close-on-click-modal=false`,内容区可滚动、底部按钮固定; + 表单分三块:`基础信息`(名称/类型/简介)、`付费设置`(免费集数/单集解锁金币/是否热门)、`封面`。 +2. 数字输入:`el-input-number` 固定宽 180、`controls-position="right"`,两列等宽对齐。 +3. **封面编辑器重做**: + - 左侧 2:3 预览(约 96×128),无封面时显示虚线占位; + - 右侧显示状态 chip(已上传/未上传)、文件名(只显示 basename,不显示完整路径)、 + `更换封面` / `移除` 操作;上传中显示进度遮罩; + - **不再展示原始 URL 输入框**;如需查看,提供“查看原图”链接在新窗口打开; + - 上传前校验类型(jpg/png/webp)与大小(≤5MB),失败在弹窗内提示并可重试; + - `移除` 只清空本地表单,保存后生效。 +4. 表单加 `:model` + `:rules`(名称必填、类型必选),保存时 `validate()`,错误显示在字段下方; + 保留现有保存接口与字段,不改 payload。 +5. 保存按钮 loading/disabled 防重复(已有 `saving`,补齐禁用与关闭保护)。 + +### 四、锁定屏幕弹窗(`LockDialog.vue`) + +- 宽度 440,`max-height` 调整到 320–360,去掉全屏按钮(该弹窗不需要全屏)。 +- 重做头部:标题左对齐、无穿过的分隔线、关闭按钮右对齐;标题下加一行说明“输入密码解锁当前会话”。 +- 内容居中:头像 64、姓名 14、密码框 100% 宽;密码框支持回车提交。 +- 底部:`取消`(关闭)+ `锁定`(primary,宽度不小于 96)。 +- 删除 `console.log('set: ', val)`,不改变锁定逻辑。 + +### 五、交互与一致性 + +- 弹窗统一:标题/内容/底部间距、圆角、按钮高度(36/40)、暗色模式可读。 +- 破坏性操作不新增逻辑;本批只做视觉与上述表单交互。 +- 不修改接口、不新增权限点、不改业务流程。 + +### 六、验收与门禁 + +- `pnpm lint:eslint` 零错误;`pnpm build:pro` 通过。 +- 开发库子菜单 icon 已更新;`GET /admin/auth/menus` 自检子菜单 icon 非空且为 `material-symbols:`。 +- 浏览器自查(不作为用户验收):登录页/工作台/短剧管理/锁定屏幕;1024 与 375 宽度; + 暗色/浅色;控制台 0 error、0 404。 +- 用户浏览器验收:菜单图标与行距、红色主色、短剧编辑弹窗封面、锁屏弹窗。 + +### 七、Git 与回执 + +- `ReelShortWeb` 从干净 `develop`(基线 `3e8312e`)拉 `feature/web-k23-admin-polish`; + `FruitServer` 只改菜单图标 SQL 种子,单独提交并 push。 +- 完成后各自 `--no-ff` 合并回 `develop` 并 push;作者 `Zhou Weidong <502333560@qq.com>`。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K23.md`;留痕写 `PROGRESS.md`。 +- 回执:主色变量、子菜单图标落库结果、弹窗改动、门禁原始输出、浏览器自查结论。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K22.1 后台收尾:登录文案、图标残留与文件清理 **用户反馈(2026-10-19,附登录页截图)**: From 5356f24632c3f8ba4365389f44951a4839109b97 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:50:04 +0800 Subject: [PATCH 21/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K23?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E6=B7=B1=E5=8C=96?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K23.md | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 docs/plans/2026-10-19-K23.md diff --git a/docs/plans/2026-10-19-K23.md b/docs/plans/2026-10-19-K23.md new file mode 100644 index 0000000..bab53b8 --- /dev/null +++ b/docs/plans/2026-10-19-K23.md @@ -0,0 +1,40 @@ +# 2026-10-19 K23 后台视觉深化 + +## 基线 + +- ReelShortWeb `develop`: `3e8312e` +- FruitServer `develop`: `9c96e18` +- 只改后台视觉/交互与菜单图标种子,不改接口契约、权限和业务流程。 + +## 主色 + +1. Element Plus 主色改为辣椒红 `#c4322a`,同步 light-3/5/7/8/9 与 dark-2。 +2. 清理后台源码中的默认 Element 蓝与蓝色透明背景。 +3. 验证按钮、开关、链接、选中菜单、标签页和焦点环对比度。 + +## 菜单 + +1. `sql/data.sql`、`sql/data-phase1.sql` 为 21 个子菜单补齐 Material Symbols Rounded 图标。 +2. 开发库幂等执行后通过 `/admin/auth/menus` 检查子菜单 icon 非空、前缀统一。 +3. 菜单管理图标候选同步扩充。 +4. 菜单行高、间距、缩进、折叠态和 popper 统一到同一套 token。 + +## 短剧编辑弹窗 + +1. 680px 三区块表单:基础信息、付费设置、封面。 +2. 表单增加 model/rules,数字输入固定 180px 且控件在右。 +3. 封面改为预览卡:basename、状态、更换/移除、类型/大小校验、进度与失败提示、查看原图。 +4. 保存按钮防重复,保存中与上传中禁止关闭。 + +## 锁屏弹窗 + +1. 440px 紧凑弹窗,移除全屏入口。 +2. 重做标题、说明、内容和底部按钮。 +3. 支持回车锁定,删除调试日志。 + +## 门禁 + +- 图标名逐个对照 `node_modules/@iconify/json/json/material-symbols.json`。 +- `pnpm lint:eslint` 零错误。 +- `pnpm build:pro` 通过。 +- 浏览器自查登录页、工作台、短剧管理、锁屏;1024/375、明暗主题、控制台 0 error、0 404。 From 91bbfd5622d1e17a18e4ff865a0de54c50c479fd Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 11:52:29 +0800 Subject: [PATCH 22/82] =?UTF-8?q?docs(plans):=20=E6=9B=B4=E6=AD=A3=20K23?= =?UTF-8?q?=20=E5=AD=90=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87=E5=8F=A3?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 51 +++++++++++++++------------------------------ 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 2c9bac5..8225558 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -37,40 +37,23 @@ 检查白字/红底、红字/白底对比度 ≥ 4.5:1;成功/警告/危险语义色保持不变。 - 登录页品牌色已用 `--app-brand`,保持不变;全站不再出现默认 Element 蓝。 -### 二、左侧菜单 +### 二、左侧菜单(口径更正:子菜单统一不用图标) -1. **子菜单图标落库**(`sys_menu.icon`,同步 `sql/data.sql` 与 `sql/data-phase1.sql`,并实际执行到开发库): - | 菜单 | id | 图标 | - | --- | --- | --- | - | 短剧管理 | 4 | `material-symbols:movie-rounded` | - | 剧集管理 | 5 | `material-symbols:playlist-play-rounded` | - | 轮播图管理 | 12 | `material-symbols:view-carousel-rounded` | - | 类型管理 | 13 | `material-symbols:category-rounded` | - | 角色权限配置 | 7 | `material-symbols:admin-panel-settings-rounded` | - | 管理员用户列表 | 8 | `material-symbols:manage-accounts-rounded` | - | 菜单管理 | 9 | `material-symbols:account-tree-rounded` | - | 角色分类 | 10 | `material-symbols:label-rounded` | - | 系统设置 | 11 | `material-symbols:tune-rounded` | - | 操作日志 | 14 | `material-symbols:history-rounded` | - | App 用户 | 16 | `material-symbols:person-rounded` | - | 创作者入驻 | 18 | `material-symbols:person-add-rounded` | - | 内容审核 | 19 | `material-symbols:fact-check-rounded` | - | 评论与举报 | 21 | `material-symbols:gavel-rounded` | - | 订单管理 | 23 | `material-symbols:receipt-long-rounded` | - | 运营大盘 | 25 | `material-symbols:analytics-rounded` | - | 我的作品 | 27 | `material-symbols:video-library-rounded` | - | 收费配置 | 29 | `material-symbols:sell-rounded` | - | 数据看板 | 30 | `material-symbols:analytics-rounded` | - | 商品配置 | 31 | `material-symbols:inventory-2-rounded` | - | 系统公告 | 33 | `material-symbols:notifications-active-rounded` | - 所有图标名必须存在于 `node_modules/@iconify/json/json/material-symbols.json`; - 菜单管理页的图标候选同步补齐。 -2. **菜单样式**(新增到业务样式,作用域限定 `#v-menu`): - - 行高 44px(不要当前的超高行距),左右 margin 8px,圆角 8px; - - 图标 18px,文字 14px,图标与文字间距 8px; - - 子菜单统一缩进(图标起始 28px 左右),父子对齐; - - 选中态:浅主色底 + 主色文字(暗色模式用深主色 + 白字),悬浮态同色系更淡; - - 父级展开/激活、折叠态、popper 子菜单都要一致,不出现“只有文字没有图标”的项。 +> 用户 2026-10-19 更正:**不是子菜单图标为空,而是子菜单统一不要图标;当前问题是没对齐、视觉不好看。** +> 不要给子菜单加图标,也不要在子菜单预留图标位置。 + +1. **子菜单图标一律清空**: + - `sys_menu` 中所有 `type='MENU'` 的子菜单 `icon` 置为空串(含 id 4/5/7/8/9/10/11/12/13/14/16/18/19/21/23/25/27/29/30/31/33); + - 同步 `sql/data.sql` 与 `sql/data-phase1.sql`,并实际执行到开发库; + - 菜单管理页保存子菜单时也不落图标(或保存后清空),避免以后又出现图标; + - 渲染层对嵌套菜单项强制不渲染图标(即使库里有历史值也只显示文字)。 +2. **对齐与视觉**(新增 `src/styles/business/menu.css`,作用域 `#v-menu`): + - 一级菜单:行高 44px,左侧 padding 16px,图标 18px,图标与文字间距 8px; + - 二级菜单:行高 40px,**文字左边缘与一级菜单文字左边缘对齐**(即一级 padding + 图标 18 + 间距 8 = 42px), + 不出现“子项文字比父项文字更靠左/更靠右”的错位; + - 二级菜单不渲染图标,也不保留空白图标位;选中/悬浮背景从文字左边缘开始,圆角 8px; + - 一级/二级的选中态、悬浮态、展开箭头、折叠态、popper 子菜单保持一致; + - 深色模式选中态用深主色底 + 白字,浅色模式浅主色底 + 主色文字;行距紧凑,不出现大块空白。 ### 三、短剧编辑弹窗(`DramaManagementView.vue`) @@ -105,7 +88,7 @@ ### 六、验收与门禁 - `pnpm lint:eslint` 零错误;`pnpm build:pro` 通过。 -- 开发库子菜单 icon 已更新;`GET /admin/auth/menus` 自检子菜单 icon 非空且为 `material-symbols:`。 +- 开发库子菜单 `icon` 已全部置空;`GET /admin/auth/menus` 自检:一级菜单有图标,二级菜单 icon 为空。 - 浏览器自查(不作为用户验收):登录页/工作台/短剧管理/锁定屏幕;1024 与 375 宽度; 暗色/浅色;控制台 0 error、0 404。 - 用户浏览器验收:菜单图标与行距、红色主色、短剧编辑弹窗封面、锁屏弹窗。 From b400e36d8ff51aa7dfd8094cef3c8dd342f6de68 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:00:59 +0800 Subject: [PATCH 23/82] =?UTF-8?q?fix(sql):=20=E6=B8=85=E7=A9=BA=E4=BA=8C?= =?UTF-8?q?=E7=BA=A7=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/data-phase1.sql | 5 ++++- sql/data.sql | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sql/data-phase1.sql b/sql/data-phase1.sql index b5e2d8d..f1fc430 100644 --- a/sql/data-phase1.sql +++ b/sql/data-phase1.sql @@ -130,7 +130,7 @@ WHERE NOT EXISTS (SELECT 1 FROM product WHERE code = 'coin_1200'); INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES (15, 0, '用户管理', '/user', 'UserCenter', '#', '/user/app-users', 'material-symbols:group-rounded', 'app-user:list', 'CATALOG', 1, 0, 4), - (16, 15, 'App 用户', 'app-users', 'app-users', 'views/userManagement/AppUsersView', '', '', 'app-user:list', 'MENU', 0, 0, 1) + (16, 15, 'App 用户', 'app-users', 'app-users', 'views/userManagement/AppUsersView', '', '', 'app-user:list', 'MENU', 0, 0, 1) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, redirect = EXCLUDED.redirect, icon = EXCLUDED.icon, permission_code = EXCLUDED.permission_code, @@ -333,3 +333,6 @@ INSERT INTO sys_config (id, config_key, config_value, remark) VALUES (3, 'app.register.max-per-ip-per-day', '0', '0=不限制;生产建议 5'), (4, 'app.register.max-per-device-per-day', '0', '0=不限制;生产建议 3') ON CONFLICT (config_key) DO NOTHING; + +-- K23:二级菜单统一只显示文字,历史图标值也一并清空。 +UPDATE sys_menu SET icon = '' WHERE type = 'MENU'; diff --git a/sql/data.sql b/sql/data.sql index f10f876..69c2c1e 100644 --- a/sql/data.sql +++ b/sql/data.sql @@ -51,7 +51,7 @@ ON CONFLICT (id) DO UPDATE SET code = EXCLUDED.code, name = EXCLUDED.name, INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES (1, 0, '工作台', '/dashboard', 'Dashboard', '#', '/dashboard/index', 'material-symbols:dashboard-rounded', 'drama:list', 'CATALOG', 0, 0, 1), - (2, 1, '工作台', 'index', 'dashboard', 'views/common/DashboardView', '', 'material-symbols:dashboard-rounded', 'drama:list', 'MENU', 0, 1, 1), + (2, 1, '工作台', 'index', 'dashboard', 'views/common/DashboardView', '', '', 'drama:list', 'MENU', 0, 1, 1), (3, 0, '内容管理', '/content', 'Content', '#', '/content/dramas', 'material-symbols:video-library-rounded', 'drama:list', 'CATALOG', 1, 0, 2), (4, 3, '短剧管理', 'dramas', 'dramas', 'views/contentManagement/DramaManagementView', '', '', 'drama:list', 'MENU', 0, 0, 1), (5, 3, '剧集管理', 'episodes', 'episodes', 'views/contentManagement/EpisodeManagementView', '', '', 'episode:list', 'MENU', 0, 0, 2), @@ -77,6 +77,9 @@ ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED. redirect = EXCLUDED.redirect, icon = EXCLUDED.icon, permission_code = EXCLUDED.permission_code, type = EXCLUDED.type, always_show = EXCLUDED.always_show, affix = EXCLUDED.affix, sort = EXCLUDED.sort; +-- K23:二级菜单统一只显示文字,历史图标值也一并清空。 +UPDATE sys_menu SET icon = '' WHERE type = 'MENU'; + -- ---------- 角色-权限 ---------- INSERT INTO sys_role_permission (id, role_id, permission_id) SELECT r.id * 1000000 + p.id, r.id, p.id FROM sys_role r CROSS JOIN sys_permission p WHERE r.code = 'super_admin' From 0ee3e4759eda6c21244abb2202b778c6d7f79ed1 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:02:33 +0800 Subject: [PATCH 24/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K23?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E8=A7=86=E8=A7=89=E6=B7=B1=E5=8C=96?= =?UTF-8?q?=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K23.md | 9 +-- docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 109 +++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/docs/plans/2026-10-19-K23.md b/docs/plans/2026-10-19-K23.md index bab53b8..8712b0a 100644 --- a/docs/plans/2026-10-19-K23.md +++ b/docs/plans/2026-10-19-K23.md @@ -14,10 +14,11 @@ ## 菜单 -1. `sql/data.sql`、`sql/data-phase1.sql` 为 21 个子菜单补齐 Material Symbols Rounded 图标。 -2. 开发库幂等执行后通过 `/admin/auth/menus` 检查子菜单 icon 非空、前缀统一。 -3. 菜单管理图标候选同步扩充。 -4. 菜单行高、间距、缩进、折叠态和 popper 统一到同一套 token。 +1. 一级菜单保留 Material Symbols Rounded 图标;所有二级菜单图标置空。 +2. 开发库幂等执行后通过 `/admin/auth/menus` 检查一级图标存在、二级 icon 为空。 +3. 菜单管理只允许目录菜单选择图标,保存子菜单时强制清空。 +4. 一级菜单行高 44,二级菜单行高 40;父子文字统一落在 42px 基线。 +5. 二级菜单不渲染图标、不保留图标空位,折叠态和 popper 同样只显示文字。 ## 短剧编辑弹窗 diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 8225558..2a238ff 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K23 后台视觉深化:主色、菜单、编辑弹窗与锁屏 +## [已处理·待用户验收] 2026-10-19 | K23 后台视觉深化:主色、菜单、编辑弹窗与锁屏 **用户指令(2026-10-19,附三张截图)**:「现在着重优化 UI 及交互」。 截图问题: diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 67e0f54..765bf1f 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4648,3 +4648,112 @@ e5c5101 chore(web): 合并 K22.1 后台收尾 功能提交与合并提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +## K23 后台视觉深化 + +### 主色 + +```text +--el-color-primary: #c4322a +--el-color-primary-light-3: #d3615b +--el-color-primary-light-5: #e19995 +--el-color-primary-light-7: #f0c2c0 +--el-color-primary-light-8: #f5d9d8 +--el-color-primary-light-9: #faeeed +--el-color-primary-dark-2: #9d2822 +``` + +旧用户持久化的 `#409eff` 在 store 恢复时迁移为 `#c4322a`。默认蓝扫描: + +```text +$ rg '#409eff|#79bbff|#a0cfff|#c6e2ff|#d9ecff|#ecf5ff|#337ecc|rgba?\(64[ ,]+158[ ,]+255' src +(无输出) +``` + +### 二级菜单图标为空 + +`data.sql` 与 `data-phase1.sql` 均加入: + +```sql +UPDATE sys_menu SET icon = '' WHERE type = 'MENU'; +``` + +```text + type | total | empty_icon | with_icon +---------+-------+------------+----------- + CATALOG | 10 | 0 | 10 + MENU | 23 | 23 | 0 + +parents=9 parentMissingIcon=0 +children=19 childWithIcon=0 +``` + +菜单管理仅在 `type='CATALOG'` 时显示图标选择,保存 MENU 时强制 icon 为空。 +渲染层对嵌套项强制不输出 AppIcon,历史脏值也不保留图标空位。 + +### 对齐实测 + +```text +1024px: parent text left=42px, row=44px; child text left=42px, row=40px, icon=0 +375px: parent text left=42px, row=44px; child text left=42px, row=40px, icon=0 +popper: child row=40px, icon=0 +``` + +浅色选中为浅主色底 + 主色文字;暗色选中为深主色底 + 白字, +暗色实测对比度 8.73:1。 + +### 短剧编辑弹窗 + +- 宽 680px,三区块,内容滚动、底部固定;375px 下宽 345px 且无横向溢出。 +- 数字输入固定 180px,控件位于右侧;1024/375 实测均为 180px。 +- 封面 96×128 预览、basename、状态 chip、更换/移除、查看原图、进度遮罩和错误提示。 +- 删除原始 URL 输入框。 +- txt 实测提示“封面仅支持 JPG、PNG 或 WebP 格式”;限制 5MB。 +- 空名称保存显示字段错误“请输入短剧名称”;类型必选。 +- 保存/上传中按钮禁用,关闭被拦截。 + +### 锁屏弹窗 + +- 宽 440px,高度 360px;375px 下宽 359px。 +- 头部底边线 0px,关闭图标距右边缘 22px。 +- 增加“输入密码解锁当前会话”;密码框回车可锁定,取消可关闭。 +- 取消/锁定按钮均为 96×36px。 +- 删除 `console.log('set: ', val)`。 + +### 门禁 + +```text +$ pnpm lint:eslint +> eslint --fix --ext .js,.ts,.vue ./src + +$ pnpm build:pro +[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. +Build successful. Please see dist-pro directory +``` + +浏览器自查:1024/375、明暗主题通过;控制台 error 0;无资源 404。 + +### 提交 + +```text +5356f24 docs(plans): 增加 K23 后台视觉深化计划 +91bbfd5 docs(plans): 更正 K23 子菜单图标口径 +ba90bf9 style(web): 统一辣椒红主色与菜单层级 +805d7dd feat(web): 重做短剧编辑弹窗 +898e439 fix(web): 优化锁屏弹窗布局与交互 +ee3bb1c chore(web): 合并 K23 后台视觉深化 +b400e36 fix(sql): 清空二级菜单图标 +``` + +功能提交与合并提交 author/committer 均为 +`Zhou Weidong <502333560@qq.com>`。 + +### 用户浏览器验收 + +1. 登录后检查按钮、链接、焦点环、标签和选中菜单:均应为辣椒红,无 Element 蓝。 +2. 展开内容管理/后台管理:一级项有图标,二级项只有文字,父子文字左边缘同线。 +3. 收起侧栏打开 popper:二级项无图标、行高 40px。 +4. 编辑短剧:检查三区块、固定数字框、封面预览与“查看原图”,不再出现原始 URL 输入。 +5. 上传非法格式或超过 5MB 图片:弹窗内显示错误且原图不变。 +6. 打开锁屏:标题/说明清晰,可取消,回车可锁定。 +7. 切换明暗主题并缩至 375px:布局不溢出,暗色选中态白字清晰。 From 477014f64b650cb4470c0d54b5ef88b0f7a562c7 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:04:35 +0800 Subject: [PATCH 25/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K23?= =?UTF-8?q?=20=E8=8F=9C=E5=8D=95=E5=AF=B9=E9=BD=90=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 765bf1f..90284f3 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4757,3 +4757,5 @@ b400e36 fix(sql): 清空二级菜单图标 5. 上传非法格式或超过 5MB 图片:弹窗内显示错误且原图不变。 6. 打开锁屏:标题/说明清晰,可取消,回车可锁定。 7. 切换明暗主题并缩至 375px:布局不溢出,暗色选中态白字清晰。 + +- 2026-10-19 K23 菜单对齐补丁:一级 padding-left=16px、左侧 margin=0,二级 margin-left=42px;1024 实测父子文字 left 均为 42px,Web 提交 `40fbd6e`,合并 `fe1ae95`,`pnpm build:pro` 通过。 From b8676d07311fdff5658348833af65848a66e3a9c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:24:49 +0800 Subject: [PATCH 26/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K23.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E4=BF=AE=E6=AD=A3=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 2a238ff..4838f30 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,72 @@ --- +## [待处理] 2026-10-19 | K23.1 后台修正:品牌文字、删除按钮红色、布局回归 + +**用户反馈(2026-10-19,附截图)**: +1. 「图片的文字没有改过来」——浅色侧边栏里 `FruitShorts` 仍是蓝色,应改为正常深色品牌字; +2. 「删除按钮统一用红色背景」——当前多处删除仍是文字/次要样式; +3. 「有的布局乱了」——K23 后菜单、弹窗或顶栏存在对齐/溢出问题。 +> 只改 `ReelShortWeb` 视觉/交互;不改接口、后端业务、客户端、main。 + +### 一、品牌文字颜色 + +- `src/store/modules/app.ts`: + - `setMenuTheme` 浅色分支 `logoTitleTextColor: 'inherit'` → `'#303133'`(或 `var(--el-text-color-primary)`); + - `setHeaderTheme` 浅色分支 `topHeaderTextColor: 'inherit'` → `'#303133'`; + - 深色分支保持 `#fff`。 +- 检查 `Logo.vue`、`ToolHeader.vue`、`Breadcrumb.vue`,确保浅色菜单/顶栏不再出现蓝色品牌字或蓝色继承文字。 +- 登录页品牌色保持现状。 + +### 二、删除按钮统一红色背景 + +1. 全仓扫描所有「删除 / 移除 / 删除菜单」按钮,统一为 `type="danger"` 实心红底、白字, + 表格内 `size="small"`;禁止 `link`、`plain`、`text`、`class="danger-action"` 的浅色文字样式。 +2. 至少覆盖: + - `views/contentManagement/DramaManagementView.vue` + - `views/contentManagement/EpisodeManagementView.vue` + - `views/contentManagement/BannerManagementView.vue` + - `views/contentManagement/CategoryManagementView.vue` + - `views/operation/NoticeManagementView.vue` + - `views/commerce/ProductManagementView.vue` + - `views/governance/ContentGovernanceView.vue`(评论删除、敏感词删除) + - `views/userManagement/AdminUsersView.vue` + - `views/permission/RoleManagementView.vue`(当前 `link`) + - `views/permission/RoleCategoriesView.vue`(补 `size="small"`) + - `views/permission/MenuManagementView.vue`(当前 `plain`) + - `views/creator-center/DramaEditView.vue` 与 `views/creator-center/WorkspaceView.vue` 的删除/下线 + - `views/commerce/OrderManagementView.vue`、`views/creator/CreatorAuditView.vue` 的 + `danger-action` 危险操作(退款/回收/冻结等)统一实心红底白字。 +3. 删除确认弹窗的确认按钮也改为红色背景(`confirmButtonClass: 'el-button--danger'` 并确认样式生效)。 +4. 调整操作列宽度,确保红底按钮不换行、不挤出单元格;同一列按钮高度一致。 + +### 三、布局回归修正 + +逐项用浏览器检查并修复: +1. 浅色/深色侧边栏:品牌图与文字垂直居中,品牌字不换行、不溢出;折叠/展开正常。 +2. 菜单展开:一级与二级文字左边缘对齐(42px 基线),行高 44/40,无重叠/多余空白;popper 同样。 +3. 短剧编辑弹窗:680px 与 375px 宽度下无横向滚动;封面预览/文件名/操作按钮不挤压; + 数字输入两列对齐;底部“取消/保存修改”固定可见。 +4. 锁定屏幕弹窗:440px 下标题/说明/表单/底部按钮不裁切,取消与锁定按钮高度一致。 +5. 表格页:红色删除按钮加入后,操作列不换行、不出现横向溢出;1024 与 375 宽度验证。 +6. 顶栏/标签页/面包屑:图标与文字基线一致,无错位。 + +### 四、验收与门禁 + +- `pnpm lint:eslint` 零错误;`pnpm build:pro` 通过。 +- 浏览器自查:1440×900、1024×768、375×812;浅色/深色;登录页、工作台、短剧管理编辑弹窗、 + 锁定屏幕、菜单展开;控制台 0 error、0 404;`scrollWidth <= clientWidth`。 +- 回执附:品牌色改动、删除按钮清单、布局修复项、门禁原始输出、浏览器自查结论。 + +### 五、Git + +- 从干净 `develop`(基线 `fe1ae95`)拉 `feature/web-k23-fixes`,小步提交, + `--no-ff` 合并回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K23.1.md`;留痕写 `PROGRESS.md`。 +- 用户负责最终验证;本批不再扩大范围。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K23 后台视觉深化:主色、菜单、编辑弹窗与锁屏 **用户指令(2026-10-19,附三张截图)**:「现在着重优化 UI 及交互」。 From 38c8f51315e9b82df03e7f78d7f8e2b4009f00f3 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:25:42 +0800 Subject: [PATCH 27/82] =?UTF-8?q?docs(plans):=20=E5=A2=9E=E5=8A=A0=20K23.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E4=BF=AE=E6=AD=A3=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K23.1.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/plans/2026-10-19-K23.1.md diff --git a/docs/plans/2026-10-19-K23.1.md b/docs/plans/2026-10-19-K23.1.md new file mode 100644 index 0000000..61b4edd --- /dev/null +++ b/docs/plans/2026-10-19-K23.1.md @@ -0,0 +1,32 @@ +# 2026-10-19 K23.1 后台修正 + +## 基线 + +- ReelShortWeb `develop`: `fe1ae95` +- FruitServer `develop`: `b8676d0` +- 只改 ReelShortWeb 视觉与交互,不改接口、后端、客户端、main。 + +## 品牌文字 + +1. 浅色菜单品牌字与浅色顶栏文字固定为 `#303133`。 +2. 处理本地持久化的旧 `inherit` 值,避免刷新后仍继承主色。 +3. 检查 Logo、ToolHeader、Breadcrumb 的实际颜色。 + +## 删除按钮 + +1. 扫描所有删除、移除、退款、回收、冻结危险按钮。 +2. 统一 `type="danger"`、表格内 `size="small"`,禁止 link/plain/text 和浅色 `danger-action`。 +3. 删除确认按钮保持 `el-button--danger` 实心红底。 +4. 调整过窄操作列,保证按钮不换行。 + +## 布局回归 + +1. 1440×900、1024×768、375×812。 +2. 检查侧栏品牌、菜单 42px 基线、popper、短剧编辑弹窗、锁屏弹窗和表格操作列。 +3. 检查顶栏、标签页、面包屑图标与文字基线。 + +## 门禁 + +- `pnpm lint:eslint` +- `pnpm build:pro` +- 浏览器控制台 0 error、0 404,页面无横向溢出。 From 801e904552c8a21ccfbeb453816229481be4620c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:35:01 +0800 Subject: [PATCH 28/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K23.1?= =?UTF-8?q?=20=E5=90=8E=E5=8F=B0=E4=BF=AE=E6=AD=A3=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 98 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 4838f30..c818250 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K23.1 后台修正:品牌文字、删除按钮红色、布局回归 +## [已处理·待用户验收] 2026-10-19 | K23.1 后台修正:品牌文字、删除按钮红色、布局回归 **用户反馈(2026-10-19,附截图)**: 1. 「图片的文字没有改过来」——浅色侧边栏里 `FruitShorts` 仍是蓝色,应改为正常深色品牌字; diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 90284f3..2f16930 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4759,3 +4759,101 @@ b400e36 fix(sql): 清空二级菜单图标 7. 切换明暗主题并缩至 375px:布局不溢出,暗色选中态白字清晰。 - 2026-10-19 K23 菜单对齐补丁:一级 padding-left=16px、左侧 margin=0,二级 margin-left=42px;1024 实测父子文字 left 均为 42px,Web 提交 `40fbd6e`,合并 `fe1ae95`,`pnpm build:pro` 通过。 + +## K23.1 后台修正 + +### 品牌文字 + +`app.ts` 浅色分支改为: + +```text +logoTitleTextColor = #303133 +topHeaderTextColor = #303133 +``` + +持久化旧主题在恢复时重新执行菜单/顶栏主题计算。浏览器实测: + +```text +FruitShorts logo text = rgb(48, 49, 51) +Top header text = rgb(48, 49, 51) +Breadcrumb text = rgb(96, 98, 102) +``` + +浅色侧边栏不再出现蓝色品牌字。 + +### 删除按钮 + +覆盖并统一为 `type="danger"` 实心红底白字: + +- 短剧、剧集、轮播图、类型、公告、商品、评论、敏感词 +- 管理员、角色、角色分类、菜单 +- 创作者分集删除、撤回、冻结 +- 订单退款、权益回收 +- 短剧封面“移除” + +表格内按钮均为 `size="small"`;`danger-action`、danger link、danger plain +扫描结果均为 0。删除确认弹窗带 `confirmButtonClass: 'el-button--danger'`。 + +浏览器实测危险按钮: + +```text +background = rgb(245, 108, 108) +color = rgb(255, 255, 255) +height = 28px(表格按钮) +white-space = nowrap +``` + +删除确认按钮同样为 `rgb(245,108,108)` 背景、白字。 + +### 布局回归 + +```text +1440×900: + 品牌图/文字中心线均为 25px + logo text color = rgb(48,49,51) + document scrollWidth = clientWidth = 1440 + +1024×768: + 菜单父文字 left=42px,父行高 44px + 菜单子文字 left=42px,子行高 40px,子图标 0 + 短剧弹窗宽 680px,内容 scrollWidth=clientWidth + 数字框 180px ×2,底部按钮可见 + 锁屏弹窗 440×360,确认/取消按钮 96×36 + +375×812: + 菜单父/子文字 left 均为 42px + 短剧弹窗宽 345px,无横向滚动,底部按钮固定可见 + 数字框仍为 180px ×2 + 锁屏弹窗宽 359px,按钮不裁切 + +表格页: + 短剧/剧集/轮播图/类型/公告/商品/治理/角色分类 + document scrollWidth = clientWidth = 375 + 红色删除按钮无换行 +``` + +### 门禁 + +```text +$ pnpm lint:eslint +> fruitshorts-admin@1.0.0 lint:eslint +> eslint --fix --ext .js,.ts,.vue ./src + +$ pnpm build:pro +[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. +Build successful. Please see dist-pro directory +``` + +浏览器控制台 error 0,资源 404 0。 + +### 提交 + +```text +38c8f51 docs(plans): 增加 K23.1 后台修正计划 +e77db70 fix(web): 修正浅色品牌文字颜色 +f5b399a fix(web): 统一危险操作按钮样式 +6f52230 chore(web): 合并 K23.1 后台修正 +``` + +功能提交与合并提交 author/committer 均为 +`Zhou Weidong <502333560@qq.com>`。 From c491c329afd29cf3f99571667898c846acc3e191 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 12:58:40 +0800 Subject: [PATCH 29/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K23.1?= =?UTF-8?q?=20=E5=B8=83=E5=B1=80=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 2f16930..201dd7e 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4857,3 +4857,11 @@ f5b399a fix(web): 统一危险操作按钮样式 功能提交与合并提交 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 + +### K23.1 布局复核修补 + +- danger 禁用态:管理员行实测背景 `rgb(245,247,250)`、文字 `rgb(168,171,178)`、`not-allowed`,可点击删除仍为红底白字。 +- 锁屏弹窗:卡片实测 `440×440`,footer 底边 `588`、卡片底边 `604`,取消/锁定按钮底边 `569`,均完整在卡片内。 +- 封面预览:桌面图片内容区 `94×126`(96×128 卡片内),`object-fit:cover`;375 下卡片恢复 `96×128`,纵向排列且与信息区无重叠,页面无横向溢出。 +- 门禁:`pnpm lint:eslint` 零错误,`pnpm build:pro` 成功。 +- Web 提交 `c8bf4a8`,合并提交 `73da0bb`。 From 3cbdca68615527f03f2b8c88aa63ecd65f9f1078 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 13:23:03 +0800 Subject: [PATCH 30/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 201dd7e..2ebe113 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4865,3 +4865,5 @@ f5b399a fix(web): 统一危险操作按钮样式 - 封面预览:桌面图片内容区 `94×126`(96×128 卡片内),`object-fit:cover`;375 下卡片恢复 `96×128`,纵向排列且与信息区无重叠,页面无横向溢出。 - 门禁:`pnpm lint:eslint` 零错误,`pnpm build:pro` 成功。 - Web 提交 `c8bf4a8`,合并提交 `73da0bb`。 + +- 2026-10-19 K23.1 工作台菜单:单子节点渲染合并父子 meta,仅父 icon 兜底;实测工作台文字 left=42px、内容管理文字 left=42px,内容子项仍无图标且 left=42px。Web 提交 `bb03a5a`,合并 `f023c7d`,lint/build 通过。 From 6127fef897cf8e0a28b73ff75a9b27470dbcec8d Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 13:32:27 +0800 Subject: [PATCH 31/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=89=A7=E9=9B=86=E4=B8=8E=E5=AD=90=E8=8F=9C=E5=8D=95=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 2ebe113..a2a4232 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4867,3 +4867,7 @@ f5b399a fix(web): 统一危险操作按钮样式 - Web 提交 `c8bf4a8`,合并提交 `73da0bb`。 - 2026-10-19 K23.1 工作台菜单:单子节点渲染合并父子 meta,仅父 icon 兜底;实测工作台文字 left=42px、内容管理文字 left=42px,内容子项仍无图标且 left=42px。Web 提交 `bb03a5a`,合并 `f023c7d`,lint/build 通过。 + +- 2026-10-19 K23.1 二级菜单背景:inline 与 popper 的 hover/active 背景强制 transparent;浅色文字为主色、深色为白色,一级背景保持不变。浏览器实测浅/深色均为 `rgba(0,0,0,0)`。Web 提交 `f6f4d26`,合并 `9f92d11`。 + +- 2026-10-19 K23.1 剧集顶部布局:左侧“当前短剧”+剧名+集数,右侧“切换短剧”+320-360px 下拉;1024 左右中心差 0.004px、下拉宽 327.68px,表头完整且 250px 固定操作列可见;375 纵向堆叠、下拉 100%、页面 scrollWidth=clientWidth=375。Web 提交 `122aa21`,合并 `046400a`,lint/build 通过。 From 68d101cc8d054215298ef6bb6a5e38bebb66547c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 13:49:32 +0800 Subject: [PATCH 32/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=A2=84=E8=A7=88=E4=B8=8E=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index a2a4232..fdf997b 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4871,3 +4871,7 @@ f5b399a fix(web): 统一危险操作按钮样式 - 2026-10-19 K23.1 二级菜单背景:inline 与 popper 的 hover/active 背景强制 transparent;浅色文字为主色、深色为白色,一级背景保持不变。浏览器实测浅/深色均为 `rgba(0,0,0,0)`。Web 提交 `f6f4d26`,合并 `9f92d11`。 - 2026-10-19 K23.1 剧集顶部布局:左侧“当前短剧”+剧名+集数,右侧“切换短剧”+320-360px 下拉;1024 左右中心差 0.004px、下拉宽 327.68px,表头完整且 250px 固定操作列可见;375 纵向堆叠、下拉 100%、页面 scrollWidth=clientWidth=375。Web 提交 `122aa21`,合并 `046400a`,lint/build 通过。 + +- 2026-10-19 K23.1 列表图片预览:新增 `AppImage` 并接入短剧封面、轮播图、App 用户头像、创作者作品封面、分集封面;短剧封面 44×56、轮播图 160×90 尺寸保持不变。浏览器实测短剧/轮播图 viewer 可打开、下一张切换、关闭;375 页面无横向溢出。当前用户数据无头像且管理员会话不可进入创作者中心,后两处完成代码接入但未取得对应业务数据点击证据。Web 提交 `8a84f24`,合并 `5db565b`。 + +- 2026-10-19 K23.1 轮播图编辑弹窗:680px 三段布局,240×135 图片预览、跳转配置、排序/状态;移除原始 URL 输入,加入图片与条件跳转校验、上传校验与进度遮罩。1024 弹窗宽 680px、正文 scrollWidth=clientWidth、footer 可见;375 弹窗宽 345px、图片区纵向、卡片 240×135、信息区无重叠、页面无横向溢出。Web 提交 `f281dcf`,合并 `685d4fd`,lint/build 通过。 From d88a7de2eb9cbfe09036badf8a2104d0e871d9e1 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 13:55:47 +0800 Subject: [PATCH 33/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=89=A7=E9=9B=86=E7=BC=96=E8=BE=91=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index fdf997b..72530df 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4875,3 +4875,5 @@ f5b399a fix(web): 统一危险操作按钮样式 - 2026-10-19 K23.1 列表图片预览:新增 `AppImage` 并接入短剧封面、轮播图、App 用户头像、创作者作品封面、分集封面;短剧封面 44×56、轮播图 160×90 尺寸保持不变。浏览器实测短剧/轮播图 viewer 可打开、下一张切换、关闭;375 页面无横向溢出。当前用户数据无头像且管理员会话不可进入创作者中心,后两处完成代码接入但未取得对应业务数据点击证据。Web 提交 `8a84f24`,合并 `5db565b`。 - 2026-10-19 K23.1 轮播图编辑弹窗:680px 三段布局,240×135 图片预览、跳转配置、排序/状态;移除原始 URL 输入,加入图片与条件跳转校验、上传校验与进度遮罩。1024 弹窗宽 680px、正文 scrollWidth=clientWidth、footer 可见;375 弹窗宽 345px、图片区纵向、卡片 240×135、信息区无重叠、页面无横向溢出。Web 提交 `f281dcf`,合并 `685d4fd`,lint/build 通过。 + +- 2026-10-19 K23.1 剧集编辑弹窗:680px 三段布局,基础信息、视频文件、付费与状态;视频区固定 240×135,移除原始 URL 输入,加入 MP4/MOV、500MB、上线视频必填校验和上传进度。1024 弹窗宽 680px、视频卡 240×135、数字框 180px、footer 可见;375 弹窗宽 345px、视频区纵向且不重叠、页面无横向溢出。格式校验实测显示“视频仅支持 MP4 或 MOV 格式”。Web 提交 `2b5dda7`,合并 `83e535d`,lint/build 通过。 From 93b229963048087dca33e20ca2465a9eedc85093 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 14:48:20 +0800 Subject: [PATCH 34/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K24?= =?UTF-8?q?=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=AE=BE=E8=AE=A1=E7=A8=BF?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index c818250..30810d2 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,93 @@ --- +## [待处理] 2026-10-19 | K24 客户端 UI 对齐设计稿(设计系统 + 首页 + 发现) + +**用户指令(2026-10-19)**:「修改客户端 UI,读 specs 下 docs 下的 screens」。 +> 设计权威文件(已全部读取): +> `docs/design/DESIGN.md`、`docs/design/README.md`、`docs/design/screens/01-home.html`、`02-discover.html` +> (以及 03-detail / 04-player / 05-me / 06-login,后三屏留到 K25/K26)。 +> **口径冲突以 README + screens HTML 为准**:`#0B0C10 / #16181F / #FF5B3D / #9278EA`; +> `DESIGN.md` 顶部 YAML 的 `#ffb4a5/#cdbdff` 是自动生成色板,不采用。 + +### 一、本批范围 + +只做「设计系统 + 底部导航 + 首页 + 发现页」。详情页、播放器、我的页、登录页留到 K25/K26。 +不改后端接口、Web、specs;不改业务数据模型字段;缺失的评分/完结/榜单名次不要伪造。 + +### 二、设计 Token(全局) + +1. `lib/core/theme/app_colors.dart` 改为 Obsidian Flare: + - background `#0B0C10`、card `#16181F`、surface-elevated `#1D1E28`、bar `#0B0C10`(95% + blur) + - primary `#FF5B3D`、pressed `#FF4321`、secondary/lavender `#9278EA` + - gold `#FBBF24`、danger/free `#FF5B3D`、success `#34D399` + - on-surface `#FFFFFF` / `#E3E2E8`、muted `#A1A1AA`、subtle `#71717A` + - border `rgba(255,255,255,0.08)`、glass 高亮 `rgba(255,255,255,0.12-0.14)` + - 保留现有语义命名(`AppColors.blue` 等)以免大面积改名,但值统一到新色板;新增 `secondary`、`lavender`、`onSurface`。 +2. `app_theme.dart`:主色/次色/背景/卡片/描边/进度条统一;固定深色;按钮/chip 使用全圆角; + 进度条改为 1–2px;补充 `Outfit`(标题)与 `Plus Jakarta Sans`(正文)字体。 +3. 字体:下载 Outfit + Plus Jakarta Sans 的 OFL TTF 放入 `assets/fonts/`,`pubspec.yaml` 注册; + 禁止运行时依赖网络字体;若下载失败,使用系统字体并在回执标注未完成项。 +4. 新增 `lib/core/widgets/glass_panel.dart`(BackdropFilter 16/24px、半透明渐变、白 8–14% 描边、 + 可选圆角 16/24/26),供首页底部卡、顶部按钮等复用。 +5. 间距/圆角:页面 gutter 16、卡片圆角 16–24、按钮/chip 全圆、卡片间距 12–16;补充到 `app_dimens.dart`。 + +### 三、底部导航(3 Tab) + +- 改为 **Home / Discover / Me** 三项,Keys 保留 `tab-home`、`tab-discover`、`tab-my`; + 删除 `tab-my-list` 独立 Tab(原 My List 内容并入 Me 页)。 +- 选中态:橙色图标 + 橙色文案 + 下方 1px 橙色圆点;未选中 `white/45`。 +- 背景 `#0B0C10/95` + 顶部 `white/5` 分隔 + backdrop blur;高度与安全区按设计。 +- 修正现有 tab 映射:Home 进沉浸 feed,Discover 进发现,Me 进个人页; + `My List` 入口保留在 Me 页内部(History/Watchlist/Liked)。 +- 更新受影响的 widget 测试,不再断言 4 Tab;保留 Home/Discover/Me 的行为断言。 + +### 四、首页(Home) + +按 `01-home.html` 重做首页沉浸层(保留 `PlayerPage(homeMode: true)` 视频 feed): +1. 顶部:状态栏安全区 + 剧名、`HOT` 徽章、`Season 1 • Vertical Cinema` 副标题;右侧搜索/更多 36px 玻璃圆钮。 +2. 右侧互动栏:剧集头像 48px + 橙色 Follow `+`;Like / Comment / Bookmark / Share, + 44–46px 玻璃圆形按钮 + 11px 计数/文案;保留下载/PiP 时收进“更多”菜单,避免超出设计动作集。 +3. 底部玻璃信息卡(26px 圆角、blur 24): + - 题材 chips(`#9278EA/15` 与 `#FF5B3D/15` 半透明底) + - `Ep. x / y` pill + - 2 行简介 + - 1px 进度条(播放段 `#FF5B3D`)+ 当前/总时长 + - `Follow Series` 橙色胶囊主 CTA + `Episodes` 玻璃胶囊 +4. 顶部/右侧/底部渐变 scrim 按设计稿比例;文字加 `0 2px 8px rgba(0,0,0,.75)` 或置于玻璃 pill。 +5. 复用现有 Player 逻辑(进度、选集、点赞/收藏/评论),不要重写播放链路。 + +### 五、发现页(Discover) + +按 `02-discover.html` 重做: +1. 顶部品牌行(橙点 + DramaPulse/FruitShorts + 副标题)+ 右侧头像入口。 +2. 44px 搜索框(左侧搜索图标、右侧语音占位),接通现有 `DiscoverLogic.search` 过滤; + `searchRequest` 时聚焦。 +3. 全圆分类 chips,选中橙色实心(未选中 `white/8`)。 +4. Continue Watching 卡:海报 64×88、`Ep. x / y • xx min left`、65% 橙色进度、橙色 Play 按钮; + 数据用现有观看记录;没有记录时隐藏该卡。 +5. 4 个快捷入口:Filter / Top Charts / New / Watchlist(玻璃卡 + 图标 + 文案)。 +6. Trending Dramas:标题 + See All;**2 列**网格,海报比例约 3/4.2、16px 圆角; + 封面叠加 Free/VIP/HOT 徽章(有数据才显示)、评分(模型无字段则隐藏)、播放量(用 `viewCount`)。 +7. 移除发现页顶层 3D 轮播(设计稿没有);轮播组件保留但不再挂在 Discover;若删除组件需确认无测试引用。 +8. 标题 12px、副标题 11px,卡片底色 `#15161E`;与设计一致。 + +### 六、测试与门禁 + +- 更新受影响的既有测试(4 Tab → 3 Tab;Discover 结构变化),保留播放/进度/收藏等行为断言。 +- 新增测试:3 Tab 映射、玻璃卡渲染、Discover 搜索过滤、2 列网格。 +- `dart analyze lib test` 零告警;`flutter test` 全过;`flutter build apk --debug` 通过。 +- 真机验收由用户执行;不伪造评分/完结/榜单数据。 + +### 七、Git 与回执 + +- 从干净 `develop` 拉 `feature/flutter-k24-design-system`,小步提交;完成后 `--no-ff` 合并回 develop 并 push; + 作者 `Zhou Weidong <502333560@qq.com>`;不动 main。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K24.md`;留痕写 `PROGRESS.md`。 +- 回执:token/字体落地、3 Tab、Home/Discover 结构、测试条数与门禁原始输出、已知数据缺口、真机验收步骤。 + +--- + ## [已处理·待用户验收] 2026-10-19 | K23.1 后台修正:品牌文字、删除按钮红色、布局回归 **用户反馈(2026-10-19,附截图)**: From 0f8652c0832a4922388afa64151af8c7e05c98fa Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:03:04 +0800 Subject: [PATCH 35/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K24?= =?UTF-8?q?=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=AE=BE=E8=AE=A1=E7=A8=BF?= =?UTF-8?q?=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K24.md | 102 +++++++++++++++++++++++++++++++++++ docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 68 +++++++++++++++++++++++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 docs/plans/2026-10-19-K24.md diff --git a/docs/plans/2026-10-19-K24.md b/docs/plans/2026-10-19-K24.md new file mode 100644 index 0000000..a0573c2 --- /dev/null +++ b/docs/plans/2026-10-19-K24.md @@ -0,0 +1,102 @@ +# K24 计划:客户端 UI 对齐设计稿 + +日期:2026-10-19 +客户端基线:`ReelShort/develop` = `b1c69e2` +文档基线:`FruitServer/develop` = `93b2299` +分支:`feature/flutter-k24-design-system` + +## 一、范围 + +本批只做设计系统、3 Tab 底部导航、首页沉浸层、发现页: + +- 设计 token:Obsidian Flare 色板、字体、间距/圆角、玻璃面板。 +- 底部导航:Home / Discover / Me 三项;My List 不再独立成 Tab,内容并入 Me 页。 +- 首页:保留 `PlayerPage(homeMode: true)` 播放链路,只替换叠加层与信息卡。 +- 发现页:品牌行、搜索、分类 chips、Continue Watching、4 个快捷入口、2 列 Trending。 + +不做:详情页、播放器、我的页、登录页的视觉重做(K25/K26);后端、Web、specs、main。 + +## 二、设计口径 + +权威来源:`docs/design/README.md` + `screens/01-home.html` + `screens/02-discover.html`。 +不采用 `DESIGN.md` 顶部 YAML 的 `#ffb4a5/#cdbdff`。 + +| 语义 | 值 | +| --- | --- | +| background / ink / bar | `#0B0C10` | +| card | `#16181F` | +| surface-elevated / raised | `#1D1E28` | +| primary / blue | `#FF5B3D` | +| pressed / bluePressed | `#FF4321` | +| secondary / lavender / blueSoft | `#9278EA` | +| gold | `#FBBF24` | +| success | `#34D399` | +| on-surface | `#FFFFFF` / `#E3E2E8` | +| muted | `#A1A1AA` | +| subtle | `#71717A` | +| border | `rgba(255,255,255,0.08)` | + +字体:Outfit(标题)、Plus Jakarta Sans(正文),OFL TTF 本地打包,不运行时联网。 +下载失败时保留系统字体,并在回执与 PROGRESS 标注未完成项。 + +## 三、TDD 顺序 + +1. 设计 token / 主题:先更新 `test/theme/app_theme_test.dart` 期望值与新增 token 断言,再改 + `app_colors.dart`、`app_theme.dart`、`app_dimens.dart`。 +2. GlassPanel:先写组件测试(blur、渐变、描边、圆角),再实现 `glass_panel.dart`。 +3. 3 Tab:先改导航测试为 `tab-home/tab-discover/tab-my`,覆盖选中态、映射、沉浸隐藏; + 再改 `app_bottom_nav.dart` 与 `home_view.dart`。 +4. 首页:先用现有 Player 测试保证播放/进度/收藏不回归,再新增首页结构断言 + (剧名、HOT、右侧互动栏、底部玻璃卡、Follow Series、Episodes)。 +5. 发现页:先写搜索过滤、2 列网格、Continue Watching 隐藏/显示测试,再改 + `discover_view.dart` / `discover_logic.dart` / `home_drama_grid.dart`。 +6. 回归:更新 4 Tab 与轮播挂载相关断言,保留播放、进度、收藏、举报等行为测试。 + +## 四、影响文件 + +- `lib/core/theme/app_colors.dart` +- `lib/core/theme/app_theme.dart` +- `lib/core/theme/app_dimens.dart` +- `lib/core/widgets/glass_panel.dart`(新增) +- `lib/core/widgets/app_bottom_nav.dart` +- `lib/pages/home/home_view.dart` +- `lib/pages/home/home_logic.dart` +- `lib/pages/discover/discover_view.dart` +- `lib/pages/discover/discover_logic.dart` +- `lib/pages/discover/widgets/home_drama_grid.dart` +- `lib/pages/player/player_view.dart`(仅 homeMode 叠加层) +- `lib/pages/mine/mine_view.dart`(仅把 My List 区块并入 Me) +- `pubspec.yaml`、`assets/fonts/*` +- 相关 `test/**` + +## 五、数据缺口与降级 + +| 设计字段 | 现有数据 | 处理 | +| --- | --- | --- | +| 评分 | `Drama` 无评分字段 | 隐藏,不伪造 | +| 完结状态 | 无完结字段 | 隐藏 | +| 榜单名次 | 无字段 | 用 `isHot` + `viewCount` 排序展示,不编名次 | +| VIP 徽章 | 无 VIP 字段;`Episode.locked` 仅集级 | 列表不显示 VIP 徽章 | +| Free 徽章 | `freeEpisodes` 仅详情接口 | 有值才显示 | +| 点赞/评论数 | 互动接口无剧级计数 | 只显示图标或文案,不编数字 | +| Continue Watching 集数/剩余时长 | `WatchProgress` 有位置/时长,无集号 | 有记录才显示,集号缺失时省略 | + +## 六、风险 + +- 首页叠加层改动可能影响沉浸模式、PiP、下载入口与既有 tooltip;通过保留原有行为入口并跑 + `test/widget_test.dart`、`test/home/**`、`test/player/**` 控制风险。 +- 3 Tab 合并会触碰多个导航测试;只调整 Tab 数量/Key 断言,不改播放与收藏断言。 +- 新字体增加安装包体积;只打包 Regular/SemiBold/Bold 必要字重。 +- 发现页数据源仍用 `CategoryController.visibleDramas`,不新增接口。 + +## 七、门禁 + +```bash +flutter pub get +dart analyze lib test +flutter test +flutter build apk --debug +``` + +提交作者/提交者:`Zhou Weidong <502333560@qq.com>`。 + diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 30810d2..e311f98 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K24 客户端 UI 对齐设计稿(设计系统 + 首页 + 发现) +## [已完成·待用户验收] 2026-10-19 | K24 客户端 UI 对齐设计稿(设计系统 + 首页 + 发现) **用户指令(2026-10-19)**:「修改客户端 UI,读 specs 下 docs 下的 screens」。 > 设计权威文件(已全部读取): diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 72530df..0ca695d 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4877,3 +4877,71 @@ f5b399a fix(web): 统一危险操作按钮样式 - 2026-10-19 K23.1 轮播图编辑弹窗:680px 三段布局,240×135 图片预览、跳转配置、排序/状态;移除原始 URL 输入,加入图片与条件跳转校验、上传校验与进度遮罩。1024 弹窗宽 680px、正文 scrollWidth=clientWidth、footer 可见;375 弹窗宽 345px、图片区纵向、卡片 240×135、信息区无重叠、页面无横向溢出。Web 提交 `f281dcf`,合并 `685d4fd`,lint/build 通过。 - 2026-10-19 K23.1 剧集编辑弹窗:680px 三段布局,基础信息、视频文件、付费与状态;视频区固定 240×135,移除原始 URL 输入,加入 MP4/MOV、500MB、上线视频必填校验和上传进度。1024 弹窗宽 680px、视频卡 240×135、数字框 180px、footer 可见;375 弹窗宽 345px、视频区纵向且不重叠、页面无横向溢出。格式校验实测显示“视频仅支持 MP4 或 MOV 格式”。Web 提交 `2b5dda7`,合并 `83e535d`,lint/build 通过。 + +### K24 客户端 UI 对齐设计稿(2026-10-19) + +范围:设计系统、3 Tab 底部导航、首页沉浸层、发现页;详情/播放器/我的/登录留 K25/K26。 + +设计口径:采用 `README.md` + `screens/01-home.html` + `screens/02-discover.html` +的 `#0B0C10 / #16181F / #1D1E28 / #FF5B3D / #FF4321 / #9278EA`,不使用 +`DESIGN.md` 顶部 YAML 的 `#ffb4a5/#cdbdff`。 + +落地: + +- `AppColors` 改 Obsidian Flare,保留 `blue/blueSoft/ink/card` 等旧名并新增 + `secondary/lavender/onSurface/subtle/success/border`。 +- 字体 Outfit(标题)+ Plus Jakarta Sans(正文)共 7 个 OFL TTF,放在 + `assets/fonts/`,两份 OFL 许可证随包;`.gitignore` 放行 fonts 目录。 +- 新增 `GlassPanel`:`BackdropFilter` 16/24px、白 8-14% 描边、圆角 16/24/26。 +- 底部导航 3 Tab:`tab-home/tab-discover/tab-my`,删除 `tab-my-list`;选中橙色图标、 + 文案与 3px 圆点,背景 `#0B0C10/95` + blur;My List 区块并入 Me 页。 +- 首页保留 `PlayerPage(homeMode: true)` 播放链路,新增 `HomeFeedOverlay`:剧名/HOT/ + Season/搜索/更多,头像 Follow +、Like/Comment/Bookmark/Share 玻璃钮,底部 26px + 玻璃信息卡、题材 chips、集数、双行简介、1.5px 进度、Follow Series/Episodes。 + 下载与 PiP 收进“更多”底部菜单。 +- 发现页移除顶层 3D 轮播;新增品牌行+头像、44px 搜索框(现有过滤与 searchRequest 聚焦)、 + 分类 chips、观看记录 Continue Watching(无记录隐藏)、4 个快捷入口、2 列 Trending + (3/4.2、16px 圆角、HOT/Free 有数据才显示、viewCount 展示)。 + +数据缺口:`Drama` 无评分、完结、VIP、剧级点赞/评论数;对应 UI 隐藏,不补假数据。 +Continue Watching 只有 `episodeId`,能匹配到当前剧集列表时才显示集号。 + +门禁原始输出: + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! + +$ flutter test +00:26 +347: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 38.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建说明:用户当时有 `flutter run --device-id=00008101...` 占用主工作区 `build/`, +因此在 `/tmp/reelshort-k24-build` 的独立 git worktree 执行 `flutter pub get` 与 +`flutter build apk --debug`,避免并发构建冲突。 + +Git: + +```text +eae1c53 feat(theme): 接入 Obsidian Flare 设计系统 +e8c1859 feat(ui): 重做三 Tab 首页与发现页 +4553606 merge: K24 客户端 UI 对齐设计稿 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 +ReelShort `develop` 与 `feature/flutter-k24-design-system` 已推送。 + +真机验收步骤(设备侧取证由用户执行): + +1. `flutter run` 打开 App,确认默认进入 Home 沉浸 feed;底部仅 Home/Discover/Me 三个 Tab。 +2. Home 检查剧名/HOT/Season、右侧头像+Follow、Like/Comment/Bookmark/Share、底部玻璃卡、 + 集数、简介、橙色进度、Follow Series/Episodes;“更多”内有下载与 PiP。 +3. 点 Discover,确认品牌行、搜索框、分类 chips、4 快捷入口、2 列 Trending;输入剧名过滤, + 清空恢复;有观看记录时显示 Continue Watching,无记录时不显示。 +4. 点 Me,确认账号内容与 History/Watchlist/Liked 在同一页;切回 Home 播放进度与收藏状态保留。 +5. 深色/浅色系统、320×568 与 390×844 小屏检查无溢出、文字不截断。 From cd711c5d5c5fbd93042bcb7b5243a38bc55cad6b Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:05:10 +0800 Subject: [PATCH 36/82] =?UTF-8?q?docs(plans):=20=E6=9B=B4=E6=96=B0=20K24?= =?UTF-8?q?=20=E6=9C=80=E7=BB=88=E9=97=A8=E7=A6=81=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 0ca695d..c6725de 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4914,15 +4914,15 @@ Analyzing lib, test... No issues found! $ flutter test -00:26 +347: All tests passed! +00:48 +347: All tests passed! $ flutter build apk --debug -Running Gradle task 'assembleDebug'... 38.8s +Running Gradle task 'assembleDebug'... 26.4s ✓ Built build/app/outputs/flutter-apk/app-debug.apk ``` 构建说明:用户当时有 `flutter run --device-id=00008101...` 占用主工作区 `build/`, -因此在 `/tmp/reelshort-k24-build` 的独立 git worktree 执行 `flutter pub get` 与 +因此在 `/tmp/reelshort-k24-final` 的独立 git worktree 执行 `flutter pub get` 与 `flutter build apk --debug`,避免并发构建冲突。 Git: From f21a334ca8fd1cdaa811a17700ee0da750276713 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:07:40 +0800 Subject: [PATCH 37/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K25?= =?UTF-8?q?=20=E8=AF=A6=E6=83=85=E9=A1=B5=E4=B8=8E=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 60 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index e311f98..a3e2eed 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,65 @@ --- -## [已完成·待用户验收] 2026-10-19 | K24 客户端 UI 对齐设计稿(设计系统 + 首页 + 发现) +## [待处理] 2026-10-19 | K25 客户端详情页 + 播放器对齐设计稿 + +**用户指令(2026-10-19)**:「开始实现详情页和播放器」。 +> 设计权威:`docs/design/screens/03-detail.html`、`04-player.html`(origin/main 或 `/tmp/specs-design/docs/design/screens/`)。 +> 设计系统沿用 K24 的 Obsidian Flare token、Outfit/Plus Jakarta Sans、GlassPanel;不改后端接口/模型字段,缺失数据不伪造。 + +### 一、详情页(`03-detail.html`) + +1. **Hero**:16:9 横版头图(优先 `drama.coverUrl`,无则 `posterUrl`),底部渐变; + 左上玻璃返回、右上玻璃分享/收藏;图上叠加 `Trailer 0:45`、`4K UHD` 玻璃 pill(无数据时只显示 4K/隐藏)。 +2. **元数据**:集数 pill(`N Episodes`)、完结/榜单名次(模型无字段则隐藏)、标题 24px、 + `Season 1 • DramaPulse Original Release`、播放量(`viewCount`)、题材标签;评分无字段则隐藏。 +3. **简介卡**:`#12141A`/GlassPanel 圆角 16、正文 14px、默认 2 行 + `More` 展开;保留现有 l10n 文案。 +4. **CTA 行**:`Start Watching`(或继续观看集数)橙色全宽胶囊 + 48×48 收藏 + 48×48 下载; + 举报入口收进右上“更多”;保留现有 Favorite/Download/Report 逻辑。 +5. **Episodes 区**:标题 `Episodes (N)` + 范围 chips(如 `1-30`,无数据可只显示全部); + 横向集数 chips(46×44、选中橙色、锁定紫色);下方 2 列剧集预览卡(96×64 缩略图、Free/Coin、 + 时长、锁态);保留现有选集跳转与下载入口。 +6. 详情页为 push 页面,不加底部 Tab;加载/失败/空态保留返回按钮(现状已有)。 + +### 二、播放器(`04-player.html`) + +1. **模式拆分**: + - `homeMode=true`(首页沉浸 feed)保持现状全屏竖滑; + - `homeMode=false`(从详情进入)改为设计稿的“卡片式播放器”: + 顶部导航(返回、居中剧名 + `Ep.x`、更多)、9:10 圆角 16 视频框、下方进度与操作区、评论卡。 +2. **顶部/视频框**:`Auto-Next On` 紫色 pill、`1.0x` 倍速 pill、中心橙色播放按钮、 + 右侧 36px 点赞/全屏;场景标签(无数据隐藏)。 +3. **进度条**:1.5px 轨、缓冲段 white/30、播放段 `#FF5B3D`、白色 thumb; + 左侧当前时间、中间 `Ep x / N`、右侧总时长;保留拖动 seek。 +4. **三按钮行**:`Episodes` 玻璃胶囊、`Comments (count)` 玻璃胶囊、`Next Ep` 橙色胶囊; + 分别打开现有选集、评论弹窗、下一集;没有下一集时置灰。 +5. **精选评论卡**:`#14161E` 16px 圆角、VIP 标记(有数据才显示)、点赞数、`View all N`; + 复用 `CommentController`;无评论时隐藏。 +6. 保留现有播放票据、自动连播、PiP、下载、互动逻辑;下载/PiP 收进顶部“更多”。 +7. 不要改 `playback_session`/ticket 协议;只改 UI 组织与控件。 + +### 三、数据缺口(不得伪造) + +- 评分、完结状态、Top 排名、VIP、剧级点赞/评论计数、场景标签:模型/接口没有就隐藏; +- `viewCount`、集数、题材、`Episode.locked`、`freeEpisodes/unlockCoin` 已有,按现有字段渲染。 + +### 四、测试与门禁 + +- 更新详情/播放器相关 widget 测试;保留 PiP、进度、票据错误、收藏/下载等既有行为断言; +- 新增:16:9 hero、CTA 行、剧集 chips、播放器卡片模式、三按钮行、进度条颜色; +- `dart analyze lib test` 零告警;`flutter test` 全过;`flutter build apk --debug` 通过。 +- 真机验收由用户执行;不伪造设备侧证据。 + +### 五、Git 与回执 + +- 从干净 `develop`(基线 `4553606`)拉 `feature/flutter-k25-detail-player`,小步提交; + 完成后 `--no-ff` 合并回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;不动 main。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K25.md`;留痕写 `PROGRESS.md`。 +- 回执:详情/播放器结构、保留/新增的 Key、测试条数与门禁原始输出、数据缺口、真机验收步骤。 + +--- + +## [待处理] 2026-10-19 | K24 客户端 UI 对齐设计稿(设计系统 + 首页 + 发现) **用户指令(2026-10-19)**:「修改客户端 UI,读 specs 下 docs 下的 screens」。 > 设计权威文件(已全部读取): From c69327062b867b64e9bb41e24e570692ad69edd9 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:17:34 +0800 Subject: [PATCH 38/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K25?= =?UTF-8?q?=20=E8=AF=A6=E6=83=85=E9=A1=B5=E4=B8=8E=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K25.md | 79 ++++++++++++++++++++++++++++++++++++ docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 63 ++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 docs/plans/2026-10-19-K25.md diff --git a/docs/plans/2026-10-19-K25.md b/docs/plans/2026-10-19-K25.md new file mode 100644 index 0000000..191af1d --- /dev/null +++ b/docs/plans/2026-10-19-K25.md @@ -0,0 +1,79 @@ +# K25 计划:客户端详情页 + 播放器对齐设计稿 + +日期:2026-10-19 +基线:`ReelShort/develop` = `4553606` +分支:`feature/flutter-k25-detail-player` + +## 一、范围 + +只改详情页与 `homeMode=false` 的播放器: + +- 详情页:16:9 hero、玻璃导航、元数据、简介展开、CTA、选集 chips、2 列剧集卡。 +- 卡片播放器:顶部导航、9:10 视频框、进度条、三按钮行、精选评论卡。 +- `homeMode=true` 的 K24 首页沉浸 feed 保持现状。 + +不改:后端接口/模型字段、首页、发现页、我的页、登录页、`playback_session`/ticket 协议。 + +## 二、设计口径 + +沿用 K24 Obsidian Flare token、Outfit/Plus Jakarta Sans、`GlassPanel`。 + +详情页结构: + +1. 16:9 hero(当前模型只有 `posterUrl`,作为 hero 图;无 `coverUrl` 字段)。 +2. 左侧玻璃返回,右侧分享/收藏/更多(举报在更多菜单)。 +3. 集数 pill、24px 标题、Season 副标题、viewCount、题材标签。 +4. 16px 简介卡,2 行 + More/Less。 +5. 橙色全宽 CTA + 48×48 收藏/下载,续看进度与错误重试保留。 +6. Episodes 标题 + 范围 chip(无区间数据时显示 All)+ 46×44 横向集数 chips。 +7. 2 列剧集预览卡:缩略图 96×64、Free/Coin、时长、锁态、下载/播放入口。 + +播放器结构(`homeMode=false`): + +1. 顶部返回、剧名 + Ep.x、更多(下载/PiP)。 +2. 9:10 圆角 16 视频框,Auto-Next/1.0x pill、中心橙色播放、右侧点赞/全屏。 +3. 1.5px 进度条,白色缓冲、橙色播放、白色 thumb;保留拖动 seek。 +4. Episodes / Comments / Next Ep 三按钮;末集 Next Ep 置灰。 +5. 精选评论卡复用 `CommentController`,无评论隐藏;VIP/总评论数字段缺失时隐藏。 + +## 三、TDD 顺序 + +1. 详情 widget 测试:hero 16:9、CTA 行、简介展开、集数 chips、2 列剧集卡。 +2. 详情实现:先复用现有 `DramaDetailLogic`,只重排视图和控件。 +3. 播放器 widget 测试:卡片模式结构、三按钮行、进度条颜色/thumb、末集禁用。 +4. 播放器实现:新增卡片布局,保留原全屏 feed;复用 ticket/session/queue。 +5. 回归:PiP、票据错误、进度、收藏、下载、举报、评论、自动连播。 + +## 四、数据缺口 + +| 设计字段 | 模型状态 | 处理 | +| --- | --- | --- | +| coverUrl | 无(只有 posterUrl) | hero 使用 posterUrl | +| 评分 | 无 | 隐藏 | +| 完结状态 | 无 | 隐藏 | +| Top 排名 | 无 | 隐藏 | +| Trailer/4K | 无 | 隐藏 | +| VIP | 无 | 隐藏 | +| 剧级点赞/评论总数 | 无 | 只显示文案/已加载数量,不伪造 | +| 场景标签 | 无 | 隐藏 | +| 集数范围 | 无 | 显示 All chip | +| 倍速能力 | 无播放速率接口 | 显示 1.0x,不伪造切换能力 | + +## 五、风险 + +- 卡片播放器切换全屏时复用同一 `PageController`;只在二者之一挂载,避免控制器绑定两个 PageView。 +- 自动连播依赖 PageController 动画,卡片模式保留 PageView 作为视频底层。 +- 评论卡新增一次评论首屏请求;无评论/失败时直接隐藏,不影响播放。 +- 详情页 hero、2 列剧集卡在小屏下需自适应缩略图宽度,避免溢出。 + +## 六、门禁与 Git + +```bash +dart analyze lib test +flutter test +flutter build apk --debug +``` + +完成后 `--no-ff` 合并回 `develop` 并 push;作者/提交者 +`Zhou Weidong <502333560@qq.com>`。真机验收由用户执行。 + diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index a3e2eed..a54626f 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K25 客户端详情页 + 播放器对齐设计稿 +## [已完成·待用户验收] 2026-10-19 | K25 客户端详情页 + 播放器对齐设计稿 **用户指令(2026-10-19)**:「开始实现详情页和播放器」。 > 设计权威:`docs/design/screens/03-detail.html`、`04-player.html`(origin/main 或 `/tmp/specs-design/docs/design/screens/`)。 diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index c6725de..55f1e9c 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -4945,3 +4945,66 @@ ReelShort `develop` 与 `feature/flutter-k24-design-system` 已推送。 清空恢复;有观看记录时显示 Continue Watching,无记录时不显示。 4. 点 Me,确认账号内容与 History/Watchlist/Liked 在同一页;切回 Home 播放进度与收藏状态保留。 5. 深色/浅色系统、320×568 与 390×844 小屏检查无溢出、文字不截断。 + +### K25 客户端详情页 + 播放器(2026-10-19) + +范围:详情页与 `homeMode=false` 卡片播放器;`homeMode=true` 首页沉浸 feed 保持 K24 现状。 + +详情页: + +- 16:9 hero(当前模型只有 `posterUrl`)、底部渐变、玻璃返回/分享/收藏/更多。 +- 集数 pill、24px 标题、Season 副标题、`viewCount`、题材标签;评分/完结/榜单项无字段隐藏。 +- 16px 玻璃简介卡,2 行 + More/Less。 +- 橙色全宽 Start Watching/继续观看 + 48×48 收藏/下载;举报保留在更多菜单。 +- Episodes 标题 + All 范围 chip;46×44 横向集数 chips,锁定项紫色;2 列剧集卡, + 390 宽下缩略图实测 96×64,含 Free/Coin、时长、锁态与下载入口。 + +播放器(从详情进入): + +- 顶部返回、剧名 + Ep.x、更多(下载/PiP)。 +- 9:10 圆角 16 视频框、Auto-Next/1.0x pill、中心橙色播放、右侧 36px 点赞/全屏。 +- 1.5px 进度条:白色 30% 缓冲、`#FF5B3D` 播放段、白色 thumb;左中右时间/集数信息,保留拖动 seek。 +- Episodes / Comments / Next Ep 三按钮;末集 Next 置灰。 +- `PlayerFeaturedComment` 复用 `CommentController`,无评论隐藏;VIP/总数无字段不显示。 +- 保留票据三态、自动连播、PiP、下载、点赞/收藏/评论与播放会话协议。 + +数据缺口:`coverUrl`、评分、完结、Top 排名、Trailer/4K、VIP、剧级点赞/评论总数、场景标签、 +集数范围、倍速能力均无模型字段;按 INBOX 隐藏或不伪造。 + +门禁原始输出: + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! + +$ flutter test +00:30 +352: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 26.3s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建说明:主工作区仍有用户侧 `flutter run`,因此在 `/tmp/reelshort-k25-final` +独立 worktree 执行 `flutter pub get` 与 `flutter build apk --debug`,避免并发占用 `build/`。 + +Git: + +```text +ec163f9 feat(detail): 重做详情页视觉结构 +689063a feat(player): 新增卡片式播放器 +04fddce merge: K25 客户端详情页与播放器 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 +ReelShort `develop` 与 `feature/flutter-k25-detail-player` 已推送。 + +真机验收步骤(设备侧取证由用户执行): + +1. 从首页/发现进入详情,检查 16:9 hero、玻璃按钮、集数/播放量/题材、简介展开。 +2. 点 Start Watching,确认进入卡片播放器:9:10 视频框、进度条、三按钮行。 +3. 拖动进度条、切换下一集、末集按钮置灰;点 Episodes/Comments 打开现有弹窗。 +4. 有评论时检查精选评论卡与 View all;无评论时应隐藏。 +5. 从播放器更多菜单验证下载/PiP;点全屏进入横屏,退出后回到卡片布局。 +6. 检查收藏、举报、续看进度、票据失败重试与自动连播未回退。 From 7613726b1a49ca18fdb28b02cbcdbbefea4bc54b Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:24:49 +0800 Subject: [PATCH 39/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=99=A8=E5=85=A8=E5=B1=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 55f1e9c..93a4380 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5008,3 +5008,44 @@ ReelShort `develop` 与 `feature/flutter-k25-detail-player` 已推送。 4. 有评论时检查精选评论卡与 View all;无评论时应隐藏。 5. 从播放器更多菜单验证下载/PiP;点全屏进入横屏,退出后回到卡片布局。 6. 检查收藏、举报、续看进度、票据失败重试与自动连播未回退。 + +### K25 修复:详情/选集进入恢复全屏(2026-10-19) + +- `player_view.dart` 移除 `!homeMode && !fullscreen` 的卡片播放器分支,详情 CTA 与集数 chip + 进入后统一走原有全屏 `PageView` + `_PlaybackOverlay`,与首页 feed 一致。 +- 删除仅卡片模式使用的 `_buildCardPlayer/_buildCardVideo/_cardTopBar/_cardActions/` + `_showCardMore/_CardIconButton/_CardActionButton`,并删除 + `card_seek_bar.dart`、`player_featured_comment.dart`。 +- `player_logic.dart` 删除仅卡片模式使用的 `hasNextEpisode/playNextEpisode`; + 票据、进度、PiP、下载、互动、选集、评论与自动连播逻辑保持原样。 +- 删除 `player_card_view_test.dart`,新增 `player_fullscreen_test.dart`: + 发现卡片进入、详情 CTA、详情集数 chip 三条路径均断言存在 `rail-like/rail-save/` + `rail-comments/rail-share`、PiP、Clear screen 与 Slider,且不存在 `card-player-*` Key。 +- 清理仅卡片模式使用的 `autoNextOn/viewAll/enterFullscreen` l10n key。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:28 +351: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 23.7s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建仍在 `/tmp/reelshort-player-fullscreen` 独立 worktree 完成,避免与用户侧 +`flutter run` 并发占用主 `build/`。 + +Git: + +```text +1c94b72 fix(player): 恢复详情与选集全屏播放 +eefabb6 merge: 修复播放器全屏进入方式 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-player-fullscreen` 已推送。真机验收由用户执行。 From 5cc6ce9d328fabcaf0524f3fd65e311e7516bf94 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:35:28 +0800 Subject: [PATCH 40/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K26?= =?UTF-8?q?=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E8=AE=BE=E8=AE=A1=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=A0=A1=E6=AD=A3=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 93 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index a54626f..d739341 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,98 @@ --- -## [已完成·待用户验收] 2026-10-19 | K25 客户端详情页 + 播放器对齐设计稿 +## [待处理] 2026-10-19 | K26 客户端按「移动端设计预览.html」校正六屏 + +**用户指令(2026-10-19)**:「现在看 移动端设计预览.html 按这个来」。 +> 新增权威设计文件(本地已同步): +> `/Users/jianghaifeng/Desktop/ReelShort/docs/移动端设计预览.html` +> 该文件优先于之前的 Stitch screens;颜色/布局/组件尺寸以它为准。 +> 保留 K24 已接入的 Outfit/Plus Jakarta Sans 字体,其余按预览校正。 + +### 一、全局 Token(按预览) + +- 主色 `#FF5B3D`、强调 `#9278EA`、背景 `#0B0C10`、底栏 `#0D0D11`、 + 卡片 `#1B1C21` / `#1C1D21`、输入 `#25252A`、正文 `#E6E1E3`、次要 `#D2CDD0`、浅橙 `#FFA490`。 +- 圆角:卡片 10–14、按钮 9、chips 20、封面 10;不再统一全圆。 +- 字体沿用 Outfit(标题)/ Plus Jakarta Sans(正文);字号按预览 9/10/11/12/13/14/15/18/20。 +- 更新 `AppColors`/`AppDimens`/`GlassPanel` 默认值;保留现有语义名。 + +### 二、首页(预览 01) + +1. 顶部:剧名 + 右侧搜索/菜单 28px 圆钮;不再显示 HOT/Season/剧集头像 Follow。 +2. 右侧互动:Like / Comment / Share / Favorite 四项,22px 图标 + 9px 文案/计数; + 下载/PiP 继续收进“更多”。 +3. 底部玻璃卡(`rgba(15,15,20,.72)`、blur 6、radius 14、padding 11/12): + - 题材 tags(都市/甜宠,8px) + - `第 x 集 / 共 y 集`(9px) + - 剧集标题(13px 800) + - 两个等宽 34px 按钮:`▶ 追剧`(橙色)/ `选集`(#2a2a30) +4. 底部 3 Tab 文案与图标按预览(首页/发现/我的)。 + +### 三、发现页(预览 02) + +1. 顶部:Logo + `发现` + 搜索圆钮 + 头像。 +2. 搜索框 36px、`#25252A`、全圆、左侧搜索图标。 +3. 分类 chips:推荐/悬疑/恋爱/动作,选中橙底白字。 +4. Continue Watching 卡:`#1C1D21`、radius 12、52×66 封面、标题/集数/3px 进度、右侧 56×28 橙色“继续”。 +5. 4 个快捷入口(筛选/排行榜/新剧/收藏):`#202126`、radius 12、高 62、16px 图标 + 9px 文案。 +6. `热门短剧` 标题带 3×18 橙色竖条 + 右侧 `全部 ›`;2 列网格,封面高 120、radius 10、 + 左上“免费”角标、底部渐变标题、下方 11px 标题 + 9px 题材。 +7. 移除预览中没有的额外区块(轮播/多余 banner)。 + +### 四、详情页(预览 03) + +1. Hero 高 190、圆角 0、左上 28px 圆形返回;不再放分享/收藏浮层。 +2. 内容:`N 集 · 已完结`(紫色 9px,完结无数据时只显示 N 集)、标题 18px、简介 11px / 1.6。 +3. `▶ 开始观看` 40px 橙色按钮。 +4. `选集` 标题 + 横向/换行集数 chips(1 起,选中橙底白字,锁定紫色)。 +5. 简化 K25 的统计/CTA 行/剧集预览卡;保留播放、收藏、下载逻辑(收藏/下载可放“更多”)。 +6. 不加底部 Tab。 + +### 五、播放器(预览 04 + 用户要求全屏) + +1. 全屏播放(用户已明确);顶部 46px:28px 返回 + 居中 `剧名 · 第 x 集` + 28px 更多。 +2. 视频区:中心 52px 播放圆钮;右下 `1.0x` 倍速文字;无右侧互动栏。 +3. 进度条 3px、`#FF5B3D` 播放段、`#474248` 轨道。 +4. 三按钮行:`选集` / `评论` / `下一集`,高 32、radius 9,下一集橙色,末集置灰。 +5. 一条精选评论卡:`#1B1C21`、radius 10、头像/昵称/时间/正文;无评论隐藏。 +6. 下载/PiP 收进更多;保留票据、自动连播、进度、互动逻辑。 + +### 六、我的页(预览 05) + +1. 顶部:Logo + `我的` + 搜索圆钮 + 头像。 +2. 用户行:48px 头像、昵称、欢迎语、右侧“登录/注册”chip(已登录显示账号信息)。 +3. 金币卡:`#201B1E`、radius 13、金币图标、我的金币、`0 金币 · 去充值`、右侧 `›`。 +4. Continue Watching 卡:`#1B1C21`、radius 12、50×64 封面、标题、第 x 集 · 时间、橙色“继续”。 +5. Tabs:历史(橙色)/ 收藏 / 喜欢;一条历史卡(48×60 封面、标题、集数/时间、播放圆钮)。 +6. 语言行:`#1B1C21`、radius 12、语言 + 当前值(橙色)。 +7. 底部 3 Tab;原 My List 区块保留在 Me 页内部。 + +### 七、登录页(预览 06) + +1. 居中 64px 渐变 Logo(`#FF5B3D → #9278EA`,radius 18)+ `水果短剧` 20px + 副标题 11px。 +2. 三个 44px 入口:Google(白底)、手机号(`#25252A`)、邮箱(`#25252A`); + Google/手机号后端未就绪时置灰并提示“即将开放”;邮箱进入现有邮箱表单。 +3. 底部 9px 法律文案:继续即代表同意《用户协议》与《隐私政策》。 +4. 保留 K21 邮箱表单作为二级页,不改认证逻辑。 + +### 八、数据与测试 + +- 预览中的 12.4k、3.2k、已完结、VIP 等:有真实数据才显示,否则隐藏,不伪造。 +- 更新首页/发现/详情/播放器/我的/登录相关测试;保留播放、进度、收藏、下载、PiP 行为断言。 +- 新增:预览布局关键 Key、3 Tab、搜索、Continue Watching、选集 chips、全屏播放器三按钮、登录入口。 +- `dart analyze lib test` 零告警;`flutter test` 全过;`flutter build apk --debug` 通过。 + +### 九、Git + +- 从干净 `develop`(基线 `eefabb6`)拉 `feature/flutter-k26-mobile-preview`,小步提交; + `--no-ff` 合并回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;不动 main。 +- 计划文档 `FruitServer/docs/plans/2026-10-19-K26.md`;留痕写 `PROGRESS.md`。 +- 回执:六屏改动、token、测试条数与门禁原始输出、数据缺口、真机验收步骤。 + +--- + +## [待处理] 2026-10-19 | K25 客户端详情页 + 播放器对齐设计稿 **用户指令(2026-10-19)**:「开始实现详情页和播放器」。 > 设计权威:`docs/design/screens/03-detail.html`、`04-player.html`(origin/main 或 `/tmp/specs-design/docs/design/screens/`)。 From 6fd532beae3a5573cddbc5528e5c8f63d8afc245 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:51:19 +0800 Subject: [PATCH 41/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K26?= =?UTF-8?q?=20=E5=85=AD=E5=B1=8F=E9=A2=84=E8=A7=88=E6=A0=A1=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/2026-10-19-K26.md | 83 ++++++++++++++++++++++++++++++++++++ docs/plans/INBOX.md | 2 +- docs/plans/PROGRESS.md | 71 ++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 docs/plans/2026-10-19-K26.md diff --git a/docs/plans/2026-10-19-K26.md b/docs/plans/2026-10-19-K26.md new file mode 100644 index 0000000..11f028c --- /dev/null +++ b/docs/plans/2026-10-19-K26.md @@ -0,0 +1,83 @@ +# K26 计划:客户端按「移动端设计预览」校正六屏 + +日期:2026-10-19 +基线:`ReelShort/develop` = `eefabb6` +分支:`feature/flutter-k26-mobile-preview` + +## 一、范围 + +按本地 `/Users/jianghaifeng/Desktop/ReelShort/docs/移动端设计预览.html` +校正六屏:首页、发现、详情、播放器、我的、登录。该文件优先于此前 Stitch screens。 + +保留 K24 的 Outfit / Plus Jakarta Sans、Provider 业务逻辑、现有接口与数据模型。 +不改后端、Web、specs、main。 + +## 二、Token + +| 语义 | 值 | +| --- | --- | +| primary | `#FF5B3D` | +| secondary | `#9278EA` | +| background | `#0B0C10` | +| nav | `#0D0D11` | +| card | `#1B1C21` | +| cardAlt | `#1C1D21` | +| input / quick | `#25252A` / `#202126` | +| gold card | `#201B1E` | +| text / dim / accent | `#E6E1E3` / `#D2CDD0` / `#FFA490` | +| border | `white 8%` | + +圆角:卡片 10-14、按钮 9、chips 20、封面 10。 +新增紧凑字号 token(9/10/11/12/13/14/15/18/20)与按钮高度 token(28/32/34/40/44)。 + +## 三、六屏 + +1. 首页:剧名 + 搜索/菜单;Like/Comment/Share/Favorite 四互动;底部玻璃卡 + (tags、第 x/共 y 集、13px 标题、34px 追剧/选集);去掉 HOT/Season/Follow。 +2. 发现:Logo + 发现 + 搜索/头像;36px 搜索框;分类 chips;52×66 Continue Watching; + 4 个 62px 快捷入口;热门短剧标题 + 2 列封面高 120 网格。 +3. 详情:190px hero + 28px 返回;N 集、18px 标题、11px 简介、40px 开始观看、选集 chips; + 收藏/下载/举报收进更多;删除统计行、预览卡与底部 Tab。 +4. 播放器:全屏;46px 顶栏;中心 52px 播放 + 1.0x;3px 进度;32px 选集/评论/下一集; + 一条精选评论卡;无右侧互动栏;下载/PiP/互动收进更多。 +5. 我的:顶部 Logo + 我的 + 搜索/头像;48px 用户行;金币卡;Continue Watching; + 历史/收藏/喜欢;语言行;底部 3 Tab。 +6. 登录:64px 渐变 Logo + 水果短剧 + 副标题;Google/手机号/邮箱三个 44px 入口; + Google/手机号置灰提示即将开放,邮箱进入 K21 表单;底部法律文案。 + +## 四、TDD 顺序 + +1. Token / AppDimens / GlassPanel 测试。 +2. 首页 overlay 结构与底部导航测试。 +3. 发现页搜索、Continue Watching、快捷入口、2 列网格测试。 +4. 详情页 190px hero、40px CTA、选集 chips 测试。 +5. 播放器全屏顶栏、三按钮、精选评论测试。 +6. 我的页用户行、金币卡、Continue Watching、语言行测试。 +7. 登录入口与邮箱二级表单测试。 +8. 回归播放、进度、收藏、下载、PiP、票据错误、评论与导航。 + +## 五、数据缺口 + +- 剧级点赞/评论数、已完结、Top 排名、VIP、评分、场景标签无模型字段:隐藏。 +- Continue Watching 仅有 `episodeId/position/duration`;集号能从剧集列表匹配时显示。 +- 金币余额与 Google/手机号登录后端未就绪:金币显示 0,Google/手机号入口提示即将开放。 +- 剧集时长只有 `durationSec`;缺失则不显示。 + +## 六、风险 + +- 六屏同时调整会触碰大量既有 widget 测试;只改视觉/布局与入口,不改业务逻辑。 +- 登录页改成入口页后,K21 邮箱表单测试需要先点击邮箱入口;表单本身与认证逻辑保持不变。 +- 播放器仍复用 ticket/PlaybackSession/PlaybackQueue;只替换非首页的 overlay。 +- 卡片圆角与按钮高度变化可能影响小屏布局,用 320×568、360×720、390×844 回归。 + +## 七、门禁 + +```bash +dart analyze lib test +flutter test +flutter build apk --debug +``` + +完成后 `--no-ff` 合并回 `develop` 并 push;作者/提交者 +`Zhou Weidong <502333560@qq.com>`。真机验收由用户执行。 + diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index d739341..5131112 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K26 客户端按「移动端设计预览.html」校正六屏 +## [已完成·待用户验收] 2026-10-19 | K26 客户端按「移动端设计预览.html」校正六屏 **用户指令(2026-10-19)**:「现在看 移动端设计预览.html 按这个来」。 > 新增权威设计文件(本地已同步): diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 93a4380..0c0a6dd 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5049,3 +5049,74 @@ eefabb6 merge: 修复播放器全屏进入方式 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-player-fullscreen` 已推送。真机验收由用户执行。 + +### K26 客户端六屏按「移动端设计预览」校正(2026-10-19) + +权威文件:`/Users/jianghaifeng/Desktop/ReelShort/docs/移动端设计预览.html`。 +保留 K24 的 Outfit / Plus Jakarta Sans、全部 Provider 业务逻辑与接口。 + +Token: + +- `bar=#0D0D11`、`card=#1B1C21`、`cardAlt/raised=#1C1D21`、`input=#25252A`、 + `quick=#202126`、`goldCard=#201B1E`、`text=#E6E1E3`、`muted=#D2CDD0`、 + `subtle=#9A96A3`、`accent=#FFA490`。 +- 卡片圆角 12、按钮 9、chips 20、封面 10;导航高 54、图标 17、文字 9; + 进度条 3px。 + +六屏: + +1. 首页:剧名 + 28px 搜索/菜单;Like/Comment/Share/Favorite 四项;底部 14px 玻璃卡 + (tags、第 x/共 y 集、13px 标题、34px 追剧/选集);去掉 HOT/Season/头像 Follow。 +2. 发现:Logo + 发现 + 搜索/头像;36px 搜索框;推荐分类 chips;52×66 Continue Watching; + 4 个 62px 快捷入口;热门短剧标题 + 2 列 120px 封面网格。 +3. 详情:190px hero + 28px 返回;N 集、18px 标题、11px 简介、40px 开始观看、选集 chips; + 收藏/下载/分享/举报收进更多;移除 K25 统计行、CTA 行与剧集预览卡。 +4. 播放器:全屏 46px 顶栏;中心 52px 播放、1.0x;3px 进度;32px 选集/评论/下一集; + 精选评论卡;无右侧互动栏;下载/PiP/点赞/收藏/分享收进更多。 +5. 我的:Logo + 我的 + 搜索/头像;48px 用户行;`#201B1E` 金币卡;50×64 Continue Watching; + 历史/收藏/喜欢 Tabs;历史卡;语言行;保留通知/下载/账号中心入口。 +6. 登录:64px 渐变 Logo + 水果短剧 + 副标题;Google/手机号/邮箱三个 44px 入口; + Google/手机号提示即将开放,邮箱进入 K21 表单;底部法律文案。 + +新增/更新测试:首页预览卡、发现搜索/Continue Watching/2 列网格、详情选集 chips、 +全屏播放器三按钮、Me 页用户/金币/继续观看/语言行、登录三入口。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:30 +354: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 27.2s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-k26-final` 独立 worktree 完成,避免与用户侧 `flutter run` +并发占用主 `build/`。 + +Git: + +```text +87db548 feat(theme): 校正 K26 预览色板与导航 +21d457f feat(ui): 校正首页发现详情播放器预览 +fecc5b0 feat(ui): 新增登录入口与我的页预览 +8767b56 test(ui): 更新三 Tab 预览断言 +a5398da merge: K26 客户端六屏按预览校正 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`。 +ReelShort `develop` 与 `feature/flutter-k26-mobile-preview` 已推送。 + +真机验收步骤(设备侧取证由用户执行): + +1. 首页检查剧名/搜索/菜单、四项互动、底部玻璃卡与 34px 追剧/选集按钮。 +2. 发现检查 36px 搜索、分类 chips、Continue Watching、4 快捷入口、2 列热门短剧。 +3. 详情检查 190px hero、N 集、18px 标题、40px 开始观看与选集 chips;更多菜单含收藏/下载。 +4. 从详情进入播放器,检查全屏顶栏、中心播放、3px 进度、三按钮与精选评论。 +5. 我的检查用户行、金币卡、Continue Watching、历史/收藏/喜欢与语言行。 +6. 登录页检查三个入口;Google/手机号提示即将开放,邮箱进入现有表单。 +7. 320×568、360×720、390×844 与深色/浅色检查无溢出。 From 71e2f266ff7435a42e51805b475de20dfc58115c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 15:59:16 +0800 Subject: [PATCH 42/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K26?= =?UTF-8?q?=20=E6=97=A7=20UI=20=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 0c0a6dd..6acdcb1 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5120,3 +5120,49 @@ ReelShort `develop` 与 `feature/flutter-k26-mobile-preview` 已推送。 5. 我的检查用户行、金币卡、Continue Watching、历史/收藏/喜欢与语言行。 6. 登录页检查三个入口;Google/手机号提示即将开放,邮箱进入现有表单。 7. 320×568、360×720、390×844 与深色/浅色检查无溢出。 + +### K26 清理:预览为唯一权威(2026-10-19) + +按用户口径移除旧 UI 与死代码,不保留新旧两套: + +- 删除旧 Discover 3D 轮播 `cover_carousel.dart`、`cover_carousel_test.dart`、 + `home_banner_source_test.dart`;发现页不再存在轮播/banner 分支。 +- 删除旧首页侧滑 `HomeQuickDrawer`,改为预览 token 的 `HomeMenuSheet` 底部菜单; + 保留 `drawer-*` 业务入口 Key(现指新菜单项,不再引用旧 Drawer 组件)。 +- 删除无入口的横屏全屏实现:`PlayerLogic.fullscreen/setFullscreen`、 + `_FullscreenControls`、`watchFullscreen/exitFullscreen` l10n。 +- 删除清屏旧 UI:`screenCleared/setScreenCleared`、首页更多里的清屏项、 + 播放器退出清屏按钮、`clearScreen/exitClearScreen` l10n。 +- 删除旧 Key 及其测试:`tab-my-list`、`home-all-dramas-title`、`card-player-*`、 + `home-feed-clear`、旧清屏/沉浸测试。 +- 全仓 grep 复核:`CoverCarousel|HomeQuickDrawer|_FullscreenControls|setFullscreen|` + `setScreenCleared|card-player-|detail-episode-grid|rail-download|tab-my-list` 均为 0 引用。 + +六屏仍严格对应预览:首页玻璃卡四互动、发现搜索/Continue/2 列、详情 190px hero/选集 +chips、全屏播放器三按钮、Me 用户/金币/Continue/语言、登录三入口。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:26 +343: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 25.5s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-k26-cleanup` 独立 worktree 完成。 + +Git: + +```text +5422581 refactor(ui): 清理 K26 旧 UI 与死代码 +c825025 merge: 清理 K26 旧 UI 与死代码 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-k26-preview-authority` 已推送。 From 696e36a9913299a40e28a642aa5a0e968ceb94ce Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:07:56 +0800 Subject: [PATCH 43/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=9A=82=E5=81=9C=E6=8C=89=E9=92=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 6acdcb1..0f7f113 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5166,3 +5166,41 @@ c825025 merge: 清理 K26 旧 UI 与死代码 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-k26-preview-authority` 已推送。 + +### K26 修复:详情播放器暂停重复按钮(2026-10-19) + +- `player_view.dart:34` 新增 `shouldShowFeedPauseIndicator(...)`,条件为 + `homeMode && selected && ready && !playing && !pip`。 +- `player_view.dart:314` 独立中心播放提示改用该条件,并加 Key + `home-feed-center-play`;详情/选集进入不再渲染这层,只保留 + `_PlaybackOverlay` 的 `player-play-toggle`。 +- 首页 `homeMode=true` 暂停时仍显示独立中心播放提示,行为不变。 +- `player_fullscreen_test.dart` 新增:详情播放暂停后 + `player-play-toggle` 仅 1 个、`home-feed-center-play` 为 0、 + 全屏播放图标仅 1 个;另加条件单测验证首页 true、详情 false、播放中 false。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:27 +345: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 24.5s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-player-single-pause` 独立 worktree 完成。 + +Git: + +```text +f0c5354 fix(player): 移除详情暂停重复按钮 +568f051 merge: 修复详情暂停重复按钮 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-player-single-pause` 已推送。 From 258be6e4e79a441017f3229ea2a29a67e809edd0 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:17:06 +0800 Subject: [PATCH 44/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=99=A8=E6=8E=A7=E5=88=B6=E5=B1=82=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 0f7f113..8064d13 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5204,3 +5204,43 @@ f0c5354 fix(player): 移除详情暂停重复按钮 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-player-single-pause` 已推送。 + +### K26 修复:播放器共享中心按钮与控制层自动隐藏(2026-10-19) + +- 新增 `lib/pages/player/widgets/player_center_toggle.dart`: + 52×52、圆形 `Color(0x80000000)`、播放/暂停图标 26。 +- 首页 feed 暂停提示与 `_PlaybackOverlay` 中心按钮统一改用 + `PlayerCenterToggle`;首页 Key `home-feed-center-play`,播放页 Key + `player-play-toggle`。 +- `_PlaybackOverlay` 改为 StatefulWidget:进入显示控制层,Timer 2.5 秒后隐藏; + 点击 `player-video-tap` 重新显示;控制层可见时点击视频会切换播放/暂停。 + dispose 取消 Timer。 +- 隐藏时只保留视频画面与点击层;PiP 分支不构建 overlay,逻辑不受影响。 +- 间距:播放器顶栏左右 14、进度条上方 8、三按钮行上 10、评论卡上 12, + 外层 SafeArea;首页右侧互动栏距右 12、距信息卡 16。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:28 +347: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 24.7s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-player-controls` 独立 worktree 完成。 + +Git: + +```text +03e34b3 fix(player): 统一暂停按钮并自动隐藏控制层 +e03ea76 merge: 统一暂停按钮并自动隐藏控制层 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-player-controls` 已推送。 From 7b1030c1ba061b0187d959c70db0dd1db6d4ef30 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:26:15 +0800 Subject: [PATCH 45/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=85=AD=E5=B1=8F=E9=97=B4=E8=B7=9D=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 8064d13..33d328f 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5244,3 +5244,42 @@ e03ea76 merge: 统一暂停按钮并自动隐藏控制层 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-player-controls` 已推送。 + +### K26 修复:首页标题、Me Tabs 与六屏顶栏间距(2026-10-19) + +- 首页底部卡片标题:`home_feed_overlay.dart:201` 改为优先 `episode.title`, + 空值时回退 `localizedDramaTitle(l10n, drama)`;Key `home-feed-episode-title` 保留。 +- Me 页历史/收藏/喜欢:改为左侧固定间距 20px、横向可滚动;文字 14px, + 选中橙色并显示 2px 下划线,未选中 `#E4DBDD`;垂直 padding 6,内容间距 12; + Keys `mine-library-tab-0/1/2` 保留。 +- 顶栏按钮统一 36×36、图标 18: + 首页搜索/菜单、发现搜索/头像、我的搜索/头像、播放器返回/更多、详情 Hero 返回/更多。 + 搜索/菜单/头像间距 8;播放器顶栏左右 14;320 宽回归通过。 +- 首页玻璃卡:padding 12,tags→集数 8、集数→标题 8、标题→按钮 10; + 右侧互动栏距右 12、距信息卡 16。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +349: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 25.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-ui-spacing` 独立 worktree 完成。 + +Git: + +```text +2fd92cd fix(ui): 修正六屏顶栏与内容间距 +cbbd4c8 merge: 修正六屏顶栏与内容间距 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-ui-spacing` 已推送。 From 8e70dd220a1a272899ed858e83fe2fadf5b7f4d2 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:33:30 +0800 Subject: [PATCH 46/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=80=89=E9=9B=86=E7=BD=91=E6=A0=BC=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 33d328f..3436c37 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5283,3 +5283,41 @@ cbbd4c8 merge: 修正六屏顶栏与内容间距 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-ui-spacing` 已推送。 + +### K26 修复:详情选集等宽懒加载网格(2026-10-19) + +- `detail-episode-chips` 从 `Wrap` 改为 `GridView.builder`: + `shrinkWrap: true`、`NeverScrollableScrollPhysics`、懒加载; + `mainAxisSpacing/crossAxisSpacing=8`、`childAspectRatio=1.35`、圆角 9。 +- 列数由 LayoutBuilder 计算:6 列格子宽度 ≥40 时保持 6 列(390/320 宽均为 6), + 否则回退 5 列。 +- 选集按 `episode.number` 升序渲染;使用 `(originalIndex, episode)` 映射, + 点击仍调用 `logic.openPlayer(context, originalIndex)`。 +- 测试覆盖 80 集:6 列、芯片等宽、1→6 同行/7 换行、倒序输入仍升序、 + 点击第 12 集打开 `PlayerPage.initialIndex == 11`、320 宽仍 6 列。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +351: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.9s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-detail-grid` 独立 worktree 完成。 + +Git: + +```text +fbfb976 fix(detail): 选集改为等宽懒加载网格 +f4e1a54 merge: 修正详情选集等宽网格 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-detail-episode-grid` 已推送。 From d9088be2a61af03bf7e5d512702852e25346c305 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:39:48 +0800 Subject: [PATCH 47/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27?= =?UTF-8?q?=20=E6=92=AD=E6=94=BE=E5=99=A8=E6=8E=A7=E5=88=B6=E5=B1=82?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E9=87=8D=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 5131112..fa89856 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,68 @@ --- +## [待处理] 2026-10-19 | K27 播放器控制层交互重做:清屏按钮 + 取消自动隐藏 + 暂停按钮即时消失 + +**用户指令(2026-10-19,原文)**: +> 「现在播放页不对啊 不是点击播放或暂停 等一会所有的按钮都消失了 而是要要清屏按钮 点了清屏其他的才消失 点击暂停是点击一下 暂停 在点击下播放 暂停按钮消失这样」 + +**现状问题(Trae 勘察)** +- `player_view.dart` 的 `_PlaybackOverlayState` 有 `Timer? _hideTimer` + `_scheduleHide()`,2.5 秒后把 `_controlsVisible` 置 false,属于「等一会全部消失」。 +- 首页 `player_view.dart` 中 `shouldShowFeedPauseIndicator` 分支会在暂停后常驻一个中心播放按钮(`home-feed-center-play`)。 +- 播放页中心按钮 `player-play-toggle` 常驻,暂停后也不消失。 +- 首页 `HomeFeedOverlay` 没有清屏按钮;播放页顶栏只有返回 / 标题 / 更多。 + +### 一、控制层常驻(删除一切定时隐藏) + +1. `_PlaybackOverlayState` 删除 `Timer? _hideTimer`、`_scheduleHide()`、`initState/dispose` 中的定时器逻辑;`import 'dart:async'` 若无其它用途一并删除。 +2. `_controlsVisible` 只由用户显式动作改变:点「清屏」→ 隐藏;清屏状态下点画面 → 恢复。**不得有任何延时自动隐藏**。 +3. 进入播放页、切集、选集返回、PiP 返回时,控制层默认可见。 + +### 二、清屏按钮 + +**播放页(`_PlaybackOverlay`)** +1. 顶栏右侧、`player-more` 左侧新增清屏按钮,复用 `_TopAction`(36×36),Key `player-clear-screen`,图标 `Icons.fullscreen_rounded`。 +2. 点击后隐藏:顶栏(`player-controls-top`)、中心按钮、进度条、三按钮、评论卡、`1.0x` 角标;画面上只剩视频。 +3. 清屏状态下点击画面任意处 → 恢复控制层,**不切换播放/暂停**。 +4. tooltip 走 l10n 新增 key `clearScreen`,en/zh/id 三语必须齐全(en `Clear screen` / zh `清屏` / id `Bersihkan layar`)。 + +**首页沉浸 feed** +1. `HomeFeedOverlay` 顶栏在「搜索」与「更多」之间新增清屏按钮,Key `home-feed-clear-screen`,36×36 圆钮,样式复用 `_RoundIcon`。 +2. 点击后隐藏整个 HomeFeedOverlay(剧名行、右侧 rail、底部玻璃卡)、首页暂停提示与渐变遮罩,只留视频。 +3. 该显隐状态由 `player_view.dart` 持有(例如 `_feedChromeVisible`),清屏后点画面恢复,且不切换播放状态。 + +### 三、中心播放/暂停按钮 + +1. 播放中且控制层可见 → 中心显示暂停按钮(`PlayerCenterToggle(playing: true)`,Key `player-play-toggle`)。 +2. 点击中心暂停按钮 → 执行暂停,并且**该按钮立即消失**;不显示常驻的播放按钮。 +3. 暂停中点击画面 → 播放;恢复播放后中心暂停按钮随控制层恢复显示。 +4. 删除首页暂停后的常驻播放按钮分支(`shouldShowFeedPauseIndicator` / `home-feed-center-play`)。若 helper 及测试因此失效,一并删除并更新测试,不留死代码。 +5. 首页与播放页必须共用 `PlayerCenterToggle`,样式不得分叉。 + +### 四、保持不变 + +- 票据三态、进度条 seek、选集、评论、下一集、下载授权、PiP、倍数角标等既有逻辑不改。 +- 不新增第三方依赖;不改后端、不改 Web。 + +### 五、测试(先红后绿) + +更新/新增 widget test,至少覆盖: +1. 播放页初始控制层可见;`pump` 5 秒后 `player-controls-top` / `player-controls-bottom` 仍然存在(证明无自动隐藏)。 +2. 点 `player-clear-screen` → 顶栏、底部控制区、中心按钮都消失;点画面恢复,且播放态不变。 +3. 播放中中心暂停按钮存在;点击后播放态变为暂停且中心按钮消失;再点画面恢复播放。 +4. 首页点 `home-feed-clear-screen` → `home-feed-title`、`home-feed-info-card` 消失;点画面恢复。 +5. 既有全部测试通过(含 `player_fullscreen_test.dart`、`player_center_toggle_test.dart`)。 + +### 六、门禁与流程 + +- 从 `develop` 拉 `fix/flutter-player-clear-screen`。 +- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug`。 +- 完成后 `git checkout develop && git merge --no-ff` 并 push;提交身份 `Zhou Weidong <502333560@qq.com>`;禁用 `git add -A`。 +- 本批只做代码改造与本地门禁;**真机验证由用户执行**,Codex 不得自行真机验证,回执里给出用户可照做的验证步骤与每步预期结果。 +- 在 `docs/plans/PROGRESS.md` 追加留痕(命令 + 原始输出 + 解读)。 + +--- + ## [已完成·待用户验收] 2026-10-19 | K26 客户端按「移动端设计预览.html」校正六屏 **用户指令(2026-10-19)**:「现在看 移动端设计预览.html 按这个来」。 From 98b3d30ca040c949a844a8f51158cc067266c9d7 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:44:42 +0800 Subject: [PATCH 48/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 3436c37..6c632a3 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5321,3 +5321,42 @@ f4e1a54 merge: 修正详情选集等宽网格 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-detail-episode-grid` 已推送。 + +### K27 播放器控制层:清屏 + 取消自动隐藏(2026-10-19) + +- 删除 `_PlaybackOverlayState` 的 Timer/自动隐藏;控制层进入默认可见并常驻, + 仅由清屏与点画面恢复改变。 +- 播放页顶栏新增 `player-clear-screen`(36×36,`Icons.fullscreen_rounded`), + 点击隐藏顶栏、中心按钮、进度条、三按钮、评论卡和 1.0x;点 `player-video-tap` + 恢复,不改变播放态。 +- 首页 `HomeFeedOverlay` 新增 `home-feed-clear-screen`;清屏后隐藏标题/rail/信息卡/ + 渐变遮罩,点 `home-feed-video-tap` 恢复,不改变播放态。 +- 中心按钮只在 `playing` 时显示暂停;点击后暂停且按钮消失;暂停时点画面恢复播放, + 按钮随播放态恢复。删除 `shouldShowFeedPauseIndicator/home-feed-center-play`。 +- 新增 l10n `clearScreen` 三语;票据/seek/选集/评论/下一集/下载/PiP 未改。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:28 +351: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 24.6s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-player-clear-screen` 独立 worktree 完成。 + +Git: + +```text +f613033 fix(player): 改为显式清屏交互 +60ec19f merge: 改为显式清屏交互 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-player-clear-screen` 已推送。真机验收由用户执行。 From 7801fad1b50fb480c75089f4adda5baa7fc1ab64 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:46:54 +0800 Subject: [PATCH 49/82] =?UTF-8?q?docs(plans):=20=E6=A0=87=E8=AE=B0=20K27?= =?UTF-8?q?=20=E5=B7=B2=E5=AE=8C=E6=88=90=E5=BE=85=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index fa89856..aea9f30 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,7 +20,7 @@ --- -## [待处理] 2026-10-19 | K27 播放器控制层交互重做:清屏按钮 + 取消自动隐藏 + 暂停按钮即时消失 +## [已完成·待用户验收] 2026-10-19 | K27 播放器控制层交互重做:清屏按钮 + 取消自动隐藏 + 暂停按钮即时消失 **用户指令(2026-10-19,原文)**: > 「现在播放页不对啊 不是点击播放或暂停 等一会所有的按钮都消失了 而是要要清屏按钮 点了清屏其他的才消失 点击暂停是点击一下 暂停 在点击下播放 暂停按钮消失这样」 From 80a3b27353874106aa624202812fad1abe9af8ec Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:48:46 +0800 Subject: [PATCH 50/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?=20=E4=B8=AD=E5=BF=83=E6=8C=89=E9=92=AE=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index aea9f30..54012d0 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,31 @@ --- +## [待处理] 2026-10-19 | K27.1 中心按钮改口径:播放中不显示,仅暂停时显示播放按钮 + +**用户指令(2026-10-19,原文)**: +> 「播放按钮不用显示啊 就点击暂停的时候显示」 + +**口径(覆盖 K27 第三节,其余不变)** +- 播放中:**不显示任何中心按钮**;点击画面 = 暂停(点一下暂停)。 +- 暂停后:中心显示播放按钮(Key 沿用 `player-play-toggle`,`playing: false`),点击或再点画面 = 播放;播放开始后按钮立即消失。 +- 首页沉浸 feed 同步:暂停时显示中心播放按钮 `home-feed-center-play`,播放中不显示;点画面仍是播放/暂停切换。 +- 清屏状态下中心按钮一并隐藏;点画面先恢复控制层,不改变播放态。 +- 不引入任何定时器;控制层仍然常驻。 + +**实现要点** +1. `_PlaybackOverlay`:把 `if (widget.playing) PlayerCenterToggle(playing: true)` 改为 `if (!widget.playing) PlayerCenterToggle(playing: false, onTap: widget.onTogglePlay)`。 +2. `_onVideoTap`:控制层可见时直接 `widget.onTogglePlay()`;清屏时只恢复控制层。 +3. `player_view.dart` 首页分支:恢复暂停态中心播放按钮(`home-feed-center-play` → `setUserWantsPlay(true)`),播放态不渲染;PiP/清屏时不渲染。 +4. 测试更新: + - 播放中 `player-play-toggle` 不存在;点画面后视频暂停且按钮出现;点按钮后恢复播放且按钮消失。 + - 首页暂停后 `home-feed-center-play` 出现,播放后消失。 + - 清屏隐藏中心按钮,点画面恢复控制层。 + - `pump` 5 秒控件仍在。 +5. 门禁/分支/提交规范同 K27:从 `develop` 拉 `fix/flutter-paused-play-toggle`,`dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`,`--no-ff` 合回 develop 并 push,作者 `Zhou Weidong <502333560@qq.com>`,PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [已完成·待用户验收] 2026-10-19 | K27 播放器控制层交互重做:清屏按钮 + 取消自动隐藏 + 暂停按钮即时消失 **用户指令(2026-10-19,原文)**: From e03215f44538be5b79f977331b8fd563e8b8e54e Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:49:30 +0800 Subject: [PATCH 51/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.2?= =?UTF-8?q?=20=E9=80=80=E5=87=BA=E6=B8=85=E5=B1=8F=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 54012d0..c773f01 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,30 @@ --- +## [待处理] 2026-10-19 | K27.2 清屏态增加「退出清屏」浮动按钮 + +**用户指令(2026-10-19,原文)**: +> 「而且有了清屏自然要有退出清屏按钮啊」 + +**口径** +- 播放页与首页 feed 进入清屏态后,画面右上角保留一个「退出清屏」浮动按钮,点击恢复控制层。 +- 按钮规格:36×36 圆形,底色 `Color(0x80000000)`,图标白色 `Icons.fullscreen_exit_rounded`(size 18),距顶部安全区 8、右侧 12。 +- Key:播放页 `player-exit-clear-screen`,首页 `home-feed-exit-clear-screen`。 +- tooltip 新增 l10n key `exitClearScreen`,三语齐全:en `Exit clear screen` / zh `退出清屏` / id `Keluar dari layar bersih`。 +- 点击只恢复控制层,**不改变播放/暂停状态**;恢复后按钮消失。 +- 保留「清屏态点击画面恢复控制层」的现有手势。 +- 按钮不自动隐藏,与控制层显示状态严格互斥。 + +**测试** +1. 点 `player-clear-screen` 后 `player-exit-clear-screen` 出现,控件区仍隐藏。 +2. 点 `player-exit-clear-screen` 后顶栏/底部/中心按钮恢复,退出按钮消失,播放态不变。 +3. 首页 `home-feed-clear-screen` → `home-feed-exit-clear-screen` 出现;点击后 overlay 恢复、按钮消失。 +4. 既有测试全过。 + +**流程**:可从 `develop` 拉 `fix/flutter-exit-clear-screen`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.1 中心按钮改口径:播放中不显示,仅暂停时显示播放按钮 **用户指令(2026-10-19,原文)**: From 03e17166ab6cf46dd3d5cc172d2f0d778c88630f Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:51:32 +0800 Subject: [PATCH 52/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?=20=E6=9A=82=E5=81=9C=E6=8C=89=E9=92=AE=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 6c632a3..38fdcfb 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5360,3 +5360,38 @@ f613033 fix(player): 改为显式清屏交互 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-player-clear-screen` 已推送。真机验收由用户执行。 + +### K27.1 中心按钮口径:仅暂停时显示(2026-10-19) + +- 播放中不渲染中心按钮;点击画面切换暂停,暂停后显示 + `player-play-toggle`(`PlayerCenterToggle(playing:false)`)。 +- 点中心按钮或再点画面恢复播放,按钮立即消失。 +- 首页恢复暂停态 `home-feed-center-play`;播放中、清屏、PiP 时不渲染。 +- 清屏时中心按钮一并隐藏,点画面仅恢复控制层,不改变播放态。 +- 无定时器,控制层仍常驻。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +352: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 24.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-paused-play-toggle` 独立 worktree 完成。 + +Git: + +```text +0eabb0a fix(player): 仅在暂停时显示播放按钮 +3fcfd68 merge: 仅在暂停时显示播放按钮 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-paused-play-toggle` 已推送。 From e22e942c2700857f67be74ea83134642dadf702c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 16:54:08 +0800 Subject: [PATCH 53/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.2?= =?UTF-8?q?=20=E9=80=80=E5=87=BA=E6=B8=85=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 38fdcfb..9775688 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5395,3 +5395,40 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-paused-play-toggle` 已推送。 + +### K27.2 清屏态退出按钮(2026-10-19) + +- 新增共享 `ExitClearScreenButton`:36×36、`Color(0x80000000)`、 + 白色 `Icons.fullscreen_exit_rounded` 18。 +- 播放页清屏后右上 `top:8/right:12` 显示 `player-exit-clear-screen`; + 点击仅恢复控制层,播放态不变。 +- 首页 feed 清屏后显示 `home-feed-exit-clear-screen`;点击恢复 overlay, + 播放态不变。 +- 保留清屏态点画面恢复手势;退出按钮不自动隐藏。 +- 新增 l10n `exitClearScreen` 三语。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:27 +352: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-exit-clear` 独立 worktree 完成。 + +Git: + +```text +e2e809e fix(player): 增加退出清屏浮动按钮 +a2de5e8 merge: 增加退出清屏浮动按钮 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-exit-clear-screen` 已推送。 From 5c2c273798b3f87999fd7c7b4d8504c8572b0653 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:03:27 +0800 Subject: [PATCH 54/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.3?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E6=80=81=E7=82=B9=E5=87=BB=E4=B8=8E?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index c773f01..73e4799 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,30 @@ --- +## [待处理] 2026-10-19 | K27.3 清屏态点击画面切播放、退出按钮位置与滑动重置 + +**用户指令(2026-10-19,原文)**: +> 「不是啊 点击完清屏 我在点击屏幕如果是播放中应该是暂停啊 而且首页点完清屏 退出清屏的位置不对 如果点击了清屏 在滑动切换也是清屏状态」 + +**口径** +1. 清屏态点击画面 = 播放/暂停切换,**保持清屏**: + - 播放页 `_onVideoTap`:无论控制层是否可见,都调用 `widget.onTogglePlay()`;删除「清屏态点画面只恢复控制层」的分支。 + - 首页清屏态:`home-feed-video-tap` 改为播放/暂停切换,保持清屏。 + - 退出清屏只由右上角 `player-exit-clear-screen` / `home-feed-exit-clear-screen` 触发,点击退出按钮**不改变播放态**。 +2. 首页退出清屏按钮位置修正:放入 `SafeArea`(顶部安全区内 8、右侧 12),36×36,与首页顶栏按钮视觉对齐;不得压在状态栏/刘海下面。 +3. 首页滑动切换剧目时重置清屏:`PageView.onPageChanged` 中把 `_feedChromeVisible` 复位为 true(仅 homeMode),新一页进入时展示控制层。 +4. 不引入定时器;控制层仍常驻;已完成的中心按钮口径(仅暂停时显示播放按钮)不变。 + +**测试** +1. 清屏后点击画面:播放 → 暂停,顶栏/底部仍隐藏,退出按钮仍在;再点 → 播放,仍清屏。 +2. 点退出按钮:控制层恢复,播放态不变。 +3. 首页清屏后用 `PageView` 切换下一页:`home-feed-title` / `home-feed-info-card` 恢复显示。 +4. 既有测试全过(更新原先「点画面恢复控制层」的断言)。 + +**流程**:从最新 `develop` 拉 `fix/flutter-clear-screen-tap`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.2 清屏态增加「退出清屏」浮动按钮 **用户指令(2026-10-19,原文)**: From 8a379966173373526f5449c311c32d1388d6aa59 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:06:44 +0800 Subject: [PATCH 55/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.3?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E6=80=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 9775688..89f9892 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5432,3 +5432,40 @@ a2de5e8 merge: 增加退出清屏浮动按钮 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-exit-clear-screen` 已推送。 + +### K27.3 清屏态点击 / 退出按钮位置 / 滑动复位(2026-10-19) + +- 播放页 `_onVideoTap` 无论清屏与否都调用播放/暂停切换;清屏态不再因点画面恢复控制层。 +- 首页 `home-feed-video-tap` 同样改为播放/暂停切换,保持清屏。 +- 退出清屏只由 `player-exit-clear-screen` / `home-feed-exit-clear-screen` 触发; + 不改变播放态。 +- 首页退出按钮包入 SafeArea(top 8 / right 12),避免状态栏/刘海遮挡。 +- 首页 `PageView.onPageChanged` 在 `homeMode` 下复位 `_feedChromeVisible=true`, + 滑动切剧自动退出清屏。 +- 无定时器,控制层常驻;仅暂停时显示中心播放按钮口径不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:37 +353: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 29.4s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-clear-tap` 独立 worktree 完成。 + +Git: + +```text +aea130b fix(player): 修正清屏态点击与滑动复位 +bc5feeb merge: 修正清屏态点击与滑动复位 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-clear-screen-tap` 已推送。真机验收由用户执行。 From c21f0309bae594f3bbb5565ce62376d2191f16bf Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:11:10 +0800 Subject: [PATCH 56/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.4?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E4=BF=9D=E6=8C=81=E4=B8=8E=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=8C=89=E9=92=AE=E5=B8=B8=E9=A9=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 73e4799..443c726 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,31 @@ --- +## [待处理] 2026-10-19 | K27.4 清屏状态跨滑动保持 + 中心按钮常驻(暂停/播放双态) + +**用户指令(2026-10-19,原文)**: +> 「我点了清屏后 再次滑动 还是没有清屏 而且清屏后点击播放没显示暂停按钮」 + +**口径(覆盖 K27.1 / K27.3 的冲突部分)** +1. **清屏状态跨滑动保持**:撤销 K27.3 在 `onPageChanged` 里复位 `_feedChromeVisible` 的逻辑;首页清屏后上下滑动切剧,新页面仍保持清屏(只有顶栏/右侧 rail/底部卡片/遮罩隐藏,见第 2 条中心按钮除外)。 +2. **中心按钮常驻双态**: + - 播放中显示暂停图标(`playing: true`);暂停中显示播放图标(`playing: false`);点击即切换播放/暂停。 + - 播放页:中心按钮移出 `if (_controlsVisible)` 控制层块,**清屏时仍显示**;清屏仍隐藏顶栏、进度条、三按钮、评论卡、倍速角标。 + - 首页:中心按钮不再依赖 `_feedChromeVisible`,清屏时同样显示;`chromeHidden`(PiP)时不显示。 + - 清屏态下点画面仍是播放/暂停切换;退出清屏仍只由右上角退出按钮触发。 +3. 不引入定时器;顶栏/底部控件仍常驻、不自动隐藏。 + +**测试** +1. 清屏后滑动切换下一页:仍无 `home-feed-title` / `home-feed-info-card`,退出按钮仍在。 +2. 清屏后中心按钮存在:播放中显示暂停图标;点一下 → 暂停并变播放图标;再点 → 播放并变暂停图标。 +3. 清屏后点画面:播放/暂停切换且保持清屏。 +4. 点退出按钮:除中心按钮外的控制层恢复,播放态不变。 +5. 既有测试全过(更新原「滑动复位」「清屏无中心按钮」的断言)。 + +**流程**:从最新 `develop` 拉 `fix/flutter-clear-screen-state`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.3 清屏态点击画面切播放、退出按钮位置与滑动重置 **用户指令(2026-10-19,原文)**: From 4070c4e39edffcfd42fd3650c85fb3b7b071b6d7 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:14:50 +0800 Subject: [PATCH 57/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.4?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E4=BF=9D=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 89f9892..7ec2461 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5469,3 +5469,40 @@ bc5feeb merge: 修正清屏态点击与滑动复位 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-clear-screen-tap` 已推送。真机验收由用户执行。 + +### K27.4 清屏跨滑动保持 + 中心按钮常驻双态(2026-10-19) + +- 撤销 `PageView.onPageChanged` 的 `_feedChromeVisible=true` 复位;首页清屏后 + 滑动切剧仍保持清屏。 +- 播放页中心 `PlayerCenterToggle` 移出控制层条件,清屏时仍显示: + 播放中 `playing:true`(暂停图标),暂停中 `playing:false`(播放图标),点击切换。 +- 首页中心 `home-feed-center-play` 不再依赖清屏状态,仅受 PiP/chromeHidden 控制; + 同样双态显示并可点击切换。 +- 清屏态点画面仍切换播放/暂停并保持清屏;退出只由右上退出按钮触发。 +- 无定时器,顶栏/底部控件仍常驻。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +353: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 23.6s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-clear-state` 独立 worktree 完成。 + +Git: + +```text +0d977da fix(player): 保持清屏并常驻中心按钮 +b1747af merge: 保持清屏并常驻中心按钮 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-clear-screen-state` 已推送。真机验收由用户执行。 From 980ce77192f236cad098d6aa0d02848ae3e1498e Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:18:20 +0800 Subject: [PATCH 58/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.5?= =?UTF-8?q?=20=E4=B8=AD=E5=BF=83=E6=8C=89=E9=92=AE=E4=BB=85=E6=9A=82?= =?UTF-8?q?=E5=81=9C=E6=97=B6=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 443c726..082d777 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,29 @@ --- +## [待处理] 2026-10-19 | K27.5 中心按钮只在暂停时显示(播放状态一律不显示) + +**用户指令(2026-10-19,原文)**: +> 「都说了播放状态不显示啊」 + +**口径(最终,覆盖 K27.4 第 2 条)** +1. **播放中:不显示任何中心按钮**(无论是否清屏、无论首页还是播放页)。 +2. **暂停中:显示中心播放按钮**(`PlayerCenterToggle(playing: false)`,图标为播放);点击它或点画面恢复播放,播放后按钮立即消失。 +3. 播放页:中心按钮单独渲染在 `_controlsVisible` 控制层块之外,保证**清屏 + 暂停时仍能看到播放按钮**;清屏播放中不显示。 +4. 首页:`home-feed-center-play` 仅在 `!userWantsPlay` 时渲染,播放中不显示;清屏不影响该规则(清屏 + 暂停 → 显示播放按钮)。 +5. K27.4 的其他结论保留:清屏状态跨滑动保持、退出清屏按钮、清屏态点画面切播放、无定时器。 + +**测试** +1. 播放中(普通态与清屏态):中心按钮都不存在。 +2. 点画面暂停后:普通态与清屏态都出现播放按钮;点它恢复播放且按钮消失。 +3. 清屏后滑动切剧:仍保持清屏。 +4. 退出按钮恢复控制层且不改变播放态。 +5. 更新 K27.4 里「两种播放状态都显示中心按钮」的断言;既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-center-toggle-paused-only`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.4 清屏状态跨滑动保持 + 中心按钮常驻(暂停/播放双态) **用户指令(2026-10-19,原文)**: From 19c608fb31866227d78c5b94223e049962304b09 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:21:07 +0800 Subject: [PATCH 59/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.5?= =?UTF-8?q?=20=E4=B8=AD=E5=BF=83=E6=8C=89=E9=92=AE=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 7ec2461..39fe4dc 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5506,3 +5506,39 @@ b1747af merge: 保持清屏并常驻中心按钮 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-clear-screen-state` 已推送。真机验收由用户执行。 + +### K27.5 中心按钮最终口径:仅暂停时显示(2026-10-19) + +- 播放中(普通态/清屏态)`player-play-toggle` 不渲染。 +- 暂停时中心显示 `PlayerCenterToggle(playing:false)`;点它或点画面恢复播放, + 按钮立即消失。 +- 播放页中心按钮仍在 `_controlsVisible` 控制层块外,保证清屏 + 暂停时可见。 +- 首页 `home-feed-center-play` 只在 `!session.userWantsPlay` 时渲染; + 清屏不影响该规则。 +- 清屏跨滑动保持、退出按钮、清屏态点画面播放切换、无定时器均保留。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:28 +353: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 23.1s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-center-paused` 独立 worktree 完成。 + +Git: + +```text +71e317f fix(player): 中心按钮仅暂停时显示 +99a57ec merge: 中心按钮仅暂停时显示 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-center-toggle-paused-only` 已推送。真机验收由用户执行。 From 4081b9c893b5be9c38e9263dbaa62b55685ca529 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:26:19 +0800 Subject: [PATCH 60/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.6?= =?UTF-8?q?=20=E9=9B=86=E6=95=B0=E5=B7=A6=E8=B4=B4=E4=B8=8E=E6=B8=85?= =?UTF-8?q?=E5=B1=8F=E8=B7=A8=E9=9B=86=E5=85=B1=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 082d777..eaba6ab 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,34 @@ --- +## [待处理] 2026-10-19 | K27.6 首页集数文案左贴 + 清屏状态跨集共享 + +**用户指令(2026-10-19,原文)**: +> 「首页的底部的卡片 第n集/共n集 要紧挨着左侧啊 还有 选集进去播放页面还是 点击清屏后 再次滑动 还不是清屏状态」 + +**问题定位(Trae 勘察)** +1. `home_feed_overlay.dart` 的 `_infoCard` 用 `Row` + `Expanded` + 右对齐 `Flexible`,把「第 n 集 / 共 n 集」顶到了卡片最右侧。 +2. 选集进入的播放页(`homeMode=false`)是 `PlaybackQueue.series`,上下滑动按集切换;每集各自渲染一个 `_PlaybackOverlay`,而 `_controlsVisible` 是 `_PlaybackOverlayState` 的局部状态,所以清屏只作用于当前集,滑到下一集又恢复控件。 + +**口径** +1. 首页底部卡片:剧集类型标签与「第 n 集 / 共 n 集」放在同一个 `Wrap`(spacing 6、runSpacing 4、交叉轴居中),集数文案紧跟标签左侧排列,**不再右对齐/推到最右**;标签过长时允许整体换行,不得溢出。 +2. 清屏状态提升为播放页级别:把 `_controlsVisible` 从 `_PlaybackOverlayState` 移到 `_PlayerPageState`,与首页 `_feedChromeVisible` 合并为同一个 `_chromeVisible`(或等价命名)。 + - `_PlaybackOverlay` 改为无内部显隐状态,接收 `controlsVisible`、`onClear`、`onTogglePlay` 等参数。 + - 播放页清屏后,上下滑动切集 / 切剧仍保持清屏;退出清屏按钮恢复后所有页面同步显示控件。 + - 首页与选集两种入口共用同一状态来源。 +3. 已确认的规则不变:播放中不显示中心按钮、暂停时显示播放按钮、清屏点画面切播放、右上角退出清屏、无定时器。 + +**测试** +1. 首页 `home-feed-episode` 的左边缘紧贴标签区(与 `home-feed-info-card` 左内边距接近,不得落在卡片右半区)。 +2. 选集进入播放页 → 点 `player-clear-screen` → 上滑切到下一集 → 仍无 `player-controls-top` / `player-controls-bottom`,`player-exit-clear-screen` 仍在;点退出后恢复。 +3. 首页清屏后滑动切剧仍保持清屏(回归)。 +4. 中心按钮仅暂停时显示(回归)。 +5. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-clear-screen-shared`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.5 中心按钮只在暂停时显示(播放状态一律不显示) **用户指令(2026-10-19,原文)**: From 218bd880e1c6265dfab142af335b5e3466f1bb0a Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:26:47 +0800 Subject: [PATCH 61/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.7?= =?UTF-8?q?=20=E5=80=8D=E9=80=9F=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index eaba6ab..b568f6b 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,30 @@ --- +## [待处理] 2026-10-19 | K27.7 倍速选择改为弹窗 + +**用户指令(2026-10-19,原文)**: +> 「倍速的要写在弹窗内」 + +**口径** +1. `_PlaybackOverlay` 画面右下角常驻的静态 `1.0x` 文本改为可点击的倍速入口(Key `player-speed`,文案显示当前倍速,如 `1.0x`)。 +2. 点击弹出倍速弹窗(底部 sheet,Key `player-speed-sheet`),选项:`0.5x / 0.75x / 1.0x / 1.25x / 1.5x / 2.0x`,每项 Key `player-speed-<值>`(如 `player-speed-1.5`);当前项用主色高亮。 +3. 选择后立即 `controller.setPlaybackSpeed(value)` 并关闭弹窗,入口文案同步更新。 +4. 倍速状态由 `_PlayerPageState` 统一持有:切换剧集后新控制器自动沿用当前倍速;离开播放页后恢复默认 1.0x。 +5. 清屏态不显示倍速入口(与顶栏/进度条一起隐藏);普通态与暂停态显示。 +6. l10n 新增 `playbackSpeed`:en `Playback speed` / zh `倍速` / id `Kecepatan putar`;三语齐全。 + +**测试** +1. 点 `player-speed` 出现 `player-speed-sheet`,包含 6 个档位。 +2. 选 `player-speed-1.5` 后弹窗关闭,入口显示 `1.5x`。 +3. 清屏后倍速入口隐藏。 +4. 切集后倍速入口仍显示所选值(若实现层可测)。 +5. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-speed-sheet`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.6 首页集数文案左贴 + 清屏状态跨集共享 **用户指令(2026-10-19,原文)**: From f6d6887b843829d8db4bc419d3a3ab4aa777ab69 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:29:49 +0800 Subject: [PATCH 62/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.6?= =?UTF-8?q?=20=E6=B8=85=E5=B1=8F=E5=85=B1=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 39fe4dc..1a713c8 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5542,3 +5542,39 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-center-toggle-paused-only` 已推送。真机验收由用户执行。 + +### K27.6 首页集数左贴 + 清屏状态跨集共享(2026-10-19) + +- 首页底部卡片 tags 与 `第 n 集 / 共 n 集` 放入同一 Wrap(spacing 6、runSpacing 4、 + 垂直居中),集数紧跟标签左侧,不再右对齐;长度超出可换行。 +- 清屏状态提升到 `_PlayerPageState._chromeVisible`,首页与选集播放共用。 + `_PlaybackOverlay` 只接收 `controlsVisible/onClear/onExitClear/onTogglePlay`, + 不再持有显隐状态。 +- 选集页清屏后滑动切下一集仍保持清屏,退出按钮仍在;退出后恢复顶栏/底部。 +- 首页清屏跨滑动保持、中心按钮仅暂停显示、点画面切播放等规则不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:28 +354: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 24.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-clear-shared` 独立 worktree 完成。 + +Git: + +```text +5b7a8bd fix(player): 共享清屏状态并左贴集数 +5ca5846 merge: 共享清屏状态并左贴集数 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-clear-screen-shared` 已推送。真机验收由用户执行。 From d977f1472b82a69012a3d7be58198a2864032914 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:33:03 +0800 Subject: [PATCH 63/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.7?= =?UTF-8?q?=20=E5=80=8D=E9=80=9F=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 1a713c8..d41c18d 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5578,3 +5578,40 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-clear-screen-shared` 已推送。真机验收由用户执行。 + +### K27.7 倍速入口改为底部弹窗(2026-10-19) + +- 播放器右下角 `1.0x` 改为可点击 `player-speed`,显示当前倍速。 +- 点击弹出 `player-speed-sheet`,档位 0.5/0.75/1.0/1.25/1.5/2.0, + Key `player-speed-<值>`,当前档主色高亮。 +- 选择后关闭弹窗、入口同步,并调用当前 `VideoPlayerController.setPlaybackSpeed`。 +- 倍速状态由 `_PlayerPageState._playbackSpeed` 持有,同时同步到 `PlayerLogic`; + 新控制器在 prepare/activate 时应用当前倍速,切集沿用。 +- 清屏时倍速入口随控制层隐藏;普通/暂停态显示。 +- 新增 l10n `playbackSpeed` 三语。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +356: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.3s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-speed-sheet` 独立 worktree 完成。 + +Git: + +```text +3a7e0bc feat(player): 倍速改为底部弹窗选择 +87628e7 merge: 倍速改为底部弹窗选择 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-speed-sheet` 已推送。真机验收由用户执行。 From 87672002355faff956be0a14b73e43fe0207c26e Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:40:39 +0800 Subject: [PATCH 64/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.8?= =?UTF-8?q?=20=E4=BA=92=E5=8A=A8=E4=B8=8B=E7=A7=BB=E4=B8=8E=E5=80=8D?= =?UTF-8?q?=E9=80=9F=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index b568f6b..dc77d89 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,29 @@ --- +## [待处理] 2026-10-19 | K27.8 首页右侧互动下移 + 倍速移入右上角弹窗 + 拖动进度显示时间 + +**用户指令(2026-10-19,原文)**: +> 「现在把首页右侧的 喜欢 评论 分享 收藏位置再往下调整下 而且点剧集进去的播放页 倍速是放在 右上角点击的弹窗内 滑动进度条的时候要有时间」 + +**口径** +1. 首页右侧互动栏(喜欢/评论/分享/收藏)整体下移:`HomeFeedOverlay` 中该栏的 `Align` 从 `Alignment.centerRight` 调整为约 `Alignment(1.0, 0.45)`(或等效的下移),右侧间距保持 12,不得与底部信息卡重叠。 +2. 倍速入口从画面右下角移除(删除 `player-speed` 那个 `1.0x` 文本按钮),改放到右上角「更多」弹窗内: + - `_openMore` 弹窗新增 `ListTile`,Key `player-more-speed`,leading `Icons.speed_rounded`,title 为 `l10n.playbackSpeed`,trailing 显示当前倍速(如 `1.0x`)。 + - 点击后关闭更多弹窗并打开现有倍速弹窗 `player-speed-sheet`;档位与选中逻辑保持不变,选择后立即生效并更新 trailing。 +3. 拖动进度条时显示时间:播放页 `SeekProgressBar` 改为 `showTimes: true`,拖动过程中显示 `当前时间 / 总时长`(复用组件已有的 `mm:ss / mm:ss` 预览),松手后按现有逻辑 seek。 +4. 其余已确认规则不变:中心按钮仅暂停时显示、清屏跨集共享、退出清屏按钮、无定时器。 + +**测试** +1. 首页 `rail-like` 的垂直中心比修改前更低(断言其 center.dy 大于播放器可视区中线上方阈值,或与底部信息卡顶部保持间距)。 +2. 播放页不再存在 `player-speed` 主画面入口;`player-more` → `player-more-speed` → `player-speed-sheet` 可打开;选 `1.5x` 后关闭弹窗,再次打开更多弹窗 trailing 显示 `1.5x`。 +3. 拖动 `player-progress` 过程中出现形如 `mm:ss / mm:ss` 的时间文本;松手后消失。 +4. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-feed-rail-speed-time`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.7 倍速选择改为弹窗 **用户指令(2026-10-19,原文)**: From 0d2e6ba87ff19b31c83789430153a81283c55e73 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:44:51 +0800 Subject: [PATCH 65/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.8?= =?UTF-8?q?=20rail=20=E4=B8=8E=E5=80=8D=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index d41c18d..cec583e 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5615,3 +5615,40 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-speed-sheet` 已推送。真机验收由用户执行。 + +### K27.8 首页互动下移 + 倍速弹窗 + 拖动时间(2026-10-19) + +- 首页右侧 Like/Comment/Share/Favorite rail 改为 `Alignment(1.0, 0.45)`, + 距右 12、与底部信息卡保持间隙。 +- 删除画面右下角 `player-speed` 静态入口;倍速移入 `player-more`: + ListTile `player-more-speed`,trailing 显示当前倍速,点击关闭更多并打开 + `player-speed-sheet`。 +- 选择倍速后立即更新入口/更多 trailing,并应用到当前及后续控制器。 +- 播放器进度条 `showTimes: true`;拖动时显示 `当前时间 / 总时长`,松手后消失。 +- 中心按钮仅暂停显示、清屏共享、退出清屏、无定时器等规则不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:29 +357: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.7s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-rail-speed` 独立 worktree 完成。 + +Git: + +```text +4d7173d fix(player): 调整 rail 倍速弹窗与进度时间 +1eaab2a merge: 调整 rail 倍速弹窗与进度时间 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-feed-rail-speed-time` 已推送。真机验收由用户执行。 From d7e69fac8098dcbe9ece0c11db149f161db5bd81 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:51:48 +0800 Subject: [PATCH 66/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.9?= =?UTF-8?q?=20=E5=8F=91=E7=8E=B0=E9=A1=B5=E5=9B=BA=E5=AE=9A=E9=A1=B6?= =?UTF-8?q?=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index dc77d89..bca8ecb 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,30 @@ --- +## [待处理] 2026-10-19 | K27.9 发现页顶栏固定(与我的页面一致) + +**用户指令(2026-10-19,原文)**: +> 「发现页上方的怎么和我的页面不一样 不是固定的」 + +**问题定位(Trae 勘察)** +- `discover_view.dart` 的 `_header` 被放在 `CustomScrollView` 的 `SliverToBoxAdapter` 里,滚动时会跟随内容消失。 +- `mine_view.dart` 的 `_topBar` 在 `List(ListView)` 之外,固定不滚动。 + +**口径** +1. 把发现页 `_header`(logo + 「发现」标题 + 搜索按钮 + 头像)从 `CustomScrollView` 的 slivers 中移出,放在 `_page` 的 `Column` 顶部、`Expanded(_feed(...))` 之前,实现固定顶栏。 +2. 顶栏尺寸与我的页面统一:`SizedBox(height: 46)` + `Padding(horizontal: 14)`,内部布局与样式沿用现有 `_header`。 +3. 搜索框、分类 chips、继续观看、快捷入口等内容仍可滚动,不改变顺序与间距。 +4. 底部导航行为不变。 + +**测试** +1. 发现页初始 `discover-search-button` 的位置; +2. 向上拖动内容列表后,`discover-search-button` 的 `dy` 不变,而可滚动内容(如分类 chips / 正在追卡片)位置发生变化; +3. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-discover-fixed-header`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.8 首页右侧互动下移 + 倍速移入右上角弹窗 + 拖动进度显示时间 **用户指令(2026-10-19,原文)**: From 01990259af22e74d07b3e5d7f57e43fe482bfe72 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 17:55:38 +0800 Subject: [PATCH 67/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.9?= =?UTF-8?q?=20=E5=9B=BA=E5=AE=9A=E9=A1=B6=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index cec583e..67de722 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5652,3 +5652,39 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-feed-rail-speed-time` 已推送。真机验收由用户执行。 + +### K27.9 发现页固定顶栏(2026-10-19) + +- `_header` 从 `CustomScrollView.slivers` 移出,放到 `DiscoverPage._page` + Column 顶部、`Expanded(_feed)` 之前。 +- 顶栏改为 `SizedBox(height:46)` + `Padding(horizontal:14)`,与 Me 页顶栏一致。 +- 搜索框、分类 chips、Continue Watching、快捷入口、热门短剧等仍在滚动区, + 顺序与间距保持;底部导航不变。 +- 测试记录 `discover-search-button` 初始位置,滚动内容后位置不变, + `home-category-chips` 位置发生上移。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:33 +358: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 26.9s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-discover-header` 独立 worktree 完成。 + +Git: + +```text +1617580 fix(discover): 固定发现页顶栏 +149b51b merge: 固定发现页顶栏 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-discover-fixed-header` 已推送。真机验收由用户执行。 From 317daf4c2ba0310e31fd2b2e04e7827a43c81f04 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:00:04 +0800 Subject: [PATCH 68/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?0=20=E5=8F=91=E7=8E=B0=E9=A1=B5=E5=B0=81=E9=9D=A2=E4=B8=8D?= =?UTF-8?q?=E8=A3=81=E5=89=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index bca8ecb..3e4fc20 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,29 @@ --- +## [待处理] 2026-10-19 | K27.10 发现页短剧卡片:封面不裁剪、图上不显示剧名 + +**用户指令(2026-10-19,原文)**: +> 「现在改发现页面的短剧列表 要求图片不做切割 图片上不显示剧名」 + +**口径** +1. `discover_view.dart` 的 `_HomeDramaCard` 封面: + - `RemoteImage` 的 `fit` 从 `BoxFit.cover` 改为 `BoxFit.contain`,图片完整显示不裁剪;封面区域加中性底色(如 `AppColors.card`),避免留白突兀。 + - 封面尺寸(高 120、圆角 10)与卡片网格尺寸保持不变。 +2. 删除封面上的剧名:移除盖在图片上的 `Positioned` 标题 `Text`,以及只为该标题服务的底部黑色渐变遮罩。 +3. 保留左上角「免费」角标;图片下方的剧名/题材两行照旧显示(`home-drama-title-` 仍存在且只有一处)。 +4. 不改变卡片点击、网格列数与间距。 + +**测试** +1. 封面内不再出现剧名文本(`find.descendant(of: cover, matching: find.text(title))` 为空)。 +2. 封面 `RemoteImage.fit == BoxFit.contain`。 +3. 图片下方 `home-drama-title-` 仍存在且只有一个;「免费」角标逻辑不变。 +4. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-discover-cover-contain`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.9 发现页顶栏固定(与我的页面一致) **用户指令(2026-10-19,原文)**: From bd53efc4c4740ec067483f1b32ef46c9517289b2 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:00:49 +0800 Subject: [PATCH 69/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?1=20=E6=90=9C=E7=B4=A2=E6=A1=86=E5=A4=B1=E7=84=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 3e4fc20..530d53f 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,26 @@ --- +## [待处理] 2026-10-19 | K27.11 发现页搜索框:点击页面其他区域失焦 + +**用户指令(2026-10-19,原文)**: +> 「点击页面搜索输入框失去焦点」 + +**口径** +1. `discover_view.dart` 的搜索 `TextField`(Key `discover-search`)增加 `onTapOutside`:点击输入框以外的任意页面区域时调用 `logic.searchFocus.unfocus()`,收起键盘、取消焦点。 +2. 点击输入框本身仍保持/获取焦点,不影响输入与搜索过滤;点击分类 chips、卡片、按钮等仍执行原有动作(失焦不吞点击)。 +3. 不改搜索逻辑、不清空输入内容、不改变界面布局。 + +**测试** +1. 点击 `discover-search` 使其获得焦点; +2. 点击页面其他区域(如顶栏标题或分类 chip)后,`logic.searchFocus.hasFocus == false`(或输入框不再处于 focused 状态); +3. 输入内容与过滤结果不受影响; +4. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-discover-search-unfocus`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.10 发现页短剧卡片:封面不裁剪、图上不显示剧名 **用户指令(2026-10-19,原文)**: From f51f07d77e4987d44e0881bc3cb54bdc61a35b66 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:02:32 +0800 Subject: [PATCH 70/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?0=20=E5=B0=81=E9=9D=A2=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 67de722..7e3c096 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5688,3 +5688,37 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-discover-fixed-header` 已推送。真机验收由用户执行。 + +### K27.10 发现页封面不裁剪、图上不显示剧名(2026-10-19) + +- `_HomeDramaCard` 封面 `RemoteImage.fit` 改为 `BoxFit.contain`, + 外层加 `AppColors.card` 中性底色;封面高 120、圆角 10、网格尺寸不变。 +- 删除封面上的剧名 Positioned 与底部黑色渐变遮罩。 +- 左上角免费角标保留;图片下方剧名/题材两行保留,剧名 Key 唯一。 +- 卡片点击、2 列网格与间距不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:31 +358: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 30.7s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-cover-contain` 独立 worktree 完成。 + +Git: + +```text +4c2384f fix(discover): 封面完整显示并移除图上标题 +bbae8cf merge: 封面完整显示并移除图上标题 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-discover-cover-contain` 已推送。真机验收由用户执行。 From 244a6ce79e63605a7fe6057aeb67e46dc4a5c69c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:04:48 +0800 Subject: [PATCH 71/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?1=20=E6=90=9C=E7=B4=A2=E5=A4=B1=E7=84=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 7e3c096..a3c564e 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5722,3 +5722,36 @@ bbae8cf merge: 封面完整显示并移除图上标题 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-discover-cover-contain` 已推送。真机验收由用户执行。 + +### K27.11 发现页搜索点击页面失焦(2026-10-19) + +- `discover-search` TextField 增加 + `onTapOutside: (_) => logic.searchFocus.unfocus()`。 +- 点击输入框仍保持焦点;点击分类、卡片、按钮等区域仍执行原动作。 +- 不清空输入、不影响过滤结果与布局。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:39 +359: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.5s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-search-unfocus` 独立 worktree 完成。 + +Git: + +```text +884687d fix(discover): 点击页面取消搜索焦点 +cabc0e7 merge: 点击页面取消搜索焦点 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-discover-search-unfocus` 已推送。真机验收由用户执行。 From 01911016d2f7e84ff9d23d55da2a42a52a598ee8 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:08:07 +0800 Subject: [PATCH 72/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?2=20=E5=8F=91=E7=8E=B0=E9=A1=B5=E7=80=91=E5=B8=83=E6=B5=81?= =?UTF-8?q?=E4=B8=8E=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 530d53f..2693ee7 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,33 @@ --- +## [待处理] 2026-10-19 | K27.12 发现页封面按原图比例铺满 + 下拉刷新 + +**用户指令(2026-10-19,原文)**: +> 「不是这样 根据封面尺寸全遮住啊 然后发现页加一个下拉刷新」 + +**口径** +1. 封面按原图比例铺满(K27.10 的 `contain` 留白不算): + - 现有封面源图比例不一(约 1220×2712、1520×2720、1080×1413),固定 120 高无法既铺满又不裁剪。 + - 改为**两列瀑布流**:每张卡宽度固定为列宽,封面高度由图片原始宽高比决定(`fitWidth`,不裁剪、不留黑边),剧名/题材仍在封面下方。 + - 封面加载中/失败用 3:4 占位,避免高度为 0;「免费」角标仍叠加在封面左上角;封面不再叠加剧名与渐变。 + - 保留 `home-all-dramas-section` / `home-all-dramas-grid` / `home-drama-card-` / `home-drama-cover-` 等既有 Key 语义(容器 Key 不变)。 + - 两列分配按奇偶分列实现(无第三方依赖);列间距 10、页面左右 14、卡片间距 10 不变。 +2. 下拉刷新: + - 发现页 `CustomScrollView` 外包 `RefreshIndicator`(`AlwaysScrollableScrollPhysics`),主色指示器。 + - `onRefresh` 同时执行 `categories.load()` 与 `logic.refreshResume()`,完成后收起;失败仍保留现有错误态/空态。 +3. 不改搜索、分类选择、快捷入口与底部导航逻辑。 + +**测试** +1. 封面图片节点不再使用裁剪模式(`fitWidth` 或等比铺满),且没有固定高度导致留白。 +2. 下拉手势触发 `onRefresh`:`CategoryController.load` 与 `refreshResume` 被调用(可用假 repository 统计次数),指示器收起。 +3. 卡片 Key 与点击进入详情行为不变。 +4. 既有测试全过。 + +**流程**:从最新 `develop` 拉 `fix/flutter-discover-masonry-refresh`;门禁 `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.11 发现页搜索框:点击页面其他区域失焦 **用户指令(2026-10-19,原文)**: From 76e6c3546fcb5e8af56eb05fc85bc9705b305dc1 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:11:16 +0800 Subject: [PATCH 73/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?2=20=E7=80=91=E5=B8=83=E6=B5=81=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index a3c564e..c29a2e0 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5755,3 +5755,40 @@ cabc0e7 merge: 点击页面取消搜索焦点 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-discover-search-unfocus` 已推送。真机验收由用户执行。 + +### K27.12 发现页瀑布流 + 下拉刷新(2026-10-19) + +- 发现页短剧列表改为手动两列瀑布流:奇偶索引分列,列间距 10、卡片间距 10、 + 左右 14;保留 `home-all-dramas-section/grid`、卡片/封面/标题 Key。 +- 封面改用 `Image.network(fit: BoxFit.fitWidth)`,高度按原图比例自适应、不裁剪; + 加载中/失败使用 3:4 占位,免费角标仍叠加左上角,图上不再有剧名/渐变。 +- `CustomScrollView` 外包 `RefreshIndicator`(`AlwaysScrollableScrollPhysics`, + 主色指示器),`onRefresh` 并行执行 `categories.load()` 与 + `logic.refreshResume()`,完成后自动收起。 +- 搜索、分类选择、快捷入口、底部导航不变。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:30 +360: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.3s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-discover-masonry` 独立 worktree 完成。 + +Git: + +```text +d271c43 feat(discover): 增加瀑布流与下拉刷新 +75dacf2 merge: 增加瀑布流与下拉刷新 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `fix/flutter-discover-masonry-refresh` 已推送。真机验收由用户执行。 From ab891a08405e0fcd052bc221b7192203c4a68cc7 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:18:24 +0800 Subject: [PATCH 74/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?3=20=E5=AE=A2=E6=88=B7=E7=AB=AF=20API=20=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 2693ee7..fa4699c 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,24 @@ --- +## [待处理] 2026-10-19 | K27.13 客户端默认 API 地址改为 192.168.31.250:8081 + +**用户指令(2026-10-19,原文)**: +> 「现在把客户端的api 地址改为 192.168.31250:8081」 + +**说明**:原文 `192.168.31250` 不是合法 IPv4,按 **`192.168.31.250`** 处理。 + +**口径** +1. `lib/core/config/app_config.dart` 的 `devHostBaseUrl` 改为 `http://192.168.31.250:8081`,注释保持原文。 +2. 其余优先级不变:运行时设置 > `--dart-define=API_BASE_URL` > 平台默认值;模拟器/桌面仍走环回。 +3. 不改其他代码;如有测试断言旧地址,一并更新。 + +**测试**:`dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`。 + +**流程**:从最新 `develop` 拉 `chore/flutter-api-host`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.12 发现页封面按原图比例铺满 + 下拉刷新 **用户指令(2026-10-19,原文)**: From 1abc190f958e9e334eb71bb472c7f82cad8c0e17 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:20:22 +0800 Subject: [PATCH 75/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?3=20API=20=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index c29a2e0..fa4b3b3 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5792,3 +5792,36 @@ d271c43 feat(discover): 增加瀑布流与下拉刷新 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `fix/flutter-discover-masonry-refresh` 已推送。真机验收由用户执行。 + +### K27.13 客户端默认 API 地址更新(2026-10-19) + +- `AppConfig.devHostBaseUrl` 更新为 `http://192.168.31.250:8081`。 +- 优先级保持:运行时设置 > `--dart-define=API_BASE_URL` > 平台默认值; + 模拟器/桌面仍使用环回地址。 +- `server_endpoint_test.dart` 的地址断言同步更新。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:31 +360: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 23.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-api-host` 独立 worktree 完成。 + +Git: + +```text +501446b chore(config): 更新开发默认服务器地址 +53b7726 merge: 更新开发默认服务器地址 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `chore/flutter-api-host` 已推送。真机验证由用户执行。 From 2441234dba60423691fde22b347c72252e24afe5 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:26:05 +0800 Subject: [PATCH 76/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?4=20API=20=E5=9C=B0=E5=9D=80=E6=94=B9=E4=B8=BA=20172.18.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index fa4699c..e196c8e 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,22 @@ --- +## [待处理] 2026-10-19 | K27.14 客户端默认 API 地址改为 172.18.0.7:8081 + +**用户指令(2026-10-19,原文)**: +> 「改成这个 172.18.0.7:8081」 + +**口径** +1. `lib/core/config/app_config.dart` 的 `devHostBaseUrl` 改为 `http://172.18.0.7:8081`。 +2. 地址优先级与模拟器/桌面环回逻辑不变。 +3. 同步更新 `test/config/server_endpoint_test.dart` 中断言旧地址的用例。 + +**测试**:`dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`。 + +**流程**:从最新 `develop` 拉 `chore/flutter-api-host-2`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.13 客户端默认 API 地址改为 192.168.31.250:8081 **用户指令(2026-10-19,原文)**: From 7aebcba35cf6a1a96256a8948afc0168618ff9b9 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:28:02 +0800 Subject: [PATCH 77/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?4=20API=20=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index fa4b3b3..fc91942 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5825,3 +5825,36 @@ Git: 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `chore/flutter-api-host` 已推送。真机验证由用户执行。 + +### K27.14 客户端默认 API 地址更新为 172.18.0.7(2026-10-19) + +- `AppConfig.devHostBaseUrl` 更新为 `http://172.18.0.7:8081`。 +- 优先级保持:运行时设置 > `--dart-define=API_BASE_URL` > 平台默认值; + 模拟器/桌面仍使用环回地址。 +- `server_endpoint_test.dart` 地址断言同步更新。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:32 +360: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.8s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-api-host2` 独立 worktree 完成。 + +Git: + +```text +cb2fa92 chore(config): 更新开发默认服务器地址 +75438c2 merge: 更新开发默认服务器地址 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `chore/flutter-api-host-2` 已推送。真机验证由用户执行。 From 8b6406038877174e084b7516623da3e73a29b283 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:29:48 +0800 Subject: [PATCH 78/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?5=20API=20=E5=9C=B0=E5=9D=80=E6=94=B9=E5=9B=9E=20192.168.31.187?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index e196c8e..95a4d77 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,22 @@ --- +## [待处理] 2026-10-19 | K27.15 客户端默认 API 地址改回 192.168.31.187:8081 + +**用户指令(2026-10-19,原文)**: +> 「`http://192.168.31.187:8081` 改成这个」 + +**口径** +1. `lib/core/config/app_config.dart` 的 `devHostBaseUrl` 改为 `http://192.168.31.187:8081`。 +2. 地址优先级与模拟器/桌面环回逻辑不变。 +3. 同步更新 `test/config/server_endpoint_test.dart` 中断言旧地址的用例。 + +**测试**:`dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`。 + +**流程**:从最新 `develop` 拉 `chore/flutter-api-host-3`;`--no-ff` 合回 develop 并 push;作者 `Zhou Weidong <502333560@qq.com>`;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.14 客户端默认 API 地址改为 172.18.0.7:8081 **用户指令(2026-10-19,原文)**: From 793d6e542a7dbc82b4393b676c3285395df6a842 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:32:08 +0800 Subject: [PATCH 79/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20K27.1?= =?UTF-8?q?5=20API=20=E5=9C=B0=E5=9D=80=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index fc91942..e5acd6f 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5858,3 +5858,35 @@ cb2fa92 chore(config): 更新开发默认服务器地址 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `chore/flutter-api-host-2` 已推送。真机验证由用户执行。 + +### K27.15 客户端默认 API 地址恢复为 192.168.31.187(2026-10-19) + +- `AppConfig.devHostBaseUrl` 恢复为 `http://192.168.31.187:8081`。 +- 优先级与模拟器/桌面环回逻辑不变。 +- `server_endpoint_test.dart` 地址断言同步更新。 + +门禁原始输出: + +```text +$ dart analyze lib test +No issues found! + +$ flutter test +00:31 +360: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 22.2s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +构建在 `/tmp/reelshort-api-host3` 独立 worktree 完成。 + +Git: + +```text +d75b696 chore(config): 恢复开发默认服务器地址 +190e4f9 merge: 恢复开发默认服务器地址 +``` + +提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; +`develop` 与 `chore/flutter-api-host-3` 已推送。真机验证由用户执行。 From 83f13e9a6ed7274edb9718862e849d47621e3a0c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:47:18 +0800 Subject: [PATCH 80/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20Web?= =?UTF-8?q?=20release=20=E4=BF=AE=E5=A4=8D=E5=90=8C=E6=AD=A5=20develop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index e5acd6f..5cc6375 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5886,7 +5886,27 @@ Git: ```text d75b696 chore(config): 恢复开发默认服务器地址 190e4f9 merge: 恢复开发默认服务器地址 -``` - 提交与合并 author/committer 均为 `Zhou Weidong <502333560@qq.com>`; `develop` 与 `chore/flutter-api-host-3` 已推送。真机验证由用户执行。 +``` + +## 2026-10-19 ReelShortWeb:release/v1.0.0 分片上传修复同步到 develop + +- `release/v1.0.0` 本地落后 1 个提交,执行 `git pull --ff-only origin release/v1.0.0` 快进到 + `8e9435e fix(web): 修复分片上传 chunkSize 字符串拼接导致大文件超限`(仅 `src/utils/uploader.ts`)。 +- `develop`(`83e535d`)以 `--no-ff` 合并 release,合并提交 + `f78960f chore(web): 合并 release 分片上传修复`,已推送。 + +门禁原始输出: + +```text +$ pnpm lint:eslint +> eslint --fix --ext .js,.ts,.vue ./src +(无错误输出) + +$ pnpm build:pro +[warn] Circular chunk: element-plus -> vue-chunks -> element-plus. Please adjust the manual chunk logic for these chunks. +Build successful. Please see dist-pro directory +``` + +`release/v1.0.0` 保持 `8e9435e` 不变;`develop` 已包含该修复。 \ No newline at end of file From e26e57ac18f12e667ee88e65a37b72d0ea788d4c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 21:18:44 +0800 Subject: [PATCH 81/82] =?UTF-8?q?docs(plans):=20=E4=B8=8B=E5=8F=91=20K27.1?= =?UTF-8?q?6=20develop=20=E5=90=88=E5=B9=B6=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/INBOX.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 95a4d77..ff3e000 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -20,6 +20,31 @@ --- +## [待处理] 2026-10-19 | K27.16 客户端 develop 合并进 release/v1.0.0 + +**用户指令(2026-10-19,原文)**: +> 「然后把 dev 相关改动合并到release/v1.0.0」 + +**前置状态** +- `ReelShort` release/v1.0.0 = `814b2c0`(含 `3d0e080` 明文 HTTP/双网络修复 + 公网地址 `http://39.162.50.99:8081`)。 +- develop = `190e4f9`,领先 release 55 个提交(K22–K27 全部 UI/播放器/发现页改动)。 + +**口径** +1. 在 `release/v1.0.0` 上执行 `git merge --no-ff develop`,冲突按以下原则解决: + - `lib/core/config/app_config.dart`:**地址取 release**(`devHostBaseUrl` 与 `lanBaseUrl` 均为 `http://39.162.50.99:8081`),保留 release 的 `probeAndApplyBaseUrl()`;结构/其余方法取 develop。 + - `lib/main.dart`:保留 `await AppConfig.probeAndApplyBaseUrl();`。 + - `android/app/src/main/AndroidManifest.xml`:保留 `android:usesCleartextTraffic="true"`。 + - `lib/core/config/server_endpoint.dart`:采用 develop 的 `SharedPreferencesAsync` 版本。 + - `pubspec.yaml` / `pubspec.lock`:采用 develop 的依赖集合(`shared_preferences ^2.5.5`、`shared_preferences_platform_interface` dev 依赖、foundation override),不要保留 release 的低版本降级。 + - `lib/core/data/services/auth_session_store.dart`:采用 develop 版本。 + - 其余 K22–K27 的 UI/播放器/发现页/测试改动全部保留 develop 版本。 +2. 解决冲突后执行 `flutter pub get`,同步把 `test/config/server_endpoint_test.dart` 的地址断言改为 `http://39.162.50.99:8081`(保留 develop 的异步 SharedPreferences mock)。 +3. 门禁:`dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`。 +4. 合并提交后 push `release/v1.0.0`;作者 `Zhou Weidong <502333560@qq.com>`;禁 `git add -A`;PROGRESS 留痕(含冲突清单与门禁原始输出)。 +5. 真机验证由用户执行。 + +--- + ## [待处理] 2026-10-19 | K27.15 客户端默认 API 地址改回 192.168.31.187:8081 **用户指令(2026-10-19,原文)**: From eeb5e0eaf8bb732c12d0fd2a2ecc132dfb34fa1a Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 21:40:51 +0800 Subject: [PATCH 82/82] =?UTF-8?q?docs(plans):=20=E8=AE=B0=E5=BD=95=20relea?= =?UTF-8?q?se=20=E5=90=88=E5=B9=B6=20develop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plans/PROGRESS.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 5cc6375..0a1d1f1 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -5909,4 +5909,30 @@ $ pnpm build:pro Build successful. Please see dist-pro directory ``` -`release/v1.0.0` 保持 `8e9435e` 不变;`develop` 已包含该修复。 \ No newline at end of file +`release/v1.0.0` 保持 `8e9435e` 不变;`develop` 已包含该修复。 + +## 2026-10-19 ReelShort:develop 合并进 release/v1.0.0(K27.16) + +- 合并提交 `35364c9 chore(release): 合并 develop 到 release/v1.0.0`,已推送。 +- 冲突/取舍:地址取 release(`http://39.162.50.99:8081`,含双网络 probe);保留 + `usesCleartextTraffic="true"` 与 `main.dart` 的 `probeAndApplyBaseUrl()`; + `server_endpoint.dart`、`auth_session_store.dart`、`pubspec.yaml`(`shared_preferences ^2.5.5` + + platform_interface + foundation override)采用 develop 版本;K22–K27 UI/播放器/发现页改动全部进入 release。 +- 首次 `flutter build apk` 因与并行的 `flutter run` 争用 Gradle 锁挂起 15 分钟; + 终止进程并 `./gradlew --stop` 后重新构建通过。 + +门禁原始输出: + +```text +$ flutter analyze lib test +No issues found! + +$ flutter test +00:30 +355 ~5: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... 23.4s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +真机验证由用户执行。 \ No newline at end of file