Zhou Weidong
|
4b0fbd73d3
|
feat(interaction): 支持游客互动与登录合并
|
2026-10-26 22:34:14 +08:00 |
|
Zhou Weidong
|
2fe24b9db7
|
feat(interaction): 新增分集计数统计接口
|
2026-10-26 21:31:17 +08:00 |
|
Zhou Weidong
|
2367a5d12b
|
feat(app): 全部短剧改为请求体分页
|
2026-10-24 16:53:26 +08:00 |
|
Zhou Weidong
|
45cf405285
|
feat(api): 加C端分类频道和剧单详情接口
|
2026-10-23 16:45:28 +08:00 |
|
Zhou Weidong
|
22edf34ff1
|
feat(system): 支持后台维护三语协议
|
2026-10-23 12:34:13 +08:00 |
|
Zhou Weidong
|
5a80e6693f
|
feat(playback): 播放票据返回各清晰度地址
|
2026-10-23 12:34:13 +08:00 |
|
Zhou Weidong
|
c5468a669b
|
refactor(app): 观看历史统一分页契约并移除 limit
|
2026-10-22 13:21:07 +08:00 |
|
Zhou Weidong
|
71b0c7315a
|
feat(app): 收藏与观看历史支持分页
|
2026-10-22 12:23:43 +08:00 |
|
Zhou Weidong
|
7d563f2cd6
|
fix(media): 补齐分集转码绑定与产物回填
|
2026-10-22 12:03:58 +08:00 |
|
Zhou Weidong
|
316baf28d6
|
feat(media): 支持后台转码配置与缩略图轴
|
2026-10-22 11:20:28 +08:00 |
|
Zhou Weidong
|
8f35160b56
|
feat(app): 推荐流支持分类过滤
|
2026-10-21 18:23:57 +08:00 |
|
Zhou Weidong
|
4c614a5ece
|
feat(content): 短剧类型与内容类型支持多选
|
2026-10-21 17:01:12 +08:00 |
|
Zhou Weidong
|
3303a91e3c
|
fix(content): 固定预览集查询顺序
|
2026-10-21 16:03:06 +08:00 |
|
Zhou Weidong
|
c6f729fb27
|
feat(interaction): 点赞与评论按集统计
|
2026-10-21 15:56:26 +08:00 |
|
Zhou Weidong
|
1052b97306
|
feat(content): 新增内容类型与首页分类 feed
|
2026-10-21 15:40:19 +08:00 |
|
Zhou Weidong
|
7579d3163a
|
fix(security): 放行评论数接口匿名访问
|
2026-10-21 11:46:18 +08:00 |
|
Zhou Weidong
|
65e8fbfc70
|
fix(interaction): 收藏计数同步维护并新增评论数接口
|
2026-10-21 11:33:59 +08:00 |
|
Zhou Weidong
|
256821b824
|
feat(content): 列表卡片与后台返回收藏点赞评论数
|
2026-10-21 11:14:18 +08:00 |
|
Zhou Weidong
|
671953bff3
|
feat(app-api): 详情补充互动数量字段
|
2026-10-20 12:02:16 +08:00 |
|
Zhou Weidong
|
63b086998e
|
feat(backend): 补齐 C 端商业化与账号缺口(金币充值/会员/搜索/语言筛选/Google登录/短信/商店可配置接入)
|
2026-10-20 04:20:42 +08:00 |
|
Zhou Weidong
|
35d92c0148
|
fix(backend): 后台注册限流配置优先并保留注入兜底
|
2026-10-17 23:39:48 +08:00 |
|
Zhou Weidong
|
f4003edc58
|
test(backend): 覆盖注册限流缺省回退
|
2026-10-17 23:31:11 +08:00 |
|
Zhou Weidong
|
f1aaaee814
|
fix(backend): 改为后台配置注册限流阈值
|
2026-10-17 23:29:25 +08:00 |
|
Zhou Weidong
|
758eb69f55
|
feat(backend): 注册限流阈值改为可配置
|
2026-10-17 23:22:28 +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
|
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
|
4418a840ec
|
refactor(app-api): 按新口径撤除 App 侧创作者中心的 works / stats
为什么:用户口径变更「创作者中心是 web 端,和 app 客户端没关系」,契约已由 PM 提交 bb21920
移除两条 C 端定义;本提交把代码对齐到新契约,App 侧创作者相关只保留入驻申请。
- 删除 GET /app/creator/works、GET /app/creator/stats 两个端点及无用注入
- 删除 CreatorStatsService.java(213 行,与后台 07 看板重复的独立实现)
- 删除随之成为死代码的:CreatorAppService.requireActiveCreator / myWorks、
CreatorCenterService.pageMyDramasOf、ErrorCode.CREATOR_NOT_ACTIVE(200007)
- 删除对应测试 7 条(works/stats 契约 4 条 + requireActive 3 条);
保留 apply 幂等与协议版本校验、config 白名单、notices 空列表
- 不动 POST /app/creator/apply、GET /app/config、GET /app/notices;不改 docs/api-phase1.md
- 实测:mvn test 98 → 91 条全过;package 通过;/v3/api-docs 接口数 41 → 39,
creator 相关只剩 /app/creator/apply;两个已撤除路径对已登录客户端返回 404
|
2026-10-16 15:21:13 +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
|
fafadfc6ec
|
test(backend): C 端核心链路契约测试 37 条,mvn test 不再是 No tests to run
为什么:红线第 8 条要求后端 mvn test 通过且核心接口有契约测试;此前 13 个模块全是
No tests to run.,这个"通过"是空的。按 M2 口径只补 C 端核心链路最小集。
- 接入层契约(MockMvc,真控制器 + 真全局异常处理器 + service 替身):
/app/auth 注册与登录、目录四条路由、播放票据 FREE 与 COIN_REQUIRED 的字段形态
- 业务规则(真 service + 替身 Mapper):
EMAIL 免码不走验证码且 verified=0、PHONE 必须带码、验证码错/过期被拒、
密码强度、注册频控 429、账号重复 200001、密码错误 100000、封禁 100001、
免费/已购/未解锁/无片源四个播放分支
- 依赖只加到 fruitshorts-app-api(spring-boot-starter-test,test scope),不动其它模块
- 测试放在接入层模块,避免动 01-08 冻结模块目录;只新增测试,未改业务逻辑
- 实测:mvn test BUILD SUCCESS,app-api Tests run: 37, Failures: 0, Errors: 0;
mvn -DskipTests package 仍 BUILD SUCCESS
|
2026-10-16 09:52:52 +08:00 |
|