已完成“考试安排与考场管理”模块:

考试计划草稿、场次配置与正式发布。
教学班、考试时间、考场、监考教师关联。
自动校验考场容量。
阻止考场、监考教师和学生考试时间冲突。
管理员查看考生名单。
教师查看个人监考安排。
学生查看已发布考试日程。
SQLite 增量升级和 MySQL 正式迁移。
This commit is contained in:
biss committed 2026-07-24 15:43:55 +08:00
1 parent af52e27a3a
commit 7f3e37de20
18 files changed
+3057 -2

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
面向普通高校的教务管理系统。后端使用 ASP.NET Core 10、EF Core 10,前端使用 Vue 3、TypeScript 和 Element Plus。
当前已实现系统登录与角色权限、基础数据、用户管理、教师档案、学生档案、课程库、培养方案、教学任务、排课课表、学生选课、成绩管理和首页统计。人员及课程列表支持组合筛选、服务端分页和完整增删改查;培养方案支持课程模块、专业年级版本、复制新版本、发布锁定和旧版本归档;教学任务支持学期课程开设、多教师、合班、容量校验、发布与结课;排课支持单双周、周次节次、教室容量、教师/行政班/教室冲突校验和版本化发布;选课支持批次时间窗、投放范围、容量与学分上限、重复课程与课表冲突校验、退课截止时间和实时教学班名单;成绩管理支持分项比例、批量录入、特殊考试状态、自动总评与绩点、教师提交、学院审核、校级发布和学生成绩单。
当前已实现系统登录与角色权限、基础数据、用户管理、教师档案、学生档案、课程库、培养方案、教学任务、排课课表、学生选课、成绩管理、考试考场和首页统计。人员及课程列表支持组合筛选、服务端分页和完整增删改查;培养方案支持课程模块、专业年级版本、复制新版本、发布锁定和旧版本归档;教学任务支持学期课程开设、多教师、合班、容量校验、发布与结课;排课支持单双周、周次节次、教室容量、教师/行政班/教室冲突校验和版本化发布;选课支持批次时间窗、投放范围、容量与学分上限、重复课程与课表冲突校验、退课截止时间和实时教学班名单;成绩管理支持分项比例、批量录入、特殊考试状态、自动总评与绩点、教师提交、学院审核、校级发布和学生成绩单;考试管理支持考试计划、场次、考场容量、监考教师、考生名单以及考场/监考/学生时间冲突校验。
权限采用后端强制校验的角色与数据范围模型。多角色账号按 `All > College > Class > Self` 取最高数据范围:校级角色可访问全校数据,院系管理员限定本学院,辅导员通过稳定的账号 ID 绑定所带行政班,教师和学生限定本人及当前教学关系;前端菜单和路由限制仅作为交互辅助,不替代 API 授权。
+20
View File
@@ -309,6 +309,24 @@ try {
if (@($studentTranscript.records).Count -lt 1) {
throw 'Published grade is not visible in the student transcript.'
}
$examPlans = Invoke-RestMethod -Uri 'http://localhost:5255/api/exams/plans' -Headers $headers
if (@($examPlans).Count -lt 1) { throw 'Development exam plan was not seeded.' }
$examDetail = Invoke-RestMethod `
-Uri "http://localhost:5255/api/exams/plans/$($examPlans[0].id)" `
-Headers $headers
if (@($examDetail.sessions).Count -lt 1) { throw 'Exam plan has no sessions.' }
$examRoster = Invoke-RestMethod `
-Uri "http://localhost:5255/api/exams/sessions/$($examDetail.sessions[0].id)/roster" `
-Headers $headers
$studentExams = Invoke-RestMethod `
-Uri 'http://localhost:5255/api/exams/my-schedule' `
-Headers $studentHeaders
$teacherExams = Invoke-RestMethod `
-Uri 'http://localhost:5255/api/exams/my-schedule' `
-Headers $teacherHeaders
if (@($studentExams).Count -lt 1 -or @($teacherExams).Count -lt 1) {
throw 'Personal exam schedule is not visible to student or invigilator.'
}
$frontend = Invoke-WebRequest -Uri 'http://localhost:5255/' -TimeoutSec 5
$spaFallback = Invoke-WebRequest -Uri 'http://localhost:5255/base-data' -TimeoutSec 5
@@ -341,6 +359,8 @@ try {
GradeSheets = @($gradeTasks).Count
GradeRecords = @($gradeDetail.sheet.records).Count
TranscriptRecords = @($studentTranscript.records).Count
ExamSessions = @($examDetail.sessions).Count
ExamRoster = @($examRoster.students).Count
AccessUpdate = $true
ScopeChecks = $scopeChecks -join ', '
StaticIndex = $frontend.Content.Contains('明序教务管理系统')
@@ -49,6 +49,8 @@ public sealed class DashboardController(AppDbContext db) : ControllerBase
x => x.Status == GradeSheetStatus.Published,
cancellationToken),
GradeRecords = await db.GradeRecords.CountAsync(cancellationToken),
ExamPlans = await db.ExamPlans.CountAsync(cancellationToken),
ExamSessions = await db.ExamSessions.CountAsync(cancellationToken),
Users = await db.Users.CountAsync(cancellationToken)
}
};
Loaded 3 of 18 files, more files were not shown because too many files have changed in this diff. Show more