已完成“考试安排与考场管理”模块:
考试计划草稿、场次配置与正式发布。 教学班、考试时间、考场、监考教师关联。 自动校验考场容量。 阻止考场、监考教师和学生考试时间冲突。 管理员查看考生名单。 教师查看个人监考安排。 学生查看已发布考试日程。 SQLite 增量升级和 MySQL 正式迁移。
This commit is contained in:
1 parent
af52e27a3a
commit
7f3e37de20
18 files changed
+3057
-2
No files matched your search
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
面向普通高校的教务管理系统。后端使用 ASP.NET Core 10、EF Core 10,前端使用 Vue 3、TypeScript 和 Element Plus。
|
面向普通高校的教务管理系统。后端使用 ASP.NET Core 10、EF Core 10,前端使用 Vue 3、TypeScript 和 Element Plus。
|
||||||
|
|
||||||
当前已实现系统登录与角色权限、基础数据、用户管理、教师档案、学生档案、课程库、培养方案、教学任务、排课课表、学生选课、成绩管理和首页统计。人员及课程列表支持组合筛选、服务端分页和完整增删改查;培养方案支持课程模块、专业年级版本、复制新版本、发布锁定和旧版本归档;教学任务支持学期课程开设、多教师、合班、容量校验、发布与结课;排课支持单双周、周次节次、教室容量、教师/行政班/教室冲突校验和版本化发布;选课支持批次时间窗、投放范围、容量与学分上限、重复课程与课表冲突校验、退课截止时间和实时教学班名单;成绩管理支持分项比例、批量录入、特殊考试状态、自动总评与绩点、教师提交、学院审核、校级发布和学生成绩单。
|
当前已实现系统登录与角色权限、基础数据、用户管理、教师档案、学生档案、课程库、培养方案、教学任务、排课课表、学生选课、成绩管理、考试考场和首页统计。人员及课程列表支持组合筛选、服务端分页和完整增删改查;培养方案支持课程模块、专业年级版本、复制新版本、发布锁定和旧版本归档;教学任务支持学期课程开设、多教师、合班、容量校验、发布与结课;排课支持单双周、周次节次、教室容量、教师/行政班/教室冲突校验和版本化发布;选课支持批次时间窗、投放范围、容量与学分上限、重复课程与课表冲突校验、退课截止时间和实时教学班名单;成绩管理支持分项比例、批量录入、特殊考试状态、自动总评与绩点、教师提交、学院审核、校级发布和学生成绩单;考试管理支持考试计划、场次、考场容量、监考教师、考生名单以及考场/监考/学生时间冲突校验。
|
||||||
|
|
||||||
权限采用后端强制校验的角色与数据范围模型。多角色账号按 `All > College > Class > Self` 取最高数据范围:校级角色可访问全校数据,院系管理员限定本学院,辅导员通过稳定的账号 ID 绑定所带行政班,教师和学生限定本人及当前教学关系;前端菜单和路由限制仅作为交互辅助,不替代 API 授权。
|
权限采用后端强制校验的角色与数据范围模型。多角色账号按 `All > College > Class > Self` 取最高数据范围:校级角色可访问全校数据,院系管理员限定本学院,辅导员通过稳定的账号 ID 绑定所带行政班,教师和学生限定本人及当前教学关系;前端菜单和路由限制仅作为交互辅助,不替代 API 授权。
|
||||||
|
|
||||||
|
|||||||
@@ -309,6 +309,24 @@ try {
|
|||||||
if (@($studentTranscript.records).Count -lt 1) {
|
if (@($studentTranscript.records).Count -lt 1) {
|
||||||
throw 'Published grade is not visible in the student transcript.'
|
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
|
$frontend = Invoke-WebRequest -Uri 'http://localhost:5255/' -TimeoutSec 5
|
||||||
$spaFallback = Invoke-WebRequest -Uri 'http://localhost:5255/base-data' -TimeoutSec 5
|
$spaFallback = Invoke-WebRequest -Uri 'http://localhost:5255/base-data' -TimeoutSec 5
|
||||||
@@ -341,6 +359,8 @@ try {
|
|||||||
GradeSheets = @($gradeTasks).Count
|
GradeSheets = @($gradeTasks).Count
|
||||||
GradeRecords = @($gradeDetail.sheet.records).Count
|
GradeRecords = @($gradeDetail.sheet.records).Count
|
||||||
TranscriptRecords = @($studentTranscript.records).Count
|
TranscriptRecords = @($studentTranscript.records).Count
|
||||||
|
ExamSessions = @($examDetail.sessions).Count
|
||||||
|
ExamRoster = @($examRoster.students).Count
|
||||||
AccessUpdate = $true
|
AccessUpdate = $true
|
||||||
ScopeChecks = $scopeChecks -join ', '
|
ScopeChecks = $scopeChecks -join ', '
|
||||||
StaticIndex = $frontend.Content.Contains('明序教务管理系统')
|
StaticIndex = $frontend.Content.Contains('明序教务管理系统')
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ public sealed class DashboardController(AppDbContext db) : ControllerBase
|
|||||||
x => x.Status == GradeSheetStatus.Published,
|
x => x.Status == GradeSheetStatus.Published,
|
||||||
cancellationToken),
|
cancellationToken),
|
||||||
GradeRecords = await db.GradeRecords.CountAsync(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)
|
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
Reference in new issue
Block a user