chore: initial import to Nexus_Edu
This commit is contained in:
62
database/README.md
Normal file
62
database/README.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# 数据库脚本使用说明
|
||||
|
||||
## 文件说明
|
||||
|
||||
- `schema.sql` - 完整建表语句(11张表)
|
||||
- `seed.sql` - 初始化示例数据
|
||||
- `drop.sql` - 清理所有表(危险!仅开发用)
|
||||
|
||||
## 使用步骤
|
||||
|
||||
### 1. 创建数据库
|
||||
|
||||
```sql
|
||||
CREATE DATABASE edunexus CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE edunexus;
|
||||
```
|
||||
|
||||
### 2. 执行建表脚本
|
||||
|
||||
```bash
|
||||
mysql -u root -p edunexus < schema.sql
|
||||
```
|
||||
|
||||
或在MySQL客户端中:
|
||||
```sql
|
||||
SOURCE schema.sql;
|
||||
```
|
||||
|
||||
### 3. 插入示例数据(可选)
|
||||
|
||||
```bash
|
||||
mysql -u root -p edunexus < seed.sql
|
||||
```
|
||||
|
||||
### 4. 清理数据(仅开发)
|
||||
|
||||
```bash
|
||||
mysql -u root -p edunexus < drop.sql
|
||||
```
|
||||
|
||||
## 表结构概览
|
||||
|
||||
| 模块 | 表名 | 说明 |
|
||||
|------|------|------|
|
||||
| 身份 | application_users | 用户账号 |
|
||||
| 组织 | schools, grades, classes, class_members | 学校组织架构 |
|
||||
| 教材 | subjects, textbooks, textbook_units, textbook_lessons, knowledge_points | 教材知识体系 |
|
||||
| 题库 | questions, question_knowledge | 题目库和知识点关联 |
|
||||
| 试卷 | exams, exam_nodes | 试卷和题目节点(树形) |
|
||||
| 作业 | assignments, student_submissions, submission_details | 作业发布和提交 |
|
||||
|
||||
## 重要说明
|
||||
|
||||
- 所有表都包含审计字段(created_at, created_by等)
|
||||
- 使用UUID作为主键(VARCHAR(36))
|
||||
- 支持软删除(is_deleted字段)
|
||||
- exam_nodes表支持无限层级嵌套
|
||||
- 密码使用bcrypt hash存储
|
||||
|
||||
## 下一步
|
||||
|
||||
数据库创建完成后,请使用后端API服务连接数据库。
|
||||
28
database/drop.sql
Normal file
28
database/drop.sql
Normal file
@@ -0,0 +1,28 @@
|
||||
-- =============================================
|
||||
-- EduNexus Pro - 清理脚本
|
||||
-- 危险操作!仅用于开发环境
|
||||
-- =============================================
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
DROP TABLE IF EXISTS `submission_details`;
|
||||
DROP TABLE IF EXISTS `student_submissions`;
|
||||
DROP TABLE IF EXISTS `assignments`;
|
||||
DROP TABLE IF EXISTS `exam_nodes`;
|
||||
DROP TABLE IF EXISTS `exams`;
|
||||
DROP TABLE IF EXISTS `question_knowledge`;
|
||||
DROP TABLE IF EXISTS `questions`;
|
||||
DROP TABLE IF EXISTS `knowledge_points`;
|
||||
DROP TABLE IF EXISTS `textbook_lessons`;
|
||||
DROP TABLE IF EXISTS `textbook_units`;
|
||||
DROP TABLE IF EXISTS `textbooks`;
|
||||
DROP TABLE IF EXISTS `subjects`;
|
||||
DROP TABLE IF EXISTS `class_members`;
|
||||
DROP TABLE IF EXISTS `classes`;
|
||||
DROP TABLE IF EXISTS `grades`;
|
||||
DROP TABLE IF EXISTS `schools`;
|
||||
DROP TABLE IF EXISTS `application_users`;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
SELECT '所有表已删除' AS Status;
|
||||
420
database/schema.sql
Normal file
420
database/schema.sql
Normal file
@@ -0,0 +1,420 @@
|
||||
-- =============================================
|
||||
-- EduNexus Pro - MySQL数据库建表脚本
|
||||
-- 基于Model.ts生成
|
||||
-- 版本: 1.0
|
||||
-- 日期: 2025-11-25
|
||||
-- =============================================
|
||||
|
||||
-- 设置字符集和时区
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
SET time_zone = '+08:00';
|
||||
|
||||
-- =============================================
|
||||
-- 1. 身份与权限模块
|
||||
-- =============================================
|
||||
|
||||
-- 用户表
|
||||
DROP TABLE IF EXISTS `application_users`;
|
||||
CREATE TABLE `application_users` (
|
||||
`id` VARCHAR(36) PRIMARY KEY COMMENT '用户ID (UUID)',
|
||||
`real_name` VARCHAR(50) NOT NULL COMMENT '真实姓名',
|
||||
`student_id` VARCHAR(20) NULL COMMENT '学号(学生)',
|
||||
`avatar_url` VARCHAR(500) NULL COMMENT '头像URL',
|
||||
`gender` ENUM('Male', 'Female') NOT NULL DEFAULT 'Male' COMMENT '性别',
|
||||
`current_school_id` VARCHAR(36) NULL COMMENT '当前所属学校ID',
|
||||
`account_status` ENUM('Active', 'Suspended', 'Graduated') NOT NULL DEFAULT 'Active' COMMENT '账号状态',
|
||||
`email` VARCHAR(100) NULL COMMENT '邮箱',
|
||||
`phone` VARCHAR(20) NULL COMMENT '手机号',
|
||||
`bio` TEXT NULL COMMENT '个人简介',
|
||||
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码Hash',
|
||||
|
||||
-- 审计字段
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`created_by` VARCHAR(36) NOT NULL COMMENT '创建人ID',
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`updated_by` VARCHAR(36) NOT NULL COMMENT '更新人ID',
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '软删除标记',
|
||||
|
||||
INDEX `idx_student_id` (`student_id`),
|
||||
INDEX `idx_email` (`email`),
|
||||
INDEX `idx_phone` (`phone`),
|
||||
INDEX `idx_school` (`current_school_id`),
|
||||
INDEX `idx_created_at` (`created_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
||||
|
||||
-- =============================================
|
||||
-- 2. 组织架构模块
|
||||
-- =============================================
|
||||
|
||||
-- 学校表
|
||||
DROP TABLE IF EXISTS `schools`;
|
||||
CREATE TABLE `schools` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '学校名称',
|
||||
`region_code` VARCHAR(20) NOT NULL COMMENT '地区编码',
|
||||
`address` VARCHAR(200) NULL COMMENT '学校地址',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
INDEX `idx_region` (`region_code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学校表';
|
||||
|
||||
-- 年级表
|
||||
DROP TABLE IF EXISTS `grades`;
|
||||
CREATE TABLE `grades` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`school_id` VARCHAR(36) NOT NULL COMMENT '所属学校ID',
|
||||
`name` VARCHAR(50) NOT NULL COMMENT '年级名称',
|
||||
`sort_order` INT NOT NULL COMMENT '排序序号',
|
||||
`enrollment_year` INT NOT NULL COMMENT '入学年份',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`school_id`) REFERENCES `schools`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_school_id` (`school_id`),
|
||||
INDEX `idx_enrollment_year` (`enrollment_year`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='年级表';
|
||||
|
||||
-- 班级表
|
||||
DROP TABLE IF EXISTS `classes`;
|
||||
CREATE TABLE `classes` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`grade_id` VARCHAR(36) NOT NULL COMMENT '所属年级ID',
|
||||
`name` VARCHAR(50) NOT NULL COMMENT '班级名称',
|
||||
`invite_code` VARCHAR(10) NOT NULL UNIQUE COMMENT '邀请码',
|
||||
`head_teacher_id` VARCHAR(36) NULL COMMENT '班主任ID',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`grade_id`) REFERENCES `grades`(`id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`head_teacher_id`) REFERENCES `application_users`(`id`) ON DELETE SET NULL,
|
||||
UNIQUE INDEX `idx_invite_code` (`invite_code`),
|
||||
INDEX `idx_grade_id` (`grade_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='班级表';
|
||||
|
||||
-- 班级成员表
|
||||
DROP TABLE IF EXISTS `class_members`;
|
||||
CREATE TABLE `class_members` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`class_id` VARCHAR(36) NOT NULL COMMENT '班级ID',
|
||||
`user_id` VARCHAR(36) NOT NULL COMMENT '用户ID',
|
||||
`role_in_class` ENUM('Student', 'Monitor', 'Committee', 'Teacher') NOT NULL DEFAULT 'Student' COMMENT '班级角色',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `application_users`(`id`) ON DELETE CASCADE,
|
||||
UNIQUE INDEX `idx_class_user` (`class_id`, `user_id`),
|
||||
INDEX `idx_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='班级成员表';
|
||||
|
||||
-- =============================================
|
||||
-- 3. 教材与知识图谱模块
|
||||
-- =============================================
|
||||
|
||||
-- 学科表
|
||||
DROP TABLE IF EXISTS `subjects`;
|
||||
CREATE TABLE `subjects` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`name` VARCHAR(50) NOT NULL COMMENT '学科名称',
|
||||
`code` VARCHAR(20) NOT NULL UNIQUE COMMENT '学科代码',
|
||||
`icon` VARCHAR(50) NULL COMMENT '图标',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
INDEX `idx_code` (`code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学科表';
|
||||
|
||||
-- 教材表
|
||||
DROP TABLE IF EXISTS `textbooks`;
|
||||
CREATE TABLE `textbooks` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`subject_id` VARCHAR(36) NOT NULL COMMENT '所属学科ID',
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '教材名称',
|
||||
`publisher` VARCHAR(100) NOT NULL COMMENT '出版社',
|
||||
`version_year` VARCHAR(20) NOT NULL COMMENT '版本年份',
|
||||
`cover_url` VARCHAR(500) NULL COMMENT '封面URL',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_subject_id` (`subject_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教材表';
|
||||
|
||||
-- 教材单元表
|
||||
DROP TABLE IF EXISTS `textbook_units`;
|
||||
CREATE TABLE `textbook_units` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`textbook_id` VARCHAR(36) NOT NULL COMMENT '所属教材ID',
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '单元名称',
|
||||
`sort_order` INT NOT NULL COMMENT '排序序号',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`textbook_id`) REFERENCES `textbooks`(`id`) ON DELETE CASCADE,
|
||||
INDEX `idx_textbook_id` (`textbook_id`),
|
||||
INDEX `idx_sort_order` (`sort_order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教材单元表';
|
||||
|
||||
-- 教材课程表
|
||||
DROP TABLE IF EXISTS `textbook_lessons`;
|
||||
CREATE TABLE `textbook_lessons` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`unit_id` VARCHAR(36) NOT NULL COMMENT '所属单元ID',
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '课名称',
|
||||
`sort_order` INT NOT NULL COMMENT '排序序号',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`unit_id`) REFERENCES `textbook_units`(`id`) ON DELETE CASCADE,
|
||||
INDEX `idx_unit_id` (`unit_id`),
|
||||
INDEX `idx_sort_order` (`sort_order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教材课程表';
|
||||
|
||||
-- 知识点表
|
||||
DROP TABLE IF EXISTS `knowledge_points`;
|
||||
CREATE TABLE `knowledge_points` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`lesson_id` VARCHAR(36) NOT NULL COMMENT '挂载课节ID',
|
||||
`parent_knowledge_point_id` VARCHAR(36) NULL COMMENT '父知识点ID',
|
||||
`name` VARCHAR(200) NOT NULL COMMENT '知识点名称',
|
||||
`difficulty` INT NOT NULL COMMENT '难度系数(1-5)',
|
||||
`description` TEXT NULL COMMENT '描述/口诀',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`lesson_id`) REFERENCES `textbook_lessons`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`parent_knowledge_point_id`) REFERENCES `knowledge_points`(`id`) ON DELETE CASCADE,
|
||||
INDEX `idx_lesson_id` (`lesson_id`),
|
||||
INDEX `idx_parent_id` (`parent_knowledge_point_id`),
|
||||
INDEX `idx_difficulty` (`difficulty`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='知识点表';
|
||||
|
||||
-- =============================================
|
||||
-- 4. 题库资源模块
|
||||
-- =============================================
|
||||
|
||||
-- 题目表
|
||||
DROP TABLE IF EXISTS `questions`;
|
||||
CREATE TABLE `questions` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`subject_id` VARCHAR(36) NOT NULL COMMENT '所属学科ID',
|
||||
`content` TEXT NOT NULL COMMENT '题干内容(HTML)',
|
||||
`options_config` JSON NULL COMMENT '选项配置(JSON)',
|
||||
`question_type` ENUM('SingleChoice', 'MultipleChoice', 'TrueFalse', 'FillBlank', 'Subjective') NOT NULL COMMENT '题目类型',
|
||||
`answer` TEXT NOT NULL COMMENT '参考答案',
|
||||
`explanation` TEXT NULL COMMENT '答案解析',
|
||||
`difficulty` INT NOT NULL DEFAULT 3 COMMENT '难度(1-5)',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_subject_id` (`subject_id`),
|
||||
INDEX `idx_question_type` (`question_type`),
|
||||
INDEX `idx_difficulty` (`difficulty`),
|
||||
FULLTEXT INDEX `ft_content` (`content`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='题目表';
|
||||
|
||||
-- 题目-知识点关联表
|
||||
DROP TABLE IF EXISTS `question_knowledge`;
|
||||
CREATE TABLE `question_knowledge` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`question_id` VARCHAR(36) NOT NULL COMMENT '题目ID',
|
||||
`knowledge_point_id` VARCHAR(36) NOT NULL COMMENT '知识点ID',
|
||||
`weight` INT NOT NULL DEFAULT 100 COMMENT '考察权重(0-100)',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`knowledge_point_id`) REFERENCES `knowledge_points`(`id`) ON DELETE CASCADE,
|
||||
UNIQUE INDEX `idx_question_knowledge` (`question_id`, `knowledge_point_id`),
|
||||
INDEX `idx_knowledge_id` (`knowledge_point_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='题目知识点关联表';
|
||||
|
||||
-- =============================================
|
||||
-- 5. 试卷工程模块
|
||||
-- =============================================
|
||||
|
||||
-- 试卷表
|
||||
DROP TABLE IF EXISTS `exams`;
|
||||
CREATE TABLE `exams` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`subject_id` VARCHAR(36) NOT NULL COMMENT '所属学科ID',
|
||||
`title` VARCHAR(200) NOT NULL COMMENT '试卷标题',
|
||||
`total_score` DECIMAL(5,1) NOT NULL DEFAULT 0 COMMENT '总分',
|
||||
`suggested_duration` INT NOT NULL COMMENT '建议时长(分钟)',
|
||||
`status` ENUM('Draft', 'Published') NOT NULL DEFAULT 'Draft' COMMENT '状态',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_subject_id` (`subject_id`),
|
||||
INDEX `idx_status` (`status`),
|
||||
INDEX `idx_created_by` (`created_by`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='试卷表';
|
||||
|
||||
-- 试卷节点表(树形结构)
|
||||
DROP TABLE IF EXISTS `exam_nodes`;
|
||||
CREATE TABLE `exam_nodes` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`exam_id` VARCHAR(36) NOT NULL COMMENT '所属试卷ID',
|
||||
`parent_node_id` VARCHAR(36) NULL COMMENT '父节点ID',
|
||||
`node_type` ENUM('Group', 'Question') NOT NULL COMMENT '节点类型',
|
||||
`question_id` VARCHAR(36) NULL COMMENT '题目ID(Question节点)',
|
||||
`title` VARCHAR(200) NULL COMMENT '标题(Group节点)',
|
||||
`description` TEXT NULL COMMENT '描述(Group节点)',
|
||||
`score` DECIMAL(5,1) NOT NULL COMMENT '分数',
|
||||
`sort_order` INT NOT NULL COMMENT '排序序号',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`exam_id`) REFERENCES `exams`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`parent_node_id`) REFERENCES `exam_nodes`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_exam_id` (`exam_id`),
|
||||
INDEX `idx_parent_node_id` (`parent_node_id`),
|
||||
INDEX `idx_sort_order` (`sort_order`),
|
||||
INDEX `idx_question_id` (`question_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='试卷节点表';
|
||||
|
||||
-- =============================================
|
||||
-- 6. 教学执行模块
|
||||
-- =============================================
|
||||
|
||||
-- 作业表
|
||||
DROP TABLE IF EXISTS `assignments`;
|
||||
CREATE TABLE `assignments` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`exam_id` VARCHAR(36) NOT NULL COMMENT '关联试卷ID',
|
||||
`class_id` VARCHAR(36) NOT NULL COMMENT '目标班级ID',
|
||||
`title` VARCHAR(200) NOT NULL COMMENT '作业标题',
|
||||
`start_time` DATETIME NOT NULL COMMENT '开始时间',
|
||||
`end_time` DATETIME NOT NULL COMMENT '截止时间',
|
||||
`allow_late_submission` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '允许迟交',
|
||||
`auto_score_enabled` BOOLEAN NOT NULL DEFAULT TRUE COMMENT '自动判分',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`exam_id`) REFERENCES `exams`(`id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`id`) ON DELETE RESTRICT,
|
||||
INDEX `idx_exam_id` (`exam_id`),
|
||||
INDEX `idx_class_id` (`class_id`),
|
||||
INDEX `idx_start_time` (`start_time`),
|
||||
INDEX `idx_end_time` (`end_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='作业表';
|
||||
|
||||
-- 学生提交表
|
||||
DROP TABLE IF EXISTS `student_submissions`;
|
||||
CREATE TABLE `student_submissions` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`assignment_id` VARCHAR(36) NOT NULL COMMENT '作业ID',
|
||||
`student_id` VARCHAR(36) NOT NULL COMMENT '学生ID',
|
||||
`submission_status` ENUM('Pending', 'Submitted', 'Grading', 'Graded') NOT NULL DEFAULT 'Pending' COMMENT '提交状态',
|
||||
`submit_time` DATETIME NULL COMMENT '提交时间',
|
||||
`time_spent_seconds` INT NULL COMMENT '耗时(秒)',
|
||||
`total_score` DECIMAL(5,1) NULL COMMENT '总得分',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`assignment_id`) REFERENCES `assignments`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `application_users`(`id`) ON DELETE CASCADE,
|
||||
UNIQUE INDEX `idx_assignment_student` (`assignment_id`, `student_id`),
|
||||
INDEX `idx_student_id` (`student_id`),
|
||||
INDEX `idx_submit_time` (`submit_time`),
|
||||
INDEX `idx_status` (`submission_status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生提交表';
|
||||
|
||||
-- 答题详情表
|
||||
DROP TABLE IF EXISTS `submission_details`;
|
||||
CREATE TABLE `submission_details` (
|
||||
`id` VARCHAR(36) PRIMARY KEY,
|
||||
`submission_id` VARCHAR(36) NOT NULL COMMENT '提交ID',
|
||||
`exam_node_id` VARCHAR(36) NOT NULL COMMENT '试卷节点ID',
|
||||
`student_answer` TEXT NULL COMMENT '学生答案',
|
||||
`grading_data` JSON NULL COMMENT '批改数据(Canvas JSON)',
|
||||
`score` DECIMAL(5,1) NULL COMMENT '得分',
|
||||
`judgement` ENUM('Correct', 'Incorrect', 'Partial') NULL COMMENT '判题结果',
|
||||
`teacher_comment` TEXT NULL COMMENT '老师评语',
|
||||
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`created_by` VARCHAR(36) NOT NULL,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`updated_by` VARCHAR(36) NOT NULL,
|
||||
`is_deleted` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
|
||||
FOREIGN KEY (`submission_id`) REFERENCES `student_submissions`(`id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`exam_node_id`) REFERENCES `exam_nodes`(`id`) ON DELETE RESTRICT,
|
||||
UNIQUE INDEX `idx_submission_node` (`submission_id`, `exam_node_id`),
|
||||
INDEX `idx_node_id` (`exam_node_id`),
|
||||
INDEX `idx_judgement` (`judgement`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='答题详情表';
|
||||
|
||||
-- =============================================
|
||||
-- 完成
|
||||
-- =============================================
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- 显示创建的所有表
|
||||
SHOW TABLES;
|
||||
121
database/seed.sql
Normal file
121
database/seed.sql
Normal file
@@ -0,0 +1,121 @@
|
||||
-- =============================================
|
||||
-- EduNexus Pro - 初始化数据脚本
|
||||
-- 用于开发和测试
|
||||
-- =============================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- =============================================
|
||||
-- 1. 插入示例学科
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `subjects` (`id`, `name`, `code`, `icon`, `created_by`, `updated_by`) VALUES
|
||||
('sub-math', '数学', 'MATH', '📐', 'system', 'system'),
|
||||
('sub-chinese', '语文', 'CHINESE', '📖', 'system', 'system'),
|
||||
('sub-english', '英语', 'ENGLISH', '🌍', 'system', 'system'),
|
||||
('sub-physics', '物理', 'PHYSICS', '⚛️', 'system', 'system'),
|
||||
('sub-chemistry', '化学', 'CHEMISTRY', '🧪', 'system', 'system');
|
||||
|
||||
-- =============================================
|
||||
-- 2. 插入示例学校和组织结构
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `schools` (`id`, `name`, `region_code`, `address`, `created_by`, `updated_by`) VALUES
|
||||
('school-1', '示范中学', '110000', '北京市海淀区示范路1号', 'system', 'system');
|
||||
|
||||
INSERT INTO `grades` (`id`, `school_id`, `name`, `sort_order`, `enrollment_year`, `created_by`, `updated_by`) VALUES
|
||||
('grade-1', 'school-1', '初一年级', 1, 2024, 'system', 'system'),
|
||||
('grade-2', 'school-1', '初二年级', 2, 2023, 'system', 'system'),
|
||||
('grade-3', 'school-1', '初三年级', 3, 2022, 'system', 'system');
|
||||
|
||||
--=============================================
|
||||
-- 3. 插入示例用户(密码: password123,实际应用需要hash)
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `application_users` (`id`, `real_name`, `student_id`, `gender`, `current_school_id`, `account_status`, `email`, `phone`, `password_hash`, `created_by`, `updated_by`) VALUES
|
||||
('user-teacher-1', '张老师', NULL, 'Male', 'school-1', 'Active', 'teacher@example.com', '13800138000', '$2b$10$example_hash', 'system', 'system'),
|
||||
('user-student-1', '王小明', 'S20240001', 'Male', 'school-1', 'Active', 'student1@example.com', '13800138001', '$2b$10$example_hash', 'system', 'system'),
|
||||
('user-student-2', '李小红', 'S20240002', 'Female', 'school-1', 'Active', 'student2@example.com', '13800138002', '$2b$10$example_hash', 'system', 'system');
|
||||
|
||||
-- =============================================
|
||||
-- 4. 插入示例班级
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `classes` (`id`, `grade_id`, `name`, `invite_code`, `head_teacher_id`, `created_by`, `updated_by`) VALUES
|
||||
('class-1', 'grade-1', '初一(1)班', 'ABC123', 'user-teacher-1', 'system', 'system');
|
||||
|
||||
INSERT INTO `class_members` (`id`, `class_id`, `user_id`, `role_in_class`, `created_by`, `updated_by`) VALUES
|
||||
('cm-1', 'class-1', 'user-teacher-1', 'Teacher', 'system', 'system'),
|
||||
('cm-2', 'class-1', 'user-student-1', 'Student', 'system', 'system'),
|
||||
('cm-3', 'class-1', 'user-student-2', 'Student', 'system', 'system');
|
||||
|
||||
-- =============================================
|
||||
-- 5. 插入示例教材
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `textbooks` (`id`, `subject_id`, `name`, `publisher`, `version_year`, `cover_url`, `created_by`, `updated_by`) VALUES
|
||||
('textbook-1', 'sub-math', '义务教育教科书·数学(七年级上册)', '人民教育出版社', '2024', 'https://placehold.co/300x400/007AFF/ffffff?text=Math', 'system', 'system');
|
||||
|
||||
INSERT INTO `textbook_units` (`id`, `textbook_id`, `name`, `sort_order`, `created_by`, `updated_by`) VALUES
|
||||
('unit-1', 'textbook-1', '第一章 有理数', 1, 'system', 'system'),
|
||||
('unit-2', 'textbook-1', '第二章 整式的加减', 2, 'system', 'system');
|
||||
|
||||
INSERT INTO `textbook_lessons` (`id`, `unit_id`, `name`, `sort_order`, `created_by`, `updated_by`) VALUES
|
||||
('lesson-1-1', 'unit-1', '1.1 正数和负数', 1, 'system', 'system'),
|
||||
('lesson-1-2', 'unit-1', '1.2 有理数', 2, 'system', 'system');
|
||||
|
||||
INSERT INTO `knowledge_points` (`id`, `lesson_id`, `parent_knowledge_point_id`, `name`, `difficulty`, `description`, `created_by`, `updated_by`) VALUES
|
||||
('kp-1', 'lesson-1-1', NULL, '正数的概念', 1, '大于0的数叫做正数', 'system', 'system'),
|
||||
('kp-2', 'lesson-1-1', NULL, '负数的概念', 1, '小于0的数叫做负数', 'system', 'system'),
|
||||
('kp-3', 'lesson-1-2', NULL, '有理数的分类', 2, '有理数包括整数和分数', 'system', 'system');
|
||||
|
||||
-- =============================================
|
||||
-- 6. 插入示例题目
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `questions` (`id`, `subject_id`, `content`, `options_config`, `question_type`, `answer`, `explanation`, `difficulty`, `created_by`, `updated_by`) VALUES
|
||||
('q-1', 'sub-math', '<p>下列各数中,是负数的是( )</p>', '{"options": ["A. 0", "B. -1", "C. 1", "D. 2"]}', 'SingleChoice', 'B', '<p>负数是小于0的数,所以答案是B</p>', 1, 'system', 'system'),
|
||||
('q-2', 'sub-math', '<p>|-5| = _____</p>', NULL, 'FillBlank', '5', '<p>绝对值表示数轴上的点到原点的距离</p>', 2, 'system', 'system'),
|
||||
('q-3', 'sub-math', '<p>计算:(-3) + 5 = ?</p>', NULL, 'Subjective', '2', '<p>负数加正数,按绝对值相减,取绝对值较大数的符号</p>', 2, 'system', 'system');
|
||||
|
||||
INSERT INTO `question_knowledge` (`id`, `question_id`, `knowledge_point_id`, `weight`, `created_by`, `updated_by`) VALUES
|
||||
('qk-1', 'q-1', 'kp-2', 100, 'system', 'system'),
|
||||
('qk-2', 'q-2', 'kp-3', 80, 'system', 'system');
|
||||
|
||||
-- =============================================
|
||||
-- 7. 插入示例试卷
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `exams` (`id`, `subject_id`, `title`, `total_score`, `suggested_duration`, `status`, `created_by`, `updated_by`) VALUES
|
||||
('exam-1', 'sub-math', '第一章单元测试', 100, 90, 'Published', 'user-teacher-1', 'user-teacher-1');
|
||||
|
||||
-- 试卷节点(树形结构示例)
|
||||
INSERT INTO `exam_nodes` (`id`, `exam_id`, `parent_node_id`, `node_type`, `question_id`, `title`, `description`, `score`, `sort_order`, `created_by`, `updated_by`) VALUES
|
||||
('node-1', 'exam-1', NULL, 'Group', NULL, '第一部分:选择题', '本大题共2小题,每小题5分,共10分', 10, 1, 'user-teacher-1', 'user-teacher-1'),
|
||||
('node-1-1', 'exam-1', 'node-1', 'Question', 'q-1', NULL, NULL, 5, 1, 'user-teacher-1', 'user-teacher-1'),
|
||||
('node-1-2', 'exam-1', 'node-1', 'Question', 'q-2', NULL, NULL, 5, 2, 'user-teacher-1', 'user-teacher-1'),
|
||||
('node-2', 'exam-1', NULL, 'Group', NULL, '第二部分:解答题', '需要写出完整步骤', 90, 2, 'user-teacher-1', 'user-teacher-1'),
|
||||
('node-2-1', 'exam-1', 'node-2', 'Question', 'q-3', NULL, NULL, 90, 1, 'user-teacher-1', 'user-teacher-1');
|
||||
|
||||
-- =============================================
|
||||
-- 8. 插入示例作业
|
||||
-- =============================================
|
||||
|
||||
INSERT INTO `assignments` (`id`, `exam_id`, `class_id`, `title`, `start_time`, `end_time`, `allow_late_submission`, `auto_score_enabled`, `created_by`, `updated_by`) VALUES
|
||||
('assignment-1', 'exam-1', 'class-1', '第一章课后作业', '2024-11-20 08:00:00', '2024-11-27 23:59:59', TRUE, TRUE, 'user-teacher-1', 'user-teacher-1');
|
||||
|
||||
-- 插入学生提交记录
|
||||
INSERT INTO `student_submissions` (`id`, `assignment_id`, `student_id`, `submission_status`, `submit_time`, `time_spent_seconds`, `total_score`, `created_by`, `updated_by`) VALUES
|
||||
('sub-1', 'assignment-1', 'user-student-1', 'Graded', '2024-11-25 10:30:00', 1800, 95, 'user-student-1', 'user-teacher-1');
|
||||
|
||||
-- 插入答题详情
|
||||
INSERT INTO `submission_details` (`id`, `submission_id`, `exam_node_id`, `student_answer`, `score`, `judgement`, `teacher_comment`, `created_by`, `updated_by`) VALUES
|
||||
('sd-1', 'sub-1', 'node-1-1', 'B', 5, 'Correct', '正确', 'user-student-1', 'user-teacher-1'),
|
||||
('sd-2', 'sub-1', 'node-1-2', '5', 5, 'Correct', '正确', 'user-student-1', 'user-teacher-1'),
|
||||
('sd-3', 'sub-1', 'node-2-1', '(-3) + 5 = 5 - 3 = 2', 85, 'Partial', '步骤正确,但表述可以更规范', 'user-student-1', 'user-teacher-1');
|
||||
|
||||
-- =============================================
|
||||
-- 完成
|
||||
-- =============================================
|
||||
|
||||
SELECT '初始化数据插入完成' AS Status;
|
||||
Reference in New Issue
Block a user