498da05995
(工作区既有改动, 非本次会话产出)
4.7 KiB
4.7 KiB
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_click 与 cps_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);淘宝/京东直接用活动payload作target_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_id→cps_group.id;activity_id→cps_activity.id;sid≈cps_group.sid——全是语义关联,无 ForeignKey(删群/删活动都不报错、不级联)。id←cps_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+indexcode(uq_cps_link_code+ix_cps_link_code);indexgroup_id、activity_id、sid。 - 无外键。
注意
target_url从 1024 加长到 2048:初版(277f9b1)只装美团短链(够短),3a40f61接淘宝后要装整段淘口令文本(较长),迁移cps_v2_platforms把target_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/。