Skip to content

V2.8.0 ​

更新日期:2026 年 10 月 2 日

以下内容以公开的 V2.7.3 为基线,包含 V2.7.4、V2.7.5、V2.7.6 三个修补批次和 V2.8.0 主线变化。

V2.8.0 把 Novora 从「能发布考试的大屏工具」升级为「基础考试管理系统」:考试有了独立记录、生命周期和操作历史, 学校可以自己向教室大屏发公告,系统有了诊断日志与错误上报,管理后台与系统设置的界面也重新组织。

升级影响

旧客户端的读取契约不变——教室大屏、ClassIsland 插件和已有考试数据都不需要额外操作,直接升级即可 (数据表结构与旧数据由服务端自动迁移和回填)。

需要留意的是操作方式的变化:新建考试保存后即为「已发布」,到点由系统自动开考,不再有人工「开考」按钮; 提前收场改为「申请停止」,由系统判定后结束,异常时有「强制结束」兜底。

一、新功能 ​

考试记录与生命周期 ​

每场考试都有独立记录

  • 考试记录:每场考试都有独立记录,包含名称、编号、备注、状态、适用范围、来源、创建人与时间。
  • 记录列表:按状态、年级/班级、来源、时间范围、创建人筛选,支持关键词搜索、分页与按天分组, 并按账号数据范围自动过滤(年级管理员只看得到本年级);筛选与分页直接下推到数据库执行。
  • 考试详情:生命周期时间线、累计暂停时长、完整操作记录(谁在什么时候做了什么); 顶部可以直接「发送公告」「公告管理」「编辑考试」,底部是暂停、延长(可填分钟数与备注)、 申请停止、强制结束与复制的操作条。创建人显示姓名,系统创建的显示「系统」。
  • 设备状态:按「显示异常 → 在线 → 离线」排序,同组内按最近在线时间倒序; 设备多时优先展示需要处理的教室,并单独标出未绑定设备的班级与正在显示其它考试的台数。

生命周期改为系统驱动

  • 创建即发布:新建考试保存后就是「已发布」,不再需要单独点发布,也不再产生草稿(复制出来的考试例外)。
  • 到点自动开考:到达计划开始时间后由系统记录实际开考时间,没有人工「开考」按钮; 推进是惰性执行的,不依赖定时任务。
  • 申请停止 + 系统判定:提前收场时提交停止申请,系统按「到结束时间 → 教室端全部结束 → 10 分钟无在线设备」 判定后自动结束;判定迟迟不来时可用「强制结束」兜底。
  • 暂停、继续、延长仍由管理员操作:暂停时长不计入实际用时;延长会顺延结束时间,重复提交不会重复加时。
  • 复制考试先落草稿:复制生成新的考试 ID,不继承原考试的暂停状态与操作记录,修改完成后再发布。
  • 非法状态跳转会被拒绝并提示原因(接口返回 409),所有状态变更都会写入审计日志与操作记录。

时间、状态与归档

  • 时间调整可见:暂停、继续、延长、结束等操作会在列表与详情里提示「时间已调整」, 操作记录中保留改动前后的时间与管理员填写的原因。
  • 状态自动推导:持久保存的状态只有 草稿 → 已发布 → 已结束 → 已归档; 「待开始 / 进行中 / 停止中」按考试时间窗、实际开考时间与暂停时长算出来,不会出现状态与时间对不上。
  • 归档与取消归档:归档记录默认从列表隐藏但保留历史,可勾选「显示已归档」查看,也可以随时取消归档; 快速考试结束后默认保留 24 小时再自动归档(部署方可用 QUICK_EXAM_ARCHIVE_GRACE_HOURS 调整, 0 表示结束后立刻归档)。
  • 数据一致性:新增投影一致性自检接口,可核对记录表与考试快照是否一致; 另有两个维护脚本用于旧考试时间窗与记录时间戳回填、孤儿考试记录清理,用法见维护文档。

考试中心与后台界面 ​

考试中心收成三个板块

管理后台的考试相关页面收成「当前考试 / 考试安排 / 历史考试」,作为左侧主导航的二级子项, 每个板块有独立地址,刷新后停在原处。

板块作用
当前考试只读实时态势:大倒计时、上一场 / 当前 / 下一场,底部显示数据同步、服务端与在线设备状态
考试安排按天时间轴列出待开始与进行中的考试,提示时间冲突与截断情况,支持按班级周网格
历史考试已结束的考试,按自然月分组,勾选「显示已归档的考试」可查看归档记录
  • 考试安排支持今天 / 明天 / 本周 / 未来两周 / 全部的时间窗切换,年级、视图、密度与更多筛选, 并给出「共 N 场 / 今天 N 场 / N 场时间重叠 / N 场周测被暂停 / N 场未排期」的统计; 窗口被截断时会说明「只取回前 N 场」并给出缩小时间窗的入口。
  • 新建考试向导:范围选择 → 科目与时间 → 确认三步,支持在向导里直接进编辑器、批量添加科目,以及 AI/JSON 导入。
  • 分考试编辑器改为弹窗:在考试中心的行、日程轴的行、当前考试面板或向导第二步打开, 关闭即回到原处,筛选与滚动位置保留;整页地址 /admin/exam/editor 仍然可用。

设置、总览与审计

  • 系统设置改为左侧分组导航 + 分组视图,桌面端不再显示冗余分组胶囊,新增「诊断日志」与「学校信息」两个分组。
  • 运行总览重做为「核心状态卡片 + 运行健康区 + 待办入口」三段式, 设备心跳、考试排期、数据同步分别判断健康状态。
  • 管理后台导航改为左侧边栏,页面级筛选与操作按钮集中到顶部上下文栏,滚动时导航保持贴边。
  • 审计日志全部显示中文:动作名称改为中文(例如「取消归档考试」),原始机器码只作为悬停提示保留; 认不出的动作显示「未识别的操作」。

交互细节

  • 空白草稿关闭时会询问「保留 / 丢弃」,不再预置一场默认考试,草稿也可以单独删除。
  • 统一日期时间选择器;打印预览、提醒浮层、提示条与角落按钮的层级重新梳理,不再互相遮挡。
  • 全屏体验重做:大屏无操作 1 分钟后给出「建议全屏」提示条(点击才进入,不强行自动进入), 考试结束后 15 分钟内提供退出全屏入口与操作指引浮层。
  • 新增统一动效层,几个原本静止的页面补上过渡;考试中心在移动端的布局问题一并修复。

学校考试公告 ​

  • 学校可以自己下发考试公告,范围可选全校 / 指定年级 / 指定班级;与作者端的软件公告是两条互不影响的通道。
  • 大屏有三种排版:标准卡片(通知与较长内容)、大字海报(一句话紧急通知)、 公告栏(浅色纸张风的长文);正文支持 Markdown 与图片,图片走同源接口,换域名也不会裂图。
  • 有效期可选 30 分钟 / 2 小时 / 当天 / 不过期,发送前用大屏同一套排版预览,发出后 1 分钟内更新。
  • 弹出方式可选「自动弹出」或「只进列表(不打扰)」。选自动弹出时,公告在考试进行中和夜间都会正常弹出; 紧急公告置顶且在大屏上不可关闭,并盖过作者端的软件公告;紧急公告只要还没看满 3 秒, 刷新、重启或被更新顶掉后都会重新弹出。
  • 大屏公告窗口带「当前 / 历史」标签,历史按需拉取;常用内容可「存为模板」并一键套用。
  • 回执与提醒:公告在大屏上可见过半、标签页在前台并累计停留满 3 秒才算「已读」; 概览给出公告条数、平均回执率、已送达台次、覆盖教室与回执率最低的几条, 需要时可以只对未读设备再提醒一次;单条公告可展开查看每台设备的应达 / 送达 / 已读,也可以按班级导出 CSV。

诊断日志与错误上报 ​

  • 诊断日志分组:可设置错误发生前后保留的日志时间范围、日志保留天数(1–30 天,超期自动清除), 按选定的时间段发送日志,或一键发送全部错误包。
  • 后台有独立的诊断队列 worker:待发送的日志包按 60 秒 / 120 秒 / 240 秒退避重试,最多 3 次; 领取时在事务内加锁并带 10 分钟租约,多实例部署不会重复发送,崩溃遗留的发送中记录会被自动回收。
  • 队列状态可以在 /api/status 的 diagnosticQueue 字段里直接查看(发送中 / 已发送 / 失败 / 过期 / 待发送 / 下次重试时间);服务端也可以挂 Cron 消费 /api/diagnostic-worker,未挂 Cron 的部署同样不会无限堆积。
  • 日志默认只留在当前设备上,不会自动外发,只有管理员主动上传才会发送给作者端;过期日志包会清空正文释放存储。
  • 客户端会静默上报影响稳定性的错误(接口 5xx、数据库读写失败、页面渲染异常、分包加载失败等), 上报经由服务端同源中继转发,浏览器不接触作者端密钥,内容经过脱敏,不含考试正文、管理员密码、 恢复密钥和登录会话;权限不足、登录过期、密码错误等正常业务提示不会被当作系统错误; 作者端不可用时自动跳过,不会阻塞学校端请求。

设备与大屏 ​

  • 在线判定:设备超过 3 分钟没有心跳就不再显示为在线(不再是旧版的 90 秒)。
  • 同步节奏:教室大屏在考试进行中或临近时每 30 秒同步一次,其余时间每 60 秒;心跳间隔相同。
  • 设备命令:命令的领取、确认、失败与回执状态会持久保存,管理端可以查看执行情况。
  • ClassIsland 插件:接口提供 API v2 能力探测与学校信息,未发送版本字段的旧插件仍走 v1 兼容路径; 配对成功后网页看板与插件在后台合并显示为同一台设备。

部署、免费版与工程能力 ​

  • 适配 Vercel 免费版(Hobby):免费计划单次部署最多允许 12 个 Serverless Functions, 本版把公开 API 入口从 13 个合并为 7 个,并用 vercel.json 的 rewrite 保留原有地址与响应契约: /api/health、/api/status、/api/time、/api/update-check、/api/redeploy、/api/error-report、 /api/diagnostic-worker 等入口继续可用,带 ?current=、?id= 等查询参数的调用也不受影响。
  • 部署配置增加防回归门禁:公开函数不得超过 12 个,且合并入口必须同时保留 vercel.json 与本地路由里的旧地址, 避免出现「构建通过但接口 404」或函数数量超限。
  • 新增 Docker 镜像构建工作流;Dockerfile 统一使用 Node 24,依赖安装固化国内镜像源并带重试。
  • 新增数据库结构版本门禁与独立集成测试环境,空库可重复初始化,健康检查会报告结构版本与当前构建。
  • 本地 / 内网部署复用同一套 API 与标准 PostgreSQL 驱动,继续提供 npm run update:local / update-local.bat 一键更新;升级前请先备份数据库,迁移由服务端在首次请求时自动执行。
  • 性能:考试列表的筛选与分页下推数据库执行;同一份考试快照在多个组件间复用并做请求合并, 且只提交发生变化的考试域;精简心跳、状态与鉴权请求的往返次数; 版本化快照地址由服务端能力控制,不再无故失效公告缓存。

二、Bug 修复 ​

考试数据、保存与生命周期 ​

  • 修复排课保存读取过期状态、列表重复拉取,以及同一场考试并发保存互相覆盖的问题; 冲突重试只提交发生变化的域,失败后保留正确的离线队列与冲突信息。
  • 修复复制考试插入失败、复制结果错误继承生命周期字段、草稿被快照删除后仍残留、 删除队列吞掉考试删除,以及空白草稿关闭行为错误的问题。
  • 修复归档考试因排序或规范化被误判为「修改没有生效」,归档记录保持只读; 同时修复旧数据缺少生命周期标记、周测冲突策略与时间窗规范化不一致的问题。
  • 修复系统自动开考、申请停止、暂停、延长与归档回写快照不一致的问题。
  • 修复考试详情从不同列表入口无法打开、设备状态显示过期、大倒计时超过 99 小时被截断、 历史考试跨月分组错误,以及分页越界时总数不准确的问题。

公告、大屏与静态资源 ​

  • 修复管理员的考试操作没有及时到达教室端、保存后立即发布与全局写槽冲突、 学校公告窗口与作者端公告无法互相切换的问题。
  • 修复紧急公告刷新或重启后不再弹出、考试进行中被压住不弹、普通公告重复弹出, 以及公告历史无法查看的问题;同时修复公告回执重复写入、未读提醒误触达已读设备的问题。
  • 修复打印预览、提醒浮层、系统提示与角落按钮层级互相遮挡,统一日期时间选择器, 并修复编辑器关闭按钮、搜索框焦点边框与多处移动端布局溢出。
  • 修复缺失的静态资源:脚本、字体和 /assets 一律返回 404 与 no-store,不再用 index.html 冒充; Service Worker 拒绝缓存类型不符的响应,动态分包加载失败会在 20 秒冷却后自动刷新一次, 兜底页提供「清理缓存并刷新」入口。
  • 修复大屏离开页面时未被接住的 AbortError 被误报为系统错误的问题,统一降级为带 source=abort 的提示。

认证、权限与诊断 ​

  • 前后端统一会话凭据来源,修复缓存过期后认证配置未重建、管理员请求缺少令牌、 权限写入失败仍显示成功,以及会话过期提示不准确的问题。
  • 修复诊断日志手动发送与保留策略请求因缺少管理员令牌而始终返回「登录状态已失效」, 以及发送后列表不刷新、队列重试并发重复、过期正文不清理的问题。
  • 修复错误上报把正常业务提示当成系统错误、敏感字段进入错误摘要,以及作者端不可用时阻塞学校端请求的问题。
  • 补齐认证、错误、心跳、设备、考试与公告的共享类型契约;客户端对用户、角色、审计日志、心跳与设备命令 的响应增加边界校验,畸形响应会被安全丢弃。

V2.7.4 – V2.7.6 稳定性修补 ​

批次主题摘要
V2.7.4正确性修复修复保存回调读取过期状态、提醒与浮层定时器未清理、设备状态面板与时间选择器显示过期值;清理未使用变量与无效 catch
V2.7.5类型契约与集成门禁认证 / 错误 / 心跳 / 设备 / 考试的共享类型契约、客户端边界校验、数据库结构版本记录与独立集成测试环境;修复未命名年级 / 班级被误过滤,并降低免费版轮询与 Neon 读取量
V2.7.6初始化向导与端口向导内日志上传控件统一、使用文档改为外部链接、设置页诊断请求补上管理员令牌;修复 Docker 容器端口映射错位导致的反向代理 502

逐条说明见 V2.7.4 – V2.7.6。

三、升级提示 ​

  1. 升级前备份数据库(云端 pg_dump,本地备份 Volume),迁移由服务端在首次请求时自动执行,不需要手工跑 SQL。
  2. 云端部署先同步 Fork(整目录),本地部署先 git pull;不要只复制个别文件, 否则可能出现「构建通过但接口 404」或 Vercel 函数数量超限。
  3. Vercel 重新部署后建议顺手检查几个旧地址:/api/health、/api/status、/api/time、 /api/update-check?current=2.8.0 和带 ?id= 的公告图片接口。
  4. 升级后确认版本号已变化,并完成一次核心验收:登录、后台保存、大屏、PDF。
  5. 顺便验一遍新流程:新建考试应为「已发布」且没有多出草稿、到点后由系统自动开考、 复制考试落进草稿、教室大屏能收到学校公告。
  6. 教室大屏与 ClassIsland 插件无需额外操作。

行为变化提示:v2.8.0 不再提供人工「开考」入口,需要提前开始时请调整计划时间; 复制出来的考试会进入草稿,编辑完成后再发布。

更完整的兼容说明见版本兼容与升级。

Novora 部署与维护文档