Ai_GirlFriend/开发/2026年2月3日/邀请码功能修复.md

237 lines
5.3 KiB
Markdown
Raw Normal View History

2026-02-03 18:00:47 +08:00
# 邀请码功能修复
## 问题描述
用户使用邀请码登录后没有成功获得5金币奖励。
## 问题原因
数据库表 `nf_user` 缺少邀请码相关的字段:
- `invite_code` - 邀请码
- `invited_by` - 被谁邀请
- `invite_count` - 邀请人数
- `invite_reward_total` - 邀请奖励总额
这些字段只在 Python 的 `lover/models.py` 中定义了,但数据库中并没有实际创建这些列。
## 解决方案
### 情况 1字段不存在
如果数据库中没有邀请码字段,执行:
```bash
mysql -u aiuser -p fastadmin < lover/migrations/add_invite_fields.sql
```
### 情况 2字段已存在推荐
如果遇到 "Duplicate column name" 错误,说明字段已存在,使用智能修复脚本:
```bash
mysql -u aiuser -p fastadmin < lover/migrations/fix_invite_fields.sql
```
这个脚本会:
- 检查每个字段是否存在,只添加缺失的字段
- 检查索引是否存在,只添加缺失的索引
- 显示最终的字段和索引信息
### 1. 执行修复脚本
```bash
# 推荐:使用智能修复脚本(自动检查并修复)
mysql -u aiuser -p fastadmin < lover/migrations/fix_invite_fields.sql
```
### 2. 检查字段状态
```bash
# 查看邀请码相关字段
mysql -u aiuser -p fastadmin < lover/migrations/check_invite_fields.sql
```
### 3. 测试邀请码功能
```bash
# 查看邀请码数据和日志
mysql -u aiuser -p fastadmin < lover/migrations/test_invite_function.sql
```
1. **获取邀请码**
- 登录系统
- 访问"我的" -> "邀请好友"页面
- 系统会自动生成邀请码
2. **使用邀请码**
- 新用户注册/登录时
- 在登录页面输入邀请码
- 登录成功后会自动调用邀请码接口
3. **验证奖励**
- 邀请人获得 10 金币
- 被邀请人获得 5 金币
- 检查 `nf_user_money_log` 表中的记录
## 邀请码功能说明
### 奖励规则
- **邀请人奖励**10 金币
- **被邀请人奖励**5 金币
- 每个用户只能使用一次邀请码
- 不能使用自己的邀请码
### API 接口
#### 1. 获取邀请信息
```
GET /config/invite/info
Authorization: Bearer {token}
```
响应:
```json
{
"code": 1,
"data": {
"invite_code": "ABC123",
"invite_count": 5,
"invite_reward_total": 50.00,
"invite_url": "https://your-domain.com/register?invite=ABC123"
}
}
```
#### 2. 使用邀请码
```
POST /config/invite/apply
Authorization: Bearer {token}
Content-Type: application/json
{
"invite_code": "ABC123"
}
```
响应:
```json
{
"code": 1,
"data": {
"message": "邀请码使用成功您获得了5.0金币",
"reward": 5.0,
"balance": 5.0
}
}
```
### 前端调用流程
1. **登录页面** (`xuniYou/pages/login/index.vue`)
- 用户输入邀请码(可选)
- 登录成功后自动调用 `applyInviteCode()` 方法
2. **邀请页面** (`xuniYou/pages/mine/invite.vue`)
- 显示用户的邀请码
- 显示邀请统计(邀请人数、奖励总额)
- 提供复制邀请码功能
### 数据库表结构
```sql
-- nf_user 表新增字段
invite_code VARCHAR(10) DEFAULT NULL COMMENT '邀请码'
invited_by VARCHAR(10) DEFAULT NULL COMMENT '被谁邀请(邀请码)'
invite_count INT(11) DEFAULT 0 COMMENT '邀请人数'
invite_reward_total DECIMAL(10,2) DEFAULT 0.00 COMMENT '邀请奖励总额'
-- 索引
UNIQUE INDEX idx_invite_code (invite_code)
INDEX idx_invited_by (invited_by)
```
### 金币日志记录
所有邀请奖励都会记录在 `nf_user_money_log` 表中:
```sql
-- 邀请人的记录
memo = '邀请新用户奖励'
money = 10.00
-- 被邀请人的记录
memo = '使用邀请码奖励'
money = 5.00
```
## 注意事项
1. **邀请码生成规则**
- 6位字符
- 只包含大写字母和数字
- 排除易混淆字符0、O、1、I
- 自动检查重复
2. **安全性**
- 使用数据库行锁防止并发问题
- 验证邀请码是否存在
- 验证用户是否已使用过邀请码
- 不能使用自己的邀请码
3. **事务处理**
- 使用数据库事务确保数据一致性
- 失败时自动回滚
- 记录详细的金币日志
## 测试步骤
### 1. 本地测试
```bash
# 1. 执行数据库迁移
mysql -u aiuser -p fastadmin < lover/migrations/add_invite_fields.sql
# 2. 重启 Python 服务
# Windows
taskkill /F /IM python.exe
python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload
# Linux
sudo systemctl restart aigirlfriend-python
```
### 2. 功能测试
1. 用户 A 登录,获取邀请码
2. 用户 B 注册/登录时输入用户 A 的邀请码
3. 检查用户 A 和用户 B 的金币余额
4. 检查 `nf_user_money_log` 表中的记录
### 3. 异常测试
1. 使用不存在的邀请码 → 应提示"邀请码不存在"
2. 重复使用邀请码 → 应提示"您已经使用过邀请码"
3. 使用自己的邀请码 → 应提示"不能使用自己的邀请码"
## 相关文件
- **数据库迁移**`lover/migrations/add_invite_fields.sql`
- **数据模型**`lover/models.py`
- **后端 API**`lover/routers/config.py`
- **前端登录页**`xuniYou/pages/login/index.vue`
- **前端邀请页**`xuniYou/pages/mine/invite.vue`
## 更新日志
- **2026-02-03**:创建邀请码字段迁移文件
- **2026-02-03**:编写修复文档
## 下一步
1. 执行数据库迁移
2. 测试邀请码功能
3. 更新部署文档,添加邀请码迁移步骤