database.ts 导出 db 常量替代 getDb() env.ts JWT_SECRET 改 optional 并新增 DEV_MODE kafka.ts connectKafka 加 try/catch 不阻塞启动 main.ts 去全局前缀 connectKafka 改非阻塞 app.module 移除未用模块加 HealthModule controller 路由去前缀去 UseGuards 从 x-user-id 读身份 service datetime ISO 字符串转 Date 修复 drizzle 错误 修正相对 import 路径 health/lifecycle 改用 Drizzle 原生查询 新增 core-edu-init.sql 初始化 4 张表 端到端验证: exams/homework/grades 全部 201/200 Outbox 事件正确写入 core_edu_outbox 表
66 lines
2.5 KiB
SQL
66 lines
2.5 KiB
SQL
-- CoreEdu 服务数据库初始化脚本
|
||
-- 表:core_edu_exams / core_edu_homework / core_edu_grades / core_edu_outbox
|
||
|
||
CREATE TABLE IF NOT EXISTS core_edu_exams (
|
||
id CHAR(36) NOT NULL PRIMARY KEY,
|
||
class_id CHAR(36) NOT NULL,
|
||
title VARCHAR(200) NOT NULL,
|
||
description TEXT,
|
||
exam_date DATETIME NOT NULL,
|
||
duration VARCHAR(50) NOT NULL,
|
||
total_score VARCHAR(10) NOT NULL,
|
||
status VARCHAR(20) NOT NULL DEFAULT 'draft',
|
||
created_by CHAR(36) NOT NULL,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
INDEX idx_exams_class_id (class_id),
|
||
INDEX idx_exams_status (status),
|
||
INDEX idx_exams_created_by (created_by)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
CREATE TABLE IF NOT EXISTS core_edu_homework (
|
||
id CHAR(36) NOT NULL PRIMARY KEY,
|
||
class_id CHAR(36) NOT NULL,
|
||
title VARCHAR(200) NOT NULL,
|
||
description TEXT,
|
||
due_date DATETIME NOT NULL,
|
||
status VARCHAR(20) NOT NULL DEFAULT 'assigned',
|
||
created_by CHAR(36) NOT NULL,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
INDEX idx_homework_class_id (class_id),
|
||
INDEX idx_homework_status (status),
|
||
INDEX idx_homework_created_by (created_by)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
CREATE TABLE IF NOT EXISTS core_edu_grades (
|
||
id CHAR(36) NOT NULL PRIMARY KEY,
|
||
student_id CHAR(36) NOT NULL,
|
||
exam_id CHAR(36),
|
||
homework_id CHAR(36),
|
||
score VARCHAR(10) NOT NULL,
|
||
feedback TEXT,
|
||
graded_by CHAR(36) NOT NULL,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
INDEX idx_grades_student_id (student_id),
|
||
INDEX idx_grades_exam_id (exam_id),
|
||
INDEX idx_grades_homework_id (homework_id),
|
||
INDEX idx_grades_graded_by (graded_by)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
CREATE TABLE IF NOT EXISTS core_edu_outbox (
|
||
id CHAR(36) NOT NULL PRIMARY KEY,
|
||
aggregate_id CHAR(36) NOT NULL,
|
||
aggregate_type VARCHAR(50) NOT NULL,
|
||
event_type VARCHAR(100) NOT NULL,
|
||
payload TEXT NOT NULL,
|
||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||
retry_count BIGINT NOT NULL DEFAULT 0,
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
processed_at TIMESTAMP NULL,
|
||
INDEX idx_outbox_status (status),
|
||
INDEX idx_outbox_aggregate (aggregate_type, aggregate_id),
|
||
INDEX idx_outbox_created_at (created_at)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|