zzhyyyyy
52a95cebc8
feat: 领券数据看板 — coupon_session 流水表 + admin 聚合接口
...
- 新表 coupon_session(一次领券一行,trace_id 唯一):POST /api/v1/coupon/session
两段 upsert(发起 started / 收尾 completed·failed·abandoned),记全程耗时、各平台耗时、
机型/ROM、app_env、trace_url、origin_package(发起来源)。
- admin GET /admin/api/coupon-data:发起/完成数 + 平均耗时 + P5/P50/P95/P99(Python 算分位,
SQLite 无 percentile)+ 按天/小时趋势 + 明细分页 + join 用户手机号/昵称,app_env 默认 prod;
另加 GET /admin/api/coupon-data/user-records 供「点手机号看该用户全部领券」抽屉。
- 迁移拆 3 个:建表 coupon_session_table + trace_url 加列 + origin_package 加列
(建表迁移已被某环境应用后改它不重跑,故新列单独加列迁移)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-30 22:04:46 +08:00
liujiahui
208112ff24
fix(dl): 落地页底图+logo 纳入 git → 修生产 /media 404 毛坯 ( #97 )
...
## 背景
用户反馈浏览器落地页仍是「毛坯」(裸黄底、缺优惠券卡/价格卡/logo)。
## 真因(实测线上)
`https://app-api.shaguabijia.com/media/dl.html ` 的 **HTML 早已是完善版且已部署**,但它引用的两张静态图被 `.gitignore` 的 `data/media/*` 规则挡在库外、从未随部署进生产 `/media`:
| 资源 | 线上 | 本地/git |
|---|---|---|
| `/media/coupon-page-bg.png`(底图:优惠券卡+跨平台比价价格卡) | **404**(22B `{"detail":"Not Found"}`) | 之前被 gitignore |
| `/media/sb-brand.png`(logo) | **404** | 之前被 gitignore |
| `/media/shaguabijia.apk`(对照) | 200 ✓ | — |
→ 两图加载失败 → 页面回退裸黄底 = 毛坯。
## 改动
照 `dl.html` / `taobao_landing.jpg` 既有白名单写法,把这两张图加进 `.gitignore` 例外并入库。
- `.gitignore`:`!data/media/coupon-page-bg.png`、`!data/media/sb-brand.png`
- 入库两图,md5 与原型一致(coupon-page-bg `f2adf28a` / sb-brand `e5b6e004`)
**无代码/HTML 改动**(dl.html 本就对齐原型,见上一 commit `6d4cbc8`)。
## 部署后生效
合并并部署本分支后,生产 `/media/` 即含这两图,落地页恢复完整。对应 6-29 UI 对齐 #10。
---------
Co-authored-by: no_gen_mu <liujianhishen@gmail.com >
Reviewed-on: #97
Co-authored-by: liujiahui <liujiahui@wonderable.ai >
Co-committed-by: liujiahui <liujiahui@wonderable.ai >
2026-06-30 20:48:31 +08:00
zhuzihao
5efe624340
admin 反馈/低价审核接口增强 + 反馈采集端环境(版本/机型) ( #94 )
...
- 反馈:新增 GET /admin/api/feedbacks/summary(待审核/已采纳/未采纳/合计计数);
列表联表带出完整手机号 + 昵称(供 admin 点手机号查该用户全部反馈)
- 低价审核:列表加 sort_by/sort_order(提交时间排序);联表带出手机号/昵称,
并按 comparison_record_id 关联比价记录带出 trace_id/trace_url + 机型/ROM/Android/app 版本
- feedback 表新增 app_version/device_model/rom_name/android_version 四列 + alembic 迁移;
/api/v1/feedback 提交接口接收并落库,供 admin 反馈页展示「提交版本号」「机型OS版本」
(字段可空,旧端不传不影响提交)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #94
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-29 23:11:30 +08:00
guke
b7b958ed58
perf(pricebot): 透传复用共享 httpx 单例,免每请求重建 SSL 上下文 + 绕过进程代理 ( #87 )
...
coupon/compare 透传原先每请求 async with httpx.AsyncClient(...) 新建:
每次重建 SSL 上下文(加载 certifi CA)实测 ~1s+,而 pricebot 是纯 HTTP
透传根本用不到 TLS;且 trust_env 默认 True 会把 http://localhost:8000
经进程代理(Clash)再绕几秒。
抽 app/core/pricebot_client.py 共享单例:trust_env=False 直连,lifespan
启动预热(SSL 一次性成本付在启动)、关停 aclose;timeout 下放到 .post()
保留 coupon 30s / compare 60s 差异。keep-alive 复用 TCP,每帧降到个位数 ms。
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #87
Co-authored-by: guke <guke@wonderable.ai >
Co-committed-by: guke <guke@wonderable.ai >
2026-06-28 09:36:31 +08:00
wuqi
f3cd97a190
feat: 信息流广告改"所见即所得"发奖——直接发客户端小球显示金币 ( #86 )
...
Reviewed-on: #86
Co-authored-by: wuqi <wuqi@wonderable.ai >
Co-committed-by: wuqi <wuqi@wonderable.ai >
2026-06-27 23:49:51 +08:00
zhuzihao
59fe715245
feat(analytics): 埋点事件接收接口 + admin 查询接口 + 埋点表 ( #83 )
...
Reviewed-on: #83
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 23:56:29 +08:00
zhuzihao
667cda566f
feat(analytics): 埋点事件接收接口 + admin 查询接口 + 埋点表 ( #81 )
...
新手引导埋点的服务端:
- 表 analytics_event(五维硬性列 + props JSON 扩展字段;event/device_id/user_id/session_id/created_at 带索引)
- POST /api/v1/analytics/events:客户端批量上报(不鉴权、body 读可选 user_id、补 client_ip + server_at)
- admin GET /admin/api/event-logs:列表 + 按 事件/设备/用户/会话/时间 筛选(offset 分页,照 list_feedbacks)
- alembic migration 建表(autogenerate 顺带检出的 ad/cps 历史索引漂移已手动剔除)
app 主后端 :8770 与 admin :8771 共用同一 SQLite,admin 同库直接查、无需跨库。
配套客户端五维上报 + admin 日志页(另两仓库 PR)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #81
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 23:33:31 +08:00
xiebing
19f5987436
feat(invite): 邀请奖励金账户(与金币隔离) + 比价发奖 + 奖励金提现 ( #82 )
...
Reviewed-on: #82
Co-authored-by: xiebing <xiebing@wonderable.ai >
Co-committed-by: xiebing <xiebing@wonderable.ai >
2026-06-26 21:10:21 +08:00
zhuzihao
ea22a11ef9
fix(ad): 激励视频发奖按环境隔离,堵测试包看广告给生产同 id 用户串号发币 ( #77 )
...
## 问题
激励视频发奖走穿山甲 S2S 回调 /api/v1/ad/pangle-callback,发币时只认回调里的裸数字
user_id(grant_ad_reward 仅校验「本库存在该 id」),无任何环境归属校验。
同一 user_id 在测试库(本地 localhost)与正式库(线上)是两个不同的人;穿山甲 S2S 回调
地址只配一个(指向生产),测试包(dev)看广告的回调也会打到生产 → 生产把奖发给「本库里
同 user_id 的另一个真人」,造成跨库串号:测试看一次广告,正式库同号用户也被发币(线上
广告收益页因此多出一条本不该有的发奖记录)。
## 修复(服务端,按环境隔离)
pangle_callback 解析激励视频 mediaExtra 透传的 srv_env(dev/prod),与本服 settings.APP_ENV
不符则受理但不发币、不写记录(is_verify=true 防穿山甲重试)。不带 srv_env 的旧客户端按本
环境放行(兼容,不误伤存量正式用户)。
- 新增回归测试 test_callback_foreign_env_skipped(srv_env=prod 打到 APP_ENV=dev 的服务 → 不发)
- sim_pangle_callback 增加 --srv-env 便于本地手验
客户端配套(mediaExtra 写入 srv_env)见 app-android 对应 PR。
## 生效前提(三者缺一仍漏)
1. 生产 app-server 部署本代码并重启
2. 生产 .env 为 APP_ENV=prod
3. app 重新构建(旧包不带 srv_env 仍走兼容放行)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #77
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 13:17:27 +08:00
zhuzihao
2edebfad83
feat(auth): 短信登录防刷 — 同一设备id同IP 每小时限 5 次 ( #78 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #78
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-26 13:17:07 +08:00
guke
3dca126411
fix(dev): 启动脚本钉定 .venv 解释器 + watchfiles 降噪 ( #75 )
...
微信优惠券增加美团/京东中间页,领券前获取微信头像授权(主功能)
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #75
Co-authored-by: guke <guke@wonderable.ai >
Co-committed-by: guke <guke@wonderable.ai >
2026-06-25 17:47:30 +08:00
zhuzihao
acdb10b516
feat(ad): 提现看视频广告后端支持(withdrawal_ad 场景 + 开关下发) ( #74 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #74
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-24 22:38:06 +08:00
guke
8008366abc
fix(wx-cps): 修复 微信cps分发时淘宝落地页授权刷新导致click_value 重复入库问题 0624 ( #73 )
...
通过authed=1判断当前请求是否是微信授权回填,如果是授权回填,不再insert cps_click
---------
Co-authored-by: guke <guke@autohome.com.cn >
Reviewed-on: #73
Co-authored-by: guke <guke@wonderable.ai >
Co-committed-by: guke <guke@wonderable.ai >
2026-06-24 18:15:44 +08:00
zhuzihao
d8c7a6d1ef
feat(auth): 测试账号免验证码登录 + 每次走引导 + 每日上限 ( #69 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #69
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-24 03:53:52 +08:00
chenshirui
a6f55a00b8
feat(device): 无障碍保护存活心跳检测 + 掉线后置检测(pull) ( #65 )
...
Co-authored-by: 陈世睿 <2839904623@qq.com >
Reviewed-on: #65
Co-authored-by: chenshirui <chenshirui@wonderable.ai >
Co-committed-by: chenshirui <chenshirui@wonderable.ai >
2026-06-23 17:33:38 +08:00
marco
a584e1f59f
feat(comparison): 比价记录累计 LLM token(入/出)并在 admin 展示
...
server 从 llm_calls[].usage 累加 prompt/completion_tokens 落库,admin 比价记录列表/详情据此展示 token 数与估算成本;配套迁移 comparison_token_cols。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-23 17:24:54 +08:00
chenshuobo
f868414966
feat(feedback): 补齐反馈历史审核发奖闭环 ( #66 )
...
- 新增反馈审核字段和迁移,支持 pending/adopted/rejected、未采纳原因和采纳金币
- 增加用户端反馈历史 records 接口和 admin 采纳/拒绝接口
- 采纳时同事务写状态、金币流水和审计日志,拦截重复审核
- 验证:pytest tests/test_feedback.py tests/test_admin_write.py tests/test_admin_read.py
---------
Co-authored-by: lowmaster-chen <1119780489@qq.com >
Reviewed-on: #66
Co-authored-by: chenshuobo <chenshuobo@wonderable.ai >
Co-committed-by: chenshuobo <chenshuobo@wonderable.ai >
2026-06-22 23:18:42 +08:00
zhuzihao
8a2f72d366
feat(user): 昵称上限放宽到 20 字(与客户端/原型一致) ( #63 )
...
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #63
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-21 00:16:40 +08:00
marco
d8358a6816
fix(user): 注销账号前置校验资金余额 + 释放微信/邀请码唯一约束
...
- delete_account 端点: 有可提现现金余额 / 在审提现单(reviewing)时拒绝注销(409), 防余额锁死在 deleted 行无法退出; pending 提现已在途不拦(对账 worker 不依赖 user.status)
- soft_delete_account: 注销连带清 wechat_openid/nickname/avatar(释放微信绑定槽, 否则该微信永久无法再被任何账号绑定→提现通道锁死) + invite_code(释放邀请码唯一槽)
- wallet 新增 get_cash_balance_cents(只读, 不建账户) 供注销前置校验; 复用 has_reviewing_withdraw
- 新增 tests/test_delete_account.py
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-20 02:03:33 +08:00
marco
95a07f75b7
feat(ad): 穿山甲广告配置后台化(app_id/各位ID/验签密钥/各场景开关)
...
- app_config 存 ad_config(默认=客户端当前内置 ID,空库维持现状)
- GET /platform/ad-config 下发客户端(不含验签密钥 reward_mkey)
- admin GET/PATCH /admin/api/ad-config 读写(operator/finance + 审计,mkey 不记明文)
- pangle 回调验签 m-key 优先读后台配置、.env 兜底兼容
- 比价/领券信息流位拆分(compare/coupon_feed_code_id)
- 客户端需发版接入 /platform/ad-config 才生效;本次后端就绪、不影响现状
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-20 01:35:17 +08:00
marco
733a51260f
feat(cps): 微信网页授权加总开关 WX_MP_OAUTH_ENABLED(默认关)
...
服务号认证审核中,先关掉落地页授权(走原逻辑不跳授权/不拿 openid),整套微信代码保留。
审核通过后 .env 置 WX_MP_OAUTH_ENABLED=true + 重启即启用,无需改代码。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 12:03:58 +08:00
marco
7fd70a264d
feat(cps): 微信网页授权接入——落地页拿 openid/昵称头像,用户级群统计
...
- 服务号网页授权(WX_MP_APPID/SECRET,区别于 App 的 WECHAT_APP_ID):
落地页 base 静默拿 openid;点「领券」补 userinfo 拿昵称头像(交互触发避快照页)
- 新表 cps_wx_user + cps_click 加 openid + 迁移;integrations/wx_oauth
- /c/{code} 授权链路 + 回调 /wx/oauth/cb + cookie 免重复授权;click 带 openid
- admin 群详情加「群内微信用户」(领券画像)端点
- 下单归因到人需 user-level sid,本期只做身份+领券侧
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 11:44:11 +08:00
marco
4b98d405d7
feat: OTA 版本下发端点(检查更新)
...
- app_config 加 get/set_app_version(独立 key,复用表不进 CONFIG_DEFS)
- GET /api/v1/platform/app-version 公开读 + POST /internal/app-version 内部写(X-Internal-Secret)
- tests/test_app_version.py 5 端到端测试
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 08:31:31 +08:00
marco
42be0f828f
feat(cps): 加微信网页授权域名校验文件端点(MP_verify)
...
coupon.shaguabijia.com 全反代 app-server,微信请求该域名根目录 MP_verify_xxx.txt
验证域名归属(放根目录)。为微信网页授权(落地页拿 openid)接入做准备。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-19 05:53:45 +08:00
marco
3cab3b9055
fix(compare-record): admin 放行 cancelled 筛选 + llm_calls 拉取改后台任务
...
- admin 列表 status pattern 加 cancelled(客户端会上报用户终止比价)
- 上报端点拉 pricebot llm_calls 改 BackgroundTasks 异步回填, 不阻塞上报响应(独立 session)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 23:32:36 +08:00
marco
a2fd666203
feat(admin): 比价记录 debug 页后端——补全链路 + DB 迁移
...
model/schema 的 debug 字段已在 4ee6de2 起头,本次补完整条链路:
- repo upsert 存客户端环境/性能字段;端点同机拉 pricebot llm_calls 落库 + 算 llm次数/重试
- schema 加 platform_results 透传(admin「卡在哪一步」从 raw_payload 读)
- admin 比价记录查询接口(按 user_id/phone 列表分页 + 详情含 llm_calls)
- 迁移 comparison_debug_fields: 给 comparison_record 加环境/性能/llm_calls 列(全 nullable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 22:33:33 +08:00
marco
d55f47fc59
feat(cps): 淘宝活动落地页图做活——每活动关联图,运营上传/选已有
...
- model: cps_activity.image_url + 迁移 cps_activity_image 回填存量淘宝活动为现有图
- admin: 新建淘宝活动必传图(上传 /upload-image 或选已有 /activity-images),存绝对 URL
- 落地页 cps_redirect: 按 link→activity 取图展示,缺图兜底默认图,img src 经 html.escape
- media: save_cps_image + to_abs_media_url(基于 CPS_REDIRECT_BASE,跨域 admin-web 可显示)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 21:32:10 +08:00
marco
7368a1ca8a
feat(cps): 淘宝落地页改用设计图主视觉 + 复制按钮上提至 75% 屏高
...
- banner/card 手画区域整体换成设计图 /media/taobao_landing.jpg(~240KB jpg)
- 复制淘口令按钮从底部固定上提到 top:75vh, 上方留白
- 图入库(data/media 白名单, 同 dl.html 先例), 同域 /media serve
- 淘口令注入 / 复制 / toast 逻辑不变
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 20:53:34 +08:00
marco
3a40f617bd
feat(cps): 后端接入淘宝/京东多平台(payload + 群多平台 + 复制统计 + 迁移)
...
- model: cps_group.platforms 多选 / cps_activity.payload(淘口令/京东链接)
/ cps_link.sid 可空 + 复制统计
- admin API: 群与活动平台多选、批量生成落地页短链 referral-links、对账字段可空
- 落地页 cps_redirect: 淘宝展示淘口令(记 copy 事件) / 京东 302 / 美团原逻辑
- 迁移 cps_v2_platforms: 加 platforms/payload/event_type 列, sid 放宽可空(含 downgrade)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 19:21:20 +08:00
marco
003fd9d986
feat(compare): 失败比价记录支持 trace 链接
...
compare.py 加 /trace/finalize 透传(按 trace_id 一致性 hash 落同一 pricebot 进程);compare_record.py list_records 加 include_trace,对本人记录在调试态(客户端 agent 调试模式)放行 trace_url。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 15:56:15 +08:00
ouzhou
04edb50acc
feat(admin/ad): 提现自动对账后台开关 + 客户端广告 flags 端点 + 穿山甲多 m-key 验签 ( #59 )
...
- 自动对账接入 app_config 运行时配置(新增 bool 配置类型):env 部署总闸 + DB 运营日常开关
双层;worker 每轮读 DB 即时生效,健康检查改报「env AND DB」实际生效态
- 新增 GET /api/v1/platform/flags(不鉴权)下发 comparing_ad_enabled 远程 kill-switch,
客户端拉取后缓存;空库回退默认 True
- 穿山甲发奖回调支持多激励位 m-key(三命名项 PANGLE_REWARD_SECRET_TEST/_DEDICATED/_PROD
+ 旧逗号分隔合并去重),verify_callback_sign_any 逐个验签任一通过即受理;向后兼容旧单 key
- 补 test_platform / bool config 用例;app_config 文档同步
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #59
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-17 10:37:54 +08:00
marco
277f9b16a2
feat(cps): 群发券分发与对账 + 短链点击追踪
...
群(sid)/活动池/转链(带sid)/美团 query_order 按 sid 对账/按群统计;
短链 /c/{code} 记点击(PV/UV)→302 跳美团,点击→下单漏斗。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-17 10:00:29 +08:00
marco
f15ca74a22
feat(store-mapping): JD 缓存 deeplink 失效标记(对标淘宝) ( #56 )
...
Reviewed-on: #56
2026-06-16 01:25:57 +08:00
ouzhou
f7d86011c1
feat(ad-revenue): admin 广告收益报表(按 用户/日期/类型/应用/代码位 聚合) ( #54 )
...
- 新增 GET /admin/api/ad-revenue-report:展示条数/收益 + 复用金币审计逐条复算做发奖对账
- ad_ecpm/ad_reward/ad_feed_reward 各加 app_env + our_code_id 两列(alembic 迁移)
- ecpm-report / feed-reward 接收并落库 app_env/our_code_id;激励发奖按 ad_session_id 回填
- ad_audit 抽出 audit_rows,报表与逐条审计复用同一复算口径
- 组级 matched 改「组内逐条全一致」,避免应发和==实发和的互相抵消掩盖错误
- list_feedbacks 改 offset 分页并返回 total(配合 admin 页码分页)
- 反馈正文上限 _CONTENT_MAX 2000→200
- 文档:新增 admin-ad-revenue-report,更新 ecpm/feed-reward/feedback 及对应 db docs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #54
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-15 23:13:14 +08:00
liujiahui
8fa55eec3e
fix(coupon): 领券弹窗频控按 App 独立 + debug 全重置补全 ( #52 )
...
bug: 弹窗 engagement 表只按 (device, 日) 全局记一条,美团弹过/领过就把整台设备当天
标记 engage,淘宝/京东被压住不弹。需求是美团/淘宝/京东各自独立、每日各弹一次。
改动:
- model: CouponPromptEngagement 加 package 列,唯一约束 (device,日) → (device,package,日)
- alembic: 新增迁移 coupon_engage_per_package(加列 + 改唯一约束, batch_alter_table)
- repository: has_engaged_today / mark_engagement 加 package 维度;新增 reset_today_completion
- api: should-show / dismiss 接收 package;coupon_step(step=0) 按 App 记 engagement;
补 /prompt/shown 接口(客户端一直在调但后端缺失, 原 404);
补 /completed-today/reset(开发设置全重置用, 解首页卡置灰)
验证: curl 端到端 —— 美团弹过后 should-show 美团=false 淘宝/京东=true;
shown/reset/completion-reset 端点全 ok。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: no_gen_mu <liujianhishen@gmail.com >
Reviewed-on: #52
Co-authored-by: liujiahui <liujiahui@wonderable.ai >
Co-committed-by: liujiahui <liujiahui@wonderable.ai >
2026-06-14 23:41:54 +08:00
ouzhou
27f76918b2
feat(admin): 运营后台跟进——review 加固 + 反馈改版 + 列表页码分页 ( #51 )
...
本 PR 汇合三块运营后台改动(原 #50 仅含其中「加固」一块,已并入本 PR 并关闭)。
## 1. review 加固 (436b2a3 )
- 超管防自锁:降级/禁用最后一个 active super_admin 前校验,杜绝零超管死局
- 时间筛选统一 tz-aware(列为 timestamptz),比较绝对时刻、不依赖 DB 会话时区
- 上报审核 / 调余额(set·扣减)加行锁,防并发/连点重复发钱
- ad_audit 复算排序补 id 次级键;health-check 限 finance;调账/拒绝 reason 去空白校验
## 2. 反馈改版 (5a18dbb )
- contact 可选、截图≤6;admin 反馈列表筛选/排序;admin·wallet 接口调整 + docs
## 3. 列表页码分页 (1a7a624 )
- CursorPage 加 total;新增 offset_paginate(count 与分页同源)
- 上报/审计日志从 id 游标改 offset 分页(支持跳页)
- 用户 / 提现 / 上报 / 审计日志 四页接入页码分页
测试:admin 套件 47 passed。前端配套改动见 shaguabijia-admin-web。
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #51
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-14 22:54:07 +08:00
ouzhou
8d7b91219a
feat(wallet): 解绑微信前对待审核提现二次确认 ( #46 )
...
## 改动
解绑微信前若有**待审核(reviewing)**提现单,首次解绑被拦下返回二次确认,用户确认后带 `force=true` 才真解绑。
- `schemas`: `UnbindWechatRequest{force}` + `UnbindWechatResultOut{needs_confirm, message}`
- `repositories`: `has_reviewing_withdraw`(只看 reviewing)
- `api`: `unbind-wechat` 接受可选 body(兼容旧无 body 客户端);`bound` 返回真实绑定态
- `docs/api`: 同步协议
## 为什么只拦 reviewing
reviewing 单解绑后审核打款会回读空 openid → 自动退回现金(钱不丢、只为让用户知情);pending 转账已在途、解绑影响不到,不拦。
配套客户端见 shaguabijia-app-android 同名分支。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #46
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-13 03:53:43 +08:00
marco
e8bd12cc1f
feat(onboarding): force_onboarding 改设备维度 + admin 设备管理 + status 查询
...
废弃 force_onboarding(运营按用户强制引导,客户端不认——被 onboarding_completed 压过),
改用 onboarding_completion(设备+账号 维度),admin 直接增删该表记录控制重走。
- 删 force_onboarding: User 列 + auth/admin schema + admin 接口 + mutations + repo
clear + /onboarding/complete 调用 + 3 测试;新增 alembic 迁移删列
- admin 设备管理: 列设备(按 device 聚合) / 重置单设备 / 全部重置(清 onboarding_completion)
- 新增 GET /api/v1/user/onboarding/status: 客户端已登录启动查"本设备是否要重走引导"
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-12 00:51:47 +08:00
zhuzihao
3d07461ef5
feat(force-onboarding): 运营一键开启新手引导 — User.force_onboarding + admin 接口 + /me 带出 + 走完自动清 ( #43 )
...
- User 新增 force_onboarding 列(仿 debug_trace_enabled)+ 迁移 user_force_onboarding。
- POST /admin/api/users/{id}/force-onboarding(operator 角色 + 审计 user.force_onboarding.set)。
- UserOut(/me 与登录响应)带出该字段;/api/v1/user/onboarding/complete 走完即自动清回 false,只触发一次。
- 测试:admin 设置+审计+角色守卫、走完引导自动清标记。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: zzhyyyyy <2685922758@qq.com >
Reviewed-on: #43
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai >
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai >
2026-06-10 22:27:06 +08:00
marco
a753843804
美团 feed 改用离线库 + 三 tab 降级兜底(替换 main 的实时版 feed) ( #40 )
...
把 main 的实时 feed 换成离线库版本 + status 降级兜底:
- rec 智能推荐:改走离线库 meituan_coupon 筛佣金≥3%(SQL 去重+排序+分页),不再实时撞限流
- distance 距离最近:改实时搜索翻页(sortField=6),按用户真实位置由近及远排
- top_sales 销量最高:改 SQL DISTINCT ON 分页,修原全表拉取+全量解析的翻页卡顿
- 四路加 status(ok/empty/degraded):空库/上游失败均返 200 不再 5xx;/coupons 502 软化为降级
- FeedResponse/CouponListResponse 加 status 字段(默认 ok,向后兼容)
注意:替换 main #18 的实时 feed 实现,需 review 行为变更;依赖的离线库由 ETL 灌(见 meituan-etl PR)
---------
Co-authored-by: chenshuobo <1119780489@qq.com >
Reviewed-on: #40
2026-06-10 20:05:50 +08:00
zhangxianze
bf82c68408
feat(compare): 美团比价前用券透传端点 /intent/precoupon/step ( #41 )
...
## 背景
客户端在美团源比价的**意图识别前**先循环调本端点用券。app-server 只做透传壳(决策在 pricebot-backend)。
## 改动
- 新增 `POST /api/v1/intent/precoupon/step` → 透传到 pricebot-backend `/api/intent/precoupon/step`
- 同 `/intent/step` 透传壳: 不鉴权、不做 schema 校验, device_id 透传区分设备
## 测试
- 链路自测(:8770 → :8000) + 真机实测用券成功
## 关联(跨三仓库, 同名分支 `feat/meituan-precoupon`)
- WonderableAI/pricebot-backend
- WonderableAI/shaguabijia-app-server
- WonderableAI/shaguabijia-app-android
**改协议字段需三仓库一起改。**
🤖 Generated with [Claude Code](https://claude.com/claude-code )
---------
Co-authored-by: xianze <ze@192.168 .0.128>
Reviewed-on: #41
Co-authored-by: zhangxianze <zhangxianze@wonderable.ai >
Co-committed-by: zhangxianze <zhangxianze@wonderable.ai >
2026-06-10 19:35:58 +08:00
zzhyyyyy
dacb37e3e1
feat(onboarding): 新手引导完成按 设备+账号 去重(表/模型/仓储/端点/迁移/测试)
...
- onboarding_completion 表(user_id+device_id 唯一约束)+ model + repository
- POST /api/v1/user/onboarding/complete 标记完成;登录响应 TokenWithUser.onboarding_completed
(按登录请求带的 device_id 判定是否已走过引导,跨卸载重装稳定)
- alembic 迁移 onboarding_completion(rebase 到最新 main 后已链在 coupon_daily_completion 之后,单 head)
- docs/database 文档 + tests/test_onboarding.py + run.bat(本地启动脚本)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-10 18:32:51 +08:00
liujiahui
0890e693d7
feat(coupon): 今日跑完整轮领券后端记录 + 查询(首页置灰源) ( #34 )
...
新增 coupon_daily_completion 表:按 (device_id, 自然日) 记"今天是否已跑完
整轮领券(到 done 帧)"。客户端据此把首页「去领取」卡置灰、不可点。
口径(用户决策 A 方案):到 done 即算,不管单券成败 —— 失败/跳过常是无障碍/
环境问题,重复点也补不回来。判断维度 device_id,与 engagement/claim 一致。
- model CouponDailyCompletion(uq device+complete_date,仿 CouponPromptEngagement)
- repo has_completed_today / mark_completed_today(幂等 upsert + IntegrityError 兜底)
- schema CouponCompletedTodayOut(completed: bool)
- coupon_step 透传链路在 action.command=="done" 那帧 best-effort 写完成记录
(pricebot 只在整轮全跑完才保留 command=="done",故无需再判 continue)
- GET /api/v1/coupon/completed-today?device_id= 供首页查询
- alembic 迁移 coupon_daily_completion(down_revision=0cf18d590b1d 当前 head)
合并后需 alembic upgrade head,否则 /completed-today 500。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: no_gen_mu <liujianhishen@gmail.com >
Reviewed-on: #34
Co-authored-by: liujiahui <liujiahui@wonderable.ai >
Co-committed-by: liujiahui <liujiahui@wonderable.ai >
2026-06-10 16:07:33 +08:00
ouzhou
0bddce516f
feat(ad): eCPM 单位统一为分 + 新增看广告金币审计接口 ( #32 )
...
- eCPM 口径修正:getEcpm 原值是分/千次,新增 parse_ecpm_fen;parse_ecpm_yuan
改为 ÷100 转元,因子1 阈值按元判档(100/200/400),收益换算用元
- test-grant 用客户端按 ad_session_id 上报的真实 eCPM 发奖(取不到/≤0 兜底 200)
- 新增 GET /admin/api/ad-coin-audit 只读复算对账(router/repo/schema),复用发奖公式
- 同步更新 docs/api、docs/database 的分/元口径
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #32
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-10 15:53:52 +08:00
marco
953a05a5e6
feat(debug-trace): 调试链接权限 + trace_url 落库与按权限下发 ( #35 )
...
- user 加 debug_trace_enabled、comparison_record 加 trace_url
- 迁移 f8d3b1e60a27:加两列,down_revision 用 tuple 顺带合并既存双 head(invite_fingerprint_table + 044dce6e9b1f)
- UserOut 加 debug_trace_enabled → /me 与登录响应带出
- ComparisonRecordIn/Out 加 trace_url;upsert 落库
- /compare/records 列表与详情按 user.debug_trace_enabled 下发;详情连 raw_payload 里那份一并抹掉,防权限绕过
- admin 加 POST /users/{id}/debug-trace(operator + 审计),列表带该字段
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Reviewed-on: #35
2026-06-10 15:35:08 +08:00
xiebing
b2f5a53dd8
feat(invite): 被邀请人列表接口 + 指纹归因(任务3) ( #31 )
...
- GET /invitees: 分页 + 名字降级兜底(昵称→微信昵称→脱敏手机号)
- 指纹归因: 落地页采集 + (IP,设备型号)反查撞库 + 时间窗口闸
- test_invite: +5 个列表测试(脱敏/倒序/昵称优先/分页/空), 修指纹测试跨用例串味
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Reviewed-on: #31
Co-authored-by: xiebing <xiebing@wonderable.ai >
Co-committed-by: xiebing <xiebing@wonderable.ai >
2026-06-09 21:48:48 +08:00
marco
25b2b6850b
feat(coupon): 领券弹窗频控加重置端点 + reset_today_engagement ( #29 )
...
- 加 POST /api/v1/coupon/prompt/reset:删该设备今日 engagement → has_engaged_today 变 false、
今天又能弹。开发设置「重置今日领券弹窗状态」按钮调它(客户端改纯后台频控后前台清缓存已失效)
- coupon_state 加 reset_today_engagement(按 device_id + 今天删);should-show 文档改为"纯后台判据"
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Reviewed-on: #29
2026-06-09 11:18:07 +08:00
ouzhou
d7c29c0883
feat(coin): 金币数值体系二期——看广告按 eCPM 发奖 + ad_session_id 幂等 + 签到膨胀固定金币 ( #28 )
...
- rewards: 激励视频实发改按 calculate_ad_reward_coin(eCPM, 当日第N次) 公式;AD_REWARD_COIN/MAX_AD_REWARD_COIN 降为历史兼容口径;新增 SIGNIN_BOOST_COIN=2000
- 签到膨胀: Day1-13 看完激励视频额外发固定金币、Day14 不允许 (signin.py / signin-boost)
- ad_session_id 幂等: ad_ecpm/ad_reward/ad_feed_reward 记录加 ad_session_id 列 + 唯一索引(新迁移 coin_reward_phase2 / ad_feed_reward_session)
- ad.py + schemas + repositories: ecpm-report / feed-reward / reward-status / test-grant 改造;config_schema 增 signin_boost_coin;admin stats overview 补充
- 同步 docs/api + docs/database + docs/integrations/pangle 及 tests(test_ad_reward / test_welfare)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #28
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-09 01:56:47 +08:00
ouzhou
6432497af1
feat: 后端接入微信提现人工审核与资金安全校验 ( #27 )
...
提现申请改为先扣款并进入待审核,审核通过后才发起微信打款,审核拒绝或微信失败时自动退款。
新增运营后台提现列表的关键词搜索、日期筛选、快捷筛选和排序参数,并支持批量通过、批量拒绝、批量刷新查单。
新增微信支付配置健康检查、现金账本校验、自动对账 worker 和单实例保护。
新增数据库唯一索引,约束同一用户未完成提现和同一提现单重复退款,提升并发安全性。
---------
Co-authored-by: OuYingJun1024 <1034284404@qq.com >
Reviewed-on: #27
Co-authored-by: ouzhou <ouzhou@wonderable.ai >
Co-committed-by: ouzhou <ouzhou@wonderable.ai >
2026-06-09 01:56:37 +08:00
marco
4d392f44f5
feat(invite): 好友邀请后端(注册即生效,邀请人+被邀请人各发1万金币) ( #24 )
...
- user.invite_code 列 + invite_relation 表(invitee_user_id 唯一 = 幂等防重复发奖)
- GET /api/v1/invite/me(我的码+分享链接+战绩)、POST /api/v1/invite/bind
- 复用 wallet.grant_coins 同事务发币;自邀屏蔽 / 无效码 / 新用户闸(注册72h内才发)
- alembic 迁移(11a1d08c6f55 -> invite_code_and_relation)+ 8 个测试(钱路/幂等/并发兜底全覆盖)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Reviewed-on: #24
2026-06-08 04:57:55 +08:00