Files
NextEdu/drizzle/0003_diagnostic_student_nullable.sql
SpecialX 5f3a1a4662 refactor(grades,diagnostic): 完成成绩和学情诊断模块审计 P1+P2 改进项
P1-1: 抽取 stats-service.ts,将 8 个统计计算纯函数从 data-access 层分离
P1-5: 创建 WidgetBoundary 组件 + 补齐 teacher 路由 loading.tsx/error.tsx (14 文件)
P1-6: 同步架构图文档 004/005,新增 stats-service 与 widget-boundary 节点
P2-1: 补充 a11y ARIA 属性(5 图表 role=img + aria-label,2 表格 caption,3 列表 role=list,3 按钮 aria-label)
P2-3: 修复班级报告 studentId 字段语义错误(schema 改为可空 + 迁移 + 代码适配)
P2-4: 修复 grade_managed scope 返回空数据(改为子查询 classes 表按 gradeId 过滤)
P2-5: 新增 /parent/diagnostic/ 页面(多子女学情诊断聚合 + loading + error)
P2-6: 统一 SearchParams 工具(student/grades 和 management/grade/insights 改用 @/shared/lib/search-params)
2026-06-22 17:07:32 +08:00

45 lines
2.8 KiB
SQL

CREATE TABLE `class_invitation_codes` (
`id` varchar(128) NOT NULL,
`class_id` varchar(128) NOT NULL,
`code` varchar(8) NOT NULL,
`class_invitation_code_status` enum('active','disabled','expired','exhausted') NOT NULL DEFAULT 'active',
`max_uses` int,
`used_count` int NOT NULL DEFAULT 0,
`expires_at` timestamp,
`created_by` varchar(128) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT (now()),
`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
`revoked_at` timestamp,
`revoked_by` varchar(128),
`note` varchar(255),
CONSTRAINT `class_invitation_codes_id` PRIMARY KEY(`id`),
CONSTRAINT `class_invitation_codes_code_unique` UNIQUE(`code`),
CONSTRAINT `class_invitation_codes_code_idx` UNIQUE(`code`)
);
--> statement-breakpoint
CREATE TABLE `system_settings` (
`id` varchar(128) NOT NULL,
`category` varchar(50) NOT NULL,
`key` varchar(100) NOT NULL,
`value` text NOT NULL,
`value_type` varchar(20) NOT NULL DEFAULT 'string',
`updated_by` varchar(128),
`created_at` timestamp NOT NULL DEFAULT (now()),
`updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `system_settings_id` PRIMARY KEY(`id`),
CONSTRAINT `ss_category_key_idx` UNIQUE(`category`,`key`)
);
--> statement-breakpoint
ALTER TABLE `homework_assignments` MODIFY COLUMN `source_exam_id` varchar(128);--> statement-breakpoint
ALTER TABLE `learning_diagnostic_reports` MODIFY COLUMN `student_id` varchar(128);--> statement-breakpoint
ALTER TABLE `messages` ADD `sender_deleted_at` timestamp;--> statement-breakpoint
ALTER TABLE `messages` ADD `receiver_deleted_at` timestamp;--> statement-breakpoint
ALTER TABLE `notification_preferences` ADD `quiet_hours_enabled` boolean DEFAULT false NOT NULL;--> statement-breakpoint
ALTER TABLE `notification_preferences` ADD `quiet_hours_start` varchar(5);--> statement-breakpoint
ALTER TABLE `notification_preferences` ADD `quiet_hours_end` varchar(5);--> statement-breakpoint
ALTER TABLE `class_invitation_codes` ADD CONSTRAINT `class_invitation_codes_class_id_classes_id_fk` FOREIGN KEY (`class_id`) REFERENCES `classes`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `class_invitation_codes` ADD CONSTRAINT `class_invitation_codes_created_by_users_id_fk` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE `class_invitation_codes` ADD CONSTRAINT `cic_c_fk` FOREIGN KEY (`class_id`) REFERENCES `classes`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX `class_invitation_codes_class_idx` ON `class_invitation_codes` (`class_id`);--> statement-breakpoint
CREATE INDEX `class_invitation_codes_status_expires_idx` ON `class_invitation_codes` (`class_invitation_code_status`,`expires_at`);--> statement-breakpoint
CREATE INDEX `ss_category_idx` ON `system_settings` (`category`);