Ai_GirlFriend/开发/2026年2月3日/邀请码问题诊断.md

330 lines
6.9 KiB
Markdown
Raw Normal View History

2026-02-03 18:00:47 +08:00
# 邀请码功能问题诊断
## 快速诊断步骤
### 第 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);
}
});
```
---
### 问题 4Python 服务认证失败
**检查 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
```
---
## 联系支持
提供以上信息可以帮助快速定位问题。