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