Parcourir la source

添加班级码功能,修改创建班级和选课接口

zhi.li102 il y a 1 an
Parent
commit
33ab97ccc9

+ 5 - 0
add_class_code_column.sql

@@ -0,0 +1,5 @@
+-- 在class表中添加class_code字段
+ALTER TABLE class ADD COLUMN class_code VARCHAR(20) NOT NULL COMMENT '班级码' AFTER teacher_id;
+
+-- 创建唯一索引确保班级码唯一性
+CREATE UNIQUE INDEX idx_class_code ON class(class_code);

+ 319 - 130
eaidb.sql

@@ -1,151 +1,340 @@
-CREATE DATABASE eai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+/*
+ Navicat Premium Data Transfer
 
-CREATE TABLE IF NOT EXISTS `eai`.`users` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'User唯一标识(自增)',
-  `name` varchar(50) NOT NULL COMMENT '真实姓名(必填)',
-  `official_email` varchar(100) NOT NULL COMMENT '南大官邮,xxx@smail.nju.edu.cn(必填)',
-  `official_number` varchar(20) NOT NULL COMMENT '南大学号、工号(必填)',
-  `role` tinyint NOT NULL COMMENT '用户角色:0-ADMIN, 1-STUDENT, 2-TEACHER(对应枚举code)',
-  `user_avatar` varchar(255) DEFAULT 'default_avatar_url' COMMENT '头像URL(有默认值、选填)',
-  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间,系统自动设置',
-  `last_login_time` datetime COMMENT '上一次登陆时间(可选)',
-  `english_name` varchar(50) COMMENT '英文名(选填)',
-  `gender` tinyint COMMENT '性别:0-MAN, 1-WOMAN(对应枚举code)',
-  `birthday` date COMMENT '生日(选填)',
-  `phone` varchar(20) COMMENT '联系方式(选填)',
-  `content_email` varchar(100) COMMENT '联系邮箱(选填)',
-  `pid` varchar(50) COMMENT '门户id',
-  `password` varchar(100) NOT NULL COMMENT '密码(加密存储)(必填)',
-  PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-
-CREATE TABLE IF NOT EXISTS `eai`.`translations` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '翻译记录唯一标识(自增)',
-  `user_id` bigint NOT NULL COMMENT '关联用户ID',
-  `assignment_id` bigint COMMENT '关联任务ID(可选)',
-  `query_text` text NOT NULL COMMENT '待翻译原文',
-  `query_result` text NOT NULL COMMENT '翻译结果',
-  `target_language` varchar(20) NOT NULL COMMENT '目标语言类型(如zh/en等)',
-  `query_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '翻译请求时间',
-  PRIMARY KEY (`id`),
-  KEY `idx_user_id` (`user_id`),
-  KEY `idx_assignment_id` (`assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='翻译记录表';
+ Source Server         : online_eai
+ Source Server Type    : MySQL
+ Source Server Version : 80027
+ Source Host           : 8.130.28.19:3306
+ Source Schema         : eai
 
-CREATE TABLE IF NOT EXISTS `eai`.`sentence_evaluation` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
+ Target Server Type    : MySQL
+ Target Server Version : 80027
+ File Encoding         : 65001
+
+ Date: 17/08/2025 18:58:59
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for ai_speaking_assignment
+-- ----------------------------
+DROP TABLE IF EXISTS `ai_speaking_assignment`;
+CREATE TABLE `ai_speaking_assignment`  (
+  `ai_speaking_assignment_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'AI口语作业ID(自增主键)',
+  `assignment_id` bigint NOT NULL COMMENT '关联的基础作业ID',
+  `min_duration` int NOT NULL DEFAULT 60 COMMENT '最小持续时间(秒)',
+  `min_interaction` int NOT NULL DEFAULT 5 COMMENT '最小交互次数',
+  `survey_links` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '调查问卷链接(JSON格式)',
+  `survey_duration` int NULL DEFAULT NULL COMMENT '问卷预计完成时间(秒)',
+  PRIMARY KEY (`ai_speaking_assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI口语专项作业表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for assignment
+-- ----------------------------
+DROP TABLE IF EXISTS `assignment`;
+CREATE TABLE `assignment`  (
+  `assignment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '作业ID(自增主键)',
+  `course_id` bigint NOT NULL COMMENT '所属课程ID(外键)',
+  `assignment_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作业名称',
+  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '作业描述',
+  `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作业类型(如HOMEWORK/QUIZ/EXAM等)',
+  `description_file` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '作业要求文件URL',
+  `attachments` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '附件URL列表(JSON格式)',
+  `teacher_id` bigint NOT NULL COMMENT '发布教师ID',
+  `start_time` datetime NOT NULL COMMENT '开始时间',
+  `end_time` datetime NOT NULL COMMENT '截止时间',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `teacher_portal_id` bigint NULL DEFAULT NULL,
+  `correct_number` int NULL DEFAULT 0,
+  `engage_number` int NULL DEFAULT 0,
+  PRIMARY KEY (`assignment_id`) USING BTREE,
+  INDEX `idx_time_range`(`start_time`, `end_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 79 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '课程作业表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for behavior_record
+-- ----------------------------
+DROP TABLE IF EXISTS `behavior_record`;
+CREATE TABLE `behavior_record`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '行为记录ID(自增主键)',
   `student_id` bigint NOT NULL COMMENT '学生ID',
   `assignment_id` bigint NOT NULL COMMENT '作业ID',
-  `no` int NOT NULL COMMENT '句子编号',
-  `content` text COMMENT '原始内容',
-  `sentence` text NOT NULL COMMENT '待评估句子',
-  `evaluation` text COMMENT '评估结果',
-  `version` int DEFAULT 1 COMMENT '版本号',
-  `type` varchar(50) COMMENT '句子类型',
-  `category` varchar(50) COMMENT '句子类别',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_assignment` (`student_id`, `assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='句子评估表';
-
-CREATE TABLE IF NOT EXISTS `eai`.`overall_evaluation` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
+  `record_file_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '行为记录文件URL',
+  `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 76 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生学习行为记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for class
+-- ----------------------------
+DROP TABLE IF EXISTS `class`;
+CREATE TABLE `class`  (
+  `class_id` bigint NOT NULL AUTO_INCREMENT,
+  `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `class_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+  `course_id` bigint NOT NULL,
+  `stu_number` int NULL DEFAULT NULL,
+  `teacher_id` bigint NULL DEFAULT NULL,
+  PRIMARY KEY (`class_id`) USING BTREE,
+  INDEX `idx_class_course`(`course_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for class_student
+-- ----------------------------
+DROP TABLE IF EXISTS `class_student`;
+CREATE TABLE `class_student`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `class_id` bigint NOT NULL,
+  `official_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `state` int NULL DEFAULT NULL,
+  `stu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_class_student_class`(`class_id`) USING BTREE,
+  INDEX `idx_class_student_official`(`official_number`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for course
+-- ----------------------------
+DROP TABLE IF EXISTS `course`;
+CREATE TABLE `course`  (
+  `course_id` bigint NOT NULL AUTO_INCREMENT COMMENT '课程ID(自增主键)',
+  `course_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程名称',
+  `teacher_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '教师ID列表(JSON序列化字符串)',
+  `teacher_portal_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '教师门户ID',
+  `enroll_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '选课码(唯一)',
+  `course_imgs` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '课程图片列表(JSON序列化字符串)',
+  `target_grade` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '目标年级',
+  `start_time` datetime NOT NULL COMMENT '课程开始时间',
+  `end_time` datetime NOT NULL COMMENT '课程结束时间',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '课程描述',
+  `course_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
+  PRIMARY KEY (`course_id`) USING BTREE,
+  INDEX `idx_time_range`(`start_time`, `end_time`) USING BTREE,
+  INDEX `idx_course_teacher_pid`(`teacher_portal_id`) USING BTREE,
+  INDEX `idx_course_time_range`(`start_time`, `end_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '课程信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for course_student
+-- ----------------------------
+DROP TABLE IF EXISTS `course_student`;
+CREATE TABLE `course_student`  (
+  `enrollment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '选课记录ID(自增主键)',
+  `course_id` bigint NOT NULL COMMENT '课程ID',
   `student_id` bigint NOT NULL COMMENT '学生ID',
-  `assignment_id` bigint NOT NULL COMMENT '作业ID',
-  `content` text COMMENT '作业内容',
-  `version` int NOT NULL DEFAULT 1 COMMENT '批改版本(跟随作业版本)',
-  `evaluation` text COMMENT '整体评估结果',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_assignment` (`student_id`, `assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='作业整体评估表';
+  PRIMARY KEY (`enrollment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生选课关联表' ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`evaluation` (
+-- ----------------------------
+-- Table structure for evaluation
+-- ----------------------------
+DROP TABLE IF EXISTS `evaluation`;
+CREATE TABLE `evaluation`  (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评价ID(自增主键)',
   `student_id` bigint NOT NULL COMMENT '学生ID',
   `assignment_id` bigint NOT NULL COMMENT '作业ID',
   `version` int NOT NULL DEFAULT 1 COMMENT '评价版本号',
   `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '评价时间',
-  `author` varchar(100) NOT NULL COMMENT '评价人',
-  `overall` int COMMENT '整体评分',
-  `sentence` int COMMENT '句子评分',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_assignment` (`student_id`, `assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='作业评价表';
-
-CREATE TABLE IF NOT EXISTS `eai`.`course_student` (
-  `enrollment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '选课记录ID(自增主键)',
-  `course_id` bigint NOT NULL COMMENT '课程ID',
-  `student_id` bigint NOT NULL COMMENT '学生ID',
-  PRIMARY KEY (`enrollment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生选课关联表';
+  `author` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '评价人',
+  `overall` int NULL DEFAULT NULL COMMENT '整体评分',
+  `sentence` int NULL DEFAULT NULL COMMENT '句子评分',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '作业评价表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for general_log
+-- ----------------------------
+DROP TABLE IF EXISTS `general_log`;
+CREATE TABLE `general_log`  (
+  `event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
+  `user_host` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+  `thread_id` bigint UNSIGNED NOT NULL,
+  `server_id` int UNSIGNED NOT NULL,
+  `command_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+  `argument` mediumblob NOT NULL
+) ENGINE = CSV CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'General log' ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`student_assignment` (
+-- ----------------------------
+-- Table structure for overall_evaluation
+-- ----------------------------
+DROP TABLE IF EXISTS `overall_evaluation`;
+CREATE TABLE `overall_evaluation`  (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
-  `assignment_id` bigint NOT NULL COMMENT '作业ID',
   `student_id` bigint NOT NULL COMMENT '学生ID',
-  `score` decimal(5,2) COMMENT '作业得分(百分制)',
-  `remark` varchar(500) COMMENT '教师评语',
-  `file_url` varchar(255) COMMENT '作业文件OSS链接',
-  `version` int NOT NULL DEFAULT 1 COMMENT '文件版本(用于onlyoffice key构建)',
-  `status` varchar(20) NOT NULL DEFAULT 'UNSUBMITTED' COMMENT '完成状态:UNSUBMITTED/SUBMITTED/GRADED',
-  `quill_content` text COMMENT 'Quill富文本内容',
-  `text_content` text COMMENT '纯文本内容',
-  `html_content` text COMMENT 'HTML格式内容',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_assignment` (`student_id`, `assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生作业关联表';
+  `assignment_id` bigint NOT NULL COMMENT '作业ID',
+  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '作业内容',
+  `version` int NOT NULL DEFAULT 1 COMMENT '批改版本(跟随作业版本)',
+  `evaluation` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '整体评估结果',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '作业整体评估表' ROW_FORMAT = Dynamic;
 
+-- ----------------------------
+-- Table structure for phone_verification
+-- ----------------------------
+DROP TABLE IF EXISTS `phone_verification`;
+CREATE TABLE `phone_verification`  (
+  `id` bigint NOT NULL,
+  `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `code_time` datetime(6) NULL DEFAULT NULL,
+  `phone` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `UK_1ebndp9bn7nuiyqujcmeifojg`(`phone`) USING BTREE,
+  INDEX `verification_phone_index`(`phone`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`course` (
-  `course_id` bigint NOT NULL AUTO_INCREMENT COMMENT '课程ID(自增主键)',
-  `course_name` varchar(100) NOT NULL COMMENT '课程名称',
-  `teacher_ids` text COMMENT '教师ID列表(JSON序列化字符串)',
-  `teacher_portal_id` varchar(50) COMMENT '教师门户ID',
-  `enroll_code` varchar(20) COMMENT '选课码(唯一)',
-  `course_imgs` text COMMENT '课程图片列表(JSON序列化字符串)',
-  `target_grade` varchar(50) COMMENT '目标年级',
-  `start_time` datetime NOT NULL COMMENT '课程开始时间',
-  `end_time` datetime NOT NULL COMMENT '课程结束时间',
-  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-  `description` text COMMENT '课程描述',
-  PRIMARY KEY (`course_id`),
-  KEY `idx_time_range` (`start_time`, `end_time`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程信息表';
+-- ----------------------------
+-- Table structure for phone_verification_seq
+-- ----------------------------
+DROP TABLE IF EXISTS `phone_verification_seq`;
+CREATE TABLE `phone_verification_seq`  (
+  `next_val` bigint NULL DEFAULT NULL
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`behavior_record` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '行为记录ID(自增主键)',
+-- ----------------------------
+-- Table structure for sentence_evaluation
+-- ----------------------------
+DROP TABLE IF EXISTS `sentence_evaluation`;
+CREATE TABLE `sentence_evaluation`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
   `student_id` bigint NOT NULL COMMENT '学生ID',
   `assignment_id` bigint NOT NULL COMMENT '作业ID',
-  `record_file_url` varchar(255) NOT NULL COMMENT '行为记录文件URL',
-  `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
-  PRIMARY KEY (`id`),
-  KEY `idx_student_assignment` (`student_id`, `assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生学习行为记录表';
+  `no` int NOT NULL COMMENT '句子编号',
+  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '原始内容',
+  `sentence` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '待评估句子',
+  `evaluation` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '评估结果',
+  `version` int NULL DEFAULT 1 COMMENT '版本号',
+  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '句子类型',
+  `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '句子类别',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 74 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '句子评估表' ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`assignment` (
-  `assignment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '作业ID(自增主键)',
-  `course_id` bigint NOT NULL COMMENT '所属课程ID(外键)',
-  `teacher_portal_id` varchar(50) COMMENT '教师门户ID',
-  `assignment_name` varchar(100) NOT NULL COMMENT '作业名称',
-  `description` text COMMENT '作业描述',
-  `type` varchar(30) NOT NULL COMMENT '作业类型(如HOMEWORK/QUIZ/EXAM等)',
-  `description_file` varchar(255) COMMENT '作业要求文件URL',
-  `attachments` text COMMENT '附件URL列表(JSON格式)',
-  `teacher_id` bigint NOT NULL COMMENT '发布教师ID',
-  `start_time` datetime NOT NULL COMMENT '开始时间',
-  `end_time` datetime NOT NULL COMMENT '截止时间',
-  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-  `engage_number` int  COMMENT '参与人数',
-  `correct_number` int  COMMENT '批改人数',
-  PRIMARY KEY (`assignment_id`),
-  KEY `idx_time_range` (`start_time`, `end_time`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程作业表';
+-- ----------------------------
+-- Table structure for sign_records
+-- ----------------------------
+DROP TABLE IF EXISTS `sign_records`;
+CREATE TABLE `sign_records`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `official_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `sign_in_time` datetime(6) NULL DEFAULT NULL,
+  `sign_status` enum('SIGNED','NOT_SIGNED','FINISHED') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `sign_task_id` bigint NOT NULL,
+  `student_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_sign_record_task`(`sign_task_id`) USING BTREE,
+  INDEX `idx_sign_record_official_task`(`official_number`, `sign_task_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
-CREATE TABLE IF NOT EXISTS `eai`.`ai_speaking_assignment` (
-  `ai_speaking_assignment_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'AI口语作业ID(自增主键)',
-  `assignment_id` bigint NOT NULL COMMENT '关联的基础作业ID',
-  `min_duration` int NOT NULL DEFAULT 60 COMMENT '最小持续时间(秒)',
-  `min_interaction` int NOT NULL DEFAULT 5 COMMENT '最小交互次数',
-  `survey_links` text COMMENT '调查问卷链接(JSON格式)',
-  `survey_duration` int COMMENT '问卷预计完成时间(秒)',
-  PRIMARY KEY (`ai_speaking_assignment_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI口语专项作业表';
+-- ----------------------------
+-- Table structure for sign_tasks
+-- ----------------------------
+DROP TABLE IF EXISTS `sign_tasks`;
+CREATE TABLE `sign_tasks`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `class_id` bigint NOT NULL,
+  `course_id` bigint NOT NULL,
+  `create_time` timestamp NULL DEFAULT NULL,
+  `end_time` timestamp NULL DEFAULT NULL,
+  `sign_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `sign_type` enum('NUMBER','QR') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `signed_number` int NULL DEFAULT NULL,
+  `status` enum('PROCESSING','FINISHED') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `teacher_id` bigint NOT NULL,
+  `total_number` int NULL DEFAULT NULL,
+  `qr_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+  `time` int NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_sign_task_teacher`(`teacher_id`) USING BTREE,
+  INDEX `idx_sign_task_class`(`class_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for slow_log
+-- ----------------------------
+DROP TABLE IF EXISTS `slow_log`;
+CREATE TABLE `slow_log`  (
+  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
+  `user_host` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+  `query_time` time(6) NOT NULL,
+  `lock_time` time(6) NOT NULL,
+  `rows_sent` int NOT NULL,
+  `rows_examined` int NOT NULL,
+  `db` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+  `last_insert_id` int NOT NULL,
+  `insert_id` int NOT NULL,
+  `server_id` int UNSIGNED NOT NULL,
+  `sql_text` mediumblob NOT NULL,
+  `thread_id` bigint UNSIGNED NOT NULL
+) ENGINE = CSV CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'Slow log' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for student_assignment
+-- ----------------------------
+DROP TABLE IF EXISTS `student_assignment`;
+CREATE TABLE `student_assignment`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
+  `assignment_id` bigint NOT NULL COMMENT '作业ID',
+  `student_id` bigint NOT NULL COMMENT '学生ID',
+  `score` decimal(5, 2) NULL DEFAULT NULL COMMENT '作业得分(百分制)',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '教师评语',
+  `file_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '作业文件OSS链接',
+  `version` int NOT NULL DEFAULT 1 COMMENT '文件版本(用于onlyoffice key构建)',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'UNSUBMITTED' COMMENT '完成状态:UNSUBMITTED/SUBMITTED/GRADED',
+  `quill_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'Quill富文本内容',
+  `text_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '纯文本内容',
+  `html_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'HTML格式内容',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 95 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生作业关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for translations
+-- ----------------------------
+DROP TABLE IF EXISTS `translations`;
+CREATE TABLE `translations`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '翻译记录唯一标识(自增)',
+  `user_id` bigint NOT NULL COMMENT '关联用户ID',
+  `assignment_id` bigint NULL DEFAULT NULL COMMENT '关联任务ID(可选)',
+  `query_text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '待翻译原文',
+  `query_result` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '翻译结果',
+  `target_language` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '目标语言类型(如zh/en等)',
+  `query_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '翻译请求时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_user_id`(`user_id`) USING BTREE,
+  INDEX `idx_assignment_id`(`assignment_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '翻译记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for users
+-- ----------------------------
+DROP TABLE IF EXISTS `users`;
+CREATE TABLE `users`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'User唯一标识(自增)',
+  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '真实姓名(必填)',
+  `official_email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '南大官邮,xxx@smail.nju.edu.cn(必填)',
+  `official_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '南大学号、工号(必填)',
+  `role` smallint NULL DEFAULT NULL,
+  `user_avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'default_avatar_url' COMMENT '头像URL(有默认值、选填)',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间,系统自动设置',
+  `last_login_time` datetime NULL DEFAULT NULL COMMENT '上一次登陆时间(可选)',
+  `english_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '英文名(选填)',
+  `gender` smallint NULL DEFAULT NULL,
+  `birthday` date NULL DEFAULT NULL COMMENT '生日(选填)',
+  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式(选填)',
+  `content_email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系邮箱(选填)',
+  `pid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '门户id',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码(加密存储)(必填)',
+  `contact_email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 77 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 14 - 0
src/main/java/com/njuzr/eaibackend/controller/ClassController.java

@@ -23,11 +23,25 @@ public class ClassController {
         this.classService = classService;
     }
 
+    /**
+     * 原来的创建班级接口,已注释
+     */
+    /*
     @PostMapping("/create")
     public MyResponse createClass(@RequestBody ClassDTO classDTO){
         Class aClass = classService.createClass(classDTO);
         return MyResponse.success(aClass);
     }
+    */
+
+    /**
+     * 新的创建班级接口,生成班级码
+     */
+    @PostMapping("/create")
+    public MyResponse<ClassVO> createClassWithCode(@RequestBody ClassDTO classDTO) {
+        ClassVO result = classService.createClass(classDTO);
+        return MyResponse.success(result);
+    }
 
     @PutMapping("/update")
     public MyResponse updateClass(@RequestBody ClassDTO classDTO){

+ 24 - 3
src/main/java/com/njuzr/eaibackend/controller/CourseController.java

@@ -242,20 +242,41 @@ public class CourseController {
     }
 
     /**
-     * 选课,通过studentId和courseId,完成选课。其中studentId从Token中获取。
+     * 原来的选课接口,已注释
+     */
+    /*
+    @PreAuthorize("hasRole('STUDENT')")
+    @PostMapping("/enroll")
+    public MyResponse enroll(
+            @AuthenticationPrincipal(expression = "id") Long studentId,
+            @RequestBody EnrollDTO enrollDTO
+    ) {
+        try {
+            enrollDTO.setStudentId(studentId);
+            courseService.enroll(enrollDTO);
+            return MyResponse.success("选课成功");
+        }
+        catch (MyException e){
+            return MyResponse.error(e.getErrCode(),e.getMessage());
+        }
+    }
+    */
+
+    /**
+     * 新的选课接口,通过班级码将学生加入对应班级
      * @param studentId
      * @param enrollDTO
      * @return
      */
     @PreAuthorize("hasRole('STUDENT')")
     @PostMapping("/enroll")
-    public MyResponse enroll(
+    public MyResponse enrollByClassCode(
             @AuthenticationPrincipal(expression = "id") Long studentId,
             @RequestBody EnrollDTO enrollDTO
     ) {
         try {
             enrollDTO.setStudentId(studentId);
-            courseService.enroll(enrollDTO);
+            courseService.enrollByClassCode(enrollDTO);
             return MyResponse.success("选课成功");
         }
         catch (MyException e){

+ 2 - 0
src/main/java/com/njuzr/eaibackend/po/Class.java

@@ -18,4 +18,6 @@ public class Class {
     private String classTime;
 
     private Long teacherId;
+
+    private String classCode;
 }

+ 6 - 0
src/main/java/com/njuzr/eaibackend/service/ClassService.java

@@ -41,4 +41,10 @@ public interface ClassService {
     List<StudentInfoVO> getStudentsByClassId(Long classId);
 
     Class getClassById(Long classId);
+
+    // 生成班级码
+    String generateClassCode();
+
+    // 检查班级码是否唯一
+    boolean isClassCodeUnique(String classCode);
 }

+ 3 - 0
src/main/java/com/njuzr/eaibackend/service/CourseService.java

@@ -34,6 +34,9 @@ public interface CourseService {
 
     void enroll(EnrollDTO enrollDTO);
 
+    // 通过班级码选课
+    void enrollByClassCode(EnrollDTO enrollDTO);
+
     IPage<UserVO> getEnrollmentsByCourse(Page<User> page, Long teacherId, Long courseId);
 
     IPage<CourseVO> getEnrollmentsByStudent(Page<Course> page, Long studentId);

+ 45 - 4
src/main/java/com/njuzr/eaibackend/service/impl/ClassServiceImpl.java

@@ -43,18 +43,59 @@ public class ClassServiceImpl implements ClassService {
     }
 
     @Override
-    public Class createClass(ClassDTO classDTO) {
-        Class aClass =new Class();
+    public ClassVO createClass(ClassDTO classDTO) {
+        Class aClass = new Class();
         aClass.setClassName(classDTO.getClassName());
         aClass.setCourseId(classDTO.getCourseId());
         aClass.setClassTime(classDTO.getClassTime());
         aClass.setTeacherId(classDTO.getTeacherId());
+        aClass.setStuNumber(0); // 初始人数为0
+
+        // 生成班级码
+        String classCode = generateClassCode();
+        aClass.setClassCode(classCode);
+
         int status = classMapper.insert(aClass);
         if (status == 0) {
-            log.error("创建课程失败,数据库插入错误!");
+            log.error("创建班级失败,数据库插入错误!");
             throw new MyException(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()+":"+"创建班级错误");
         }
-        return aClass;
+
+        return convertToVO(aClass);
+    }
+
+    private String generateClassCode() {
+        // 生成6位字母数字组合的班级码
+        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+        Random random = new Random();
+        StringBuilder codeBuilder = new StringBuilder();
+
+        for (int i = 0; i < 6; i++) {
+            int index = random.nextInt(characters.length());
+            codeBuilder.append(characters.charAt(index));
+        }
+
+        String classCode = codeBuilder.toString();
+
+        // 检查唯一性,如果不唯一则重新生成
+        if (!isClassCodeUnique(classCode)) {
+            return generateClassCode();
+        }
+
+        return classCode;
+    }
+
+    private boolean isClassCodeUnique(String classCode) {
+        QueryWrapper<Class> wrapper = new QueryWrapper<>();
+        wrapper.eq("class_code", classCode);
+        Class existingClass = classMapper.selectOne(wrapper);
+        return existingClass == null;
+    }
+
+    private ClassVO convertToVO(Class aClass) {
+        ClassVO classVO = new ClassVO();
+        BeanUtils.copyProperties(aClass, classVO);
+        return classVO;
     }
 
     @Override

+ 80 - 0
src/main/java/com/njuzr/eaibackend/service/impl/CourseServiceImpl.java

@@ -327,6 +327,16 @@ public class CourseServiceImpl implements CourseService {
         if (!target.getEnrollCode().equals(enrollDTO.getEnrollCode()))
             throw MyException.create(HttpStatus.BAD_REQUEST, "选课码错误");
 
+        // 检查学生是否已经选过该课程
+        QueryWrapper<CourseStudent> wrapper = new QueryWrapper<>();
+        wrapper.eq("student_id", enrollDTO.getStudentId());
+        wrapper.eq("course_id", enrollDTO.getCourseId());
+        CourseStudent existingCourseStudent = courseStudentMapper.selectOne(wrapper);
+
+        if (existingCourseStudent != null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "学生已经选过该课程");
+        }
+
         Enrollment enrollment = ModelMapperUtil.map(enrollDTO, Enrollment.class);
         courseStudentMapper.insert(enrollment);
 
@@ -352,6 +362,76 @@ public class CourseServiceImpl implements CourseService {
         throw MyException.create(HttpStatus.BAD_REQUEST, "失败");
     }
 
+    @Override
+    @Transactional
+    public void enrollByClassCode(EnrollDTO enrollDTO) {
+        // 根据班级码查询班级信息
+        String classCode = enrollDTO.getEnrollCode();
+        QueryWrapper<Class> classWrapper = new QueryWrapper<>();
+        classWrapper.eq("class_code", classCode);
+        Class targetClass = classMapper.selectOne(classWrapper);
+
+        if (targetClass == null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "班级码不存在");
+        }
+
+        Long courseId = targetClass.getCourseId();
+        Long classId = targetClass.getClassId();
+
+        // 检查学生是否已经加入了该课程下的其他班级
+        QueryWrapper<ClassStudent> csWrapper = new QueryWrapper<>();
+        csWrapper.eq("student_id", enrollDTO.getStudentId());
+        csWrapper.inSql("class_id", "SELECT class_id FROM class WHERE course_id = " + courseId);
+        ClassStudent existingClassStudent = classStudentMapper.selectOne(csWrapper);
+
+        if (existingClassStudent != null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "学生已经加入了该课程下的一个班级");
+        }
+
+        // 检查学生是否已经选过该课程
+        QueryWrapper<CourseStudent> courseStudentWrapper = new QueryWrapper<>();
+        courseStudentWrapper.eq("student_id", enrollDTO.getStudentId());
+        courseStudentWrapper.eq("course_id", courseId);
+        CourseStudent existingCourseStudent = courseStudentMapper.selectOne(courseStudentWrapper);
+
+        if (existingCourseStudent == null) {
+            // 创建新的选课记录
+            Enrollment enrollment = new Enrollment();
+            enrollment.setStudentId(enrollDTO.getStudentId());
+            enrollment.setCourseId(courseId);
+            enrollment.setEnrollTime(new Date());
+            enrollment.setEnrollCode(classCode);
+
+            int status = courseStudentMapper.insert(enrollment);
+            if (status == 0) {
+                log.error("选课失败,数据库插入错误!");
+                throw new MyException(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()+":"+"选课错误");
+            }
+        }
+
+        // 将学生加入班级
+        ClassStudent classStudent = new ClassStudent();
+        classStudent.setStudentId(enrollDTO.getStudentId());
+        classStudent.setClassId(classId);
+        classStudent.setState(1); // 已加入状态
+
+        // 获取学生信息
+        User student = userMapper.selectById(enrollDTO.getStudentId());
+        if (student != null) {
+            classStudent.setOfficialNumber(student.getOfficialNumber());
+            classStudent.setStuName(student.getName());
+        }
+
+        int csStatus = classStudentMapper.insert(classStudent);
+        if (csStatus == 0) {
+            log.error("加入班级失败,数据库插入错误!");
+            throw new MyException(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase()+":"+"加入班级错误");
+        }
+
+        // 更新班级人数
+        classMapper.increaseStuNumber(classId, 1);
+    }
+
 
     /**
      * 获取某课程的所有选课学生信息

+ 48 - 0
src/main/java/com/njuzr/eaibackend/util/DatabaseMigrationUtil.java

@@ -0,0 +1,48 @@
+package com.njuzr.eaibackend.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.FileCopyUtils;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+@Component
+public class DatabaseMigrationUtil {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    /**
+     * 执行数据库迁移脚本
+     */
+    @PostConstruct
+    public void migrate() {
+        try {
+            // 读取SQL脚本
+            String sql = readSqlScript("add_class_code_column.sql");
+
+            // 执行SQL脚本
+            jdbcTemplate.execute(sql);
+            System.out.println("数据库迁移成功:添加class_code字段");
+        } catch (Exception e) {
+            System.err.println("数据库迁移失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 读取SQL脚本文件
+     */
+    private String readSqlScript(String fileName) throws IOException {
+        ClassPathResource resource = new ClassPathResource(fileName);
+        try (InputStream inputStream = resource.getInputStream()) {
+            byte[] bytes = FileCopyUtils.copyToByteArray(inputStream);
+            return new String(bytes, StandardCharsets.UTF_8);
+        }
+    }
+}