Files
shaguabijia-app-server/docs/database/cps_link.md
T
2026-06-17 23:32:36 +08:00

4.7 KiB
Raw Blame History

cps_link — CPS 群发短链(发群用的 /c/{code},外套一层我们的短链)

模型 app/models/cps_link.py(CpsLink) · 仓库 app/repositories/cps_link.py(create_link / get_by_code) · 接口 admin 生成 POST /admin/api/cps/referral-links、用户落地 GET /c/{code}(app/api/v1/cps_redirect.py) · ← 索引 · 总览

群发券链接外套一层我们自己的短链 /c/{code},目的是统计点击 + 控制落地。在 CPS 群发漏斗里它是**"发出去的那条链接"**:由 群(cps_group)× 活动(cps_activity)在后台"批量生成短链"产出,运营把 /c/{code} 复制到微信群。用户一点 → 记一条 cps_click → 按平台 302 跳 target_url(美团短链/京东链接)或返回淘宝落地页。cps_clickcps_link 同文件(models/cps_link.py),详见 cps_click.md

用在哪 / 增删改查

  • C(插入):POST /admin/api/cps/referral-links(generate_referral_links,operator)批量生成——按 group_id + 一组 activity_ids,对每个活动调 _gen_one_link:美团走 meituan.get_referral_link(act_id/product_view_sign, sid=群.sid) 拿短链作 target_url(无群 sid 则 400);淘宝/京东直接用活动 payloadtarget_url。落库走 create_link,短码 code_gen_code 生成(去易混字符,冲突重试 5 次仍冲突用 12 位兜底)。code 全局唯一即天然幂等键,但每次调用都新建 link(同群同活动重复生成会产生多条不同 code)。
  • U(更新):。link 一旦生成不改(改了等于换链接)。
  • R(读):GET /c/{code}(cps_landing)落地时 get_by_code 取 link → 决定跳转/落地;POST /c/{code}/copy 同样按 code 取。后台无 link 列表端点(运营只看生成结果与按群统计)。
  • D(删除):无删除路径。删群/删活动都不级联删 link(已发链接保持可用)。

字段

类型 约束 / 默认 说明(取值 / join)
id Integer PK, autoincrement cps_click.link_id 语义引用(非 FK)
code String(16) UNIQUE, index, NOT NULL 短码,发群链接 /c/{code} 的 code。字母表去掉 0/O/1/l/I(肉眼复制不易错),默认 8 位
group_id Integer index, NOT NULL 归属群 = cps_group.id(语义关联,非 FK)
activity_id Integer index, NOT NULL 对应活动 = cps_activity.id(语义关联,非 FK);淘宝落地页反查活动取图
sid String(64) index, nullable 渠道追踪位,仅美团 link 有(= 群 sid);淘宝/京东无 sid。生成时从群冗余进来
platform String(20) NOT NULL, default meituan meituan / taobao / jd。决定 cps_landing 是 302 跳还是渲染淘宝落地页
target_url String(2048) NOT NULL 跳转/落地目标:美团短链 / 京东链接(302 跳) / 淘宝整段淘口令文本(H5 落地页复制)
created_at DateTime(tz) server_default now(), NOT NULL 生成时间(无 updated_at)

关系 / Join Key

  • group_idcps_group.id;activity_idcps_activity.id;sidcps_group.sid——全是语义关联,无 ForeignKey(删群/删活动都不报错、不级联)。
  • idcps_click.link_id(一 link 多点击);记点击时 record_click 把 link 的 group_id/sid 冗余进 cps_click
  • target_url 间接关联 cps_order:美团 target_url 携带群 sid,用户经它下单后订单回来的 sid 即此群 sid——但 link 与 order 没有直接列关联,只经 sid 在群维度汇合。

索引与约束

  • PK id;UNIQUE+index code(uq_cps_link_code + ix_cps_link_code);index group_idactivity_idsid
  • 无外键

注意

  • target_url 从 1024 加长到 2048:初版(277f9b1)只装美团短链(够短),3a40f61 接淘宝后要装整段淘口令文本(较长),迁移 cps_v2_platformstarget_url 放宽到 2048,同时 sid 改 nullable(淘宝/京东 link 无 sid)。
  • sid 冗余进 link 又冗余进 click:统计时按群聚合点击不必 join cps_link(见 click_stats_by_group 直接读 cps_click.group_id);sid 留在 link 上则是为了生成时一次性带齐,跳转无需再查群。
  • 短码去易混字符:_CODE_ALPHABET 排除 0/O/1/l/I,因为短链会被运营/用户肉眼复制粘贴,降低抄错率;碰撞重试 5 次后降级 12 位,概率近 0。
  • 三平台落地分叉(cps_redirect.cps_landing):美团/京东 → 302 跳 target_url;淘宝 → 不能 302(淘口令不是 URL),改返回自渲染 H5 落地页(图来自活动 image_url,按钮复制 target_url 淘口令)。code 不存在时兜底跳 https://www.meituan.com/