feat: 多班级版 v2.0 - Go后端重写 + 43轮代码审查
- 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 多班级完全隔离 - 超级管理员独立登录 - 课代表作业管理、排行榜分项排行 - 角色加减分上下限可配置 - 家长改密功能(可开关) - 周度/月度重置功能 - MySQL 5.7 兼容 - 43轮代码审查+全部修复 - Apache 2.0 许可证
This commit is contained in:
262
sql/init.sql
262
sql/init.sql
@@ -1,12 +1,13 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - 数据库初始化脚本
|
||||
-- 多班级版班级管理系统 - 数据库初始化脚本 (v2.0 Go重写版)
|
||||
-- 数据库: classmanagerdb
|
||||
-- 字符集: utf8mb4
|
||||
-- MySQL 兼容: 5.7+(不使用 CHECK 约束、窗口函数等 8.0+ 特性)
|
||||
--
|
||||
-- 开发者: Canglan
|
||||
-- 联系方式: admin@sea-studio.top
|
||||
-- 版权归属: Sea Network Technology Studio
|
||||
-- 许可证: MIT License
|
||||
-- 许可证: Apache License 2.0
|
||||
--
|
||||
-- 版权所有 © Sea Network Technology Studio
|
||||
-- ===========================================
|
||||
@@ -19,7 +20,22 @@ USE `classmanagerdb`;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- 学期表
|
||||
-- ===========================================
|
||||
-- 1. 班级表(多班级核心)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `classes` (
|
||||
`class_id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '班级ID',
|
||||
`class_name` VARCHAR(100) NOT NULL COMMENT '班级名称,如 高一(1)班',
|
||||
`grade` VARCHAR(50) DEFAULT NULL COMMENT '年级',
|
||||
`description` VARCHAR(255) DEFAULT NULL COMMENT '班级描述',
|
||||
`status` TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY `uk_class_name` (`class_name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 2. 学期表(系统级共享)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `semesters` (
|
||||
`semester_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`semester_name` VARCHAR(100) NOT NULL COMMENT '学期名称,如 2025春季学期',
|
||||
@@ -30,7 +46,9 @@ CREATE TABLE IF NOT EXISTS `semesters` (
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 科目表(仅保留语数英)
|
||||
-- ===========================================
|
||||
-- 3. 科目表(系统级共享)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `subjects` (
|
||||
`subject_id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '科目ID',
|
||||
`subject_name` VARCHAR(50) NOT NULL COMMENT '科目名称',
|
||||
@@ -41,27 +59,36 @@ CREATE TABLE IF NOT EXISTS `subjects` (
|
||||
UNIQUE KEY `uk_subject_name` (`subject_name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 学生表(无班级ID)
|
||||
-- ===========================================
|
||||
-- 4. 学生表(归属班级)
|
||||
-- 宿舍号格式: 南0-000, 东12-345, 北1-001, 西5-222
|
||||
-- 正则校验: ^[东南北西]\d{1,2}-\d{3}$(应用层校验,MySQL 5.7 不执行 CHECK 约束)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `students` (
|
||||
`student_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_no` VARCHAR(20) NOT NULL UNIQUE,
|
||||
`student_no` VARCHAR(20) NOT NULL,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
`total_points` INT DEFAULT 60,
|
||||
`parent_phone` VARCHAR(20) DEFAULT NULL,
|
||||
`dormitory_number` VARCHAR(20) DEFAULT NULL COMMENT '宿舍号',
|
||||
`parent_account` VARCHAR(50) DEFAULT NULL COMMENT '家长登录账号(推荐手机号)',
|
||||
`dormitory_number` VARCHAR(20) DEFAULT NULL COMMENT '宿舍号,格式:南0-000',
|
||||
`status` TINYINT DEFAULT 1,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`points_updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '分数最后更新时间',
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY `uk_student_no_class` (`student_no`, `class_id`),
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 用户表
|
||||
-- ===========================================
|
||||
-- 5. 用户表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`user_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL UNIQUE,
|
||||
`password_hash` VARCHAR(255) NOT NULL,
|
||||
`real_name` VARCHAR(50) NOT NULL,
|
||||
`user_type` ENUM('student', 'parent', 'admin') NOT NULL,
|
||||
`user_type` ENUM('student', 'parent', 'admin', 'super_admin') NOT NULL,
|
||||
`student_id` INT DEFAULT NULL,
|
||||
`status` TINYINT DEFAULT 1,
|
||||
`need_change_password` TINYINT DEFAULT 1,
|
||||
@@ -71,19 +98,40 @@ CREATE TABLE IF NOT EXISTS `users` (
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 管理员角色表(无班级ID)
|
||||
-- ===========================================
|
||||
-- 6. 系统管理员表(独立于班级的超级管理员)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `super_admins` (
|
||||
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '登录用户名',
|
||||
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希(MD5(SHA1(password)+salt))',
|
||||
`salt` VARCHAR(64) NOT NULL COMMENT '密码盐值',
|
||||
`real_name` VARCHAR(50) NOT NULL COMMENT '真实姓名',
|
||||
`status` TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
|
||||
`need_change_password` TINYINT DEFAULT 1 COMMENT '是否需要修改密码:1=需要,0=不需要',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 7. 管理员角色表(归属班级)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `admin_roles` (
|
||||
`admin_role_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`user_id` INT NOT NULL,
|
||||
`role_type` ENUM('班主任', '班长', '学习委员', '考勤委员', '劳动委员', '志愿委员') NOT NULL,
|
||||
`subject_id` INT DEFAULT NULL,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`role_type` ENUM('班主任', '班长', '学习委员', '考勤委员', '劳动委员', '志愿委员', '科任老师', '课代表') NOT NULL,
|
||||
`subject_id` INT DEFAULT NULL COMMENT '关联科目ID(科任老师/课代表必填)',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`subject_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_user_subject` (`user_id`, `subject_id`)
|
||||
UNIQUE KEY `uk_user_class` (`user_id`, `class_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 操行分记录表
|
||||
-- ===========================================
|
||||
-- 8. 操行分记录表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `conduct_records` (
|
||||
`record_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_id` INT NOT NULL,
|
||||
@@ -104,20 +152,26 @@ CREATE TABLE IF NOT EXISTS `conduct_records` (
|
||||
FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`semester_id`) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 作业表(无班级ID)
|
||||
-- ===========================================
|
||||
-- 9. 作业表(归属班级)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `assignments` (
|
||||
`assignment_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`subject_id` INT NOT NULL,
|
||||
`title` VARCHAR(100) NOT NULL,
|
||||
`description` TEXT,
|
||||
`deadline` DATE NOT NULL,
|
||||
`created_by` INT NOT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`subject_id`),
|
||||
FOREIGN KEY (`created_by`) REFERENCES `users`(`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 作业提交记录表
|
||||
-- ===========================================
|
||||
-- 10. 作业提交记录表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `homework_submissions` (
|
||||
`submission_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`assignment_id` INT NOT NULL,
|
||||
@@ -135,12 +189,14 @@ CREATE TABLE IF NOT EXISTS `homework_submissions` (
|
||||
UNIQUE KEY `uk_assignment_student` (`assignment_id`, `student_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 考勤记录表
|
||||
-- ===========================================
|
||||
-- 11. 考勤记录表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `attendance_records` (
|
||||
`attendance_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_id` INT NOT NULL,
|
||||
`date` DATE NOT NULL,
|
||||
`slot` ENUM('morning', 'afternoon', 'evening') DEFAULT 'morning' COMMENT '考勤时段:早上/中午/晚修',
|
||||
`slot` ENUM('morning', 'afternoon', 'evening') DEFAULT 'morning' COMMENT '考勤时段:早上/下午/晚修',
|
||||
`status` ENUM('present', 'absent', 'late', 'leave') DEFAULT 'present',
|
||||
`reason` VARCHAR(255) DEFAULT NULL,
|
||||
`recorder_id` INT NOT NULL,
|
||||
@@ -155,12 +211,15 @@ CREATE TABLE IF NOT EXISTS `attendance_records` (
|
||||
UNIQUE KEY `uk_student_date_slot` (`student_id`, `date`, `slot`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 操作日志表
|
||||
-- ===========================================
|
||||
-- 12. 操作日志表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `operation_logs` (
|
||||
`log_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`operator_id` INT NOT NULL,
|
||||
`operator_name` VARCHAR(50) DEFAULT NULL,
|
||||
`operator_role` VARCHAR(50) DEFAULT NULL,
|
||||
`class_id` INT DEFAULT NULL COMMENT '操作所属班级ID',
|
||||
`operation_type` VARCHAR(50) NOT NULL,
|
||||
`target_type` VARCHAR(50) DEFAULT NULL,
|
||||
`target_id` INT DEFAULT NULL,
|
||||
@@ -169,7 +228,9 @@ CREATE TABLE IF NOT EXISTS `operation_logs` (
|
||||
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 登录日志表
|
||||
-- ===========================================
|
||||
-- 13. 登录日志表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `login_logs` (
|
||||
`log_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL,
|
||||
@@ -180,15 +241,18 @@ CREATE TABLE IF NOT EXISTS `login_logs` (
|
||||
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 学期归档快照表
|
||||
-- ===========================================
|
||||
-- 14. 学期归档快照表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `semester_archives` (
|
||||
`archive_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`semester_id` INT NOT NULL,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`student_id` INT NOT NULL,
|
||||
`student_no` VARCHAR(20) NOT NULL,
|
||||
`student_name` VARCHAR(50) NOT NULL,
|
||||
`final_points` INT NOT NULL COMMENT '学期最终操行分',
|
||||
`rank_position` INT DEFAULT NULL COMMENT '排名',
|
||||
`rank_position` INT DEFAULT NULL COMMENT '班级内排名',
|
||||
`total_students` INT DEFAULT NULL COMMENT '班级总人数',
|
||||
`attendance_present` INT DEFAULT 0 COMMENT '出勤次数',
|
||||
`attendance_absent` INT DEFAULT 0 COMMENT '缺勤次数',
|
||||
@@ -199,41 +263,161 @@ CREATE TABLE IF NOT EXISTS `semester_archives` (
|
||||
`homework_late` INT DEFAULT 0 COMMENT '迟交作业数',
|
||||
`archived_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`semester_id`),
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 系统设置表
|
||||
-- ===========================================
|
||||
-- 15. 系统设置表(全局)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `system_settings` (
|
||||
`setting_key` VARCHAR(50) PRIMARY KEY,
|
||||
`setting_value` VARCHAR(255) NOT NULL,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 性能索引(v2.0)
|
||||
CREATE INDEX `idx_conduct_semester` ON `conduct_records`(`semester_id`);
|
||||
CREATE INDEX `idx_attendance_semester` ON `attendance_records`(`semester_id`);
|
||||
CREATE INDEX `idx_conduct_student` ON `conduct_records`(`student_id`);
|
||||
-- ===========================================
|
||||
-- 16. 班级设置表(每班级独立配置,班主任可修改)
|
||||
-- setting_key 约定:
|
||||
-- 角色加减分上下限:
|
||||
-- point_limit_班主任_max / point_limit_班主任_min
|
||||
-- point_limit_班长_max / point_limit_班长_min (默认 ±5)
|
||||
-- point_limit_学习委员_max / point_limit_学习委员_min (默认 ±5)
|
||||
-- point_limit_考勤委员_max / point_limit_考勤委员_min
|
||||
-- point_limit_劳动委员_max / point_limit_劳动委员_min (默认 ±1)
|
||||
-- point_limit_志愿委员_max / point_limit_志愿委员_min (默认 0~5)
|
||||
-- point_limit_科任老师_max / point_limit_科任老师_min (默认 ±5)
|
||||
-- 操行分初始值:
|
||||
-- initial_points (默认 60)
|
||||
-- 扣分规则:
|
||||
-- deduction_homework_not_submit (默认 2)
|
||||
-- deduction_homework_late (默认 1)
|
||||
-- deduction_attendance_absent (默认 3)
|
||||
-- deduction_attendance_late (默认 1)
|
||||
-- deduction_attendance_leave (默认 0)
|
||||
-- 家长相关:
|
||||
-- parent_password_change_enabled (默认 true)
|
||||
-- parent_account_enabled (默认 true)
|
||||
-- 周期重置:
|
||||
-- reset_frequency (默认 none: 仅学期结算; weekly: 每周; monthly: 每月)
|
||||
-- reset_day_of_week (默认 1: 周重置日 1=周一 ~ 7=周日,仅 weekly 时生效)
|
||||
-- reset_day_of_month (默认 1: 月重置日 1~28,仅 monthly 时生效)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `class_settings` (
|
||||
`setting_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`setting_key` VARCHAR(50) NOT NULL COMMENT '设置项键名',
|
||||
`setting_value` VARCHAR(255) NOT NULL COMMENT '设置项值',
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_class_setting` (`class_id`, `setting_key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 性能索引(v2.1)
|
||||
CREATE INDEX `idx_student_created` ON `conduct_records`(`student_id`, `created_at`);
|
||||
CREATE INDEX `idx_recorder_id` ON `conduct_records`(`recorder_id`);
|
||||
CREATE INDEX `idx_date` ON `attendance_records`(`date`);
|
||||
CREATE INDEX `idx_username_created` ON `login_logs`(`username`, `created_at`);
|
||||
CREATE INDEX `idx_operator_created` ON `operation_logs`(`operator_id`, `created_at`);
|
||||
CREATE INDEX `idx_semester_id` ON `semester_archives`(`semester_id`);
|
||||
-- ===========================================
|
||||
-- 17. 周期归档快照表(周/月重置时创建)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `period_archives` (
|
||||
`archive_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`period_type` ENUM('weekly', 'monthly') NOT NULL COMMENT '周期类型:weekly=周,monthly=月',
|
||||
`period_label` VARCHAR(50) NOT NULL COMMENT '周期标签,如 2025-W03、2025-01',
|
||||
`student_id` INT NOT NULL,
|
||||
`student_no` VARCHAR(20) NOT NULL,
|
||||
`student_name` VARCHAR(50) NOT NULL,
|
||||
`final_points` INT NOT NULL COMMENT '重置前操行分',
|
||||
`rank_position` INT DEFAULT NULL COMMENT '班级内排名',
|
||||
`total_students` INT DEFAULT NULL COMMENT '班级总人数',
|
||||
`archived_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`reset_by` VARCHAR(20) DEFAULT 'auto' COMMENT '重置触发方式:auto=自动定时,manual=手动触发',
|
||||
`operator_id` INT DEFAULT NULL COMMENT '手动触发的操作者ID',
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 18. 班级功能开关表(控制班级内各功能模块的启用/禁用)
|
||||
-- feature_key 约定:
|
||||
-- role_班长_enabled / role_学习委员_enabled / role_考勤委员_enabled
|
||||
-- role_劳动委员_enabled / role_志愿委员_enabled
|
||||
-- role_科任老师_enabled / role_课代表_enabled
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `class_features` (
|
||||
`feature_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`feature_key` VARCHAR(50) NOT NULL COMMENT '功能标识',
|
||||
`enabled` TINYINT DEFAULT 1 COMMENT '是否启用:1=启用,0=禁用',
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_class_feature` (`class_id`, `feature_key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 性能索引(使用存储过程实现 MySQL 5.7 兼容的条件索引创建)
|
||||
-- ===========================================
|
||||
DROP PROCEDURE IF EXISTS `create_index_if_not_exists`;
|
||||
DELIMITER //
|
||||
CREATE PROCEDURE `create_index_if_not_exists`(
|
||||
IN `p_table` VARCHAR(64),
|
||||
IN `p_index` VARCHAR(64),
|
||||
IN `p_columns` VARCHAR(255)
|
||||
)
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM `information_schema`.`statistics`
|
||||
WHERE `table_schema` = DATABASE()
|
||||
AND `table_name` = p_table
|
||||
AND `index_name` = p_index
|
||||
LIMIT 1
|
||||
) THEN
|
||||
SET @sql = CONCAT('CREATE INDEX `', p_index, '` ON `', p_table, '`(', p_columns, ')');
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END //
|
||||
DELIMITER ;
|
||||
|
||||
CALL `create_index_if_not_exists`('conduct_records', 'idx_conduct_semester', '`semester_id`');
|
||||
CALL `create_index_if_not_exists`('attendance_records', 'idx_attendance_semester', '`semester_id`');
|
||||
CALL `create_index_if_not_exists`('conduct_records', 'idx_conduct_student', '`student_id`');
|
||||
CALL `create_index_if_not_exists`('conduct_records', 'idx_student_created', '`student_id`, `created_at`');
|
||||
CALL `create_index_if_not_exists`('conduct_records', 'idx_recorder_id', '`recorder_id`');
|
||||
CALL `create_index_if_not_exists`('conduct_records', 'idx_conduct_type_semester', '`semester_id`, `related_type`, `student_id`');
|
||||
CALL `create_index_if_not_exists`('attendance_records', 'idx_attendance_date', '`date`');
|
||||
CALL `create_index_if_not_exists`('login_logs', 'idx_username_created', '`username`, `created_at`');
|
||||
CALL `create_index_if_not_exists`('operation_logs', 'idx_operator_created', '`operator_id`, `created_at`');
|
||||
CALL `create_index_if_not_exists`('semester_archives', 'idx_semester_id', '`semester_id`');
|
||||
CALL `create_index_if_not_exists`('students', 'idx_student_class', '`class_id`');
|
||||
CALL `create_index_if_not_exists`('admin_roles', 'idx_admin_role_class', '`class_id`');
|
||||
CALL `create_index_if_not_exists`('assignments', 'idx_assignment_class', '`class_id`');
|
||||
CALL `create_index_if_not_exists`('assignments', 'idx_assignment_subject', '`subject_id`');
|
||||
CALL `create_index_if_not_exists`('semester_archives', 'idx_archive_class', '`class_id`');
|
||||
CALL `create_index_if_not_exists`('operation_logs', 'idx_operation_class', '`class_id`');
|
||||
CALL `create_index_if_not_exists`('period_archives', 'idx_period_archive_type', '`class_id`, `period_type`, `period_label`');
|
||||
|
||||
DROP PROCEDURE IF EXISTS `create_index_if_not_exists`;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- ===========================================
|
||||
-- 初始数据
|
||||
-- ===========================================
|
||||
|
||||
-- 插入初始科目(仅语数英,如不存在)
|
||||
INSERT IGNORE INTO `subjects` (`subject_name`, `subject_code`, `sort_order`) VALUES
|
||||
('语文', 'CHI', 1),
|
||||
('数学', 'MATH', 2),
|
||||
('英语', 'ENG', 3);
|
||||
|
||||
-- 初始化系统版本号
|
||||
-- 初始化系统版本号
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('db_version', '2.7')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '2.7';
|
||||
VALUES ('db_version', '2.0')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '2.0';
|
||||
|
||||
-- 系统管理员独立登录路径
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('super_admin_login_path', '/super-admin/login')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '/super-admin/login';
|
||||
|
||||
-- 控制台输出初始化结果(含版本号)
|
||||
SELECT CONCAT('数据库初始化完成!版本: v', (SELECT setting_value FROM system_settings WHERE setting_key = 'db_version')) AS message;
|
||||
|
||||
@@ -1,106 +1,264 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.0 初始数据库结构
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: 系统初始版本,创建核心表结构。
|
||||
-- 包含: semesters, subjects, students, users,
|
||||
-- admin_roles, conduct_records, attendance_records
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- 多班级版班级管理系统 - v1.0 升级脚本
|
||||
-- 从旧版单班级系统升级到多班级版
|
||||
--
|
||||
-- 开发者: Canglan
|
||||
-- 联系方式: admin@sea-studio.top
|
||||
-- 版权归属: Sea Network Technology Studio
|
||||
-- 许可证: Apache License 2.0
|
||||
--
|
||||
-- 版权所有 © Sea Network Technology Studio
|
||||
--
|
||||
-- 升级说明:
|
||||
-- 1. 创建班级表、班级设置表、班级功能开关表
|
||||
-- 2. 将现有学生迁移到默认班级
|
||||
-- 3. 扩展管理员角色枚举(科任老师、课代表)
|
||||
-- 4. 修改学生表字段(parent_phone → parent_account)
|
||||
-- 5. 为所有现有表添加 class_id 字段
|
||||
-- 6. 创建系统管理员表(super_admins)
|
||||
-- 7. 添加班级设置预置项和功能开关预置项
|
||||
-- 8. 添加系统管理员登录路径配置
|
||||
-- ===========================================
|
||||
|
||||
-- 学期表
|
||||
CREATE TABLE IF NOT EXISTS `semesters` (
|
||||
`semester_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`semester_name` VARCHAR(100) NOT NULL COMMENT '学期名称',
|
||||
`start_date` DATE DEFAULT NULL COMMENT '学期开始日期',
|
||||
`end_date` DATE DEFAULT NULL COMMENT '学期结束日期',
|
||||
`is_active` TINYINT DEFAULT 0 COMMENT '是否为当前活跃学期',
|
||||
`is_archived` TINYINT DEFAULT 0 COMMENT '是否已归档',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
USE `classmanagerdb`;
|
||||
|
||||
-- 科目表
|
||||
CREATE TABLE IF NOT EXISTS `subjects` (
|
||||
`subject_id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '科目ID',
|
||||
`subject_name` VARCHAR(50) NOT NULL COMMENT '科目名称',
|
||||
`is_active` TINYINT DEFAULT 1 COMMENT '是否启用',
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ===========================================
|
||||
-- 1. 创建班级表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `classes` (
|
||||
`class_id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '班级ID',
|
||||
`class_name` VARCHAR(100) NOT NULL COMMENT '班级名称,如 高一(1)班',
|
||||
`grade` VARCHAR(50) DEFAULT NULL COMMENT '年级',
|
||||
`description` VARCHAR(255) DEFAULT NULL COMMENT '班级描述',
|
||||
`status` TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY `uk_subject_name` (`subject_name`)
|
||||
UNIQUE KEY `uk_class_name` (`class_name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 学生表
|
||||
CREATE TABLE IF NOT EXISTS `students` (
|
||||
`student_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_no` VARCHAR(20) NOT NULL UNIQUE,
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
`total_points` INT DEFAULT 60,
|
||||
`parent_phone` VARCHAR(20) DEFAULT NULL,
|
||||
`status` TINYINT DEFAULT 1,
|
||||
-- ===========================================
|
||||
-- 2. 创建班级设置表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `class_settings` (
|
||||
`setting_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`setting_key` VARCHAR(50) NOT NULL COMMENT '设置项键名',
|
||||
`setting_value` VARCHAR(255) NOT NULL COMMENT '设置项值',
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_class_setting` (`class_id`, `setting_key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 3. 创建班级功能开关表
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `class_features` (
|
||||
`feature_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`class_id` INT NOT NULL COMMENT '所属班级ID',
|
||||
`feature_key` VARCHAR(50) NOT NULL COMMENT '功能标识',
|
||||
`enabled` TINYINT DEFAULT 1 COMMENT '是否启用:1=启用,0=禁用',
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_class_feature` (`class_id`, `feature_key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 4. 创建系统管理员表(super_admins)
|
||||
-- ===========================================
|
||||
CREATE TABLE IF NOT EXISTS `super_admins` (
|
||||
`id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '登录用户名',
|
||||
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希(MD5(SHA1(password)+salt))',
|
||||
`salt` VARCHAR(64) NOT NULL COMMENT '密码盐值',
|
||||
`real_name` VARCHAR(50) NOT NULL COMMENT '真实姓名',
|
||||
`status` TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 用户表
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`user_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL UNIQUE,
|
||||
`password_hash` VARCHAR(64) NOT NULL,
|
||||
`real_name` VARCHAR(50) NOT NULL,
|
||||
`user_type` ENUM('student', 'parent', 'admin') NOT NULL,
|
||||
`student_id` INT DEFAULT NULL,
|
||||
`status` TINYINT DEFAULT 1,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
-- ===========================================
|
||||
-- 5. 插入默认班级(现有数据迁移)
|
||||
-- ===========================================
|
||||
INSERT INTO `classes` (`class_name`, `grade`, `description`)
|
||||
VALUES ('默认班级', NULL, '系统升级时自动创建的默认班级')
|
||||
ON DUPLICATE KEY UPDATE `class_id` = `class_id`;
|
||||
|
||||
-- 管理员角色表
|
||||
CREATE TABLE IF NOT EXISTS `admin_roles` (
|
||||
`admin_role_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`user_id` INT NOT NULL,
|
||||
`role_type` ENUM('班主任', '班长', '学习委员', '考勤委员', '劳动委员', '志愿委员') NOT NULL,
|
||||
`subject_id` INT DEFAULT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`subject_id`) ON DELETE CASCADE,
|
||||
UNIQUE KEY `uk_user_subject` (`user_id`, `subject_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
-- 获取默认班级ID
|
||||
SET @default_class_id = (SELECT `class_id` FROM `classes` WHERE `class_name` = '默认班级' LIMIT 1);
|
||||
|
||||
-- 操行分记录表
|
||||
CREATE TABLE IF NOT EXISTS `conduct_records` (
|
||||
`record_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_id` INT NOT NULL,
|
||||
`points_change` INT NOT NULL,
|
||||
`reason` VARCHAR(255) NOT NULL,
|
||||
`recorder_id` INT NOT NULL,
|
||||
`recorder_name` VARCHAR(50) DEFAULT NULL,
|
||||
`related_id` INT DEFAULT NULL,
|
||||
`is_revoked` TINYINT DEFAULT 0,
|
||||
`revoked_by` INT DEFAULT NULL,
|
||||
`revoked_at` DATETIME DEFAULT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`recorder_id`) REFERENCES `users`(`user_id`),
|
||||
FOREIGN KEY (`revoked_by`) REFERENCES `users`(`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
-- ===========================================
|
||||
-- 6. 学生表:添加 class_id 字段
|
||||
-- ===========================================
|
||||
ALTER TABLE `students`
|
||||
ADD COLUMN `class_id` INT NOT NULL DEFAULT 1 COMMENT '所属班级ID' AFTER `student_no`,
|
||||
ADD FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT;
|
||||
|
||||
-- 考勤记录表
|
||||
CREATE TABLE IF NOT EXISTS `attendance_records` (
|
||||
`attendance_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`student_id` INT NOT NULL,
|
||||
`date` DATE NOT NULL,
|
||||
`slot` ENUM('morning', 'afternoon', 'evening') DEFAULT 'morning' COMMENT '考勤时段',
|
||||
`status` ENUM('present', 'absent', 'late', 'leave') DEFAULT 'present',
|
||||
`reason` VARCHAR(255) DEFAULT NULL,
|
||||
`recorder_id` INT NOT NULL,
|
||||
`deduction_applied` TINYINT DEFAULT 0,
|
||||
`deduction_record_id` BIGINT DEFAULT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`recorder_id`) REFERENCES `users`(`user_id`),
|
||||
FOREIGN KEY (`deduction_record_id`) REFERENCES `conduct_records`(`record_id`) ON DELETE SET NULL,
|
||||
UNIQUE KEY `uk_student_date_slot` (`student_id`, `date`, `slot`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
-- 将现有学生关联到默认班级
|
||||
UPDATE `students` SET `class_id` = @default_class_id WHERE `class_id` = 1;
|
||||
|
||||
-- 插入初始科目
|
||||
INSERT IGNORE INTO `subjects` (`subject_name`) VALUES ('语文'), ('数学'), ('英语');
|
||||
-- 修改唯一约束(学号+班级联合唯一)
|
||||
ALTER TABLE `students` DROP INDEX `student_no`;
|
||||
ALTER TABLE `students` ADD UNIQUE KEY `uk_student_no_class` (`student_no`, `class_id`);
|
||||
|
||||
-- ===========================================
|
||||
-- 7. 学生表:parent_phone → parent_account
|
||||
-- ===========================================
|
||||
ALTER TABLE `students` CHANGE COLUMN `parent_phone` `parent_account` VARCHAR(50) DEFAULT NULL COMMENT '家长登录账号(推荐手机号)';
|
||||
|
||||
-- 更新宿舍号字段注释(格式:南0-000)
|
||||
ALTER TABLE `students` MODIFY COLUMN `dormitory_number` VARCHAR(20) DEFAULT NULL COMMENT '宿舍号,格式:南0-000';
|
||||
|
||||
-- ===========================================
|
||||
-- 8. 用户表:扩展 user_type 枚举
|
||||
-- ===========================================
|
||||
ALTER TABLE `users` MODIFY COLUMN `user_type` ENUM('student', 'parent', 'admin', 'super_admin') NOT NULL;
|
||||
|
||||
-- ===========================================
|
||||
-- 9. 管理员角色表:添加 class_id 和扩展枚举
|
||||
-- ===========================================
|
||||
ALTER TABLE `admin_roles`
|
||||
ADD COLUMN `class_id` INT NOT NULL DEFAULT 1 COMMENT '所属班级ID' AFTER `user_id`,
|
||||
ADD FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT;
|
||||
|
||||
-- 将现有管理员关联到默认班级
|
||||
UPDATE `admin_roles` SET `class_id` = @default_class_id WHERE `class_id` = 1;
|
||||
|
||||
-- 扩展角色枚举
|
||||
ALTER TABLE `admin_roles` MODIFY COLUMN `role_type` ENUM('班主任', '班长', '学习委员', '考勤委员', '劳动委员', '志愿委员', '科任老师', '课代表') NOT NULL;
|
||||
|
||||
-- 添加班级级唯一约束
|
||||
ALTER TABLE `admin_roles` ADD UNIQUE KEY `uk_user_class` (`user_id`, `class_id`);
|
||||
|
||||
-- ===========================================
|
||||
-- 10. 作业表:添加 class_id
|
||||
-- ===========================================
|
||||
ALTER TABLE `assignments`
|
||||
ADD COLUMN `class_id` INT NOT NULL DEFAULT 1 COMMENT '所属班级ID' AFTER `assignment_id`,
|
||||
ADD FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT;
|
||||
|
||||
UPDATE `assignments` SET `class_id` = @default_class_id WHERE `class_id` = 1;
|
||||
|
||||
-- ===========================================
|
||||
-- 11. 学期归档表:添加 class_id
|
||||
-- ===========================================
|
||||
ALTER TABLE `semester_archives`
|
||||
ADD COLUMN `class_id` INT NOT NULL DEFAULT 1 COMMENT '所属班级ID' AFTER `semester_id`,
|
||||
ADD FOREIGN KEY (`class_id`) REFERENCES `classes`(`class_id`) ON DELETE RESTRICT;
|
||||
|
||||
UPDATE `semester_archives` SET `class_id` = @default_class_id WHERE `class_id` = 1;
|
||||
|
||||
-- ===========================================
|
||||
-- 12. 操作日志表:添加 class_id
|
||||
-- ===========================================
|
||||
ALTER TABLE `operation_logs`
|
||||
ADD COLUMN `class_id` INT DEFAULT NULL COMMENT '操作所属班级ID' AFTER `operator_role`;
|
||||
|
||||
-- ===========================================
|
||||
-- 13. 添加新索引(MySQL 5.7 兼容:使用存储过程检查索引是否存在)
|
||||
-- ===========================================
|
||||
DROP PROCEDURE IF EXISTS `add_index_if_not_exists`;
|
||||
DELIMITER //
|
||||
CREATE PROCEDURE `add_index_if_not_exists`(
|
||||
IN p_table VARCHAR(64),
|
||||
IN p_index VARCHAR(64),
|
||||
IN p_columns VARCHAR(512)
|
||||
)
|
||||
BEGIN
|
||||
DECLARE index_count INT DEFAULT 0;
|
||||
SELECT COUNT(*) INTO index_count
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = p_table
|
||||
AND index_name = p_index;
|
||||
IF index_count = 0 THEN
|
||||
SET @sql = CONCAT('ALTER TABLE `', p_table, '` ADD INDEX `', p_index, '` (', p_columns, ')');
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END //
|
||||
DELIMITER ;
|
||||
|
||||
CALL `add_index_if_not_exists`('students', 'idx_student_class', '`class_id`');
|
||||
CALL `add_index_if_not_exists`('admin_roles', 'idx_admin_role_class', '`class_id`');
|
||||
CALL `add_index_if_not_exists`('assignments', 'idx_assignment_class', '`class_id`');
|
||||
CALL `add_index_if_not_exists`('assignments', 'idx_assignment_subject', '`subject_id`');
|
||||
CALL `add_index_if_not_exists`('semester_archives', 'idx_archive_class', '`class_id`');
|
||||
CALL `add_index_if_not_exists`('operation_logs', 'idx_operation_class', '`class_id`');
|
||||
CALL `add_index_if_not_exists`('conduct_records', 'idx_conduct_type_semester', '`semester_id`, `related_type`, `student_id`');
|
||||
CALL `add_index_if_not_exists`('conduct_records', 'idx_conduct_semester', '`semester_id`');
|
||||
CALL `add_index_if_not_exists`('conduct_records', 'idx_conduct_student', '`student_id`');
|
||||
CALL `add_index_if_not_exists`('conduct_records', 'idx_student_created', '`student_id`, `created_at`');
|
||||
CALL `add_index_if_not_exists`('conduct_records', 'idx_recorder_id', '`recorder_id`');
|
||||
CALL `add_index_if_not_exists`('attendance_records', 'idx_attendance_semester', '`semester_id`');
|
||||
CALL `add_index_if_not_exists`('attendance_records', 'idx_date', '`date`');
|
||||
CALL `add_index_if_not_exists`('login_logs', 'idx_username_created', '`username`, `created_at`');
|
||||
CALL `add_index_if_not_exists`('operation_logs', 'idx_operator_created', '`operator_id`, `created_at`');
|
||||
CALL `add_index_if_not_exists`('semester_archives', 'idx_semester_id', '`semester_id`');
|
||||
|
||||
DROP PROCEDURE IF EXISTS `add_index_if_not_exists`;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- ===========================================
|
||||
-- 14. 为默认班级插入预置班级设置
|
||||
-- ===========================================
|
||||
INSERT INTO `class_settings` (`class_id`, `setting_key`, `setting_value`) VALUES
|
||||
-- 角色加减分上下限
|
||||
(@default_class_id, 'point_limit_班主任_max', '10'),
|
||||
(@default_class_id, 'point_limit_班主任_min', '-10'),
|
||||
(@default_class_id, 'point_limit_班长_max', '5'),
|
||||
(@default_class_id, 'point_limit_班长_min', '-5'),
|
||||
(@default_class_id, 'point_limit_学习委员_max', '5'),
|
||||
(@default_class_id, 'point_limit_学习委员_min', '-5'),
|
||||
(@default_class_id, 'point_limit_考勤委员_max', '8'),
|
||||
(@default_class_id, 'point_limit_考勤委员_min', '-8'),
|
||||
(@default_class_id, 'point_limit_劳动委员_max', '1'),
|
||||
(@default_class_id, 'point_limit_劳动委员_min', '-1'),
|
||||
(@default_class_id, 'point_limit_志愿委员_max', '5'),
|
||||
(@default_class_id, 'point_limit_志愿委员_min', '0'),
|
||||
(@default_class_id, 'point_limit_科任老师_max', '5'),
|
||||
(@default_class_id, 'point_limit_科任老师_min', '-5'),
|
||||
-- 操行分初始值
|
||||
(@default_class_id, 'initial_points', '60'),
|
||||
-- 扣分规则
|
||||
(@default_class_id, 'deduction_homework_not_submit', '2'),
|
||||
(@default_class_id, 'deduction_homework_late', '1'),
|
||||
(@default_class_id, 'deduction_attendance_absent', '3'),
|
||||
(@default_class_id, 'deduction_attendance_late', '1'),
|
||||
(@default_class_id, 'deduction_attendance_leave', '0'),
|
||||
-- 家长相关
|
||||
(@default_class_id, 'parent_password_change_enabled', 'true'),
|
||||
(@default_class_id, 'parent_account_enabled', 'true')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = VALUES(`setting_value`);
|
||||
|
||||
-- ===========================================
|
||||
-- 15. 为默认班级插入预置功能开关
|
||||
-- ===========================================
|
||||
INSERT INTO `class_features` (`class_id`, `feature_key`, `enabled`) VALUES
|
||||
(@default_class_id, 'role_班长_enabled', 1),
|
||||
(@default_class_id, 'role_学习委员_enabled', 1),
|
||||
(@default_class_id, 'role_考勤委员_enabled', 1),
|
||||
(@default_class_id, 'role_劳动委员_enabled', 1),
|
||||
(@default_class_id, 'role_志愿委员_enabled', 1),
|
||||
(@default_class_id, 'role_科任老师_enabled', 1),
|
||||
(@default_class_id, 'role_课代表_enabled', 1)
|
||||
ON DUPLICATE KEY UPDATE `enabled` = VALUES(`enabled`);
|
||||
|
||||
-- ===========================================
|
||||
-- 16. 添加系统管理员登录路径配置
|
||||
-- ===========================================
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('super_admin_login_path', '/super-admin/login')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '/super-admin/login';
|
||||
|
||||
-- ===========================================
|
||||
-- 17. 更新系统版本号
|
||||
-- ===========================================
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('db_version', '1.0')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '1.0';
|
||||
|
||||
-- 升级完成
|
||||
SELECT CONCAT('升级完成!版本: v1.0,默认班级ID: ', @default_class_id) AS message;
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.0 → v1.1 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. users 表添加 need_change_password 列
|
||||
-- 2. users 表添加 last_login_time 列
|
||||
-- 3. users 表添加 last_login_ip 列
|
||||
-- 4. users 表 password_hash 字段扩展至 VARCHAR(255)
|
||||
--
|
||||
-- 兼容性: 使用存储过程实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- 升级步骤 1: users 添加 need_change_password 列
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'users'
|
||||
AND COLUMN_NAME = 'need_change_password'
|
||||
) THEN
|
||||
ALTER TABLE `users`
|
||||
ADD COLUMN `need_change_password` TINYINT DEFAULT 1
|
||||
AFTER `status`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- 升级步骤 2: users 添加 last_login_time 列
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'users'
|
||||
AND COLUMN_NAME = 'last_login_time'
|
||||
) THEN
|
||||
ALTER TABLE `users`
|
||||
ADD COLUMN `last_login_time` DATETIME DEFAULT NULL
|
||||
AFTER `need_change_password`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- 升级步骤 3: users 添加 last_login_ip 列
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'users'
|
||||
AND COLUMN_NAME = 'last_login_ip'
|
||||
) THEN
|
||||
ALTER TABLE `users`
|
||||
ADD COLUMN `last_login_ip` VARCHAR(45) DEFAULT NULL
|
||||
AFTER `last_login_time`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- 升级步骤 4: password_hash 字段扩展至 VARCHAR(255)
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
DECLARE v_col_len INT;
|
||||
SELECT CHARACTER_MAXIMUM_LENGTH INTO v_col_len
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'users'
|
||||
AND COLUMN_NAME = 'password_hash';
|
||||
|
||||
IF v_col_len < 255 THEN
|
||||
ALTER TABLE `users`
|
||||
MODIFY COLUMN `password_hash` VARCHAR(255) NOT NULL;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
@@ -1,41 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.1 → v1.2 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 创建 assignments(作业表)
|
||||
-- 2. 创建 homework_submissions(作业提交记录表)
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- 升级步骤 1: 创建作业表
|
||||
CREATE TABLE IF NOT EXISTS `assignments` (
|
||||
`assignment_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`subject_id` INT NOT NULL,
|
||||
`title` VARCHAR(100) NOT NULL,
|
||||
`description` TEXT,
|
||||
`deadline` DATE NOT NULL,
|
||||
`created_by` INT NOT NULL,
|
||||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`subject_id`),
|
||||
FOREIGN KEY (`created_by`) REFERENCES `users`(`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 升级步骤 2: 创建作业提交记录表
|
||||
CREATE TABLE IF NOT EXISTS `homework_submissions` (
|
||||
`submission_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`assignment_id` INT NOT NULL,
|
||||
`student_id` INT NOT NULL,
|
||||
`status` ENUM('submitted', 'not_submitted', 'late') DEFAULT 'not_submitted',
|
||||
`submit_time` DATETIME DEFAULT NULL,
|
||||
`comments` TEXT,
|
||||
`deduction_applied` TINYINT DEFAULT 0,
|
||||
`deduction_record_id` BIGINT DEFAULT NULL,
|
||||
`updated_by` INT DEFAULT NULL,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`assignment_id`) REFERENCES `assignments`(`assignment_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`) ON DELETE CASCADE,
|
||||
FOREIGN KEY (`deduction_record_id`) REFERENCES `conduct_records`(`record_id`) ON DELETE SET NULL,
|
||||
UNIQUE KEY `uk_assignment_student` (`assignment_id`, `student_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -1,22 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.2 → v1.3 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 创建 operation_logs(操作日志表)
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `operation_logs` (
|
||||
`log_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`operator_id` INT NOT NULL,
|
||||
`operator_name` VARCHAR(50) DEFAULT NULL,
|
||||
`operator_role` VARCHAR(50) DEFAULT NULL,
|
||||
`operation_type` VARCHAR(50) NOT NULL,
|
||||
`target_type` VARCHAR(50) DEFAULT NULL,
|
||||
`target_id` INT DEFAULT NULL,
|
||||
`details` TEXT,
|
||||
`ip_address` VARCHAR(45) DEFAULT NULL,
|
||||
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -1,19 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.3 → v1.4 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 创建 login_logs(登录日志表)
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `login_logs` (
|
||||
`log_id` BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||||
`username` VARCHAR(50) NOT NULL,
|
||||
`login_result` TINYINT NOT NULL,
|
||||
`fail_reason` VARCHAR(100) DEFAULT NULL,
|
||||
`ip_address` VARCHAR(45) DEFAULT NULL,
|
||||
`user_agent` VARCHAR(255) DEFAULT NULL,
|
||||
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -1,30 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.4 → v1.5 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 创建 semester_archives(学期归档快照表)
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `semester_archives` (
|
||||
`archive_id` INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`semester_id` INT NOT NULL,
|
||||
`student_id` INT NOT NULL,
|
||||
`student_no` VARCHAR(20) NOT NULL,
|
||||
`student_name` VARCHAR(50) NOT NULL,
|
||||
`final_points` INT NOT NULL COMMENT '学期最终操行分',
|
||||
`rank_position` INT DEFAULT NULL COMMENT '排名',
|
||||
`total_students` INT DEFAULT NULL COMMENT '班级总人数',
|
||||
`attendance_present` INT DEFAULT 0 COMMENT '出勤次数',
|
||||
`attendance_absent` INT DEFAULT 0 COMMENT '缺勤次数',
|
||||
`attendance_late` INT DEFAULT 0 COMMENT '迟到次数',
|
||||
`attendance_leave` INT DEFAULT 0 COMMENT '请假次数',
|
||||
`homework_submitted` INT DEFAULT 0 COMMENT '已交作业数',
|
||||
`homework_not_submitted` INT DEFAULT 0 COMMENT '未交作业数',
|
||||
`homework_late` INT DEFAULT 0 COMMENT '迟交作业数',
|
||||
`archived_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`semester_id`),
|
||||
FOREIGN KEY (`student_id`) REFERENCES `students`(`student_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -1,63 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.5 → v1.6 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. subjects 表添加 subject_code 列(科目代码)
|
||||
-- 2. subjects 表添加 sort_order 列(排序序号)
|
||||
-- 3. 更新已有科目的 subject_code
|
||||
--
|
||||
-- 兼容性: 使用存储过程实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- 升级步骤 1: subjects 添加 subject_code 列
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'subjects'
|
||||
AND COLUMN_NAME = 'subject_code'
|
||||
) THEN
|
||||
ALTER TABLE `subjects`
|
||||
ADD COLUMN `subject_code` VARCHAR(20) DEFAULT NULL COMMENT '科目代码'
|
||||
AFTER `subject_name`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- 升级步骤 2: subjects 添加 sort_order 列
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'subjects'
|
||||
AND COLUMN_NAME = 'sort_order'
|
||||
) THEN
|
||||
ALTER TABLE `subjects`
|
||||
ADD COLUMN `sort_order` INT DEFAULT 0 COMMENT '排序序号'
|
||||
AFTER `is_active`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- 升级步骤 3: 更新已有科目的 subject_code
|
||||
UPDATE `subjects` SET `subject_code` = 'CHI' WHERE `subject_name` = '语文' AND (`subject_code` IS NULL OR `subject_code` = '');
|
||||
UPDATE `subjects` SET `subject_code` = 'MATH' WHERE `subject_name` = '数学' AND (`subject_code` IS NULL OR `subject_code` = '');
|
||||
UPDATE `subjects` SET `subject_code` = 'ENG' WHERE `subject_name` = '英语' AND (`subject_code` IS NULL OR `subject_code` = '');
|
||||
|
||||
-- 升级步骤 4: 设置默认排序
|
||||
UPDATE `subjects` SET `sort_order` = 1 WHERE `subject_name` = '语文' AND `sort_order` = 0;
|
||||
UPDATE `subjects` SET `sort_order` = 2 WHERE `subject_name` = '数学' AND `sort_order` = 0;
|
||||
UPDATE `subjects` SET `sort_order` = 3 WHERE `subject_name` = '英语' AND `sort_order` = 0;
|
||||
@@ -1,31 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - 升级至 v1.7
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: 此脚本用于在已有数据库中创建版本管理系统。
|
||||
-- 适用于从 v1.7 之前的版本升级。
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 创建 system_settings 表(用于存储版本号等系统配置)
|
||||
-- 2. 插入初始版本号 1.7
|
||||
--
|
||||
-- 兼容性: 使用 IF NOT EXISTS 实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 1: 创建 system_settings 表
|
||||
-- ===========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `system_settings` (
|
||||
`setting_key` VARCHAR(50) PRIMARY KEY,
|
||||
`setting_value` VARCHAR(255) NOT NULL,
|
||||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 2: 插入初始版本号
|
||||
-- ===========================================
|
||||
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('db_version', '1.7')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '1.7';
|
||||
@@ -1,131 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.7 → v1.8 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. conduct_records 表添加 related_type 列
|
||||
-- 2. conduct_records 表添加 semester_id 列 + 外键
|
||||
-- 3. attendance_records 表添加 semester_id 列 + 外键
|
||||
--
|
||||
-- 兼容性: 使用存储过程实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 1: conduct_records 添加 related_type 列
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND COLUMN_NAME = 'related_type'
|
||||
) THEN
|
||||
ALTER TABLE `conduct_records`
|
||||
ADD COLUMN `related_type` ENUM('manual', 'homework', 'attendance') DEFAULT 'manual'
|
||||
AFTER `recorder_name`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 2: conduct_records 添加 semester_id 列
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND COLUMN_NAME = 'semester_id'
|
||||
) THEN
|
||||
ALTER TABLE `conduct_records`
|
||||
ADD COLUMN `semester_id` INT DEFAULT NULL COMMENT '所属学期ID'
|
||||
AFTER `revoked_at`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 3: conduct_records 添加 semester_id 外键
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND COLUMN_NAME = 'semester_id'
|
||||
AND REFERENCED_TABLE_NAME IS NOT NULL
|
||||
) THEN
|
||||
ALTER TABLE `conduct_records`
|
||||
ADD FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`semester_id`) ON DELETE SET NULL;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 4: attendance_records 添加 semester_id 列
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'attendance_records'
|
||||
AND COLUMN_NAME = 'semester_id'
|
||||
) THEN
|
||||
ALTER TABLE `attendance_records`
|
||||
ADD COLUMN `semester_id` INT DEFAULT NULL COMMENT '所属学期ID'
|
||||
AFTER `deduction_record_id`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 5: attendance_records 添加 semester_id 外键
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'attendance_records'
|
||||
AND COLUMN_NAME = 'semester_id'
|
||||
AND REFERENCED_TABLE_NAME IS NOT NULL
|
||||
) THEN
|
||||
ALTER TABLE `attendance_records`
|
||||
ADD FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`semester_id`) ON DELETE SET NULL;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
@@ -1,6 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.0 → v2.0.1 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.0.1 为纯前端修改版本,无数据库 schema 变更。
|
||||
-- ===========================================
|
||||
@@ -1,145 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v1.8 → v2.0 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 变更内容:
|
||||
-- 1. 添加性能索引: conduct_records.semester_id
|
||||
-- 2. 添加性能索引: attendance_records.semester_id
|
||||
-- 3. 添加性能索引: conduct_records.student_id
|
||||
-- 4. 数据迁移: recorder_name 从 username 更新为 real_name
|
||||
-- 5. students 表添加 dormitory_number 列
|
||||
-- 6. students 表添加 points_updated_at 列
|
||||
--
|
||||
-- 兼容性: 使用存储过程实现幂等,phpMyAdmin 可直接执行
|
||||
-- ===========================================
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 1: 添加 conduct_records.semester_id 索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND INDEX_NAME = 'idx_conduct_semester'
|
||||
) THEN
|
||||
CREATE INDEX `idx_conduct_semester` ON `conduct_records`(`semester_id`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 2: 添加 attendance_records.semester_id 索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'attendance_records'
|
||||
AND INDEX_NAME = 'idx_attendance_semester'
|
||||
) THEN
|
||||
CREATE INDEX `idx_attendance_semester` ON `attendance_records`(`semester_id`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 3: 添加 conduct_records.student_id 索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND INDEX_NAME = 'idx_conduct_student'
|
||||
) THEN
|
||||
CREATE INDEX `idx_conduct_student` ON `conduct_records`(`student_id`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 4: 数据迁移 - recorder_name 从 username 更新为 real_name
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
UPDATE `conduct_records` cr
|
||||
INNER JOIN `users` u ON cr.recorder_id = u.user_id
|
||||
SET cr.recorder_name = u.real_name
|
||||
WHERE cr.recorder_name = u.username;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 5: students 表添加 dormitory_number 列
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'students'
|
||||
AND COLUMN_NAME = 'dormitory_number'
|
||||
) THEN
|
||||
ALTER TABLE `students`
|
||||
ADD COLUMN `dormitory_number` VARCHAR(20) DEFAULT NULL COMMENT '宿舍号'
|
||||
AFTER `parent_phone`;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 6: students 表添加 points_updated_at 列
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_step`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'students'
|
||||
AND COLUMN_NAME = 'points_updated_at'
|
||||
) THEN
|
||||
ALTER TABLE `students`
|
||||
ADD COLUMN `points_updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '分数最后更新时间';
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_step`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_step`;
|
||||
@@ -1,136 +1,53 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.0.1 → v2.1 升级脚本
|
||||
-- 主要内容:添加缺失的数据库索引,优化查询性能
|
||||
-- 多班级版班级管理系统 - v2.1 升级脚本
|
||||
-- 修复 review-report-v14 中发现的安全和逻辑问题
|
||||
--
|
||||
-- 开发者: Canglan
|
||||
-- 联系方式: admin@sea-studio.top
|
||||
-- 版权归属: Sea Network Technology Studio
|
||||
-- 许可证: Apache License 2.0
|
||||
--
|
||||
-- 版权所有 © Sea Network Technology Studio
|
||||
--
|
||||
-- 升级说明:
|
||||
-- 1. 为 super_admins 表添加 need_change_password 字段
|
||||
-- 2. 为 existing 超级管理员设置默认值(首次登录强制改密)
|
||||
-- ===========================================
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 1: conduct_records 表添加 student_id + created_at 联合索引
|
||||
-- ===========================================
|
||||
USE `classmanagerdb`;
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_conduct_student_created_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_conduct_student_created_idx`()
|
||||
-- 为 super_admins 表添加 need_change_password 字段
|
||||
-- 已存在则跳过(使用存储过程检测)
|
||||
DROP PROCEDURE IF EXISTS `add_column_if_not_exists`;
|
||||
DELIMITER //
|
||||
CREATE PROCEDURE `add_column_if_not_exists`(
|
||||
IN p_table VARCHAR(64),
|
||||
IN p_column VARCHAR(64),
|
||||
IN p_definition VARCHAR(512)
|
||||
)
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND INDEX_NAME = 'idx_student_created'
|
||||
) THEN
|
||||
ALTER TABLE `conduct_records` ADD INDEX `idx_student_created` (`student_id`, `created_at`);
|
||||
DECLARE col_count INT DEFAULT 0;
|
||||
SELECT COUNT(*) INTO col_count
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = p_table
|
||||
AND column_name = p_column;
|
||||
IF col_count = 0 THEN
|
||||
SET @sql = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_column, '` ', p_definition);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END$$
|
||||
END //
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_add_conduct_student_created_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_conduct_student_created_idx`;
|
||||
CALL `add_column_if_not_exists`('super_admins', 'need_change_password', 'TINYINT DEFAULT 1 COMMENT \'是否需要修改密码:1=需要,0=不需要\' AFTER `status`');
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 2: conduct_records 表添加 recorder_id 索引
|
||||
-- ===========================================
|
||||
DROP PROCEDURE IF EXISTS `add_column_if_not_exists`;
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_conduct_recorder_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_conduct_recorder_idx`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'conduct_records'
|
||||
AND INDEX_NAME = 'idx_recorder_id'
|
||||
) THEN
|
||||
ALTER TABLE `conduct_records` ADD INDEX `idx_recorder_id` (`recorder_id`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
-- 更新系统版本号
|
||||
INSERT INTO `system_settings` (`setting_key`, `setting_value`)
|
||||
VALUES ('db_version', '2.1')
|
||||
ON DUPLICATE KEY UPDATE `setting_value` = '2.1';
|
||||
|
||||
CALL `upgrade_add_conduct_recorder_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_conduct_recorder_idx`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 3: attendance_records 表添加 date 索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_attendance_date_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_attendance_date_idx`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'attendance_records'
|
||||
AND INDEX_NAME = 'idx_date'
|
||||
) THEN
|
||||
ALTER TABLE `attendance_records` ADD INDEX `idx_date` (`date`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_add_attendance_date_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_attendance_date_idx`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 4: login_logs 表添加 username + created_at 联合索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_login_username_created_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_login_username_created_idx`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'login_logs'
|
||||
AND INDEX_NAME = 'idx_username_created'
|
||||
) THEN
|
||||
ALTER TABLE `login_logs` ADD INDEX `idx_username_created` (`username`, `created_at`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_add_login_username_created_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_login_username_created_idx`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 5: operation_logs 表添加 operator_id + created_at 联合索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_operation_operator_created_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_operation_operator_created_idx`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'operation_logs'
|
||||
AND INDEX_NAME = 'idx_operator_created'
|
||||
) THEN
|
||||
ALTER TABLE `operation_logs` ADD INDEX `idx_operator_created` (`operator_id`, `created_at`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_add_operation_operator_created_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_operation_operator_created_idx`;
|
||||
|
||||
-- ===========================================
|
||||
-- 升级步骤 6: semester_archives 表添加 semester_id 索引
|
||||
-- ===========================================
|
||||
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_archive_semester_idx`;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE `upgrade_add_archive_semester_idx`()
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'semester_archives'
|
||||
AND INDEX_NAME = 'idx_semester_id'
|
||||
) THEN
|
||||
ALTER TABLE `semester_archives` ADD INDEX `idx_semester_id` (`semester_id`);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
CALL `upgrade_add_archive_semester_idx`();
|
||||
DROP PROCEDURE IF EXISTS `upgrade_add_archive_semester_idx`;
|
||||
SELECT '升级完成!版本: v2.1' AS message;
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.1 → v2.2 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.2 为安全修复与功能增强版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 修复管理员操作越权漏洞(加分/撤销/恢复操作增加权限校验)
|
||||
-- 2. 新增宿舍集体加分功能(前端+后端)
|
||||
-- 3. 学生导入支持宿舍号字段
|
||||
-- 4. 导入预览表格显示宿舍号列
|
||||
-- ===========================================
|
||||
@@ -1,11 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.2 → v2.3 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.3 为升级系统优化版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 升级系统全面重构(错误处理、SQL 解析、XSS 防护)
|
||||
-- 2. 新增升级验证 + 自动重试 + 失败回滚机制
|
||||
-- 3. 补全 v1.0-v1.6 增量升级脚本
|
||||
-- 4. 修复 DELIMITER SQL 执行问题
|
||||
-- ===========================================
|
||||
@@ -1,11 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.3 → v2.4 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.4 为UI优化与功能完善版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 操行分扣分类型扩展(卫生/课堂/纪律/作业/考勤/劳动/志愿)
|
||||
-- 2. 历史记录支持按扣分原因类型前缀筛选
|
||||
-- 3. 修复科目删除失败问题
|
||||
-- 4. 优化历史记录合并记录UI
|
||||
-- ===========================================
|
||||
@@ -1,11 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.5 → v2.5.1 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.5.1 为 UI 优化版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 筛选学生时自动取消合并记录
|
||||
-- 2. 合并记录选项样式优化(修复竖排显示)
|
||||
-- 3. 历史记录筛选功能改为折叠式
|
||||
-- 4. 科目管理调用修复
|
||||
-- ===========================================
|
||||
@@ -1,12 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.3 → v2.5 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.5 为功能增强版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 历史记录页UI优化(文字宽度/换行/合并按钮样式)
|
||||
-- 2. 新增"状态"筛选项(正常/已撤销)
|
||||
-- 3. 合并记录支持批量撤销/反撤销
|
||||
-- 4. 操作菜单底部遮挡修复
|
||||
-- 5. 删除科目报错修复
|
||||
-- ===========================================
|
||||
@@ -1,12 +0,0 @@
|
||||
-- ===========================================
|
||||
-- 班级操行分管理系统 - v2.5.1 → v2.6 升级脚本
|
||||
-- 字符集: utf8mb4
|
||||
--
|
||||
-- 说明: v2.6 为功能增强版本,无数据库 schema 变更。
|
||||
-- 主要变更:
|
||||
-- 1. 历史记录页筛选面板重构(学生筛选移入面板、合并按钮移出面板)
|
||||
-- 2. 新增科目下拉筛选(通过 reason 前缀匹配)
|
||||
-- 3. 新增原因关键词搜索(reason_search 模糊匹配)
|
||||
-- 4. 科目管理删除后仅显示启用科目
|
||||
-- 5. 筛选面板展开/收起功能修复
|
||||
-- ===========================================
|
||||
@@ -1,2 +0,0 @@
|
||||
-- v2.7 无 schema 变更
|
||||
-- 操作菜单定位修复、历史记录显示修复、筛选面板修复、科目删除修复、学期周数列修复、escapeHtml 转义修复
|
||||
Reference in New Issue
Block a user