300 lines
6.6 KiB
Markdown
300 lines
6.6 KiB
Markdown
# 新分销逻辑 - 宝塔面板操作清单
|
||
|
||
## ✅ 已完成的准备工作
|
||
|
||
- ✅ 数据库字段已添加(last_purchase_date, purchase_count, total_commission)
|
||
- ✅ 代码已部署到服务器(/www/wwwroot/soul/dist)
|
||
- ✅ 索引已创建
|
||
|
||
---
|
||
|
||
## 🔧 宝塔面板操作步骤
|
||
|
||
### Step 1: 重启 Node.js 服务
|
||
|
||
1. 登录宝塔面板:`http://你的服务器IP:8888`
|
||
2. 左侧菜单 → **网站** → 找到 `soul.quwanzhi.com`
|
||
3. 点击 **设置** → **Node项目** 标签
|
||
4. 找到项目 `soul`
|
||
5. 点击 **重启** 按钮
|
||
6. 等待状态变为"运行中"
|
||
|
||
**或者使用命令行**(如果有SSH权限):
|
||
```bash
|
||
# 使用宝塔的pm2完整路径
|
||
/www/server/nodejs/v16.20.2/bin/pm2 restart soul
|
||
|
||
# 查看状态
|
||
/www/server/nodejs/v16.20.2/bin/pm2 status
|
||
|
||
# 查看日志
|
||
/www/server/nodejs/v16.20.2/bin/pm2 logs soul --lines 50
|
||
```
|
||
|
||
---
|
||
|
||
### Step 2: 验证服务是否正常
|
||
|
||
#### 2.1 检查网站访问
|
||
在浏览器打开:`https://soul.quwanzhi.com`
|
||
|
||
**预期**:
|
||
- ✅ 网站正常加载
|
||
- ✅ 无404错误
|
||
- ✅ 可以正常登录
|
||
|
||
#### 2.2 检查新API是否生效
|
||
|
||
打开浏览器控制台,访问:
|
||
```
|
||
https://soul.quwanzhi.com/api/db/config?key=referral_config
|
||
```
|
||
|
||
**预期返回**:
|
||
```json
|
||
{
|
||
"success": true,
|
||
"config": {
|
||
"distributorShare": 90,
|
||
"minWithdrawAmount": 10,
|
||
"bindingDays": 30,
|
||
"userDiscount": 5,
|
||
"enableAutoWithdraw": false
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2.3 检查推广设置页面
|
||
|
||
访问:`https://soul.quwanzhi.com/admin/referral-settings`
|
||
|
||
**预期**:
|
||
- ✅ 页面正常加载
|
||
- ✅ 显示当前配置
|
||
- ✅ 可以修改并保存
|
||
|
||
---
|
||
|
||
### Step 3: 配置自动解绑定时任务
|
||
|
||
1. 宝塔面板 → 左侧菜单 → **计划任务**
|
||
2. 点击 **添加计划任务**
|
||
3. 填写以下信息:
|
||
|
||
**任务配置**:
|
||
```
|
||
任务类型:Shell脚本
|
||
任务名称:自动解绑过期推荐关系
|
||
执行周期:每天 02:00(凌晨2点)
|
||
脚本内容:
|
||
cd /www/wwwroot/soul/dist && /www/server/nodejs/v16.20.2/bin/node scripts/auto-unbind-expired-simple.js >> /www/wwwroot/soul/logs/auto-unbind.log 2>&1
|
||
```
|
||
|
||
4. 点击 **添加**
|
||
5. 任务创建后,点击 **执行** 按钮测试一次
|
||
|
||
**预期日志**(如果没有过期记录):
|
||
```
|
||
============================================================
|
||
自动解绑定时任务
|
||
执行时间: 2026/2/5 14:30:00
|
||
============================================================
|
||
✅ 已连接到数据库: soul_miniprogram
|
||
✅ 无需解绑的记录
|
||
============================================================
|
||
任务完成
|
||
============================================================
|
||
```
|
||
|
||
---
|
||
|
||
### Step 4: 查看定时任务日志
|
||
|
||
```bash
|
||
# 方式1:SSH命令
|
||
cat /www/wwwroot/soul/logs/auto-unbind.log
|
||
|
||
# 方式2:宝塔面板
|
||
计划任务 → 找到"自动解绑"任务 → 点击"日志"
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 功能测试(小程序端)
|
||
|
||
### 测试1:立即切换绑定
|
||
|
||
1. **准备两个测试账号**:
|
||
- 账号A:作为推荐人A(获取推荐码 SOULA001)
|
||
- 账号C:作为推荐人C(获取推荐码 SOULC001)
|
||
- 账号B:作为购买者
|
||
|
||
2. **测试步骤**:
|
||
```
|
||
Step 1: A 分享文章链接给 B
|
||
Step 2: B 点击链接进入小程序(会自动绑定A)
|
||
Step 3: 查数据库验证绑定
|
||
Step 4: C 分享文章链接给 B
|
||
Step 5: B 点击C的链接(应该立即切换)
|
||
Step 6: 再次查数据库验证
|
||
```
|
||
|
||
3. **数据库验证SQL**:
|
||
```sql
|
||
-- 查看B当前的绑定状态
|
||
SELECT
|
||
referee_id,
|
||
referrer_id,
|
||
status,
|
||
binding_date,
|
||
expiry_date
|
||
FROM referral_bindings
|
||
WHERE referee_id = 'B的用户ID'
|
||
ORDER BY binding_date DESC;
|
||
```
|
||
|
||
**预期结果**:
|
||
- 最新一条:`referrer_id = C的ID, status = active`
|
||
- 上一条:`referrer_id = A的ID, status = cancelled`
|
||
|
||
---
|
||
|
||
### 测试2:购买分佣
|
||
|
||
1. **B 购买一篇文章(1元)**
|
||
2. **查看分佣结果**:
|
||
```sql
|
||
SELECT
|
||
rb.referrer_id,
|
||
rb.purchase_count,
|
||
rb.total_commission,
|
||
rb.last_purchase_date,
|
||
u.pending_earnings
|
||
FROM referral_bindings rb
|
||
JOIN users u ON rb.referrer_id = u.id
|
||
WHERE rb.referee_id = 'B的用户ID' AND rb.status = 'active';
|
||
```
|
||
|
||
**预期结果**(假设90%分成):
|
||
```
|
||
referrer_id: C的ID
|
||
purchase_count: 1
|
||
total_commission: 0.90
|
||
pending_earnings: 0.90
|
||
```
|
||
|
||
3. **B 再次购买**:
|
||
```sql
|
||
-- 查询应显示
|
||
purchase_count: 2
|
||
total_commission: 1.80
|
||
pending_earnings: 1.80
|
||
```
|
||
|
||
---
|
||
|
||
### 测试3:好友优惠(新功能)
|
||
|
||
1. **后台设置好友优惠为 10%**
|
||
- 访问:`https://soul.quwanzhi.com/admin/referral-settings`
|
||
- 修改"好友优惠"为 `10`
|
||
- 保存
|
||
|
||
2. **B 通过推荐链接购买**
|
||
- 原价 1.00 元的文章
|
||
- 支付时应显示 **0.90 元**(10% off)
|
||
|
||
3. **验证佣金计算**:
|
||
- C 应获得佣金 = 0.90 × 90% = **0.81 元**
|
||
- 而不是 1.00 × 90% = 0.90 元
|
||
|
||
---
|
||
|
||
## 📊 后台监控
|
||
|
||
### 查看绑定切换记录
|
||
|
||
**SQL查询**:
|
||
```sql
|
||
-- 查看最近的绑定切换
|
||
SELECT
|
||
rb.referee_id,
|
||
rb.referrer_id,
|
||
rb.status,
|
||
rb.binding_date,
|
||
rb.purchase_count,
|
||
rb.total_commission
|
||
FROM referral_bindings rb
|
||
WHERE rb.status IN ('active', 'cancelled')
|
||
ORDER BY rb.binding_date DESC
|
||
LIMIT 20;
|
||
```
|
||
|
||
### 查看即将过期的绑定
|
||
|
||
```sql
|
||
-- 7天内即将过期且无购买的绑定
|
||
SELECT
|
||
rb.referee_id,
|
||
rb.referrer_id,
|
||
rb.binding_date,
|
||
rb.expiry_date,
|
||
DATEDIFF(rb.expiry_date, NOW()) as days_left,
|
||
rb.purchase_count
|
||
FROM referral_bindings rb
|
||
WHERE rb.status = 'active'
|
||
AND rb.expiry_date > NOW()
|
||
AND DATEDIFF(rb.expiry_date, NOW()) <= 7
|
||
AND rb.purchase_count = 0
|
||
ORDER BY days_left ASC;
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 常见问题
|
||
|
||
### Q1: 点击新链接后没有切换?
|
||
**检查**:
|
||
- 宝塔面板 → Node项目 → 查看日志
|
||
- 搜索 `[Referral Bind]` 关键词
|
||
- 确认是否有报错
|
||
|
||
### Q2: 购买后 purchase_count 还是 0?
|
||
**检查**:
|
||
- 查看支付回调日志:`pm2 logs soul | grep PayNotify`
|
||
- 确认字段 `purchase_count` 是否存在
|
||
- 执行SQL验证:`SHOW COLUMNS FROM referral_bindings;`
|
||
|
||
### Q3: 定时任务没有执行?
|
||
**检查**:
|
||
- 宝塔面板 → 计划任务 → 找到任务 → 点击"执行"测试
|
||
- 查看日志:`cat /www/wwwroot/soul/logs/auto-unbind.log`
|
||
- 确认脚本路径正确:`ls -la /www/wwwroot/soul/dist/scripts/auto-unbind-expired-simple.js`
|
||
|
||
---
|
||
|
||
## 📝 部署后清理
|
||
|
||
部署成功后,删除临时文件:
|
||
|
||
```bash
|
||
# 本地清理
|
||
rm .env.migration
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 完成检查清单
|
||
|
||
- [ ] 数据库字段已添加
|
||
- [ ] 代码已部署
|
||
- [ ] PM2服务运行正常
|
||
- [ ] 网站可以访问
|
||
- [ ] 推广设置页面正常
|
||
- [ ] 定时任务已配置
|
||
- [ ] 功能测试通过
|
||
|
||
---
|
||
|
||
**下一步:执行上述测试验证,或告诉我遇到的任何问题!**
|