功能与集成
Waitlist(候补名单)
上线前收集邮箱的候补名单:落库到 D1、可选同步到 Resend audience、后台可导出 CSV、自带 Turnstile bot 防护。
fork 后你要改哪: 开箱即用。想把报名同步到邮件列表就填
RESEND_AUDIENCE_ID;表单样式 改src/features/waitlist/components/。
工作原理
报名走 joinWaitlist server fn(src/features/waitlist/waitlist.actions.ts),依次:
- 校验 Turnstile token(设了
TURNSTILE_SECRET_KEY才校验;否则跳过)。 - 规范化 + 校验邮箱(
email.ts)。 - 落库 D1:
upsertWaitlist(upsert.ts)按邮箱 upsert,返回added/already。 - 同步 audience(best-effort):
addContact(src/features/audience/audience.ts)把邮箱 写入 Resend audience;失败只记日志,不影响报名成功。
表单组件:waitlist-form.tsx / waitlist-dialog.tsx,已用在落地页 footer 和 /waitlist
路由。来源标记(source)由 clampSource 收敛,便于区分报名入口。
audience 同步与 CSV 导出
- 同步到 Resend:需同时设
RESEND_API_KEY+RESEND_AUDIENCE_ID。缺任一 →addContact返回skipped(报名仍进 D1,只是不同步)。这套addContact也为将来的 newsletter 复用。 - 导出:管理员可在
/admin/waitlist查看,并经/admin/waitlist.csv(src/routes/admin/waitlist[.]csv.ts)导出 CSV。仅管理员可访问(见 基础 Admin)。
RESEND_AUDIENCE_ID 留空完全没问题 —— 报名照常存进 D1,你随时能从后台导出 CSV。同步只是
锦上添花。
常见改动
- 多个报名入口分别统计:调用时传不同的
source,再在clampSource的白名单里登记。 - 关掉验证码:不设
TURNSTILE_SECRET_KEY即跳过校验(不建议线上关)。