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