feat: 新增等级与奖章系统
Some checks failed
continuous-integration/drone/push Build is failing

- 后端: 新增 user_levels, exp_history, badge_definitions, user_badges, level_configs 表
- 后端: 新增 LevelService 和 BadgeService 服务
- 后端: 新增等级/奖章/签到/排行榜 API 端点
- 后端: 考试/练习/陪练完成时触发经验值和奖章检查
- 前端: 新增 LevelBadge, ExpProgress, BadgeCard, LevelUpDialog 组件
- 前端: 新增排行榜页面
- 前端: 成长路径页面集成真实等级数据
- 数据库: 包含迁移脚本和初始数据
This commit is contained in:
yuliang_guo
2026-01-29 16:19:22 +08:00
parent 5dfe23831d
commit 0933b936f9
19 changed files with 3207 additions and 65 deletions

View File

@@ -1,82 +1,82 @@
# 数据库迁移说明
## 目录结构
```
migrations/
├── README.md # 本说明文件
└── versions/
└── add_practice_rooms_table.sql # 双人对练功能迁移脚本
```
本目录包含 KPL 考培练系统的数据库迁移脚本。
## 迁移脚本列表
### 1. add_practice_rooms_table.sql
| 脚本 | 说明 | 创建时间 |
|------|------|----------|
| `add_level_badge_system.sql` | 等级与奖章系统 | 2026-01-29 |
**功能**:双人对练功能数据库结构
## 执行迁移
**新增表**
- `practice_rooms` - 对练房间表
- `practice_room_messages` - 房间实时消息表
### 测试环境Docker
**修改表**
- `practice_dialogues` - 新增 `user_id`, `role_name`, `room_id`, `message_type` 字段
- `practice_sessions` - 新增 `room_id`, `participant_role`, `session_type` 字段
- `practice_reports` - 新增 `room_id`, `user_id`, `report_type`, `partner_feedback`, `interaction_score` 字段
## 执行方法
### 方法一:直接登录 MySQL 执行
KPL 测试环境数据库在服务器 Docker 容器中运行
```bash
# 1. 登录 MySQL
docker exec -it kpl-mysql-dev mysql -uroot -p
# 1. SSH 登录 KPL 服务器
ssh root@<KPL服务器IP>
# 2. 选择数据库
USE kaopeilian;
# 2. 进入项目目录
cd /www/wwwroot/kpl.ireborn.com.cn
# 3. 复制并执行 SQL 脚本内容
# 或使用 source 命令执行脚本文件
# 3. 执行迁移(方法一:直接执行)
docker exec -i kpl-mysql-dev mysql -uroot -pnj861021 kpl_dev < backend/migrations/add_level_badge_system.sql
# 或者(方法二:交互式执行)
docker exec -it kpl-mysql-dev mysql -uroot -pnj861021 kpl_dev
# 然后复制粘贴 SQL 脚本内容执行
# 方法三从本地执行需要先上传SQL文件到服务器
# scp backend/migrations/add_level_badge_system.sql root@<服务器IP>:/tmp/
# ssh root@<服务器IP> "docker exec -i kpl-mysql-dev mysql -uroot -pnj861021 kpl_dev < /tmp/add_level_badge_system.sql"
```
### 方法二:使用 docker exec 执行
**注意**MySQL 容器密码为 `nj861021`(之前通过 `docker exec kpl-mysql-dev env | grep MYSQL` 确认)
### 生产环境
生产环境迁移前请确保:
1. 已备份数据库
2. 在低峰期执行
3. 测试环境验证通过
```bash
# 1. 将 SQL 文件复制到容器
docker cp migrations/versions/add_practice_rooms_table.sql kpl-mysql-dev:/tmp/
# 2. 执行迁移
docker exec -i kpl-mysql-dev mysql -uroot -pYourPassword kaopeilian < /tmp/add_practice_rooms_table.sql
```
### 方法三:远程 SSH 执行
```bash
# SSH 到服务器后执行
ssh user@your-server "docker exec -i kpl-mysql-dev mysql -uroot -pYourPassword kaopeilian" < migrations/versions/add_practice_rooms_table.sql
# 执行迁移(替换为实际的生产数据库配置)
mysql -h<host> -u<user> -p<password> <database> < backend/migrations/add_level_badge_system.sql
```
## 回滚方法
每个迁移脚本底部都包含了回滚 SQL。如需回滚取消注释并执行回滚部分的 SQL 即可。
如需回滚,执行以下 SQL
## 生产环境迁移检查清单
```sql
DROP TABLE IF EXISTS user_badges;
DROP TABLE IF EXISTS badge_definitions;
DROP TABLE IF EXISTS exp_history;
DROP TABLE IF EXISTS level_configs;
DROP TABLE IF EXISTS user_levels;
```
- [ ] 备份数据库
- [ ] 在测试环境验证迁移脚本
- [ ] 检查是否有正在进行的事务
- [ ] 执行迁移脚本
- [ ] 验证表结构是否正确
- [ ] 验证索引是否创建成功
- [ ] 重启后端服务(如有必要)
- [ ] 验证功能是否正常
## 验证迁移
## 注意事项
执行以下查询验证表是否创建成功:
1. **MySQL 版本兼容性**:脚本使用了 `IF NOT EXISTS``IF EXISTS`,确保 MySQL 版本支持这些语法8.0+ 完全支持)
```sql
SHOW TABLES LIKE '%level%';
SHOW TABLES LIKE '%badge%';
SHOW TABLES LIKE '%exp%';
2. **字符集**:表默认使用 `utf8mb4` 字符集,支持表情符号等特殊字符
-- 查看表结构
DESCRIBE user_levels;
DESCRIBE exp_history;
DESCRIBE badge_definitions;
DESCRIBE user_badges;
DESCRIBE level_configs;
3. **外键约束**:脚本中的外键约束默认被注释,根据实际需求决定是否启用
4. **索引优化**:已为常用查询字段创建索引,如需调整请根据实际查询模式优化
-- 验证初始数据
SELECT COUNT(*) FROM level_configs; -- 应该是 10 条
SELECT COUNT(*) FROM badge_definitions; -- 应该是 20 条
SELECT COUNT(*) FROM user_levels; -- 应该等于用户数
```