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,164 @@
-- ============================================
-- 为所有学员用户注入陪练会话数据
-- ============================================
USE `kaopeilian`;
-- 先创建陪练场景(如果不存在)
INSERT IGNORE INTO practice_scenes (id, name, description, type, difficulty, status, background, ai_role, objectives, keywords, duration, usage_count, rating, created_by, is_deleted)
VALUES
(1, '电话销售陪练', '模拟电话销售场景,提升电话沟通技巧', 'phone', 'intermediate', 'active', '客户对轻医美项目感兴趣,需要通过电话进行专业介绍', 'AI扮演潜在客户', '["掌握电话开场技巧", "专业介绍项目", "处理客户疑问"]', '["电话销售", "沟通技巧", "项目介绍"]', 15, 0, 4.5, 1, 0),
(2, '面对面咨询陪练', '模拟面对面咨询场景,提升面诊沟通能力', 'face', 'intermediate', 'active', '客户到店咨询轻医美项目,需要专业面诊和方案推荐', 'AI扮演到店客户', '["建立客户信任", "专业面诊", "方案推荐"]', '["面对面", "咨询", "方案设计"]', 20, 0, 4.7, 1, 0),
(3, '客户投诉处理陪练', '模拟客户投诉场景,提升问题处理能力', 'complaint', 'senior', 'active', '客户对服务或效果不满意,需要妥善处理投诉', 'AI扮演投诉客户', '["倾听客户诉求", "安抚客户情绪", "提供解决方案"]', '["投诉处理", "情绪管理", "客户关系"]', 15, 0, 4.3, 1, 0),
(4, '售后服务陪练', '模拟售后服务场景,提升客户满意度', 'after-sales', 'junior', 'active', '项目完成后,进行售后跟进和关怀', 'AI扮演已消费客户', '["售后关怀", "效果跟进", "二次营销"]', '["售后服务", "客户维护", "复购"]', 10, 0, 4.6, 1, 0),
(5, '产品介绍陪练', '模拟产品介绍场景,提升产品讲解能力', 'product-intro', 'beginner', 'active', '向客户详细介绍轻医美项目和产品', 'AI扮演咨询客户', '["产品特点讲解", "适用人群分析", "价值传递"]', '["产品介绍", "专业知识", "销售技巧"]', 15, 0, 4.8, 1, 0);
-- 为每个学员用户创建陪练记录
-- 使用存储过程批量生成
DELIMITER //
DROP PROCEDURE IF EXISTS generate_practice_sessions//
CREATE PROCEDURE generate_practice_sessions(IN target_user_id INT, IN session_count INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE session_date DATETIME;
DECLARE duration INT;
DECLARE scene INT;
DECLARE scene_name_val VARCHAR(200);
DECLARE scene_type_val VARCHAR(50);
DECLARE score INT;
DECLARE turns INT;
WHILE i < session_count DO
-- 在过去60天内随机生成日期
SET session_date = DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 60) DAY) + INTERVAL FLOOR(RAND() * 43200) SECOND;
-- 随机时长10-30分钟
SET duration = 600 + FLOOR(RAND() * 1200);
-- 随机选择场景
SET scene = 1 + FLOOR(RAND() * 5);
-- 根据场景设置名称和类型
CASE scene
WHEN 1 THEN
SET scene_name_val = '电话销售陪练';
SET scene_type_val = 'phone';
WHEN 2 THEN
SET scene_name_val = '面对面咨询陪练';
SET scene_type_val = 'face';
WHEN 3 THEN
SET scene_name_val = '客户投诉处理陪练';
SET scene_type_val = 'complaint';
WHEN 4 THEN
SET scene_name_val = '售后服务陪练';
SET scene_type_val = 'after-sales';
WHEN 5 THEN
SET scene_name_val = '产品介绍陪练';
SET scene_type_val = 'product-intro';
END CASE;
-- 随机对话轮数
SET turns = 10 + FLOOR(RAND() * 20);
-- 随机分数60-95分
SET score = 60 + FLOOR(RAND() * 35);
-- 插入陪练会话
INSERT INTO practice_sessions (
session_id,
user_id,
scene_id,
scene_name,
scene_type,
start_time,
end_time,
duration_seconds,
turns,
status,
is_deleted,
created_at,
updated_at
) VALUES (
CONCAT('session_', target_user_id, '_', UNIX_TIMESTAMP(session_date)),
target_user_id,
scene,
scene_name_val,
scene_type_val,
session_date,
DATE_ADD(session_date, INTERVAL duration SECOND),
duration,
turns,
'completed',
0,
session_date,
session_date
);
-- 插入陪练报告
INSERT INTO practice_reports (
session_id,
total_score,
score_breakdown,
ability_dimensions,
created_at,
updated_at
) VALUES (
CONCAT('session_', target_user_id, '_', UNIX_TIMESTAMP(session_date)),
score,
JSON_OBJECT(
'professionalism', score + FLOOR(RAND() * 10) - 5,
'communication', score + FLOOR(RAND() * 10) - 5,
'problem_solving', score + FLOOR(RAND() * 10) - 5
),
JSON_OBJECT(
'technical_skills', score + FLOOR(RAND() * 10) - 5,
'service_attitude', score + FLOOR(RAND() * 10) - 5,
'sales_ability', score + FLOOR(RAND() * 10) - 5
),
session_date,
session_date
);
SET i = i + 1;
END WHILE;
END//
DELIMITER ;
-- 为所有学员角色用户生成陪练数据
-- 获取所有学员用户ID并为每个用户生成15-25条记录
-- user_id = 1 (superadmin) - 20条
CALL generate_practice_sessions(1, 20);
-- user_id = 5 (consultant_001) - 25条
CALL generate_practice_sessions(5, 25);
-- user_id = 7 (therapist_001) - 22条
CALL generate_practice_sessions(7, 22);
-- user_id = 8 (receptionist_001) - 18条
CALL generate_practice_sessions(8, 18);
-- 统计结果
SELECT '========================================' AS '';
SELECT '✅ 陪练数据生成完成!' AS '';
SELECT '========================================' AS '';
SELECT
u.id,
u.username,
u.role,
COUNT(ps.id) as practice_count
FROM users u
LEFT JOIN practice_sessions ps ON u.id = ps.user_id AND ps.is_deleted = 0
WHERE u.is_deleted = 0
GROUP BY u.id, u.username, u.role
ORDER BY u.id;
-- 清理存储过程
DROP PROCEDURE IF EXISTS generate_practice_sessions;