db399a40fa
- ops_stat: 真实值 offset→保底(max);初始基数过只增不减护栏 - ops_marquee: 脱敏名手机尾号+中文昵称混合;金额长尾;时间随机抖动;真实+种子不足兜底补满;真实记录查询 ~30s 缓存 - comparison_record: 复合索引 (status, created_at) + 迁移(PG CONCURRENTLY);修复 alembic 多 head(merge 改挂 onboarding_completion) - 轮播种子批量删除/启用接口 + ids 上限;docs 同步 - 附带并行会话 WIP:admin users / wallet Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: OuYingJun1024 <1034284404@qq.com> Reviewed-on: #42 Co-authored-by: ouzhou <ouzhou@wonderable.ai> Co-committed-by: ouzhou <ouzhou@wonderable.ai>
2.7 KiB
2.7 KiB
GET /api/v1/platform/savings-feed — 首页轮播 feed(真实+种子混播)
所属:Platform 组(前缀
/api/v1/platform) | 鉴权:无 | ← 返回 API 索引
客户端首页顶部「用户****xxx 比价后节省 xx 元」滚动条数据源。全平台真实比价记录优先;不足时用运营配的种子(ops_marquee_seed)补齐到 limit 条「混播」,保证轮播不空。
入参
| 参数 | 类型 | 说明 |
|---|---|---|
limit |
int, query | 返回条数,默认 8,范围 1~30 |
出参
响应 200:SavingsFeedOut
| 字段 | 类型 | 说明 |
|---|---|---|
items |
list | 轮播条目数组(最多 limit 条) |
items[].masked_user |
string | 脱敏用户名,手机尾号(138****5678)/ 中文昵称(省钱**)混合风格 |
items[].saved_amount_cents |
int | 节省(分),客户端 ÷100 显示「x.xx 元」 |
items[].time |
string | 北京时间 HH:MM:SS |
说明
- 真实条:
comparison_record中status='success'且0 < saved_amount_cents ≤ 300 元的近期记录(金额超 300 元视为异常 / bug 值剔除,防「节省 999 元」穿帮),按user_id去重(同一用户只取最新一条,避免单人刷屏);用户名按user_id确定性合成手机尾号 / 中文昵称混合脱敏名(同用户恒定)。 - 种子条:
ops_marquee_seed(enabled=true),仅在真实去重后不足limit时补齐;从启用种子中公平随机抽取(不再固定取前 N,所有种子都有机会露出)。每条种子:用户名留空或旧用户****xxx模板名则随机合成混合风格名并避开同屏撞名(自愈历史种子),金额在[min_cents, max_cents]取长尾随机值(小额居多、偶尔大额,固定金额则 min==max)。 - 兜底:真实 + 种子仍凑不满
limit(种子被全停用 / 太少)时,用内置合成条补满,保证轮播既不空也不稀疏。 time为合成的「最近」时间(从当前北京时间往前随机抖动递减,首条几十秒前,其余多数 1~5 分钟、偶尔扎堆或较长):社会证明轮播保证永远像刚发生且节奏自然不机械,不受旧测试数据 / 低谷期记录影响。真实的用户/金额不变,只换展示时间。- 因含随机(抽取 / 金额 / 合成名),每次请求结果都不同——这是轮播想要的鲜活感。
- 性能:首页人人都看、真实数据变化慢,真实记录原始行带 ~30s 进程内缓存(展示层随机仍每次重算,只省 DB 往返;新记录最多晚 30s 进轮播)。查询走复合索引
ix_comparison_status_created (status, created_at),避免随数据量增大全表扫。 - 逻辑见
app/repositories/ops_marquee.py;运营管理种子见 admin-marquee-seeds。