Commit Graph
365 Commits
Author SHA1 Message Date
Zhou Weidong 73292ba74d docs(plans): 记录 K11 首页三列网格实施回执 2026-10-17 22:35:19 +08:00
Zhou Weidong f97574b57e docs(plans): 增加 K11 首页三列网格实施计划 2026-10-17 22:30:39 +08:00
Zhou Weidong 2a06190cfe docs(plans): 下发 K11 首页三列网格任务 2026-10-17 22:29:26 +08:00
Zhou Weidong 3b2afc9f47 docs(plans): 记录 K10 统一空态实施回执 2026-10-17 21:56:35 +08:00
Zhou Weidong f1d56b1040 docs(plans): 增加 K10 统一空态实施计划 2026-10-17 17:39:28 +08:00
Zhou Weidong 3f84bc6568 docs(plans): 下发 K10 统一空态任务 2026-10-17 17:38:25 +08:00
Zhou Weidong a1f88b6553 docs(plans): 记录 iOS 依赖编译修复回执 2026-10-17 17:31:19 +08:00
Zhou Weidong a5dad549f8 docs(plans): 记录 K9 首页剧目网格实施回执 2026-10-17 17:25:36 +08:00
Zhou Weidong 496d27334a docs(plans): 增加 K9 首页剧目网格实施计划 2026-10-17 17:21:33 +08:00
Zhou Weidong b434f6594b docs(plans): 下发 K9 首页剧目网格改造 2026-10-17 17:20:35 +08:00
Zhou Weidong b5aed111a0 docs(plans): 记录 K8 登录页视觉实施回执 2026-10-17 17:15:43 +08:00
Zhou Weidong e7c11c3163 docs(plans): 增加 K8 登录页视觉实施计划 2026-10-17 17:09:29 +08:00
Zhou Weidong c33e6cdc9d docs(plans): 下发 K8 登录页视觉重设计 2026-10-17 17:07:56 +08:00
Zhou Weidong ea97c8bc1b docs(plans): 记录首页轮播与观看历史真机修复回执 2026-10-17 17:00:47 +08:00
Zhou Weidong c43604d725 docs(plans): 记录 K7 轮播与通知实施回执 2026-10-17 16:51:22 +08:00
Zhou Weidong f36fea083b docs(plans): 下发 K7 轮播图与站内信任务 2026-10-17 16:45:08 +08:00
Zhou Weidong 0aeb9086d6 docs(plans): 记录 K6 导航与观看历史修复 2026-10-17 16:42:10 +08:00
Zhou Weidong 7374045065 docs(plans): 记录 iOS SPM 构建修复与限制 2026-10-17 16:32:55 +08:00
Zhou Weidong ab0d69914f docs(plans): 记录 K6 登录导航与震动回执 2026-10-17 16:17:16 +08:00
Zhou Weidong 93af19e548 docs(plans): K6 增加点击震动反馈要求 2026-10-17 16:07:05 +08:00
Zhou Weidong 79a1194257 docs(plans): 下发 K6 登录与底部导航 UI 任务 2026-10-17 16:04:11 +08:00
Zhou Weidong 1bf0f654fb docs(plans): 记录 K5 主题与印尼语实施回执 2026-10-17 15:59:14 +08:00
Zhou Weidong f05476f6db docs(plans): 下发 K5 克莱因蓝主题任务 2026-10-17 15:51:04 +08:00
Zhou Weidong c2bd096ef3 docs(plans): 补记 K3 举报错误透传修复 2026-10-17 15:29:59 +08:00
Zhou Weidong 969538e6c9 docs(plans): 记录 K3 互动实施与验收回执 2026-10-17 15:27:42 +08:00
Zhou Weidong a0156ee946 docs(plans): 下发 K3 互动任务 2026-10-17 15:09:12 +08:00
Zhou Weidong 4a658fc67e docs(plans): 补齐 K2 真机验收与门禁回执 2026-10-17 15:02:28 +08:00
Zhou Weidong 698bb78aeb docs(plans): 记录 K2 实施与验收回执 2026-10-17 14:50:51 +08:00
jianghaifeng 4118efd0ca docs(inbox): 按 specs 补全 K2 执行规范与门禁 2026-10-17 14:17:17 +08:00
jianghaifeng 096e90c4c6 docs(inbox): 记录用户裁定——K2 先按现状契约执行,契约缺口后期再补 2026-10-17 14:12:37 +08:00
jianghaifeng 582453f0bd docs(inbox): 下发 K2 客户端第二批(分类/记录/收藏/下载授权 + UI) 2026-10-17 14:11:22 +08:00
jianghaifeng bad3bf4e79 docs: 记录 specs 只同步 main / specs 权威 / 执行前必读 INBOX 的裁定 2026-10-17 14:06:50 +08:00
jianghaifeng 7637e322ec docs: 记录 2026-10-17 三库全量拉取与 main→develop 同步结果 2026-10-17 13:50:01 +08:00
jianghaifeng 2d70858887 docs(plans): K1-verify 回执与留痕(真机验证交回用户,标注未验证) 2026-10-16 18:06:02 +08:00
jianghaifeng 53ac5d60d1 docs(plans): 新增 K1-verify 条目 + 红线第 10 条(设备验证必须设备侧取证)
背景:1-3/1-4 的真机验证用了错地址 10.157.242.1(开发机 VPN 网卡、手机不可达),
且当时的证据是本机 curl 本机网卡地址返回 200 —— 假阳性,已导致真机首页加载失败。
本条目要求用正确地址(ipconfig getifaddr en0 取)重做,且证据必须产自设备侧
(首选:integration_test 在手机进程里真请求并断言),拿不到就如实标「未验证」。
红线新增第 10 条,防止再犯。
2026-10-16 17:54:36 +08:00
jianghaifeng 40e2812677 docs(plans): K1 回执(客户端详情+播放+续看+收藏,含真数据/假数据清单) 2026-10-16 17:39:36 +08:00
jianghaifeng 59d064f8c6 docs(plans): 新增 K1 条目(客户端对接:详情+播放+进度续看+收藏,含 UI 三态)
PM 勘察:客户端只调了 6 个 C 端接口(契约已实现 44 个);无 playback/watch/library
api 类;WatchHistoryRepository 仍是 SharedPreferences 本地存储、mine_logic 用 demoProfileId
假数据;EngagementRepository 亦为本地。K1 打通首页→详情→播放→续看→收藏一条链路。
2026-10-16 17:25:00 +08:00
jianghaifeng 0cab094194 docs(plans): J1 回执(全局 ID 字符串化 + 契约统一),标为已处理·待用户验收 2026-10-16 16:48:07 +08:00
jianghaifeng f35db2cd3b feat(framework): 全局 Long 字符串化,ID 一律以字符串下发
用户裁定方案 (a):雪花 id 精度问题全局修,统一契约。

- 新增 JacksonLongToStringConfig(fruitshorts-framework):Long/Long.TYPE → ToStringSerializer,
  经 Jackson2ObjectMapperBuilderCustomizer 挂进 Spring Boot 的 ObjectMapper;admin-api 与
  app-api 都是 scanBasePackages=com.fruitshorts,一处生效两端一致
- 例外:PageResult.total 是计数不是 id,用 mixin 显式保持数字(前端分页组件要数字);
  Integer/int(pageIndex/pageSize/Result.code 等)不受影响
- 反序列化方向不变:请求体 'id:123'、路径变量、查询参数都接受字符串
- 契约 api-phase1.md §0 新增「ID 字段一律以字符串下发」总口径,§2.11/§2.12 改为引用 §0;
  I1 里逐字段加的 @JsonSerialize 与 Result<String> 回退成自然写法,避免多套口径
- 测试:新增 LongToStringSerializationTest(普通/嵌套/List/Map/分页 + 反序列化 + 19 位路径变量),
  契约测试的 standalone mapper 也挂上模块(否则测试假绿);C 端 4 条 id 断言改成 isString
- mvn test:commerce 33 / admin-api 21 / app-api 49 / worker 12 = 115 条全过
2026-10-16 16:44:13 +08:00
jianghaifeng c503629bf9 docs(plans): 新增 J1 条目(全局 ID 字符串化 + 契约统一,用户裁定方案 a)
雪花 id 19 位超出 JS 安全整数,I1 期间 Codex 实测与 PM 独立复核均复现
(点下架回 200002、/admin/app-users/page 下发裸数字)。用户裁定全局修改并统一契约。
本条目给出范围:framework 全局 Long→String、契约 §0 总口径、两个前端适配、
验证要求(含 node 逐位比对证据)与门禁。
2026-10-16 16:36:23 +08:00
jianghaifeng 10264c4ef6 docs(plans): I1 回执补充禅道同步说明(禅道暂无 I1 任务) 2026-10-16 16:34:45 +08:00
jianghaifeng e9877d78d8 docs(plans): I1 回执(商品配置 + 系统公告),标为已处理·待用户验收 2026-10-16 16:34:18 +08:00
jianghaifeng 8d19a0cc0a feat(admin): 商品配置与系统公告管理接口,id 以字符串下发
- /admin/products 六个接口 + 校验(code 唯一、store_product_id 同平台唯一、
  COIN_PACK 需 coin_amount>0、VIP 需 vip_days>0、VIP 只建不启)
- /admin/notices 六个接口,与 C 端 /app/notices 共用 OpsNoticeService.pageForApp 一套筛选口径
- 权限点 product:list/product:update/notice:list/notice:update + 菜单 31/32/33(sql/data-phase1.sql 幂等)
- 雪花 id 超过 JS 安全整数范围:id 以字符串下发,避免浏览器四舍五入导致回查 200002
- C 端商品查询收敛到 ProductService.findForStore,OrderService 不再自带一份
- 测试:module-commerce 33 / admin-api 16 / app-api 49 / worker 12,共 110 条全过
2026-10-16 16:33:15 +08:00
jianghaifeng 7513ac06bc docs(plans): 指令通道迁入本仓库(specs 改为只拉取,由项目负责人更新)
用户口径:specs 仓库今后只拉取、由项目负责人维护,我们不再向其提交;工作留痕与
指令队列改放本仓库 docs/plans/ 下,避免本地领先提交与上游 INBOX 反复冲突。

本文件包含双 Agent 协作红线(含"验收归用户""门禁口径"),以及当前待处理条目
I1:后台管理端商品(金币包)配置 + 系统公告管理(后端接口 + ReelShortWeb 页面)。
2026-10-16 16:13:22 +08:00
jianghaifeng 5609b42dcd docs: 对齐契约 §3 与 README 文档索引的进度口径
按实测修正 4 处状态描述,消除"已完成/未完成"口径不一致:

- api-phase1.md §3「契约与实现状态对照」:
  04 多码率为「转码 worker(C1)已产出」;06 分享埋点标「待 C3」;
  09 由"下一批"改为「Google Play 票据校验闭环已实现,Apple IAP 只留端口」;
  10 由"压测与埋点 下一批"改为「C1 已实现,C2/C3/压测 未做」;
  并补最后更新时间与「未完成清单见 README」的指向
- README.md 文档索引:api-phase1 的描述由"标注已实现 / 下一批"
  改为"含「契约与实现状态对照」"

为什么改:契约里的状态表过期会直接误导排期与联调判断,属最容易踩的坑。
2026-10-16 15:32:05 +08:00
jianghaifeng bb219203bc docs(api): 移除 /app/creator/works 与 /app/creator/stats 的 C 端定义
创作者中心(工作台 / 作品管理 / 数据看板)由 Web 端承载,创作者登录后台管理使用
(见 api-phase1.md §2.10),App 客户端不提供创作者中心。因此契约 §1.9 去掉这两条,
只保留「创作者入驻申请 + 启动配置 + 系统公告」;§1.9 标题与说明同步修正,
apply 幂等表里"已通过"一行改为指向 Web 端。

为什么要改:原定义要求 App 侧再实现一份「创作者数据看板」,虽与后台 07 看板同口径,
但代码完全独立,两份长期必然漂移(后台数字与创作者看到的数字对不上是信任问题)。
按产品口径创作者中心不上 App,这份重复实现没有存在意义,移除即从根上消除漂移风险,
也避免前端照旧契约开发后返工。
2026-10-16 15:14:34 +08:00
jianghaifeng 14b5e4137f feat(app-api): E1 补全 5 个 C 端接口(创作者入驻/作品/看板 + 启动配置/公告)
为什么:联调 10-19 开始,前端照 api-phase1.md §1.9 写会 404,需要先把这 5 个补齐。

契约先行(12-上线检查清单 §一):先重写 api-phase1.md §1.9 —— 把 commerce 三条移出本节标"已实现",
补齐 5 个接口的请求/响应字段、错误码、分页口径、幂等矩阵,并新增 200007 CREATOR_NOT_ACTIVE。

- GET /app/config(匿名):硬编码白名单 6 键 + 契约默认值兜底,绝不整表下发
- GET /app/notices(匿名):ops_notice 只读分页(status/target/发布与过期时间),无数据返回空列表
- POST /app/creator/apply:幂等,防重靠 DB 唯一索引 uk_creator_user,并发冲突读回既有记录
- GET /app/creator/works:非生效创作者报 200007 + 分状态提示,不返回空数组冒充成功
- GET /app/creator/stats:与后台 07 看板同口径(字段/notes 逐条一致),null + notes 语义保留
- 冻结模块零改动:module-creator 仅新增 CreatorAppService/两个 VO 与 1 个公开方法 pageMyDramasOf,
  既有 pageMyDramas 一行未动;module-system 仅新增 OpsNotice 实体与 Mapper
- Swagger 中文注解按 S1 规范补齐;白名单与 /app/notices 加进安全白名单
- 实测:mvn test 98 条全过(app-api 41→56);package 通过;端到端五接口全部符合预期
  (重复 apply 同 id + created:false、pending 看 works/stats 报 200007、approved 后正常)
2026-10-16 14:56:44 +08:00
jianghaifeng 1dc97b4bf6 feat(commerce): B1-2 恢复购买/退款拒付回收/对账真实比对 + Apple 端口预留
为什么:风险清单 R-03 把"票据校验 + 对账打通"列为上线阻塞项。勘察发现 ReconcileService 与
/admin/reconcile 两个接口 B1 之前就已实现,真缺口是:对账没跟商店比对、差额用 0 兜底(违反
"取不到就用 null"的契约)、退款回收只有人工入口且不幂等。按实际缺口做,不重复造。

- 恢复购买:补专项测试(换设备重提同一票据 → 同一订单、原交付时间不改写、不新增流水);
  补单能力沿用 B1-1 的服务端建单路径,恢复列表沿用 GET /app/orders,不新增接口
- 退款/拒付回收:GooglePlayPurchaseClient 增加 listVoidedPurchases(purchases.voidedpurchases,
  带分页);新增 StoreRefundService 拉取并按 (platform, orderId) 幂等回收,本地无单计入差异;
  OrderService 增加 refundByStoreCallback(已退款直接返回,不二次回收/不写第二条流水),
  人工 refund() 的既有契约(已退款报错)保持不变
- 对账:reconcile_task 增 store_amount_sum(可空)与 notes 两列(幂等 ALTER);
  run() 改为集合比对(本地缺票据 + 票据无本地单 + 商店已作废但本地无单),并在同一次 run 里
  顺带执行退款回收;storeAmountSum 恒为 null 并在 notes 说明需从 Play Console 财务报告获取;
  商店调用失败置 status=FAILED 且不写 SUCCESS+0
- Apple IAP:只留端口/枚举与明确提示,不实现真调用(B2 再实现)
- 契约同步 docs/api-phase1.md §1.8/§2.6;新增测试 17 条(commerce 14 + admin-api 3)
- 实测:mvn test 71 条全过(commerce 27 + admin-api 3 + app-api 41,B1-1 的 54 条未被打红);
  两个入口 package 通过;端到端手动对账返回 storeAmountSum=null + notes 说明缺什么
2026-10-16 11:52:10 +08:00
Zhou Weidong db897d50d6 feat(commerce): Google Play 票据校验闭环(校验→建单→发权益 + 幂等/防重放)
为什么:风险清单 R-03 把支付票据校验列为上线阻塞项;/app/orders/verify 此前只有 disabled
占位,且 verifyAndDeliver 要求订单事先存在——而 IAP 没有下单接口,接了校验也走不通。

- 新增 GooglePlayStoreVerifier(校验 purchaseState/productId/orderId)+ StorePlatforms(平台归一化)
- 新增 GooglePlayPurchaseClient 端口与 HttpGooglePlayPurchaseClient:JDK HttpClient + 服务账号
  RS256 JWT 换 token,不引入 Google SDK 依赖;token 按过期缓存
- StoreVerifier 实现由 fruitshorts.commerce.store.verifier 选择,默认 disabled,无凭据时对外行为不变
- OrderService 补齐闭环:校验通过后按 (platform, storeProductId) 找商品建单、写 store_receipt 审计、
  发金币并推进到 DELIVERED;幂等键 (platform, storeTransactionId) 与唯一索引双保险
- 防重放:重复提交同用户返回既有订单且不再发币;票据已被他人使用返回 403;校验失败不写任何数据
- 凭据只走配置/环境变量(packageName + service account JSON),不入库不提交
- 契约同步 docs/api-phase1.md §1.8;金额微单位换算与回退价有单测覆盖
- 实测:mvn test 54 条全过(commerce 13 + app-api 41,M2 的 37 条未被打红);
  两个入口 package 通过;默认 disabled 端到端返回 200003 且 orders 表零行
2026-10-16 11:03:33 +08:00
Vicky 5ce6de1e3b Merge remote-tracking branch 'origin/main' 2026-10-16 10:51:15 +08:00