330 lines
6.9 KiB
Markdown
330 lines
6.9 KiB
Markdown
|
|
# 邀请码功能问题诊断
|
|||
|
|
|
|||
|
|
## 快速诊断步骤
|
|||
|
|
|
|||
|
|
### 第 1 步:检查数据库字段
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/check_invite_fields.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:应该看到 4 个字段
|
|||
|
|
- `invite_code` - VARCHAR(10)
|
|||
|
|
- `invited_by` - VARCHAR(10)
|
|||
|
|
- `invite_count` - INT(11)
|
|||
|
|
- `invite_reward_total` - DECIMAL(10,2)
|
|||
|
|
|
|||
|
|
**如果字段不完整**:执行修复脚本
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/fix_invite_fields.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第 2 步:测试后端 API
|
|||
|
|
|
|||
|
|
#### 2.1 测试获取邀请信息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 替换 YOUR_TOKEN 为实际的用户 token
|
|||
|
|
curl -X GET "http://localhost:30101/config/invite/info" \
|
|||
|
|
-H "token: YOUR_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期响应**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 1,
|
|||
|
|
"data": {
|
|||
|
|
"invite_code": "ABC123",
|
|||
|
|
"invite_count": 0,
|
|||
|
|
"invite_reward_total": 0.0,
|
|||
|
|
"invite_url": "https://your-domain.com/register?invite=ABC123"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果返回 401 错误**:token 无效或过期
|
|||
|
|
**如果返回 500 错误**:检查 Python 服务日志
|
|||
|
|
|
|||
|
|
#### 2.2 测试使用邀请码
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 替换 YOUR_TOKEN 和 INVITE_CODE
|
|||
|
|
curl -X POST "http://localhost:30101/config/invite/apply" \
|
|||
|
|
-H "token: YOUR_TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"invite_code": "ABC123"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期响应**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 1,
|
|||
|
|
"data": {
|
|||
|
|
"message": "邀请码使用成功!您获得了5.0金币",
|
|||
|
|
"reward": 5.0,
|
|||
|
|
"balance": 5.0
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第 3 步:检查 Python 服务日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Windows
|
|||
|
|
# 查看控制台输出
|
|||
|
|
|
|||
|
|
# Linux
|
|||
|
|
sudo journalctl -u aigirlfriend-python -n 50 -f
|
|||
|
|
# 或
|
|||
|
|
sudo tail -f /var/log/aigirlfriend-python.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键日志**:
|
|||
|
|
- `认证调试` - 查看 token 是否正确解析
|
|||
|
|
- `用户中心调试` - 查看是否成功获取用户信息
|
|||
|
|
- 任何 `ERROR` 或 `Exception` 信息
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 第 4 步:检查数据库数据
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/test_invite_function.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这会显示:
|
|||
|
|
1. 最近 10 个用户的邀请码信息
|
|||
|
|
2. 有邀请码的用户列表
|
|||
|
|
3. 使用了邀请码的用户列表
|
|||
|
|
4. 邀请相关的金币日志
|
|||
|
|
5. 邀请数据统计
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 常见问题排查
|
|||
|
|
|
|||
|
|
### 问题 1:字段类型错误(最常见!)
|
|||
|
|
|
|||
|
|
**错误表现**:邀请码功能不工作,用户没有获得金币
|
|||
|
|
|
|||
|
|
**原因**:数据库字段类型不正确
|
|||
|
|
- `invited_by` 应该是 `varchar(10)` 但实际是 `int`
|
|||
|
|
- `invite_reward_total` 应该是 `decimal(10,2)` 但实际是 `int`
|
|||
|
|
|
|||
|
|
**检查方法**:
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/check_invite_fields.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```
|
|||
|
|
字段名 |类型 |
|
|||
|
|
-------------------+-------------+
|
|||
|
|
invite_code |varchar(10) | ✅
|
|||
|
|
invited_by |varchar(10) | ✅ 应该是这个
|
|||
|
|
invite_count |int(11) | ✅
|
|||
|
|
invite_reward_total|decimal(10,2)| ✅ 应该是这个
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果类型错误**:
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/fix_invite_field_types.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 问题 2:字段已存在错误
|
|||
|
|
|
|||
|
|
**错误信息**:`Duplicate column name 'invite_code'`
|
|||
|
|
|
|||
|
|
**原因**:字段已经存在
|
|||
|
|
|
|||
|
|
**解决**:使用智能修复脚本
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/fix_invite_fields.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 问题 2:用户没有获得金币
|
|||
|
|
|
|||
|
|
**可能原因**:
|
|||
|
|
|
|||
|
|
#### A. 邀请码不存在
|
|||
|
|
```sql
|
|||
|
|
-- 检查邀请码是否存在
|
|||
|
|
SELECT id, username, invite_code
|
|||
|
|
FROM nf_user
|
|||
|
|
WHERE invite_code = 'ABC123';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### B. 用户已使用过邀请码
|
|||
|
|
```sql
|
|||
|
|
-- 检查用户是否已使用过邀请码
|
|||
|
|
SELECT id, username, invited_by
|
|||
|
|
FROM nf_user
|
|||
|
|
WHERE id = 用户ID;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### C. 使用了自己的邀请码
|
|||
|
|
- 检查邀请码是否是用户自己的
|
|||
|
|
|
|||
|
|
#### D. API 调用失败
|
|||
|
|
- 检查前端是否正确调用了 `/config/invite/apply` 接口
|
|||
|
|
- 检查 token 是否正确传递
|
|||
|
|
- 查看浏览器控制台的网络请求
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 问题 3:前端没有调用邀请码接口
|
|||
|
|
|
|||
|
|
**检查点**:
|
|||
|
|
|
|||
|
|
1. **登录页面** (`xuniYou/pages/login/index.vue`)
|
|||
|
|
- 第 412 行:检查是否有邀请码判断
|
|||
|
|
- 第 434 行:检查 `applyInviteCode()` 方法
|
|||
|
|
|
|||
|
|
2. **浏览器控制台**
|
|||
|
|
- 打开开发者工具 → Network 标签
|
|||
|
|
- 登录时查看是否有 `/config/invite/apply` 请求
|
|||
|
|
- 查看请求参数和响应
|
|||
|
|
|
|||
|
|
3. **手动测试**
|
|||
|
|
```javascript
|
|||
|
|
// 在浏览器控制台执行
|
|||
|
|
uni.request({
|
|||
|
|
url: 'http://localhost:30101/config/invite/apply',
|
|||
|
|
method: 'POST',
|
|||
|
|
header: {
|
|||
|
|
'Content-Type': 'application/json',
|
|||
|
|
'token': uni.getStorageSync('token')
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
invite_code: 'ABC123'
|
|||
|
|
},
|
|||
|
|
success: (res) => {
|
|||
|
|
console.log('邀请码响应:', res);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 问题 4:Python 服务认证失败
|
|||
|
|
|
|||
|
|
**检查 token 传递**:
|
|||
|
|
|
|||
|
|
前端应该使用以下任一方式传递 token:
|
|||
|
|
- `Authorization: Bearer {token}`
|
|||
|
|
- `X-Token: {token}`
|
|||
|
|
- `token: {token}` (header)
|
|||
|
|
- `token: {token}` (cookie)
|
|||
|
|
|
|||
|
|
**当前前端使用**:`token: {token}` (header)
|
|||
|
|
|
|||
|
|
**验证**:
|
|||
|
|
```bash
|
|||
|
|
# 查看 Python 日志中的认证调试信息
|
|||
|
|
# 应该看到:
|
|||
|
|
# 认证调试 - token_header: YOUR_TOKEN
|
|||
|
|
# 认证调试 - 提取的 token: YOUR_TOKEN
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 完整测试流程
|
|||
|
|
|
|||
|
|
### 1. 准备两个测试账号
|
|||
|
|
|
|||
|
|
- **用户 A**(邀请人):18800000001
|
|||
|
|
- **用户 B**(被邀请人):18800000002
|
|||
|
|
|
|||
|
|
### 2. 用户 A 获取邀请码
|
|||
|
|
|
|||
|
|
1. 登录用户 A
|
|||
|
|
2. 进入"我的" → "邀请好友"
|
|||
|
|
3. 记录邀请码(例如:ABC123)
|
|||
|
|
4. 记录当前金币余额
|
|||
|
|
|
|||
|
|
### 3. 用户 B 使用邀请码
|
|||
|
|
|
|||
|
|
1. 退出登录
|
|||
|
|
2. 使用用户 B 登录
|
|||
|
|
3. 在登录页面输入邀请码:ABC123
|
|||
|
|
4. 登录成功
|
|||
|
|
|
|||
|
|
### 4. 验证结果
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 查看用户 A 的数据
|
|||
|
|
SELECT id, username, invite_code, invite_count, invite_reward_total, money
|
|||
|
|
FROM nf_user
|
|||
|
|
WHERE username = '18800000001';
|
|||
|
|
|
|||
|
|
-- 查看用户 B 的数据
|
|||
|
|
SELECT id, username, invited_by, money
|
|||
|
|
FROM nf_user
|
|||
|
|
WHERE username = '18800000002';
|
|||
|
|
|
|||
|
|
-- 查看金币日志
|
|||
|
|
SELECT
|
|||
|
|
l.user_id,
|
|||
|
|
u.username,
|
|||
|
|
l.money,
|
|||
|
|
l.before,
|
|||
|
|
l.after,
|
|||
|
|
l.memo,
|
|||
|
|
FROM_UNIXTIME(l.createtime) AS time
|
|||
|
|
FROM nf_user_money_log l
|
|||
|
|
LEFT JOIN nf_user u ON l.user_id = u.id
|
|||
|
|
WHERE l.memo LIKE '%邀请%'
|
|||
|
|
ORDER BY l.createtime DESC
|
|||
|
|
LIMIT 10;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 用户 A:`invite_count` +1,`invite_reward_total` +10,`money` +10
|
|||
|
|
- 用户 B:`invited_by` = 'ABC123',`money` +5
|
|||
|
|
- 金币日志中有两条记录
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 如果问题仍未解决
|
|||
|
|
|
|||
|
|
### 收集以下信息:
|
|||
|
|
|
|||
|
|
1. **数据库字段检查结果**
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/check_invite_fields.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **Python 服务日志**(最近 50 行)
|
|||
|
|
```bash
|
|||
|
|
# 复制日志内容
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **浏览器控制台错误**
|
|||
|
|
- Network 标签中的请求详情
|
|||
|
|
- Console 标签中的错误信息
|
|||
|
|
|
|||
|
|
4. **测试 API 的响应**
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:30101/config/invite/info" \
|
|||
|
|
-H "token: YOUR_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
5. **数据库测试结果**
|
|||
|
|
```bash
|
|||
|
|
mysql -u aiuser -p fastadmin < lover/migrations/test_invite_function.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 联系支持
|
|||
|
|
|
|||
|
|
提供以上信息可以帮助快速定位问题。
|