Files
012-kaopeilian/backend/scripts/init_database_unified.sql
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

607 lines
34 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================
-- 考培练系统数据库初始化脚本
-- 版本1.0.0
-- 更新时间2024-12
-- ============================================
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS `kaopeilian` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `kaopeilian`;
-- ============================================
-- 一、用户管理模块
-- ============================================
-- 1.1 用户表
CREATE TABLE IF NOT EXISTS `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
`email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
`phone` VARCHAR(20) UNIQUE COMMENT '手机号',
`password_hash` VARCHAR(200) NOT NULL COMMENT '密码哈希',
`full_name` VARCHAR(100) COMMENT '姓名',
`gender` VARCHAR(10) COMMENT '性别: male/female',
`avatar_url` VARCHAR(500) COMMENT '头像URL',
`bio` TEXT COMMENT '个人简介',
`school` VARCHAR(100) COMMENT '学校',
`major` VARCHAR(100) COMMENT '专业',
`role` VARCHAR(20) DEFAULT 'trainee' COMMENT '系统角色: admin, manager, trainee',
`is_active` BOOLEAN DEFAULT TRUE COMMENT '是否激活',
`is_verified` BOOLEAN DEFAULT FALSE COMMENT '是否验证',
`last_login_at` DATETIME COMMENT '最后登录时间',
`password_changed_at` DATETIME COMMENT '密码修改时间',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME NULL COMMENT '删除时间',
INDEX idx_role (role),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 1.2 团队表
CREATE TABLE IF NOT EXISTS `teams` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL UNIQUE COMMENT '团队名称',
`code` VARCHAR(50) NOT NULL UNIQUE COMMENT '团队代码',
`description` TEXT COMMENT '团队描述',
`team_type` VARCHAR(50) DEFAULT 'department' COMMENT '团队类型: department, project, study_group',
`is_active` BOOLEAN DEFAULT TRUE COMMENT '是否激活',
`leader_id` INT COMMENT '负责人ID',
`parent_id` INT COMMENT '父团队ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (leader_id) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (parent_id) REFERENCES teams(id) ON DELETE CASCADE,
INDEX idx_team_type (team_type),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队表';
-- 1.3 用户团队关联表
CREATE TABLE IF NOT EXISTS `user_teams` (
`user_id` INT NOT NULL,
`team_id` INT NOT NULL,
`role` VARCHAR(50) DEFAULT 'member' COMMENT '团队角色: member, leader',
`joined_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
PRIMARY KEY (user_id, team_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户团队关联表';
-- ============================================
-- 二、组织与岗位管理模块
-- ============================================
-- 2.0 岗位表
CREATE TABLE IF NOT EXISTS `positions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL COMMENT '岗位名称',
`code` VARCHAR(100) NOT NULL UNIQUE COMMENT '岗位编码',
`description` TEXT COMMENT '岗位描述',
`parent_id` INT NULL COMMENT '上级岗位ID',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态: active/inactive',
`skills` JSON NULL COMMENT '核心技能',
`level` VARCHAR(20) NULL COMMENT '岗位等级: junior/intermediate/senior/expert',
`sort_order` INT DEFAULT 0 COMMENT '排序',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME NULL COMMENT '删除时间',
`created_by` INT NULL COMMENT '创建人ID',
`updated_by` INT NULL COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES positions(id) ON DELETE SET NULL,
INDEX idx_positions_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位表';
-- 插入轻医美连锁岗位(按层级关系)
-- 注意需要按顺序插入以正确设置parent_id
-- 第一层:区域经理
INSERT INTO positions (name, code, description, status, skills, level, sort_order) VALUES
('区域经理', 'region_manager', '负责多家门店的运营管理和业绩达成', 'active', '["团队管理", "业绩分析", "战略规划", "客户关系"]', 'expert', 10);
-- 获取区域经理ID
SET @region_manager_id = LAST_INSERT_ID();
-- 第二层:店长
INSERT INTO positions (name, code, description, parent_id, status, skills, level, sort_order) VALUES
('店长', 'store_manager', '负责门店日常运营管理,团队建设和业绩达成', @region_manager_id, 'active', '["门店管理", "团队建设", "销售管理", "客户维护"]', 'senior', 20);
-- 获取店长ID
SET @store_manager_id = LAST_INSERT_ID();
-- 第三层:各职能岗位
INSERT INTO positions (name, code, description, parent_id, status, skills, level, sort_order) VALUES
('美容顾问', 'beauty_consultant', '为客户提供专业的美容咨询和方案设计', @store_manager_id, 'active', '["产品知识", "销售技巧", "方案设计", "客户沟通"]', 'intermediate', 30),
('医美咨询师', 'medical_beauty_consultant', '提供医疗美容项目咨询和方案制定', @store_manager_id, 'active', '["医美知识", "风险评估", "方案设计", "合规意识"]', 'senior', 35),
('美容技师', 'beauty_therapist', '为客户提供专业的美容护理服务', @store_manager_id, 'active', '["护肤技术", "仪器操作", "手法技巧", "服务意识"]', 'intermediate', 40),
('护士', 'nurse', '协助医生进行医美项目操作,负责术后护理', @store_manager_id, 'active', '["护理技术", "无菌操作", "应急处理", "医疗知识"]', 'intermediate', 45),
('前台接待', 'receptionist', '负责客户接待、预约管理和前台事务', @store_manager_id, 'active', '["接待礼仪", "沟通能力", "信息管理", "服务意识"]', 'junior', 50),
('市场专员', 'marketing_specialist', '负责门店营销活动策划和执行', @store_manager_id, 'active', '["活动策划", "社媒运营", "数据分析", "创意设计"]', 'intermediate', 60);
-- ============================================
-- 二、课程管理模块
-- ============================================
-- 2.1 课程表
CREATE TABLE IF NOT EXISTS `courses` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(200) NOT NULL COMMENT '课程名称',
`description` TEXT COMMENT '课程描述',
`category` ENUM('technology', 'management', 'business', 'general') DEFAULT 'general' COMMENT '课程分类',
`status` ENUM('draft', 'published', 'archived') DEFAULT 'draft' COMMENT '课程状态',
`cover_image` VARCHAR(500) COMMENT '封面图片URL',
`duration_hours` FLOAT COMMENT '课程时长(小时)',
`difficulty_level` INT COMMENT '难度等级(1-5)',
`tags` JSON COMMENT '标签列表',
`published_at` DATETIME COMMENT '发布时间',
`publisher_id` INT COMMENT '发布人ID',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
`is_featured` BOOLEAN DEFAULT FALSE COMMENT '是否推荐',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_by` INT COMMENT '创建人ID',
`updated_by` INT COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_status (status),
INDEX idx_category (category),
INDEX idx_is_featured (is_featured),
INDEX idx_is_deleted (is_deleted),
INDEX idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程表';
-- 2.2 课程资料表
CREATE TABLE IF NOT EXISTS `course_materials` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`course_id` INT NOT NULL COMMENT '课程ID',
`name` VARCHAR(200) NOT NULL COMMENT '资料名称',
`description` TEXT COMMENT '资料描述',
`file_url` VARCHAR(500) NOT NULL COMMENT '文件URL',
`file_type` VARCHAR(50) NOT NULL COMMENT '文件类型',
`file_size` INT NOT NULL COMMENT '文件大小(字节)',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,
INDEX idx_course_id (course_id),
INDEX idx_is_deleted (is_deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程资料表';
-- 2.3 知识点表
CREATE TABLE IF NOT EXISTS `knowledge_points` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`course_id` INT NOT NULL COMMENT '课程ID',
`name` VARCHAR(200) NOT NULL COMMENT '知识点名称',
`description` TEXT COMMENT '知识点描述',
`parent_id` INT COMMENT '父知识点ID',
`level` INT DEFAULT 1 COMMENT '层级深度',
`path` VARCHAR(500) COMMENT '路径(如: 1.2.3)',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
`weight` FLOAT DEFAULT 1.0 COMMENT '权重',
`is_required` BOOLEAN DEFAULT TRUE COMMENT '是否必修',
`estimated_hours` FLOAT COMMENT '预计学习时间(小时)',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_by` INT NULL COMMENT '创建人ID',
`updated_by` INT NULL COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,
FOREIGN KEY (parent_id) REFERENCES knowledge_points(id) ON DELETE CASCADE,
INDEX idx_course_id (course_id),
INDEX idx_parent_id (parent_id),
INDEX idx_is_deleted (is_deleted),
INDEX idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='知识点表';
-- 2.4 成长路径表
CREATE TABLE IF NOT EXISTS `growth_paths` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(200) NOT NULL COMMENT '路径名称',
`description` TEXT COMMENT '路径描述',
`target_role` VARCHAR(100) COMMENT '目标角色',
`courses` JSON COMMENT '课程列表[{course_id, order, is_required}]',
`estimated_duration_days` INT COMMENT '预计完成天数',
`is_active` BOOLEAN DEFAULT TRUE COMMENT '是否启用',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_is_active (is_active),
INDEX idx_is_deleted (is_deleted),
INDEX idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成长路径表';
-- 资料知识点关联表
CREATE TABLE `material_knowledge_points` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`material_id` INT NOT NULL COMMENT '资料ID',
`knowledge_point_id` INT NOT NULL COMMENT '知识点ID',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
`is_ai_generated` BOOLEAN DEFAULT FALSE COMMENT '是否AI生成',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `idx_material_knowledge` (`material_id`, `knowledge_point_id`),
FOREIGN KEY (material_id) REFERENCES course_materials(id) ON DELETE CASCADE,
FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id) ON DELETE CASCADE,
INDEX idx_material_id (material_id),
INDEX idx_knowledge_point_id (knowledge_point_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资料知识点关联表';
-- ============================================
-- 三、考试模块
-- ============================================
-- 3.1 题目表
CREATE TABLE IF NOT EXISTS `questions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`course_id` INT NOT NULL COMMENT '课程ID',
`question_type` VARCHAR(20) NOT NULL COMMENT '题目类型: single_choice, multiple_choice, true_false, fill_blank, essay',
`title` TEXT NOT NULL COMMENT '题目标题',
`content` TEXT COMMENT '题目内容',
`options` JSON COMMENT '选项JSON格式',
`correct_answer` TEXT NOT NULL COMMENT '正确答案',
`explanation` TEXT COMMENT '答案解释',
`score` FLOAT DEFAULT 10.0 COMMENT '分值',
`difficulty` VARCHAR(10) DEFAULT 'medium' COMMENT '难度等级: easy, medium, hard',
`tags` JSON COMMENT '标签JSON格式',
`usage_count` INT DEFAULT 0 COMMENT '使用次数',
`correct_count` INT DEFAULT 0 COMMENT '答对次数',
`is_active` BOOLEAN DEFAULT TRUE COMMENT '是否启用',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,
INDEX idx_course_id (course_id),
INDEX idx_question_type (question_type),
INDEX idx_difficulty (difficulty),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='题目表';
-- 3.2 考试记录表
CREATE TABLE IF NOT EXISTS `exams` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL COMMENT '用户ID',
`course_id` INT NOT NULL COMMENT '课程ID',
`exam_name` VARCHAR(255) NOT NULL COMMENT '考试名称',
`question_count` INT DEFAULT 10 COMMENT '题目数量',
`total_score` FLOAT DEFAULT 100.0 COMMENT '总分',
`pass_score` FLOAT DEFAULT 60.0 COMMENT '及格分',
`start_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间',
`end_time` DATETIME COMMENT '结束时间',
`duration_minutes` INT DEFAULT 60 COMMENT '考试时长(分钟)',
`score` FLOAT COMMENT '得分',
`is_passed` BOOLEAN COMMENT '是否通过',
`status` VARCHAR(20) DEFAULT 'started' COMMENT '状态: started, submitted, timeout',
`questions` JSON COMMENT '题目数据JSON格式',
`answers` JSON COMMENT '答案数据JSON格式',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_course_id (course_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='考试记录表';
-- 3.3 考试结果详情表
CREATE TABLE IF NOT EXISTS `exam_results` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`exam_id` INT NOT NULL COMMENT '考试ID',
`question_id` INT NOT NULL COMMENT '题目ID',
`user_answer` TEXT COMMENT '用户答案',
`is_correct` BOOLEAN DEFAULT FALSE COMMENT '是否正确',
`score` FLOAT DEFAULT 0.0 COMMENT '得分',
`answer_time` INT COMMENT '答题时长(秒)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (exam_id) REFERENCES exams(id) ON DELETE CASCADE,
FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE,
INDEX idx_exam_id (exam_id),
INDEX idx_question_id (question_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='考试结果详情表';
-- ============================================
-- 四、陪练模块
-- ============================================
-- 4.1 陪练场景表
CREATE TABLE IF NOT EXISTS `training_scenes` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL COMMENT '场景名称',
`description` TEXT COMMENT '场景描述',
`category` VARCHAR(50) NOT NULL COMMENT '场景分类',
`ai_config` JSON COMMENT 'AI配置如Coze Bot ID等',
`prompt_template` TEXT COMMENT '提示词模板',
`evaluation_criteria` JSON COMMENT '评估标准',
`status` ENUM('DRAFT', 'ACTIVE', 'INACTIVE') DEFAULT 'DRAFT' COMMENT '场景状态',
`is_public` BOOLEAN DEFAULT TRUE COMMENT '是否公开',
`required_level` INT COMMENT '所需用户等级',
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
`deleted_at` DATETIME COMMENT '删除时间',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_status (status),
INDEX idx_category (category),
INDEX idx_is_public (is_public),
INDEX idx_is_deleted (is_deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='陪练场景表';
-- 4.2 陪练会话表
CREATE TABLE IF NOT EXISTS `training_sessions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL COMMENT '用户ID',
`scene_id` INT NOT NULL COMMENT '场景ID',
`coze_conversation_id` VARCHAR(100) COMMENT 'Coze会话ID',
`start_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间',
`end_time` DATETIME COMMENT '结束时间',
`duration_seconds` INT COMMENT '持续时长(秒)',
`status` ENUM('CREATED', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED', 'ERROR') DEFAULT 'CREATED' COMMENT '会话状态',
`session_config` JSON COMMENT '会话配置',
`total_score` FLOAT COMMENT '总分',
`evaluation_result` JSON COMMENT '评估结果详情',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (scene_id) REFERENCES training_scenes(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_scene_id (scene_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='陪练会话表';
-- 4.3 陪练消息表
CREATE TABLE IF NOT EXISTS `training_messages` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`session_id` INT NOT NULL COMMENT '会话ID',
`role` ENUM('USER', 'ASSISTANT', 'SYSTEM') NOT NULL COMMENT '消息角色',
`type` ENUM('TEXT', 'VOICE', 'SYSTEM') NOT NULL COMMENT '消息类型',
`content` TEXT NOT NULL COMMENT '消息内容',
`voice_url` VARCHAR(500) COMMENT '语音文件URL',
`voice_duration` FLOAT COMMENT '语音时长(秒)',
`message_metadata` JSON COMMENT '消息元数据',
`coze_message_id` VARCHAR(100) COMMENT 'Coze消息ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (session_id) REFERENCES training_sessions(id) ON DELETE CASCADE,
INDEX idx_session_id (session_id),
INDEX idx_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='陪练消息表';
-- 4.4 陪练报告表
CREATE TABLE IF NOT EXISTS `training_reports` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`session_id` INT NOT NULL UNIQUE COMMENT '会话ID',
`user_id` INT NOT NULL COMMENT '用户ID',
`overall_score` FLOAT NOT NULL COMMENT '总体得分',
`dimension_scores` JSON NOT NULL COMMENT '各维度得分',
`strengths` JSON NOT NULL COMMENT '优势点',
`weaknesses` JSON NOT NULL COMMENT '待改进点',
`suggestions` JSON NOT NULL COMMENT '改进建议',
`detailed_analysis` TEXT COMMENT '详细分析',
`transcript` TEXT COMMENT '对话文本记录',
`statistics` JSON COMMENT '统计数据',
`created_by` BIGINT COMMENT '创建人ID',
`updated_by` BIGINT COMMENT '更新人ID',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (session_id) REFERENCES training_sessions(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='陪练报告表';
-- ============================================
-- 五、初始测试数据
-- ============================================
-- 插入测试用户
INSERT INTO users (username, email, phone, password_hash, full_name, role, is_active, is_verified) VALUES
('superadmin', 'superadmin@kaopeilian.com', '13800000001', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewKyNiQdP/sQj6C6', '超级管理员', 'admin', TRUE, TRUE),
('admin', 'admin@kaopeilian.com', '13800000002', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewKyNiQdP/sQj6C6', '系统管理员', 'admin', TRUE, TRUE),
('testuser', 'testuser@kaopeilian.com', '13800000003', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewKyNiQdP/sQj6C6', '测试学员', 'trainee', TRUE, TRUE);
-- 插入测试团队
INSERT INTO teams (name, code, description, team_type, leader_id) VALUES
('技术部', 'TECH', '负责技术研发和维护', 'department', 2),
('产品部', 'PROD', '负责产品设计和规划', 'department', 2),
('Python学习小组', 'PY_GROUP', 'Python技术学习交流', 'study_group', 2);
-- 插入用户团队关联
INSERT INTO user_teams (user_id, team_id, role) VALUES
(2, 1, 'leader'),
(2, 2, 'leader'),
(3, 1, 'member'),
(3, 3, 'member');
-- 插入轻医美相关课程
INSERT INTO courses (name, description, category, status, duration_hours, difficulty_level, tags, is_featured, sort_order, published_at) VALUES
-- 技术类课程
('皮肤生理学基础', '学习皮肤结构、功能和常见问题,为专业护理打下基础', 'technology', 'published', 16, 2, '["皮肤学", "基础理论", "必修课"]', TRUE, 100, NOW()),
('医美产品知识与应用', '全面了解各类医美产品的成分、功效和适用人群', 'technology', 'published', 20, 3, '["产品知识", "医美", "专业技能"]', TRUE, 110, NOW()),
('美容仪器操作与维护', '掌握各类美容仪器的操作方法、注意事项和日常维护', 'technology', 'published', 24, 3, '["仪器操作", "实操技能", "设备维护"]', FALSE, 120, NOW()),
('医美项目介绍与咨询', '详细了解各类医美项目的原理、效果和适应症', 'technology', 'published', 30, 4, '["医美项目", "专业咨询", "风险告知"]', TRUE, 170, NOW()),
-- 业务类课程
('轻医美销售技巧', '学习专业的销售话术、客户需求分析和成交技巧', 'business', 'published', 16, 2, '["销售技巧", "客户沟通", "业绩提升"]', TRUE, 130, NOW()),
('客户服务与投诉处理', '提升服务意识,掌握客户投诉处理的方法和技巧', 'business', 'published', 12, 2, '["客户服务", "危机处理", "沟通技巧"]', FALSE, 140, NOW()),
('社媒营销与私域运营', '学习如何通过社交媒体进行品牌推广和客户维护', 'business', 'published', 16, 2, '["社媒营销", "私域流量", "客户维护"]', FALSE, 180, NOW()),
-- 管理类课程
('门店运营管理', '学习门店日常管理、团队建设和业绩管理', 'management', 'published', 20, 3, '["门店管理", "团队管理", "运营策略"]', FALSE, 160, NOW()),
-- 通用类课程
('卫生消毒与感染控制', '学习医美机构的卫生标准和消毒流程,确保服务安全', 'general', 'published', 8, 1, '["卫生安全", "消毒规范", "合规管理"]', TRUE, 150, NOW()),
-- 保留原有的技术课程作为选修参考
('Python编程基础', 'Python语言入门课程适合零基础学员', 'technology', 'published', 40, 2, '["Python", "编程基础", "入门"]', FALSE, 200, NOW()),
('数据分析基础', '学习数据分析方法和工具,提升数据驱动决策能力', 'technology', 'published', 32, 3, '["数据分析", "Excel", "可视化"]', FALSE, 210, NOW());
-- 为第一个课程添加资料
INSERT INTO course_materials (course_id, name, description, file_url, file_type, file_size) VALUES
(1, 'Python基础教程.pdf', 'Python编程基础教程文档', '/uploads/python-basics.pdf', 'pdf', 2048000),
(1, '课程视频1', '第一章节视频教程', '/uploads/video1.mp4', 'mp4', 104857600);
-- 为第一个课程添加知识点
INSERT INTO knowledge_points (course_id, name, description, parent_id, level, weight, estimated_hours) VALUES
(1, 'Python环境搭建', '学习如何安装和配置Python开发环境', NULL, 1, 1.0, 2),
(1, 'Python基础语法', '学习Python的基本语法规则', NULL, 1, 2.0, 8),
(1, '变量和数据类型', '了解Python中的变量和基本数据类型', 2, 2, 1.5, 3),
(1, '控制流程', '学习条件语句和循环结构', 2, 2, 1.5, 4);
-- 插入测试题目
INSERT INTO questions (course_id, question_type, title, content, options, correct_answer, explanation, score, difficulty, tags) VALUES
(1, 'single_choice', 'Python中哪个关键字用于定义函数', NULL, '{"A": "def", "B": "function", "C": "fun", "D": "define"}', 'A', 'Python使用def关键字来定义函数', 10.0, 'easy', '["python", "基础", "函数"]'),
(1, 'single_choice', 'Python中列表和元组的主要区别是什么', NULL, '{"A": "列表是有序的,元组是无序的", "B": "列表可变,元组不可变", "C": "列表只能存储数字,元组可以存储任何类型", "D": "没有区别"}', 'B', '列表是可变的mutable而元组是不可变的immutable', 10.0, 'medium', '["python", "数据结构"]'),
(1, 'true_false', 'Python是一种编译型语言', NULL, NULL, 'false', 'Python是一种解释型语言不需要编译成机器码', 10.0, 'easy', '["python", "基础"]'),
(1, 'fill_blank', 'Python中使用____关键字定义类', NULL, NULL, 'class', '使用class关键字定义类', 10.0, 'easy', '["python", "面向对象"]');
-- 插入陪练场景
INSERT INTO training_scenes (name, description, category, ai_config, status, is_public) VALUES
('Python编程助手', '帮助学员解决Python编程问题', '技术辅导', '{"bot_id": "python_assistant_bot"}', 'active', TRUE),
('面试模拟', '模拟技术面试场景', '职业发展', '{"bot_id": "interview_simulator_bot"}', 'active', TRUE),
('项目讨论', '项目方案讨论和优化', '项目管理', '{"bot_id": "project_discussion_bot"}', 'draft', TRUE);
-- 插入成长路径
INSERT INTO growth_paths (name, description, target_role, courses, estimated_duration_days) VALUES
('Python工程师成长路径', '从入门到精通的Python学习路径', 'Python开发工程师', '[{"course_id": 1, "order": 1, "is_required": true}, {"course_id": 4, "order": 2, "is_required": true}]', 90),
('技术管理者路径', '技术人员转型管理岗位', '技术经理', '[{"course_id": 2, "order": 1, "is_required": true}, {"course_id": 3, "order": 2, "is_required": false}]', 60);
-- ============================================
-- 六、创建视图(可选)
-- ============================================
-- 用户课程进度视图
CREATE OR REPLACE VIEW v_user_course_progress AS
SELECT
u.id as user_id,
u.username,
c.id as course_id,
c.name as course_name,
COUNT(DISTINCT e.id) as exam_count,
AVG(e.score) as avg_score,
MAX(e.score) as best_score
FROM users u
CROSS JOIN courses c
LEFT JOIN exams e ON e.user_id = u.id AND e.course_id = c.id AND e.status = 'submitted'
GROUP BY u.id, c.id;
-- ============================================
-- 七、岗位成员和课程关联表
-- ============================================
-- 创建岗位成员关联表
CREATE TABLE IF NOT EXISTS position_members (
id INT AUTO_INCREMENT PRIMARY KEY,
position_id INT NOT NULL COMMENT '岗位ID',
user_id INT NOT NULL COMMENT '用户ID',
role VARCHAR(50) COMMENT '成员角色(预留字段)',
joined_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by INT COMMENT '创建人ID',
updated_by INT COMMENT '更新人ID',
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_at DATETIME,
FOREIGN KEY (position_id) REFERENCES positions(id),
FOREIGN KEY (user_id) REFERENCES users(id),
UNIQUE KEY uix_position_user (position_id, user_id, is_deleted),
INDEX ix_position_members_id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位成员关联表';
-- 创建岗位课程关联表
CREATE TABLE IF NOT EXISTS position_courses (
id INT AUTO_INCREMENT PRIMARY KEY,
position_id INT NOT NULL COMMENT '岗位ID',
course_id INT NOT NULL COMMENT '课程ID',
course_type VARCHAR(20) NOT NULL DEFAULT 'required' COMMENT '课程类型',
priority INT DEFAULT 0 COMMENT '优先级/排序',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by INT COMMENT '创建人ID',
updated_by INT COMMENT '更新人ID',
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_at DATETIME,
FOREIGN KEY (position_id) REFERENCES positions(id),
FOREIGN KEY (course_id) REFERENCES courses(id),
UNIQUE KEY uix_position_course (position_id, course_id, is_deleted),
INDEX ix_position_courses_id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位课程关联表';
-- 创建课程考试设置表
CREATE TABLE IF NOT EXISTS course_exam_settings (
id INT AUTO_INCREMENT PRIMARY KEY,
course_id INT NOT NULL UNIQUE COMMENT '课程ID',
single_choice_count INT NOT NULL DEFAULT 10 COMMENT '单选题数量',
multiple_choice_count INT NOT NULL DEFAULT 5 COMMENT '多选题数量',
true_false_count INT NOT NULL DEFAULT 5 COMMENT '判断题数量',
fill_blank_count INT NOT NULL DEFAULT 0 COMMENT '填空题数量',
duration_minutes INT NOT NULL DEFAULT 60 COMMENT '考试时长(分钟)',
difficulty_level INT NOT NULL DEFAULT 3 COMMENT '难度系数(1-5)',
passing_score INT NOT NULL DEFAULT 60 COMMENT '及格分数',
is_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用',
show_answer_immediately BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否立即显示答案',
allow_retake BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否允许重考',
max_retake_times INT COMMENT '最大重考次数',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by INT COMMENT '创建人ID',
updated_by INT COMMENT '更新人ID',
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_at DATETIME,
deleted_by INT COMMENT '删除人ID',
FOREIGN KEY (course_id) REFERENCES courses(id),
INDEX ix_course_exam_settings_id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程考试设置表';
-- 插入岗位成员样例数据(使用已存在的用户)
INSERT INTO position_members (position_id, user_id) VALUES
(2, 2), -- 店长admin
(3, 3); -- 美容顾问testuser
-- 插入岗位课程关联数据
-- 需要根据实际插入的课程ID来设置这里使用子查询获取课程ID
-- 店长必修课程
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 2, id, 'required', 1 FROM courses WHERE name = '门店运营管理' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 2, id, 'required', 2 FROM courses WHERE name = '轻医美销售技巧' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 2, id, 'required', 3 FROM courses WHERE name = '客户服务与投诉处理' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 2, id, 'required', 4 FROM courses WHERE name = '卫生消毒与感染控制' AND is_deleted = FALSE LIMIT 1;
-- 美容顾问必修课程
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 3, id, 'required', 1 FROM courses WHERE name = '皮肤生理学基础' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 3, id, 'required', 2 FROM courses WHERE name = '医美产品知识与应用' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 3, id, 'required', 3 FROM courses WHERE name = '轻医美销售技巧' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 3, id, 'required', 4 FROM courses WHERE name = '客户服务与投诉处理' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 3, id, 'optional', 5 FROM courses WHERE name = '社媒营销与私域运营' AND is_deleted = FALSE LIMIT 1;
-- 美容技师必修课程
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 4, id, 'required', 1 FROM courses WHERE name = '皮肤生理学基础' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 4, id, 'required', 2 FROM courses WHERE name = '美容仪器操作与维护' AND is_deleted = FALSE LIMIT 1;
INSERT INTO position_courses (position_id, course_id, course_type, priority)
SELECT 4, id, 'required', 3 FROM courses WHERE name = '卫生消毒与感染控制' AND is_deleted = FALSE LIMIT 1;
-- ============================================
-- 八、输出完成信息
-- ============================================
SELECT '数据库初始化完成!' as message;
SELECT '默认账号-超级管理员superadmin / Superadmin123!' as info1;
SELECT '默认账号-系统管理员admin / Admin123!' as info2;
SELECT '默认账号-测试学员testuser / TestPass123!' as info3;