Zhou Weidong
|
64eadf1446
|
feat(commerce): 新增打赏任务中心与签到发奖
backend-ci / test (push) Failing after 4m53s
|
2026-11-09 10:32:53 +08:00 |
|
Zhou Weidong
|
8a5a381b44
|
feat(catalog): 新增分类推荐榜快照接口
backend-ci / test (push) Failing after 4m45s
|
2026-11-02 14:45:43 +08:00 |
|
jianghaifeng
|
afd8d00752
|
feat(catalog): 卡片下发完整简介不再截断
backend-ci / test (push) Canceled after 0s
|
2026-10-30 22:53:22 +08:00 |
|
jianghaifeng
|
958de5ef22
|
feat(config): /app/config 下发登录页背景地址
backend-ci / test (push) Canceled after 0s
|
2026-10-30 17:14:46 +08:00 |
|
jianghaifeng
|
f2103f6604
|
feat(cover): 短剧新增横版封面字段并在进度接口下发
backend-ci / test (push) Canceled after 0s
- Drama/DramaSaveReqVO/DramaRespVO 新增 horizontalCover,打通后台上传链路
- AppDramaCardVO/AppDramaDetailVO 新增 coverLandscape
- ProgressRespVO 新增 dramaCoverLandscape,继续观看横幅可直接取横版图
|
2026-10-29 17:32:49 +08:00 |
|
jianghaifeng
|
0d4d510aee
|
feat(content): 标签增加语义码并随卡片下发
backend-ci / test (push) Canceled after 0s
标签名称会随语言和运营文案变化,客户端按名称判断板块(如推荐页「上新」
横滑)一改名就失效。content_tag 新增 code 列并在后台维护,
卡片与详情以 tagCode 下发,已有「上新 / 热剧 / 新剧 / 热播」一并回填。
|
2026-10-29 15:45:34 +08:00 |
|
Zhou Weidong
|
8fb1f52777
|
fix(config): 调度线程池扩到 4 条,避免落库与其它定时任务互相排队
|
2026-10-28 18:51:52 +08:00 |
|
Zhou Weidong
|
3e2d6a06d9
|
perf(playback): 观看进度上报异步化(Redis write-behind 批量落库)
- POST /app/watch/progress 只写 Redis 缓冲立即返回(p95 75ms→2ms),
WatchProgressFlusher 每 2s 把 watch:pg:dirty 队列按身份合并批量 UPSERT,
Redis 异常自动回退同步写库,接口契约不变
- 读接口用缓冲覆盖 DB 行保证读己之写;Caffeine 缓存剧集校验免去上报路径两条 DB 查询
- 落库按「新增进度/新增流水/更新行」分组攒批(MyBatis BATCH 只合并连续同形状语句),
配合 reWriteBatchedInserts 多值 INSERT,12.4 万积压 45 秒消化完,
1650 QPS 持续压测队列稳态归零
|
2026-10-28 14:59:09 +08:00 |
|
Vicky
|
272aa62434
|
feat: phase1 UI prep — P1 安全(XFF防护), P2 规模化(平台索引+region保护), P3 文档补全
P1 安全: WebUtils.getClientIp 改为 remoteAddr 优先 + 可信代理 CIDR 配置
P2 规模化: DISTINCT ON 查询补匹配排序的部分索引 (migrate-k113)
P2 一致性: syncCountryByIp regionCode 同语言/时区/币种加保护,不覆盖用户自定义
P3 文档: api-phase1.md 新增 platform 参数说明, IpRegionService 新增集成测试 + VERSION
新增: CountryProfile 52 国映射 + IpRegionService 离线 ip2region 解析
平台筛选: app-users/favorites/likes/watch-history 按最近一次会话 ANDROID/IOS 筛选
|
2026-10-27 15:45:15 +08:00 |
|
jianghaifeng
|
229f1d0198
|
refactor(device): 设备平台只记 iOS/Android
去掉系统版本、机型与版本号上报,表结构收敛为 device_id + platform。
|
2026-10-27 14:00:12 +08:00 |
|
Vicky
|
2cf8f9a1c3
|
feat(device): 按 device_id 记录客户端系统与机型
- 新增 app_device_profile 表与 upsert,匿名请求同样建档
- app-api 设备画像过滤器,同设备 60 秒节流写一次
- 收藏/点赞/观看列表优先用设备画像,缺失回退最近会话
|
2026-10-27 13:53:47 +08:00 |
|
Zhou Weidong
|
23321a0b0c
|
feat(favorites): 支持设备批量取消收藏
|
2026-10-27 10:33:59 +08:00 |
|
Zhou Weidong
|
848c746505
|
feat(watch): 支持设备观看与登录合并
|
2026-10-27 09:54:47 +08:00 |
|
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
|
87e20c31a9
|
feat(security): 允许匿名搜索与打开协议页
|
2026-10-23 12:34:13 +08:00 |
|
Zhou Weidong
|
22edf34ff1
|
feat(system): 支持后台维护三语协议
|
2026-10-23 12:34:13 +08:00 |
|
Zhou Weidong
|
16ba79a336
|
feat(interaction): 支持批量取消收藏
|
2026-10-23 12:34:13 +08:00 |
|
Zhou Weidong
|
ab58641bbe
|
feat(user): 展示用户最近使用的系统
|
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
|
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
|
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
|
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
|
32710c2e06
|
feat: 接入 Prometheus 监控(放行 /actuator/prometheus + 指标暴露 + compose 编排)
|
2026-10-21 06:28:11 +08:00 |
|
Zhou Weidong
|
6d3997cbae
|
feat: C3 埋点事件上报(/app/events 匿名落库)
|
2026-10-21 06:25:25 +08:00 |
|
Zhou Weidong
|
fa4977a71d
|
feat: C2 Redis 接入 + 接口限流(RedisService + @RateLimit,验证码/登录防刷)
|
2026-10-21 06:24:55 +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
|
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
|
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
|
b567365460
|
feat(deploy): D1 后端部署就绪(配置外置 + prod fail-fast + 自包含 Compose + 冒烟/回滚)
为什么:用户下午要部署,但全仓没有任何部署产物;且生产漏配密钥会静默使用代码里的 dev 默认值,
属上线阻塞项(04-部署架构 / 12-上线检查清单)。
- 配置外置(三件):DB_URL、JWT 双密钥(**发现 app-secret 此前没外置,一直用 dev 默认值**)、
MEDIA_SIGNATURE_SECRET、MEDIA_SIGNATURE_REQUIRED、CORS_ALLOWED_ORIGINS、MEDIA_ROOT_DIR
- 新增三份 application-prod.yml:签名强制开启、CORS 收紧、媒资指向挂载点、日志级别
- 新增 ProdSecretGuard(@Profile("prod")):密钥缺失/仍是 dev 默认值/不足 32 位、签名未开、
DB_URL 或 CORS 为空 → 一次列全并终止启动(exit 1)
- 新增 /healthz 轻量健康端点:查明 /actuator/health 的"超时"是旧 jar 未重启所致,项目本就
没有 actuator 依赖,故不引新依赖;同时把 /healthz 加进安全白名单
- Docker 化:多阶段 Dockerfile(非 root、tini、依赖层缓存、ffmpeg 只给 worker)、.dockerignore、
自包含 docker-compose.yml(含 PostgreSQL 18 + Redis + 命名卷 + 按序初始化 sql + healthcheck)
- tools/smoke.sh(失败非 0 退出)+ DEPLOY.md(Compose 主线 / 裸 jar 兜底 / 回滚 / 故障速查)
- 实测:mvn test 83 条全过;两入口 package 通过;prod 缺密钥退出码 1 且报错明确、配齐后正常启动;
冒烟脚本全 PASS;本机无 Docker,镜像与 compose 未经构建验证(已在回执如实标注)
|
2026-10-16 13:01:08 +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 |
|
Zhou Weidong
|
27e689c771
|
fix(config): 修复合并后 app-api 重复的 springdoc 配置键
|
2026-10-16 10:52:17 +08:00 |
|
Vicky
|
5ce6de1e3b
|
Merge remote-tracking branch 'origin/main'
|
2026-10-16 10:51:15 +08:00 |
|
Vicky
|
c6fcfcc6ea
|
docs(backend): S1 接口文档在线化——补 springdoc 配置 + 39 个 Controller 中文注解
为什么:前端联调依赖在线接口文档。S1 条目要求两个端口的 /v3/api-docs 能看、
且每个接口有中文分组与中文 summary。
诊断(与 PM 初步定位不同,有硬证据):app-api 的 /v3/api-docs、/doc.html、/、
/error 全部"挂住"(8s 超时 0 字节),根因不是 Spring Security 拦截,而是
运行中的进程握着一个被重新打包替换掉的旧 jar——spring-boot:repackage 把原 fat jar
原地改名为 .jar.original(同一 inode)再写新 jar,进程再去加载"启动后未加载过的类"
就必然 NoClassDefFoundError(日志里连 logback 的 ThrowableProxy 都加载不到),
线程直接死掉、既不响应也记不了日志。SecurityConfig.PUBLIC_PATHS 本来就包含
/doc.html、/swagger-ui/**、/v3/api-docs/**,未改任何安全配置。
- app-api 的 application.yml 补 springdoc.swagger-ui.path: /doc.html
- 39 个 Controller(app-api 10 + admin-api 29)补 @Tag(name=中文分组)
与 @Operation(summary=中文描述),共 172 个接口;描述取自 api-phase1.md 与既有 Javadoc
- 两个入口类加 @OpenAPIDefinition:文档标题 + 顶层 tags 清单(springdoc 默认顶层 tags 为空)
- 纯新增 357 行、删除 0 行:业务逻辑、路径、字段零改动
- 实测:mvn test 37 条契约测试全过;两个入口 package BUILD SUCCESS;
两端口 /v3/api-docs 中文 tags + 中文 summary,/doc.html 可打开,
非白名单路径 5ms 内返回 {"code":401,...} 不再挂住
|
2026-10-16 10:44:37 +08:00 |
|
Zhou Weidong
|
66e6fc1555
|
feat: app-api 启用 Swagger 在线接口文档 (springdoc /doc.html)
|
2026-10-16 10:13:47 +08:00 |
|
Vicky
|
37c9a141d3
|
feat: S0 主键改雪花(DDL 去 identity + 实体 ASSIGN_ID + 雪花配置)
为什么:自增主键把 ID 分配锁在单库序列上,分库分表时无法横向扩展。趁线上业务数据
近零(只有系统种子表有量)先改,代价最低。
- sql/schema.sql、sql/schema-phase1.sql、sql/partition-maintenance.sql:61 处
GENERATED BY DEFAULT AS IDENTITY 去掉,主键改 BIGINT 无默认值
- 52 个实体 @TableId IdType.AUTO -> IdType.ASSIGN_ID;两个入口 id-type: assign_id,
并加 global-config.sequence.worker-id/datacenter-id(单机固定值,多实例需按实例分配)
- 新增 sql/migrate-s0-snowflake.sql:存量库幂等迁移,走 DROP IDENTITY 保留数据,不重建表
- 实测:三份建表脚本在新库连跑两遍幂等;线上 57 张表 identity 归零;
watch_history/playback_ticket/order_event 的主键与唯一索引仍含分区键
|
2026-10-16 09:00:38 +08:00 |
|
Zhou Weidong
|
35be37c193
|
style: 全量补充作者标识 // Author: fruit.com.cn
|
2026-10-16 00:01:53 +08:00 |
|
Vicky
|
7e730fbbca
|
feat: 08 订单与权益落地(金币解锁 / 权益判定生效 / 补发回收 / 对账)
为什么:
1) 第一阶段要能真正收到钱,而收钱方式是金币解锁分集。本提交把钱包、金币流水、
权益、订单四样打通,客户端可以解锁并立刻播放,不再只是展示。
2) 权益判定此前只是端口占位(一律视为未解锁)。交易模块用 @Primary 提供实现后,
播放入口与下载入口的付费判定同时生效 —— 两条链路一行没改。
3) 钱的事必须可追溯、可幂等:所有金币变动都带幂等键并写 coin_ledger,
余额与流水同事务;订单每次状态流转都写 order_event(月分区),支付争议可回溯。
4) 后台要能兜住线上问题:补发(重复提交幂等)、退款(回收权益 + 扣回金币,
余额不足时留人工跟进备注)、人工补币(先校验用户存在,避免给不存在的用户建钱包)、
手动对账(默认每天 04:20 自动跑前一天)。
5) 09 商店支付按约束只做端口预留:StoreVerifier 未接入时明确报"尚未配置",
宁可不收钱也不产生假订单。
|
2026-10-15 12:26:27 +08:00 |
|