📋 进行中的活动
| 活动名称 | 参与人数 | 助力人数 | 已领奖励 | 状态 |
|---|---|---|---|---|
| 加载中... | ||||
🕐 最近动态 (最近24小时)
🏆 影响力排行榜
哪些用户带来最多粉丝,拥有最高的裂变潜力?
| 排名 | 用户 | 得分 | 助力数 | 二代数 | 裂变K值 | 留存率 | 奖励数 | 趋势 |
|---|---|---|---|---|---|---|---|---|
| 加载中... | ||||||||
请选择活动
从上方下拉菜单选择活动,生成完整的运营报表。
系统总体状态
📋 系统检查清单
所有组件都必须正确配置才能使系统正常工作。
📲 小程序开发配置指南
本指南解释了小程序开发中 localhost 与真机测试的核心问题,以及我们的解决方案。
🔴 核心问题
为什么小程序真机无法直接访问 localhost?
- localhost 是本地回环地址 — 指向设备自身,不是你的电脑
- 手机和电脑是不同设备 — 手机的 localhost 是手机本身,无法到达你电脑的服务
- 微信小程序限制 — 正式环境必须使用 HTTPS 且域名需备案
✅ 我们的解决方案
Cloudflare Tunnel + Supabase 自动同步
我们使用 Cloudflare Tunnel 将本地服务暴露到公网,并将 Tunnel URL 存储在 Supabase。 小程序启动时自动从 Supabase 获取最新 URL,无需每次手动修改代码。
┌──────────────┐ ┌─────────────────┐ ┌──────────────┐
│ 你的电脑 │───▶│ Cloudflare Tunnel│───▶│ 公网 URL │
│ localhost:3000│ │ │ │ xxx.trycloudflare.com │
└──────────────┘ └─────────────────┘ └──────────────┘
│
┌───────────────────────┘
▼
┌──────────────────────────┐
│ Supabase │◀─── Admin 后台保存 URL
│ tunnel_config 表 │
└──────────────────────────┘
│
▼
┌──────────────────────────┐
│ 小程序 (真机) │◀─── 启动时自动获取 URL
│ 自动使用最新 Tunnel URL │
└──────────────────────────┘
🔄 自动环境检测
小程序会自动检测运行环境,选择正确的 API 地址。
- platform =
devtools - 使用
http://localhost:3000/api - 无需额外配置
- platform =
ios或android - 从 Supabase 获取 Tunnel URL
- URL 缓存 5 分钟
⚙️ 必要配置
以下配置只需完成一次。
进入「开发 → 开发管理 → 开发设置 → 服务器域名」
在 request合法域名 添加:https://fseyfnuqxvrcwrpshxyv.supabase.co
在微信开发者工具右上角「详情 → 本地设置」
勾选 ☑️ 不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书
扫码预览时,点击右上角「...」→「开启调试」
这样真机也可以访问非 HTTPS 域名(开发阶段)
📋 日常开发流程
- 启动后端服务 —
cd backend && npm run dev - 启动 Cloudflare Tunnel —
cloudflared tunnel --url http://localhost:3000 - 复制 Tunnel URL — 从终端输出中复制
https://xxx.trycloudflare.com - 在 Admin 后台保存 URL — 「基础设施 → 隧道配置」粘贴并保存
- 真机预览 — 小程序会自动获取最新 URL,无需改代码
🔧 常见问题排查
真机提示「request:fail url not in domain list」
原因:Supabase 域名未添加到合法域名列表
解决:在微信公众平台添加 https://fseyfnuqxvrcwrpshxyv.supabase.co 到 request 合法域名
真机请求超时或无响应
可能原因:
- Cloudflare Tunnel 已断开(每次重启电脑后需要重新启动)
- Admin 后台的 Tunnel URL 未更新
- 后端服务未启动
解决:重新启动 tunnel 并更新 URL
模拟器正常但真机报错
原因:模拟器使用 localhost,真机需要公网 URL
解决:确保 Tunnel 正在运行且 URL 已保存到 Admin 后台
小程序无法获取 Tunnel URL
检查步骤:
- 确认 Supabase 域名已添加到 request 合法域名
- 检查
tunnel_config表中是否有记录 - 清除小程序本地存储后重试
🚀 生产环境注意事项
上线生产环境前,需要完成以下配置:
- 域名备案 — 国内服务器需要 ICP 备案
- HTTPS 证书 — 所有 API 必须使用 HTTPS
- 正式域名 — 替换 Cloudflare Tunnel 为正式域名
- 添加合法域名 — 在微信公众平台添加正式 API 域名
- 关闭调试开关 — 小程序代码中移除开发时的调试代码
Connection Status
Not configured
Not configured
更新 Tunnel URL
从 cloudflared 命令输出中复制 URL,粘贴到下方保存。
首次使用需在小程序「request合法域名」添加:
fseyfnuqxvrcwrpshxyv.supabase.co
Quick Reference Commands
🔗 Why Do You Need a Tunnel?
Connection Status
Not configured
Not configured
Not configured
Go to WeChat MP Admin to configure the webhook URL and message settings
📱 Why Do You Need WeChat Official Account?
Quick Reference
Connection Status
Not configured
Not configured
🗄️ Why Do You Need Database?
Quick Reference
Connection Status
http://localhost:3000
development
-
💻 Why Do You Need Backend Server?
Quick Reference
🔄 完整数据流
了解数据如何在裂变营销系统中流转
二维码包含: camp_{campaignId}_ref_{userA_code}
微信触发 "subscribe" 事件
微信 → Cloudflare 隧道 → 后端
POST /api/oa/webhook
保存到 campaign_helpers 表:
- helper_openid (用户B)
- participant_id (用户A)
- campaign_id
- is_valid = true
- source_channel = 'wechat_scan'
用户A的 helper_count++
检查是否解锁奖励
发送小程序链接:
pages/landing/index?ref={code}&from=oa
带邀请码的落地页
获取微信code → 换取session
POST /api/auth/login
姓名、电话、公司等
保存到 users 表
关联邀请码到用户A
保存到 event_logs:
- event_type: 'register'
- user_id: 用户B
- referrer_id: 用户A
- source: 'oa_scan'
成为参与者
POST /api/oa/scene
scene: camp_{id}_ref_{userB_code}
用户B的头像 + 昵称 + 二维码
POST /api/campaigns/{id}/poster
朋友圈、群聊、好友
用户C扫码 → 助力用户B → 成为分享者
裂变增长!🚀
小程序显示助力人数
查询 campaign_participants
helper_count ≥ required_helpers
按钮:"领取奖励"
POST /api/campaigns/{id}/claim/{rewardId}
验证助力数(重新计算有效助力)
保存到 campaign_reward_claims
记录事件: 'campaign_reward_claimed'
所有事件保存到 event_logs
- 用户行为(登录、注册、扫码)
- 公众号事件(关注、取关)
- 活动事件(助力、领奖)
source_channel: wechat_scan, h5_share 等
referrer_id: 谁邀请的用户
campaign_id: 哪个活动
计算 influence_score
直接邀请 + 二级邀请
实时指标、图表、调试日志
监控活动表现
🛡️ 防作弊与边界情况
- When user unfollows: Set
is_valid = falseincampaign_helpers - Don't immediately update participant's
helper_count - On reward claim: Re-calculate valid helpers only
- If insufficient: Show "Some helpers unfollowed, need X more"
- If re-follows: Restore
is_valid = true
Same user (by openid) can only help once per participant per campaign
Database unique constraint: (helper_openid, participant_id, campaign_id)
Campaign has start_date and end_date
Helpers only count if within campaign period
Real-time event stream shows suspicious patterns
Filter by: rapid helps from same IP, bot-like behavior
🛠️ 开发测试工具
快速重置数据,高效测试活动流程
🧪 测试账号
核心功能保存测试微信账号,快速重置助力记录进行重复测试。
💡 如何使用?
重置 - 清除助力记录,可重新扫码助力
完全重置 - 清除所有数据+公众号关联,测试完整新用户流程
🔄 活动数据重置
重置指定活动
仅清除选定活动的助力、参与、领奖记录
清除测试用户
删除所有非管理员用户,保留活动配置
☢️ 危险操作区 谨慎使用
| 用户 | 联系方式 | 微信标识 | 互动数据 | 来源 | 操作 | |
|---|---|---|---|---|---|---|
| 加载中... | ||||||
🤖 AI 客服配置
检查中...配置 AI 客服与 n8n 的集成,自动回复公众号用户消息。
启用 AI 客服
启用后,用户发送消息会转发到 n8n 处理,AI 生成回复后自动发送给用户。
n8n Webhook URL
配置 n8n 工作流的 Webhook 接收地址。
超时设置
n8n 响应超时时间(毫秒)。微信要求 5 秒内响应,建议设置 4500ms。
兜底消息
当 AI 无法回复或超时时,发送给用户的消息。
转人工提示
转接人工客服前发送给用户的消息。
转人工关键词(备用)
用户消息包含这些关键词时,直接转人工(作为 AI 判断的补充)。
多个关键词用逗号分隔