加载中...
📊 进行中活动
-
👥 参与人数
-
🤝 助力人数
-
- 有效
🎁 已领取奖励
-
📈 人均助力
-

📋 进行中的活动

活动名称 参与人数 助力人数 已领奖励 状态
加载中...

🕐 最近动态 (最近24小时)

加载中...
加载活动列表...

🏆 影响力排行榜

哪些用户带来最多粉丝,拥有最高的裂变潜力?

👥
- 活跃用户数
🌟
- 平均影响力
🔄
- 平均裂变系数
🏅
- 最佳表现者
排名 用户 得分 助力数 二代数 裂变K值 留存率 奖励数 趋势
加载中...
快速选择:
请选择一个活动查看调试数据
📑

请选择活动

从上方下拉菜单选择活动,生成完整的运营报表。

连接中...
0 事件总数
0 本次会话
- 最后事件
0 事件/分钟
正在连接事件流...
加载事件中...
🌐 Cloudflare 隧道 ⏳ 检测中...
隧道地址:
Webhook 地址: -
状态: -
📱 WeChat Official Account ⏳ Checking...
OA AppID: -
Access Token: -
Last Webhook: -
🗄️ Database (Supabase) ⏳ Checking...
Connection: -
Tables: -
⚙️ Backend Server ⏳ Checking...
Local URL: http://localhost:3000
API Status: -

系统总体状态

点击刷新检测

📋 系统检查清单

所有组件都必须正确配置才能使系统正常工作。

🗄️ 数据库 (Supabase)
SUPABASE_URL 已配置
SUPABASE_SERVICE_KEY 已配置
数据库表已创建
数据库连接成功
📱 微信小程序
WECHAT_APPID 已配置
WECHAT_SECRET 已配置
服务器域名已添加(仅生产环境)
🖥️ 本地开发: 在微信开发者工具 → 详情 → 本地设置中勾选"不校验合法域名"
🌐 生产环境: 在微信公众平台 → 开发 → 开发设置中添加服务器域名
📡 微信公众号
OA_APPID 已配置
OA_SECRET 已配置
OA_TOKEN 已配置
OA_ENCODING_AES_KEY 已配置
Webhook URL configured and verified
🚇 Cloudflare Tunnel (Development Only)
Tunnel URL configured Only needed for local development. Production uses direct domain.
Tunnel is active
Tunnel accessible from internet
💻 Backend Server
Server running on port 3000
All environment variables loaded
API routes accessible

📲 小程序开发配置指南

本指南解释了小程序开发中 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 = iosandroid
  • 从 Supabase 获取 Tunnel URL
  • URL 缓存 5 分钟

⚙️ 必要配置

以下配置只需完成一次。

1
微信公众平台 - 添加 Supabase 域名

进入「开发 → 开发管理 → 开发设置 → 服务器域名」
request合法域名 添加:https://fseyfnuqxvrcwrpshxyv.supabase.co

2
开发者工具 - 开启不校验合法域名(开发时)

在微信开发者工具右上角「详情 → 本地设置」
勾选 ☑️ 不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书

3
真机调试 - 开启调试模式

扫码预览时,点击右上角「...」→「开启调试」
这样真机也可以访问非 HTTPS 域名(开发阶段)

📋 日常开发流程

  1. 启动后端服务cd backend && npm run dev
  2. 启动 Cloudflare Tunnelcloudflared tunnel --url http://localhost:3000
  3. 复制 Tunnel URL — 从终端输出中复制 https://xxx.trycloudflare.com
  4. 在 Admin 后台保存 URL — 「基础设施 → 隧道配置」粘贴并保存
  5. 真机预览 — 小程序会自动获取最新 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

检查步骤:

  1. 确认 Supabase 域名已添加到 request 合法域名
  2. 检查 tunnel_config 表中是否有记录
  3. 清除小程序本地存储后重试

🚀 生产环境注意事项

上线生产环境前,需要完成以下配置:

  • 域名备案 — 国内服务器需要 ICP 备案
  • HTTPS 证书 — 所有 API 必须使用 HTTPS
  • 正式域名 — 替换 Cloudflare Tunnel 为正式域名
  • 添加合法域名 — 在微信公众平台添加正式 API 域名
  • 关闭调试开关 — 小程序代码中移除开发时的调试代码

Connection Status

Checking...
📦
LOCAL SERVER
Checking...
PROCESS PID
Checking...
🌐
LATENCY
Checking...
🔗 Current Tunnel URL
Not configured
📡 WeChat Webhook URL
Not configured

更新 Tunnel URL

cloudflared 命令输出中复制 URL,粘贴到下方保存。

🌐
📱
小程序自动同步
保存后,小程序真机调试会自动获取最新的 Tunnel URL,无需手动修改代码。
首次使用需在小程序「request合法域名」添加:fseyfnuqxvrcwrpshxyv.supabase.co

Quick Reference Commands

🔗 Why Do You Need a Tunnel?

Connection Status

Checking...
📱
OA APPID
Checking...
🔑
ACCESS TOKEN
Checking...
📡
LAST WEBHOOK
Checking...
🆔 OA AppID
Not configured
🔐 OA Secret
Not configured
📡 Webhook URL
Not configured

📱 Why Do You Need WeChat Official Account?

Quick Reference

Connection Status

Checking...
🗄️
CONNECTION
Checking...
📊
TABLES
Checking...
LATENCY
Checking...
🔗 Supabase URL
Not configured
🔑 Supabase Key
Not configured

🗄️ Why Do You Need Database?

Quick Reference

Connection Status

Checking...
💻
LOCAL SERVER
Checking...
❤️
API HEALTH
Checking...
⏱️
RESPONSE TIME
Checking...
🔗 Local URL
http://localhost:3000
🌍 Environment
development
🔧 Node Version
-

💻 Why Do You Need Backend Server?

Quick Reference

🔄 完整数据流

了解数据如何在裂变营销系统中流转

1 扫码关注流程
👤
用户B扫描二维码

二维码包含: camp_{campaignId}_ref_{userA_code}

用户B关注公众号

微信触发 "subscribe" 事件

📡
Webhook 事件

微信 → 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++

检查是否解锁奖励

💬
自动回复用户B

发送小程序链接:

pages/landing/index?ref={code}&from=oa
2 新用户注册
📱
用户B打开小程序

带邀请码的落地页

🔐
wx.login()

获取微信code → 换取session

POST /api/auth/login
✍️
填写注册表单

姓名、电话、公司等

💾
创建用户记录

保存到 users

关联邀请码到用户A

📝
记录事件

保存到 event_logs:

  • event_type: 'register'
  • user_id: 用户B
  • referrer_id: 用户A
  • source: 'oa_scan'
3 用户B成为分享者
🎯
用户B参与活动

成为参与者

🎫
生成用户B的二维码 POST /api/oa/scene

scene: camp_{id}_ref_{userB_code}

🖼️
生成海报

用户B的头像 + 昵称 + 二维码

POST /api/campaigns/{id}/poster
📤
用户B分享海报

朋友圈、群聊、好友

🔁
循环继续

用户C扫码 → 助力用户B → 成为分享者

裂变增长!🚀

4 进度追踪与奖励
📊
实时进度更新

小程序显示助力人数

查询 campaign_participants

🎁
解锁奖励

helper_count ≥ required_helpers

按钮:"领取奖励"

领取奖励 POST /api/campaigns/{id}/claim/{rewardId}

验证助力数(重新计算有效助力)

📝
数据库记录

保存到 campaign_reward_claims

记录事件: 'campaign_reward_claimed'

5 数据分析与追踪
📈
持续追踪

所有事件保存到 event_logs

  • 用户行为(登录、注册、扫码)
  • 公众号事件(关注、取关)
  • 活动事件(助力、领奖)
🎯
来源追踪

source_channel: wechat_scan, h5_share 等

referrer_id: 谁邀请的用户

campaign_id: 哪个活动

👑
影响力排行榜

计算 influence_score

直接邀请 + 二级邀请

📊
管理后台

实时指标、图表、调试日志

监控活动表现

🛡️ 防作弊与边界情况

🔄
Unfollow Handling (Balanced Approach):
  1. When user unfollows: Set is_valid = false in campaign_helpers
  2. Don't immediately update participant's helper_count
  3. On reward claim: Re-calculate valid helpers only
  4. If insufficient: Show "Some helpers unfollowed, need X more"
  5. If re-follows: Restore is_valid = true
🚫
Duplicate Prevention:

Same user (by openid) can only help once per participant per campaign

Database unique constraint: (helper_openid, participant_id, campaign_id)

Time Limits:

Campaign has start_date and end_date

Helpers only count if within campaign period

🔍
Admin Monitoring:

Real-time event stream shows suspicious patterns

Filter by: rapid helps from same IP, bot-like behavior

加载设置中...

🛠️ 开发测试工具

快速重置数据,高效测试活动流程

小程序注册 加载中...

🧪 测试账号

核心功能

🔄 活动数据重置

重置指定活动

仅清除选定活动的助力、参与、领奖记录

清除测试用户

删除所有非管理员用户,保留活动配置

-- 用户
⚙️ 高级选项
🗑️

重置所有活动数据

清除所有活动的助力、参与、领奖记录

🔧

手动重置 OpenID

☢️ 危险操作区 谨慎使用
⚠️

以下操作将永久删除数据,无法撤销!

删除全部用户

删除所有用户,保留活动配置

☢️ 删除全部数据

删除所有数据:用户、活动、记录等

- 总用户数
- 📱 小程序用户
- 📢 公众号粉丝
- ✅ 已注册
- 👑 管理员
用户 联系方式 微信标识 来源 操作
加载中...
1 / 1 显示 0 / 0

🤖 AI 客服配置

检查中...

配置 AI 客服与 n8n 的集成,自动回复公众号用户消息。

启用 AI 客服

启用后,用户发送消息会转发到 n8n 处理,AI 生成回复后自动发送给用户。

n8n Webhook URL

配置 n8n 工作流的 Webhook 接收地址。

超时设置

n8n 响应超时时间(毫秒)。微信要求 5 秒内响应,建议设置 4500ms。

毫秒 (推荐: 4500)

兜底消息

当 AI 无法回复或超时时,发送给用户的消息。

转人工提示

转接人工客服前发送给用户的消息。

转人工关键词(备用)

用户消息包含这些关键词时,直接转人工(作为 AI 判断的补充)。

多个关键词用逗号分隔

📖 n8n 集成指南(Callback 模式)

🔄 数据流图(Callback 模式)

🧪 一步步测试指南

⏰ 48小时消息窗口说明