feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

View File

@@ -0,0 +1,172 @@
-- ==============================================
-- 为 user_id=6 (nurse_001) 生成统计分析数据
-- ==============================================
USE kaopeilian;
SET @user_id = 6;
SET @user_name = (SELECT username FROM users WHERE id = @user_id);
SELECT CONCAT('开始为用户 ', @user_name, ' (ID: ', @user_id, ') 生成统计数据') AS '';
-- ============================================
-- 1. 生成考试记录 (50条)
-- ============================================
-- 保留原有的3条记录再生成47条
INSERT INTO exams (
user_id, course_id, exam_name, question_count, pass_score,
questions, start_time, end_time, status, duration_minutes,
round1_score, is_passed, created_at, updated_at
)
SELECT
@user_id,
c.id,
CONCAT(c.name, '练习测试_', DATE_FORMAT(exam_dt, '%m月%d日')),
10,
60,
'[]',
exam_dt,
DATE_ADD(exam_dt, INTERVAL FLOOR(20 + RAND() * 40) MINUTE),
'completed',
FLOOR(20 + RAND() * 40), -- 20-60分钟
FLOOR(55 + RAND() * 45), -- 55-100分
1,
exam_dt,
exam_dt
FROM (
SELECT DATE_SUB(NOW(), INTERVAL days DAY) + INTERVAL hours HOUR + INTERVAL minutes MINUTE as exam_dt
FROM (
SELECT 0 as days UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
SELECT 5 UNION ALL SELECT 7 UNION ALL SELECT 9 UNION ALL SELECT 12 UNION ALL SELECT 15
) d,
(SELECT 9 as hours UNION ALL SELECT 10 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16) h,
(SELECT 0 as minutes UNION ALL SELECT 15 UNION ALL SELECT 30 UNION ALL SELECT 45) m
) exam_dates
CROSS JOIN (
SELECT id, name FROM courses WHERE is_deleted = FALSE LIMIT 3
) c
LIMIT 47;
-- 更新 is_passed 标志
UPDATE exams SET is_passed = (round1_score >= pass_score) WHERE user_id = @user_id AND is_passed = 0;
SELECT CONCAT('✓ 当前考试记录总数: ', COUNT(*), '') AS ''
FROM exams WHERE user_id = @user_id;
-- ============================================
-- 2. 生成错题记录 (250条)
-- ============================================
-- 删除旧的错题记录,重新生成
DELETE FROM exam_mistakes WHERE user_id = @user_id;
-- 为每个考试生成3-6个错题
INSERT INTO exam_mistakes (
user_id, exam_id, question_id, knowledge_point_id,
question_content, correct_answer, user_answer, question_type,
created_at, updated_at
)
SELECT
e.user_id,
e.id,
NULL,
kp.id,
CONCAT('关于"', kp.name, '"的',
ELT(1 + FLOOR(RAND() * 3), '概念理解', '实际应用', '综合分析'), '问题'),
CONCAT('正确答案:', kp.name, '的标准解释'),
CONCAT('错误理解:', '学员对', kp.name, '的误解'),
ELT(1 + FLOOR(RAND() * 5), 'single_choice', 'multiple_choice', 'true_false', 'fill_blank', 'essay'),
e.start_time,
e.start_time
FROM exams e
CROSS JOIN (
SELECT 1 AS mistake_num UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) AS mistake_counts
INNER JOIN knowledge_points kp ON kp.course_id = e.course_id
WHERE e.user_id = @user_id
AND kp.is_deleted = FALSE
AND RAND() < 0.8
ORDER BY RAND()
LIMIT 250;
SELECT CONCAT('✓ 错题记录: ', COUNT(*), '') AS ''
FROM exam_mistakes WHERE user_id = @user_id;
-- ============================================
-- 3. 生成陪练记录 (20条)
-- ============================================
-- 删除旧的陪练记录
DELETE FROM practice_dialogues WHERE session_id IN (
SELECT session_id FROM practice_sessions WHERE user_id = @user_id
);
DELETE FROM practice_reports WHERE session_id IN (
SELECT session_id FROM practice_sessions WHERE user_id = @user_id
);
DELETE FROM practice_sessions WHERE user_id = @user_id;
-- 生成新的陪练记录
INSERT INTO practice_sessions (
session_id, user_id, scene_id, scene_name,
duration_seconds, status,
start_time, end_time, created_at, updated_at
)
SELECT
CONCAT('session_', @user_id, '_', UNIX_TIMESTAMP(practice_dt)),
@user_id,
1 + FLOOR(RAND() * 5),
ELT(1 + FLOOR(RAND() * 5), '电话销售陪练', '面对面咨询陪练', '客户投诉处理陪练', '售后服务陪练', '产品介绍陪练'),
FLOOR(600 + RAND() * 3000), -- 600-3600秒 (10-60分钟)
'completed',
practice_dt,
DATE_ADD(practice_dt, INTERVAL FLOOR(10 + RAND() * 50) MINUTE),
practice_dt,
practice_dt
FROM (
SELECT DATE_SUB(NOW(), INTERVAL days DAY) + INTERVAL hours HOUR as practice_dt
FROM (
SELECT 0 as days UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 5 UNION ALL
SELECT 7 UNION ALL SELECT 10 UNION ALL SELECT 12 UNION ALL SELECT 15 UNION ALL SELECT 20
) d,
(SELECT 10 as hours UNION ALL SELECT 14 UNION ALL SELECT 16) h
) practice_dates
LIMIT 20;
SELECT CONCAT('✓ 陪练记录: ', COUNT(*), '') AS ''
FROM practice_sessions WHERE user_id = @user_id;
-- ============================================
-- 4. 统计概览
-- ============================================
SELECT '========================================' AS '';
SELECT '数据生成完成' AS '';
SELECT '========================================' AS '';
SELECT CONCAT('用户: ', username, ' (', role, ')') AS ''
FROM users WHERE id = @user_id;
SELECT CONCAT('✓ 考试记录: ', COUNT(*), '') AS ''
FROM exams WHERE user_id = @user_id;
SELECT CONCAT('✓ 错题记录: ', COUNT(*), '') AS ''
FROM exam_mistakes WHERE user_id = @user_id;
SELECT CONCAT('✓ 陪练记录: ', COUNT(*), '') AS ''
FROM practice_sessions WHERE user_id = @user_id;
SELECT CONCAT('✓ 知识点数量: ', COUNT(*), '') AS ''
FROM knowledge_points WHERE is_deleted = FALSE;
-- 成绩分布
SELECT '========================================' AS '';
SELECT '成绩分布情况' AS '';
SELECT '========================================' AS '';
SELECT
CONCAT('优秀(90-100): ', SUM(CASE WHEN round1_score >= 90 THEN 1 ELSE 0 END), '') AS '',
CONCAT('良好(80-89): ', SUM(CASE WHEN round1_score >= 80 AND round1_score < 90 THEN 1 ELSE 0 END), '') AS '',
CONCAT('中等(70-79): ', SUM(CASE WHEN round1_score >= 70 AND round1_score < 80 THEN 1 ELSE 0 END), '') AS '',
CONCAT('及格(60-69): ', SUM(CASE WHEN round1_score >= 60 AND round1_score < 70 THEN 1 ELSE 0 END), '') AS '',
CONCAT('不及格(<60): ', SUM(CASE WHEN round1_score < 60 THEN 1 ELSE 0 END), '') AS ''
FROM exams WHERE user_id = @user_id;
SELECT '✓ 数据生成成功,可以刷新统计分析页面查看' AS '';