Commit Graph
43 Commits
  • 成绩通知:仅在某门课程成绩正式发布后自动发送,按成绩单学生名单通知,不展示具体分数;发布状态与通知同一次提交。
    手动发信:移除“成绩通知”选项,只能发送普通通知,原有角色与范围权限保持不变。
    选课通知:管理员关闭一轮选课时,自动向每位参与学生发送一条汇总通知,包含最终选中课程及候补未成功课程;候补失效、轮次关闭和通知生成保持原子性。
    关闭选课界面会明确提示发送通知,并显示实际通知人数。
  • 学生可在“学籍管理 → 电子成绩单与证明”申请成绩单或学籍证明。
    服务端根据登录账号绑定本人档案,不接受学生 ID,无法代他人申请。
    成绩单仅包含正式发布成绩;无已发布成绩时明确提示。
    同类型、同用途 5 分钟内重复申请复用已有有效凭证。
    申请后即时生成 PDF,可在本人凭证列表下载、二维码验真。
    管理员的下载记录、失效、重签能力保持不变。
  • 已完善个人教学日历订阅。
    主要能力:
    教师、学生可在“我的课表”启用订阅、复制 URL、唤起日历客户端或下载一次性 ICS。
    自动覆盖固定课程、调停课后的最新安排、考试/监考、补考,以及灵活课程提醒。
    采用独立随机订阅标识和 HMAC 签名;重置或停用后旧地址立即失效。
    支持 ETag 条件请求和一小时刷新提示,减少日历客户端重复同步。
    订阅地址按实际前端 API 地址生成,兼容独立部署域名。
    已增加窄屏弹窗最大宽度和纵向操作布局。
  • 将索引缩短为 IX_CE_Offering_Status_WaitlistedAt。
    将候补迁移改为可重入:先检查列和索引是否存在,再执行 DDL。
    附件中已经成功添加 WaitlistedAt、但索引创建失败的数据库可直接重试,不会报重复列。
    运行时和 dotnet ef 连接统一开启 AllowUserVariables;Connector/NET 默认关闭该选项。Connector/NET 官方说明
    增加所有 MySQL 索引名不得超过 64 字符的回归测试。
  • 已把选课的“年级划分”和限制规则补成完整闭环:
    选课批次可指定多个适用年级;留空兼容原有“全部年级”。
    新增可选的“最多课程门数”,与原有学分上限并行。
    年级、门数限制统一作用于学生可见批次、自主选课、候补、管理员代选和自动递补。
    普通候选名单遵守年级及行政班范围;强制选课可绕过业务限制,但仍严格遵守管理员学院权限。
    管理页面会展示“2026 级 · 最多 6 门 · 最多 30 学分”,名单和候补列表也增加年级列。
    新增 MySQL 迁移:[CourseSelectionGradeLimits.cs](E:/jiaowu/src/Jiaowu.Api/Infrastructure/Persistence/Migrations/MySql/20260726180000_CourseSelectionGradeLimits.cs)。
  • 已完成“选课候补与自动递补”完整流程。
    学生端:满员后可加入/取消候补,展示候补顺位和当前候补人数。
    自动递补:退课释放名额后,按候补时间顺序重新校验学籍、范围、学分及时间冲突;不合格者自动失效并继续下一位。
    管理端:教学班显示候补人数,名单抽屉提供候补队列及移出操作。
    状态通知:递补成功、资格失效、批次关闭、管理员移出均会通知学生。
    并发安全:退课和递补放在 Serializable 事务中执行。
    数据库:已补充 SQLite 开发迁移和 MySQL 正式迁移。
  • 修复500
    TimeOnly ↔ TimeSpan
  • 学年学期页面新增“设为当前”“归档”“撤销归档”,当前学期不能归档、删除或直接取消;已归档学期需先撤销才能重新设为当前。[BaseDataController.cs (line 286)](/E:/jiaowu/src/Jiaowu.Api/Controllers/BaseDataController.cs:286)
    切换后,其他学期自动变为历史态;已归档学期进一步弱化。所有主要学期选择器统一默认当前,并显示“当前 / 历史 / 已归档”。[academicTerms.ts (line 1)](/E:/jiaowu/web/src/utils/academicTerms.ts:1)
    桌面使用分层表格,390px 手机端改为独立学期卡片,操作不会再挤压表格。[BaseDataView.vue (line 211)](/E:/jiaowu/web/src/views/BaseDataView.vue:211)
    归档定义为“历史显示状态”,不是成绩冻结:补考成绩仍可录入并回写,已发布成绩仍可走成绩更正审批。
    已加入 SQLite 开发迁移、MySQL 正式迁移和切换/归档/撤销测试。[20260726143000_AcademicTermArchiving.cs (line 1)](/E:/jiaowu/src/Jiaowu.Api/Infrastructure/Persistence/Migrations/MySql/20260726143000_AcademicTermArchiving.cs:1)
  • 已完成,学生端考勤记录现在按课程展示。
    每门课程会独立显示:
    课程名称、代码、教学班和任课教师。
    课程总体出勤率。
    出勤、迟到、缺勤、请假、免修次数。
    按日期排列的历次点名记录。
    缺勤或迟到记录仍可单独申诉。
  • 新增显式命令:--seed-demo-data --confirm-production-demo-data
    仅允许非 Development 环境运行。
    只允许写入没有业务数据的独立空库。
    演示数据使用单个 InnoDB 事务,失败整体回滚;迁移 DDL 仍单独执行,因为 MySQL 8.4 的 DDL 会隐式提交。MySQL 事务文档、隐式提交说明
    不包含通用测试密码或学生、教师登录账号。
    包含校区、学期、30 间教室、16 个学院、52 个专业、104 个班级、128 名教师、3,640 名学生和148门课程。
  • 全部完成。定时检测系统概览:
    新增组件
    
      ┌────────────────────────────────┬─────────────────────────────────────────────────────────┐
      │              组件              │                          说明                           │
      ├────────────────────────────────┼─────────────────────────────────────────────────────────┤
      │ WarningSchedule 实体           │ 定时配置:学期、星期几、时、分、启用/禁用、上次执行时间 │
      ├────────────────────────────────┼─────────────────────────────────────────────────────────┤
      │ WarningCheckWorker             │ BackgroundService,每分钟轮询一次,匹配到时间就执行检测 │
      ├────────────────────────────────┼─────────────────────────────────────────────────────────┤
      │ GET/PUT /api/warnings/schedule │ 读取/保存定时配置                                       │
      └────────────────────────────────┴─────────────────────────────────────────────────────────┘
    
      页面配置
    
      在学业预警页面顶部新增「定时检测」区域:
      - 启用开关:一键开/关自动检测
      - 星期选择:周一至周日
      - 时分选择:精确到分钟
      - 上次执行时间:自动显示
    
      工作流程
    
      每分钟 Worker 轮询
        → 查询 WarningSchedules 表,匹配当前星期+时+分
        → 检查是否已在本分钟执行过(防止重复)
        → 加载该学期全部启用规则 + 在籍学生
        → 逐条规则、逐个学生检测
        → 已存在的同型预警跳过,新预警写入 + 通知学生/辅导员
        → 更新 LastRunAt
    
      管理员配置"每周一 08:00 自动检测",系统就会在每周一早上 8 点整自动执行一次完整的学业预警检测。
  • 已改成后台“检查并发布”任务,原来的超时主要就是同步逐条校验导致的。
    发布接口立即返回 202 Accepted,页面轮询显示检查进度。
    校验改为批量读取,减少重复数据库查询。
    检查失败保留草稿并显示具体原因;成功后原子完成旧课表归档和新课表发布。
    同一学期禁止两个发布任务并发,服务重启后未完成任务会自动恢复。
    发布期间锁定编辑、自动排课等冲突操作。
    已补齐 SQLite 开发迁移及 MySQL 生产迁移。
  • 教学任务按 授课周数 × 周学时 = 课程总学时 双端校验,不匹配会显示具体差额并阻止保存;公共课批量生成同样校验。
    排课约束增加课程、教师、学院、授课方式、场地要求、约束状态筛选,并支持批量修改当前筛选结果。
    新增“非排时课程”授课方式:不进入自动排课
    不占星期、节次和教室
    不阻塞课表发布
    允许正常选课
    在班级课表和学生个人课表中单独展示
  • 主要改动:
    自动排课接口立即返回 202 + jobId
    后台服务独立执行,不受浏览器关闭或前端超时影响
    进度、成功、失败状态持久化到数据库
    服务重启后自动恢复排队中或中断的任务
    同一草稿禁止重复提交后台任务
    运行期间禁止编辑、发布或删除该课表
    排课结果和任务成功状态在同一事务中提交
    前端每秒轮询进度,显示已处理教学班和已规划安排数
  • 自动排课:保留手工安排,按教师、行政班、周次、节次、容量和场地约束补排。
    课程约束:可限定校区、教学楼、指定教室、允许上课日、最早/最晚节次。
    无教室课程:教室可为空,但仍校验教师和班级冲突。
    作息维护:按学期维护节次、上下课时间和启用状态。
    发布保护:发布前重新检查全部约束,并阻止学时未排满的课表发布。
    工作台升级:增加“排课规则与作息”“自动排课”入口,自动生成后仍支持手工微调。
    同时兼容 SQLite 和 MySQL,已生成正式迁移。
  • 课程库 Excel 导入导出已完成:
    支持下载标准导入模板。
    导出严格沿用当前关键词、学院、分类、课程性质和状态筛选。
    以课程编码为唯一键:存在则更新,不存在则新增。
    校验学院编码、课程分类、课程性质、学分学时及考核方式。
    整批原子导入,任一行错误则全部不写入,并提示具体行号。
    学院管理员仍只能维护本学院的专业课和实践课,无法借 Excel 越权。
    界面入口沿用现有课程库工具栏样式。
  • 学籍异动:休学、复学、退学申请及辅导员→学院→教务处分级审批。
    毕业审核:批次计算、缺失课程检查、人工复核、结果发布。
    学位授予:毕业资格与 GPA 计算、人工调整、发布授予结果。
    毕业离校:离校事项配置、责任角色分工、逐项办理及批次关闭。
  • 已继续完成“学籍异动”后端基础闭环:
    学生可申请休学、复学或退学。
    自动根据当前状态推导目标学籍状态。
    同一学生不能同时提交多项在审申请。
    强制执行辅导员 → 学院 → 校级三级审核。
    驳回不会修改学生档案。
    只有校级最终批准才更新学籍状态。
    数据范围分别限制到本人、所带班级、所属学院或全校。
    SQLite 增量升级和 MySQL 迁移已生成。
    当前 28 项测试继续全部通过。
  • 已完成“考试安排与考场管理”模块:
    考试计划草稿、场次配置与正式发布。
    教学班、考试时间、考场、监考教师关联。
    自动校验考场容量。
    阻止考场、监考教师和学生考试时间冲突。
    管理员查看考生名单。
    教师查看个人监考安排。
    学生查看已发布考试日程。
    SQLite 增量升级和 MySQL 正式迁移。
  • 已完成“成绩管理与学业档案”模块:
    教师批量录入平时、期中、期末成绩。
    自动计算总评、绩点和及格状态。
    支持缺考、缓考、免修。
    教师提交 → 学院审核/退回 → 校级发布。
    学生只能查看正式发布成绩。
    自动统计平均分、完成度、及格率和加权 GPA。
    SQLite 本地增量升级和 MySQL 正式迁移均已完成。
    分级权限在前后端同时校验。
  • 选课批次:时间窗口、退课截止、学分上限、开放/关闭。
    教学班投放:容量、班级范围、全校开放。
    学生选退课:容量、重复课程、学分上限、课表冲突校验。
    教学班实时名单。
    校级、学院级、学生角色分级操作。
    SQLite 本地增量升级及演示数据。
    MySQL 正式 EF Core 迁移。
    Vue 已编译进 wwwroot,单服务运行无需 npm run dev。
    学生端和管理端均完成桌面、手机响应式检查。
  • 多角色账号按 All > College > Class > Self 自动取最高权限。
    学院管理员限制在所属学院。
    辅导员通过稳定账号 ID 绑定行政班,避免重名串班。
    教师只能访问本人档案、授课课程和所授课学生。
    学生只能访问本人档案及所在班级课程。
    教师/学生角色会自动校验并绑定工号或学号档案。
    超级管理员可在用户页面调整角色、学院、工号/学号,并预览生效后的数据范围。
  • 排课版本新建、编辑、复制、发布、归档和删除。
    周课表视图,支持12节课、单双周和起止周。
    自动校验教师、行政班、教室、时间段冲突。
    校验教室容量、教学任务状态和学期范围。
    SQLite 开发环境自动升级,MySQL 提供正式 EF Core 迁移。
    Vue 已编译为静态文件并随 ASP.NET Core 发布,无需 npm run dev。
    桌面端和390px移动端页面均已验收。
  • 培养方案:专业/年级版本、课程模块、学分校验、复制版本、发布锁定、旧版本归档。
    教学任务:学期开课、授课教师、唯一主讲、合班、容量与周次校验、发布及结课。
    SQLite 开发库已自动升级,无需删除原数据库。
    新增对应 MySQL EF Core 迁移。
    Vue 已编译进 wwwroot,仍可只运行 ASP.NET Core 单服务。
    桌面端及 390px 窄屏页面验证通过,无前端控制台错误。
  • 3
  • 1