Ai_GirlFriend/开发/2026年2月3日/邀请码问题诊断.md
2026-02-03 18:00:47 +08:00

330 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 邀请码功能问题诊断
## 快速诊断步骤
### 第 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
```
---
## 联系支持
提供以上信息可以帮助快速定位问题