sync-docs-and-fixes
All checks were successful
CI / build-deploy (push) Successful in 4m39s

This commit is contained in:
SpecialX
2026-03-03 17:32:26 +08:00
parent 538805bad0
commit eb08c0ab68
73 changed files with 2218 additions and 422 deletions

View File

@@ -0,0 +1,88 @@
SET @has_exams_subject := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND COLUMN_NAME = 'subject_id'
);--> statement-breakpoint
SET @sql := IF(@has_exams_subject = 0, 'ALTER TABLE `exams` ADD `subject_id` varchar(128);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_exams_grade := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND COLUMN_NAME = 'grade_id'
);--> statement-breakpoint
SET @sql := IF(@has_exams_grade = 0, 'ALTER TABLE `exams` ADD `grade_id` varchar(128);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_kp_anchor := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'knowledge_points'
AND COLUMN_NAME = 'anchor_text'
);--> statement-breakpoint
SET @sql := IF(@has_kp_anchor = 0, 'ALTER TABLE `knowledge_points` ADD `anchor_text` varchar(255);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_exams_subject_fk := (
SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND CONSTRAINT_NAME = 'exams_subject_id_subjects_id_fk'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
);--> statement-breakpoint
SET @sql := IF(@has_exams_subject_fk = 0, 'ALTER TABLE `exams` ADD CONSTRAINT `exams_subject_id_subjects_id_fk` FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`id`) ON DELETE no action ON UPDATE no action;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_exams_grade_fk := (
SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND CONSTRAINT_NAME = 'exams_grade_id_grades_id_fk'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
);--> statement-breakpoint
SET @sql := IF(@has_exams_grade_fk = 0, 'ALTER TABLE `exams` ADD CONSTRAINT `exams_grade_id_grades_id_fk` FOREIGN KEY (`grade_id`) REFERENCES `grades`(`id`) ON DELETE no action ON UPDATE no action;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_exams_subject_idx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND INDEX_NAME = 'exams_subject_idx'
);--> statement-breakpoint
SET @sql := IF(@has_exams_subject_idx = 0, 'CREATE INDEX `exams_subject_idx` ON `exams` (`subject_id`);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_exams_grade_idx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'exams'
AND INDEX_NAME = 'exams_grade_idx'
);--> statement-breakpoint
SET @sql := IF(@has_exams_grade_idx = 0, 'CREATE INDEX `exams_grade_idx` ON `exams` (`grade_id`);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
INSERT IGNORE INTO `roles` (`id`, `name`, `created_at`, `updated_at`)
SELECT UUID(), LOWER(TRIM(`role`)), NOW(), NOW()
FROM `users`
WHERE `role` IS NOT NULL AND TRIM(`role`) <> '';--> statement-breakpoint
INSERT IGNORE INTO `users_to_roles` (`user_id`, `role_id`)
SELECT `users`.`id`, `roles`.`id`
FROM `users`
INNER JOIN `roles` ON `roles`.`name` = LOWER(TRIM(`users`.`role`))
WHERE `users`.`role` IS NOT NULL AND TRIM(`users`.`role`) <> '';--> statement-breakpoint
ALTER TABLE `users` DROP COLUMN `role`;

View File

@@ -0,0 +1,110 @@
SET @has_subject_id := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_subject_teachers'
AND COLUMN_NAME = 'subject_id'
);--> statement-breakpoint
SET @sql := IF(@has_subject_id = 0, 'ALTER TABLE `class_subject_teachers` ADD COLUMN `subject_id` VARCHAR(128) NULL;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
INSERT INTO `subjects` (`id`, `name`, `code`)
SELECT UUID(), '语文', 'CHINESE' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '语文' OR `code` = 'CHINESE')
UNION ALL
SELECT UUID(), '数学', 'MATH' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '数学' OR `code` = 'MATH')
UNION ALL
SELECT UUID(), '英语', 'ENG' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '英语' OR `code` = 'ENG')
UNION ALL
SELECT UUID(), '美术', 'ART' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '美术' OR `code` = 'ART')
UNION ALL
SELECT UUID(), '体育', 'PE' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '体育' OR `code` = 'PE')
UNION ALL
SELECT UUID(), '科学', 'SCI' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '科学' OR `code` = 'SCI')
UNION ALL
SELECT UUID(), '社会', 'SOC' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '社会' OR `code` = 'SOC')
UNION ALL
SELECT UUID(), '音乐', 'MUSIC' FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `subjects` WHERE `name` = '音乐' OR `code` = 'MUSIC');--> statement-breakpoint
SET @has_subject_col := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_subject_teachers'
AND COLUMN_NAME = 'subject'
);--> statement-breakpoint
SET @sql := IF(@has_subject_col = 1, '
UPDATE `class_subject_teachers` cst
JOIN `subjects` s ON (
s.`name` = cst.`subject`
OR s.`code` = CASE cst.`subject`
WHEN ''语文'' THEN ''CHINESE''
WHEN ''数学'' THEN ''MATH''
WHEN ''英语'' THEN ''ENG''
WHEN ''美术'' THEN ''ART''
WHEN ''体育'' THEN ''PE''
WHEN ''科学'' THEN ''SCI''
WHEN ''社会'' THEN ''SOC''
WHEN ''音乐'' THEN ''MUSIC''
ELSE NULL
END
)
SET cst.`subject_id` = s.`id`
WHERE cst.`subject_id` IS NULL;
', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @subject_id_nulls := (
SELECT COUNT(*) FROM `class_subject_teachers`
WHERE `subject_id` IS NULL
);--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0, 'ALTER TABLE `class_subject_teachers` MODIFY COLUMN `subject_id` VARCHAR(128) NOT NULL;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0, 'ALTER TABLE `class_subject_teachers` DROP PRIMARY KEY;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0, 'ALTER TABLE `class_subject_teachers` ADD PRIMARY KEY (`class_id`, `subject_id`);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0 AND @has_subject_col = 1, 'ALTER TABLE `class_subject_teachers` DROP COLUMN `subject`;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_subject_id_idx := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_subject_teachers'
AND INDEX_NAME = 'class_subject_teachers_subject_id_idx'
);--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0 AND @has_subject_id_idx = 0, 'CREATE INDEX `class_subject_teachers_subject_id_idx` ON `class_subject_teachers` (`subject_id`);', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;--> statement-breakpoint
SET @has_subject_fk := (
SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_subject_teachers'
AND CONSTRAINT_NAME = 'cst_s_fk'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
);--> statement-breakpoint
SET @sql := IF(@subject_id_nulls = 0 AND @has_subject_fk = 0, 'ALTER TABLE `class_subject_teachers` ADD CONSTRAINT `cst_s_fk` FOREIGN KEY (`subject_id`) REFERENCES `subjects`(`id`) ON DELETE CASCADE;', 'SELECT 1');--> statement-breakpoint
PREPARE stmt FROM @sql;--> statement-breakpoint
EXECUTE stmt;--> statement-breakpoint
DEALLOCATE PREPARE stmt;

View File

@@ -2,7 +2,7 @@
"version": "5",
"dialect": "mysql",
"id": "2cf4c7e4-f538-499e-a5a5-9281d556bc9d",
"prevId": "5eaf9185-8a1e-4e35-8144-553aec7ff31f",
"prevId": "a6d95d47-4400-464e-bc53-45735dd6e3e3",
"tables": {
"academic_years": {
"name": "academic_years",
@@ -3068,4 +3068,4 @@
"tables": {},
"indexes": {}
}
}
}

View File

@@ -1,8 +1,8 @@
{
"version": "5",
"dialect": "mysql",
"id": "5eaf9185-8a1e-4e35-8144-553aec7ff31f",
"prevId": "3b23e056-3d79-4ea9-a03e-d1b5d56bafda",
"id": "551f3408-945e-4f1d-984c-bfd35fe9d0ea",
"prevId": "2cf4c7e4-f538-499e-a5a5-9281d556bc9d",
"tables": {
"academic_years": {
"name": "academic_years",
@@ -1180,6 +1180,20 @@
"notNull": true,
"autoincrement": false
},
"subject_id": {
"name": "subject_id",
"type": "varchar(128)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"grade_id": {
"name": "grade_id",
"type": "varchar(128)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"start_time": {
"name": "start_time",
"type": "timestamp",
@@ -1220,7 +1234,22 @@
"default": "(now())"
}
},
"indexes": {},
"indexes": {
"exams_subject_idx": {
"name": "exams_subject_idx",
"columns": [
"subject_id"
],
"isUnique": false
},
"exams_grade_idx": {
"name": "exams_grade_idx",
"columns": [
"grade_id"
],
"isUnique": false
}
},
"foreignKeys": {
"exams_creator_id_users_id_fk": {
"name": "exams_creator_id_users_id_fk",
@@ -1234,6 +1263,32 @@
],
"onDelete": "no action",
"onUpdate": "no action"
},
"exams_subject_id_subjects_id_fk": {
"name": "exams_subject_id_subjects_id_fk",
"tableFrom": "exams",
"tableTo": "subjects",
"columnsFrom": [
"subject_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"exams_grade_id_grades_id_fk": {
"name": "exams_grade_id_grades_id_fk",
"tableFrom": "exams",
"tableTo": "grades",
"columnsFrom": [
"grade_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
@@ -2009,6 +2064,13 @@
"notNull": false,
"autoincrement": false
},
"anchor_text": {
"name": "anchor_text",
"type": "varchar(255)",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"parent_id": {
"name": "parent_id",
"type": "varchar(128)",
@@ -2765,14 +2827,6 @@
"notNull": false,
"autoincrement": false
},
"role": {
"name": "role",
"type": "varchar(50)",
"primaryKey": false,
"notNull": false,
"autoincrement": false,
"default": "'student'"
},
"password": {
"name": "password",
"type": "varchar(255)",
@@ -3006,4 +3060,4 @@
"tables": {},
"indexes": {}
}
}
}

View File

@@ -64,6 +64,20 @@
"when": 1768470966367,
"tag": "0008_thin_madrox",
"breakpoints": true
},
{
"idx": 9,
"version": "5",
"when": 1772162908476,
"tag": "0009_smart_mephistopheles",
"breakpoints": true
},
{
"idx": 10,
"version": "5",
"when": 1772439600000,
"tag": "0010_subject_id_switch",
"breakpoints": true
}
]
}
}