课程库 Excel 导入导出已完成:

支持下载标准导入模板。
导出严格沿用当前关键词、学院、分类、课程性质和状态筛选。
以课程编码为唯一键:存在则更新,不存在则新增。
校验学院编码、课程分类、课程性质、学分学时及考核方式。
整批原子导入,任一行错误则全部不写入,并提示具体行号。
学院管理员仍只能维护本学院的专业课和实践课,无法借 Excel 越权。
界面入口沿用现有课程库工具栏样式。
This commit is contained in:
2026-07-24 18:56:25 +08:00 Unverified
parent 5a7a8d530b
commit d7cf3f9e76
24 changed files with 3710 additions and 32 deletions
+12 -1
View File
@@ -111,6 +111,12 @@ public sealed class PersistenceTests : IAsyncLifetime
Nature = CourseNature.MajorRequired,
AssessmentMethod = AssessmentMethod.Examination
};
var category = new CourseCategory
{
Code = "BASIC",
Name = "基础课程"
};
course.CourseCategoryId = category.Id;
var teacher = new Teacher
{
TeacherNumber = "T2026001",
@@ -148,6 +154,7 @@ public sealed class PersistenceTests : IAsyncLifetime
counselor,
administrativeClass,
teacher,
category,
new Student
{
StudentNumber = "202601001",
@@ -237,7 +244,10 @@ public sealed class PersistenceTests : IAsyncLifetime
var savedClass = await _db.AdministrativeClasses
.Include(x => x.CounselorUser)
.SingleAsync();
var savedCourse = await _db.Courses.Include(x => x.College).SingleAsync();
var savedCourse = await _db.Courses
.Include(x => x.College)
.Include(x => x.CourseCategory)
.SingleAsync();
var curriculumPlan = await _db.CurriculumPlans
.Include(x => x.Modules)
.ThenInclude(x => x.Courses)
@@ -255,6 +265,7 @@ public sealed class PersistenceTests : IAsyncLifetime
Assert.Equal("计算机科学与技术", student.AdministrativeClass!.Major!.Name);
Assert.Equal("陈老师", savedClass.CounselorUser!.DisplayName);
Assert.Equal(4m, savedCourse.Credits);
Assert.Equal("基础课程", savedCourse.CourseCategory!.Name);
Assert.Equal(savedCourse.TotalHours, savedCourse.LectureHours + savedCourse.PracticeHours);
Assert.Single(curriculumPlan.Modules);
Assert.Single(curriculumPlan.Modules.Single().Courses);