- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
89 lines
6.8 KiB
SQL
89 lines
6.8 KiB
SQL
-- 创建考试相关表
|
||
|
||
-- 1. 创建题目表
|
||
CREATE TABLE IF NOT EXISTS `questions` (
|
||
`id` INT NOT NULL AUTO_INCREMENT,
|
||
`course_id` INT NOT NULL,
|
||
`question_type` VARCHAR(20) NOT NULL COMMENT '题目类型: single_choice, multiple_choice, true_false, fill_blank, essay',
|
||
`title` TEXT NOT NULL COMMENT '题目标题',
|
||
`content` TEXT NULL COMMENT '题目内容',
|
||
`options` JSON NULL COMMENT '选项(JSON格式)',
|
||
`correct_answer` TEXT NOT NULL COMMENT '正确答案',
|
||
`explanation` TEXT NULL COMMENT '答案解释',
|
||
`score` FLOAT DEFAULT 10.0 COMMENT '分值',
|
||
`difficulty` VARCHAR(10) DEFAULT 'medium' COMMENT '难度等级: easy, medium, hard',
|
||
`tags` JSON NULL COMMENT '标签(JSON格式)',
|
||
`usage_count` INT DEFAULT 0 COMMENT '使用次数',
|
||
`correct_count` INT DEFAULT 0 COMMENT '答对次数',
|
||
`is_active` BOOLEAN DEFAULT TRUE COMMENT '是否启用',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_course_id` (`course_id`),
|
||
KEY `idx_question_type` (`question_type`),
|
||
KEY `idx_difficulty` (`difficulty`),
|
||
KEY `idx_is_active` (`is_active`),
|
||
CONSTRAINT `fk_questions_course` FOREIGN KEY (`course_id`) REFERENCES `courses` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- 2. 创建考试记录表
|
||
CREATE TABLE IF NOT EXISTS `exams` (
|
||
`id` INT NOT NULL AUTO_INCREMENT,
|
||
`user_id` BIGINT NOT NULL,
|
||
`course_id` INT NOT NULL,
|
||
`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 NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间',
|
||
`end_time` DATETIME NULL COMMENT '结束时间',
|
||
`duration_minutes` INT DEFAULT 60 COMMENT '考试时长(分钟)',
|
||
`score` FLOAT NULL COMMENT '得分',
|
||
`is_passed` BOOLEAN NULL COMMENT '是否通过',
|
||
`status` VARCHAR(20) DEFAULT 'started' COMMENT '状态: started, submitted, timeout',
|
||
`questions` JSON NULL COMMENT '题目数据(JSON格式)',
|
||
`answers` JSON NULL COMMENT '答案数据(JSON格式)',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_id` (`user_id`),
|
||
KEY `idx_course_id` (`course_id`),
|
||
KEY `idx_status` (`status`),
|
||
CONSTRAINT `fk_exams_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
|
||
CONSTRAINT `fk_exams_course` FOREIGN KEY (`course_id`) REFERENCES `courses` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- 3. 创建考试结果详情表
|
||
CREATE TABLE IF NOT EXISTS `exam_results` (
|
||
`id` INT NOT NULL AUTO_INCREMENT,
|
||
`exam_id` INT NOT NULL,
|
||
`question_id` INT NOT NULL,
|
||
`user_answer` TEXT NULL COMMENT '用户答案',
|
||
`is_correct` BOOLEAN DEFAULT FALSE COMMENT '是否正确',
|
||
`score` FLOAT DEFAULT 0.0 COMMENT '得分',
|
||
`answer_time` INT NULL COMMENT '答题时长(秒)',
|
||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_exam_id` (`exam_id`),
|
||
KEY `idx_question_id` (`question_id`),
|
||
CONSTRAINT `fk_exam_results_exam` FOREIGN KEY (`exam_id`) REFERENCES `exams` (`id`) ON DELETE CASCADE,
|
||
CONSTRAINT `fk_exam_results_question` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- 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, 'single_choice', '以下哪个不是Python的内置数据类型?', NULL, '{"A": "list", "B": "dict", "C": "array", "D": "tuple"}', 'C', 'array不是Python的内置数据类型,需要导入array模块', 10.0, 'medium', '["python", "数据类型"]'),
|
||
(1, 'true_false', 'Python是一种编译型语言', NULL, NULL, 'false', 'Python是一种解释型语言,不需要编译成机器码', 10.0, 'easy', '["python", "基础"]'),
|
||
(1, 'true_false', 'Python支持多重继承', NULL, NULL, 'true', 'Python支持多重继承,一个类可以继承多个父类', 10.0, 'medium', '["python", "面向对象"]');
|
||
|
||
-- 5. 插入更多测试题目(如果需要)
|
||
INSERT INTO `questions` (`course_id`, `question_type`, `title`, `content`, `options`, `correct_answer`, `explanation`, `score`, `difficulty`, `tags`) VALUES
|
||
(1, 'single_choice', 'Python中的装饰器是什么?', NULL, '{"A": "一种设计模式", "B": "用于修改函数或类行为的函数", "C": "一种数据结构", "D": "一种循环结构"}', 'B', '装饰器是一个接受函数作为参数并返回新函数的函数', 15.0, 'hard', '["python", "高级特性", "装饰器"]'),
|
||
(1, 'single_choice', '以下哪个方法用于向列表末尾添加元素?', NULL, '{"A": "add()", "B": "insert()", "C": "append()", "D": "extend()"}', 'C', 'append()方法用于向列表末尾添加单个元素', 10.0, 'easy', '["python", "列表", "方法"]'),
|
||
(1, 'multiple_choice', 'Python中哪些是可变数据类型?', '请选择所有正确答案', '{"A": "list", "B": "tuple", "C": "dict", "D": "str", "E": "set"}', '["A", "C", "E"]', 'list、dict和set是可变数据类型,而tuple和str是不可变的', 15.0, 'medium', '["python", "数据类型"]'),
|
||
(1, 'fill_blank', 'Python中使用____关键字定义类', NULL, NULL, 'class', '使用class关键字定义类', 10.0, 'easy', '["python", "面向对象"]'),
|
||
(1, 'essay', '请解释Python中的GIL(全局解释器锁)是什么,以及它对多线程编程的影响', NULL, NULL, 'GIL是Python解释器的一个机制,同一时刻只允许一个线程执行Python字节码。这对CPU密集型的多线程程序性能有负面影响,但对I/O密集型程序影响较小。', 'GIL确保了Python对象的线程安全,但限制了多线程的并行性能', 20.0, 'hard', '["python", "高级", "并发"]');
|