Ai_GirlFriend/邀请码功能修复说明.md

276 lines
6.2 KiB
Markdown
Raw Normal View History

2026-02-04 18:58:05 +08:00
# 邀请码功能修复说明
## 🐛 问题
用户反馈:"好友登录的时候输入这个邀请码还是不行"
## 🔍 问题分析
### 1. 后端检查 ✅
测试后端 API
```bash
python test_invite_code.py
```
**结果**:后端 API 工作正常
- `/config/invite/info` - 获取邀请码 ✅
- `/config/invite/apply` - 使用邀请码 ✅
### 2. 前端问题 ❌
检查前端代码 `xuniYou/pages/login/index.vue`
**发现的问题**
#### 问题 1认证方式不正确
```javascript
// 旧代码
header: {
'Content-Type': 'application/json',
'token': uni.getStorageSync("token") || "",
},
```
后端支持的认证方式:
1. `Authorization: Bearer <token>` ✅ 推荐
2. `X-Token: <token>`
3. `token: <token>` (header) ✅
4. `token: <token>` (cookie) ✅
虽然第3种方式理论上可以但是使用 `Authorization: Bearer` 更标准。
#### 问题 2错误处理不完善
- 邀请码使用失败时,只在控制台输出,用户看不到错误信息
- 没有检查 token 是否存在
- 没有详细的日志输出
#### 问题 3响应数据结构处理不当
```javascript
// 旧代码
if (res.data.code === 1) {
uni.showToast({
title: res.data.data.message, // ← 可能为 undefined
icon: 'success'
});
}
```
## ✅ 解决方案
### 修改文件:`xuniYou/pages/login/index.vue`
#### 修改 1使用标准的 Authorization header
**修改前**
```javascript
header: {
'Content-Type': 'application/json',
'token': uni.getStorageSync("token") || "",
},
```
**修改后**
```javascript
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token,
},
```
#### 修改 2添加 token 检查
```javascript
const token = uni.getStorageSync("token");
console.log('准备使用邀请码:', this.inviteCode);
console.log('当前 token:', token);
if (!token) {
console.error('Token 不存在,无法使用邀请码');
uni.showToast({
title: '登录状态异常,请重新登录',
icon: 'none'
});
return;
}
```
#### 修改 3完善错误处理
```javascript
success: (res) => {
console.log('邀请码使用响应:', res);
if (res.data && res.data.code === 1) {
uni.showToast({
title: res.data.data.message || '邀请码使用成功',
icon: 'success'
});
} else {
// 邀请码使用失败,显示错误信息
const errorMsg = res.data ? res.data.message : '邀请码使用失败';
console.log('邀请码使用失败:', errorMsg);
uni.showToast({
title: errorMsg,
icon: 'none',
duration: 2000
});
}
},
```
## 🎯 修改位置
文件:`xuniYou/pages/login/index.vue`
方法:`applyInviteCode()`
行号:约 432-470 行
## 📊 修改效果
### 修改前
- 邀请码使用失败,用户看不到错误信息
- 只在控制台输出日志
- 认证方式可能不标准
### 修改后
- 邀请码使用失败,显示具体的错误信息
- 添加了详细的日志输出,方便调试
- 使用标准的 `Authorization: Bearer` 认证方式
- 添加了 token 检查,防止空 token 请求
## 🚀 测试步骤
### 步骤 1获取邀请码
1. 用户 A 登录应用
2. 进入"我的" → "邀请好友"
3. 复制邀请码(例如:`UAAZAM`
### 步骤 2使用邀请码
1. 用户 B 打开登录页面
2. 输入手机号和验证码
3. 在"邀请码"输入框中输入 `UAAZAM`
4. 点击登录
### 步骤 3验证结果
**成功的情况**
- 显示提示:"邀请码使用成功您获得了5金币"
- 用户 B 的金币余额增加 5 金币
- 用户 A 的金币余额增加 10 金币
- 用户 A 的邀请计数 +1
**失败的情况**
- 显示具体的错误信息:
- "邀请码不存在" - 邀请码输入错误
- "您已经使用过邀请码" - 用户已经使用过邀请码
- "不能使用自己的邀请码" - 用户输入了自己的邀请码
## 🔍 调试方法
### 查看前端日志
打开浏览器开发者工具F12查看 Console 标签页:
```
准备使用邀请码: UAAZAM
当前 token: 3932cd35-4238-4c3f-ad5c-ad6ce9454e79
邀请码使用响应: {data: {code: 1, msg: 'ok', data: {...}}}
```
### 查看后端日志
后端服务会输出详细日志:
```
INFO: POST /config/invite/apply HTTP/1.1" 200 OK
认证调试 - 提取的 token: 3932cd35-4238-4c3f-ad5c-ad6ce9454e79
```
### 查看数据库
```sql
-- 查看用户的邀请信息
SELECT id, nickname, invite_code, invited_by, invite_count, invite_reward_total, money
FROM nf_user
WHERE id IN (70, 71);
-- 查看金币日志
SELECT * FROM nf_user_money_log
WHERE user_id IN (70, 71)
ORDER BY id DESC
LIMIT 10;
```
## 📝 常见问题
### Q1: 提示"邀请码不存在"
**原因**
- 邀请码输入错误
- 邀请码包含空格或特殊字符
**解决**
- 检查邀请码是否正确(区分大小写)
- 确保没有多余的空格
### Q2: 提示"您已经使用过邀请码"
**原因**
- 用户之前已经使用过邀请码
- 数据库中 `invited_by` 字段不为空
**解决**
- 每个用户只能使用一次邀请码
- 如果需要重置,需要手动清空数据库中的 `invited_by` 字段
### Q3: 提示"不能使用自己的邀请码"
**原因**
- 用户输入了自己的邀请码
**解决**
- 使用其他用户的邀请码
### Q4: 没有任何提示
**原因**
- 网络错误
- 后端服务未启动
- Token 无效
**解决**
1. 检查后端服务是否运行:访问 http://localhost:30101/docs
2. 检查浏览器控制台是否有错误
3. 检查 token 是否有效
## 💡 技术细节
### 邀请码生成规则
```python
def _generate_invite_code() -> str:
"""生成6位邀请码不含易混淆字符"""
chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' # 去掉 0O1I 等易混淆字符
return ''.join(random.choice(chars) for _ in range(6))
```
### 奖励规则
- 邀请人获得10 金币
- 被邀请人获得5 金币
### 数据库字段
- `invite_code` - 用户的邀请码(唯一)
- `invited_by` - 被谁邀请(邀请码)
- `invite_count` - 邀请人数
- `invite_reward_total` - 邀请奖励总额
---
**修复说明版本**: 1.0
**创建时间**: 2026-02-04 19:00
**状态**: ✅ 已修复