237 lines
5.3 KiB
Markdown
237 lines
5.3 KiB
Markdown
# 邀请码功能修复
|
||
|
||
## 问题描述
|
||
|
||
用户使用邀请码登录后,没有成功获得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. 更新部署文档,添加邀请码迁移步骤
|