已完成“成绩管理与学业档案”模块:
教师批量录入平时、期中、期末成绩。 自动计算总评、绩点和及格状态。 支持缺考、缓考、免修。 教师提交 → 学院审核/退回 → 校级发布。 学生只能查看正式发布成绩。 自动统计平均分、完成度、及格率和加权 GPA。 SQLite 本地增量升级和 MySQL 正式迁移均已完成。 分级权限在前后端同时校验。
This commit is contained in:
@@ -12,6 +12,7 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
private const string SchedulesMigration = "20260724_04_schedules";
|
||||
private const string ClassCounselorMigration = "20260724_05_class_counselor";
|
||||
private const string CourseSelectionMigration = "20260724_06_course_selection";
|
||||
private const string GradesMigration = "20260724_07_grades";
|
||||
|
||||
public async Task MigrateAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
@@ -63,6 +64,10 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
CourseSelectionMigration,
|
||||
CourseSelectionStatements,
|
||||
cancellationToken);
|
||||
await ApplyMigrationAsync(
|
||||
GradesMigration,
|
||||
GradesStatements,
|
||||
cancellationToken);
|
||||
}
|
||||
|
||||
private async Task ApplyMigrationAsync(
|
||||
@@ -506,4 +511,62 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
ON "CourseEnrollments" ("StudentId", "Status");
|
||||
"""
|
||||
];
|
||||
|
||||
private static readonly string[] GradesStatements =
|
||||
[
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS "GradeSheets" (
|
||||
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeSheets" PRIMARY KEY,
|
||||
"TeachingTaskId" TEXT NOT NULL,
|
||||
"RegularWeight" TEXT NOT NULL,
|
||||
"MidtermWeight" TEXT NOT NULL,
|
||||
"FinalWeight" TEXT NOT NULL,
|
||||
"Status" INTEGER NOT NULL,
|
||||
"ReviewComment" TEXT NULL,
|
||||
"SubmittedAt" TEXT NULL,
|
||||
"ReviewedAt" TEXT NULL,
|
||||
"PublishedAt" TEXT NULL,
|
||||
"CreatedAt" TEXT NOT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL,
|
||||
CONSTRAINT "FK_GradeSheets_TeachingTasks_TeachingTaskId"
|
||||
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeSheets_TeachingTaskId"
|
||||
ON "GradeSheets" ("TeachingTaskId");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS "IX_GradeSheets_Status"
|
||||
ON "GradeSheets" ("Status");
|
||||
""",
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS "GradeRecords" (
|
||||
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeRecords" PRIMARY KEY,
|
||||
"GradeSheetId" TEXT NOT NULL,
|
||||
"StudentId" TEXT NOT NULL,
|
||||
"RegularScore" TEXT NULL,
|
||||
"MidtermScore" TEXT NULL,
|
||||
"FinalScore" TEXT NULL,
|
||||
"TotalScore" TEXT NULL,
|
||||
"GradePoint" TEXT NULL,
|
||||
"ExamStatus" INTEGER NOT NULL,
|
||||
"Notes" TEXT NULL,
|
||||
"CreatedAt" TEXT NOT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL,
|
||||
CONSTRAINT "FK_GradeRecords_GradeSheets_GradeSheetId"
|
||||
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE,
|
||||
CONSTRAINT "FK_GradeRecords_Students_StudentId"
|
||||
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeRecords_GradeSheetId_StudentId"
|
||||
ON "GradeRecords" ("GradeSheetId", "StudentId");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS "IX_GradeRecords_StudentId_TotalScore"
|
||||
ON "GradeRecords" ("StudentId", "TotalScore");
|
||||
"""
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user