流程总览
客户
Landing Page填写表单
→
系统
发送邮件通知管理员
→
你(手动)
评估客户 &创建租户
→
系统
发送激活邮件给客户
→
客户
点击链接设置密码
→
完成
登录系统开始使用
分步详解
1
客户访问 Landing Page 并提交 Demo 请求
客户操作
客户在 celoria.ai 的 Contact 区域填写姓名、电话、邮箱和留言,点击 Submit。
涉及端点:
速率限制: 3 次/小时/IP
POST /api/demo-request(公开,无需认证)速率限制: 3 次/小时/IP
2
系统自动发送两封邮件
系统自动📧 客户确认邮件
- • 感谢提交
- • Calendly 预约链接(如果配了
CALENDLY_DEMO_URL) - • "1 个工作日内联系"
📧 管理员通知邮件
- • 发到
PLATFORM_ADMIN_EMAIL - • 包含客户姓名、邮箱、电话、留言
- • 提交时间戳
注意: 邮件发送是 fire-and-forget,失败不阻塞 API 响应。查看后端日志确认邮件是否发送成功。
3
你:评估客户 & 创建租户
你的操作收到管理员通知邮件后,评估客户需求,决定是否创建租户。
操作方式:通过平台管理员 API 创建租户
# 1. 登录平台管理员
curl -X POST http://localhost:3000/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"platform@celoria.ai","password":"test123"}'
# 2. 创建租户(用返回的 token)
curl -X POST http://localhost:3000/api/platform/tenants \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <token>' \
-d '{
"name": "客户的沙龙名称",
"planType": "standard",
"contactName": "客户姓名",
"contactEmail": "客户邮箱",
"contactPhone": "客户电话"
}'
创建成功后返回值包含:
- •
tenant.shortId— 租户短 ID(用于 URL,如salon001) - •
activation.token— 激活令牌 - •
activation.activationUrl— 完整激活链接 - •
activation.expiresAt— 过期时间(默认 72 小时)
注意事项:
- •
contactEmail就是客户将来登录用的邮箱,务必确认准确 - • 激活令牌有过期时间,过期后客户无法激活,需要你重新生成
- •
shortId创建后不可修改,会出现在客户的 URL 中(celoria.ai/{shortId})
4
你:将激活链接发给客户
你的操作把 Step 3 返回的激活链接发给客户。链接格式:
https://celoria.ai/en/activate?token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
发送方式建议:
- • 目前需要手动发(邮件/短信/微信均可)
- • 未来可以做成系统自动发激活邮件(TODO)
- • 告诉客户激活链接 72 小时内有效
- • 如果客户反馈链接过期,需要你通过 API 重新生成
5
客户点击激活链接,设置密码
客户操作客户打开链接后看到激活页面:
页面显示内容
- • 租户名称(如 "Jane's Nail Salon")
- • 脱敏邮箱(如 j***e@example.com)
- • 密码输入框 + 确认框
- • 最少 8 位
异常状态处理
- • 无效令牌 → 错误提示
- • 已过期 → 提示联系管理员
- • 已激活 → 提示直接登录
- • 网络错误 → 通用错误页
涉及端点:
页面路由:
GET /api/tenants/activate?token=xxx — 预验证令牌POST /api/tenants/activate — 提交密码完成激活页面路由:
/[locale]/activate?token=xxx
6
激活成功,自动跳转登录
系统自动密码设置成功后,页面显示成功消息,3 秒后自动跳转到该租户的登录页:
/en/{tenantShortId}/login
客户用刚设置的邮箱 + 密码登录即可。首次登录的角色为 super_admin(租户级超级管理员)。
环境配置清单
以下环境变量必须在 .env 中正确配置,否则相关功能不工作:
| 变量 | 用途 | 必须? |
|---|---|---|
| RESEND_API_KEY | 邮件发送(Demo 请求确认 + 管理员通知) | 必须 |
| RESEND_FROM_EMAIL | 邮件发件人地址 | 必须 |
| PLATFORM_ADMIN_EMAIL | 接收 Demo 请求通知的管理员邮箱 | 必须 |
| CALENDLY_DEMO_URL | Calendly 预约链接(放在客户确认邮件中) | 可选 |
| NEXT_PUBLIC_API_URL | Landing Page 调用后端 API 的地址(生产: https://api.celoria.ai) |
生产必须 |
常见问题 & 排查
Landing Page 提交后没收到邮件
- 检查后端日志:
pm2 logs celoria-api --lines 50,搜索 "demo request" 或 "Failed to send" - 确认
RESEND_API_KEY是否有效(过期/quota 耗尽?) - 确认
RESEND_FROM_EMAIL的域名已在 Resend 验证 - API 返回 200 不代表邮件发送成功(fire-and-forget 机制)
Landing Page 提交报 CORS 错误
- 确认后端 CORS 中已包含 Landing Page 的源(
localhost:3003或https://celoria.ai) - 确认 Landing Page 的
NEXT_PUBLIC_API_URL没有拼错 - 生产环境确认
https://celoria.ai在白名单里
客户说激活链接打不开 / 显示无效
- 链接是否超过 72 小时?→ 需要你重新生成令牌
- 链接是否被截断?(邮件客户端有时会断行)→ 让客户复制完整 URL
- 是否已经激活过?→ 页面会显示"已激活"提示,让客户直接登录
- 检查 URL 中的 locale 是否正确(
/en/activate或/zh/activate)
客户激活后登录失败
- 确认激活 API 返回了
success: true(查后端日志) - 确认客户用的邮箱和创建租户时的
contactEmail一致 - 确认登录页 URL 中的
tenantShortId正确 - 检查租户状态是否为
active
待办 & 未来优化
- ! 自动发送激活邮件 — 租户创建后系统自动发激活链接给客户,免去手动发送的步骤
- ! 重新生成激活令牌 API — 给管理员一个 UI 按钮,在令牌过期后可以重新生成并发送
- ? Demo 请求持久化 — 当前 demo 请求只发邮件不入库,未来可以存到数据库用于 CRM 跟踪
- ? Self-service 注册 — 客户自助创建租户(免费试用 → 付费升级),彻底去掉人工环节
快速参考:涉及的文件
| 文件 | 职责 |
|---|---|
| backend/api/demo-request.js | Demo 请求 API(公开) |
| backend/api/tenant-activate.js | 租户激活 API(公开) |
| backend/services/tenant/tenant-service.js | 核心激活逻辑(activateAdmin) |
| backend/server.js | CORS 白名单 + 路由挂载 |
| landingpage/src/components/Contact.tsx | Landing Page 表单(功能化) |
| frontend/web_app/src/app/[locale]/activate/page.tsx | 账户激活页面 |
| frontend/web_app/src/i18n/locales/{en,zh}/auth.json | 激活页面中英文翻译 |