Skip to content

v1.0.1

Choose a tag to compare

@tempChanghong tempChanghong released this 06 Sep 03:40
· 54 commits to main since this release

NPClassworksKV v1.0.1 · Nijika(伊地知虹夏)

版本概述

v1.0.1 是 NPClassworksKV 基于 v1.0.0 的维护更新。

本次更新重点改进作业提交的一致性、权限撤销后的写入保护、通知回执和历史清理,并优化待处理中心查询及自动部署验证,为现有前端功能提供更可靠的后端支持。

新增功能

无。 本版本不新增业务功能,主要完善现有接口的正确性、安全性、性能和运维保障。

体验与性能优化

  • 减少重复作业:大屏创建与离线补传支持稳定请求标识,同一请求的并发提交和重试返回已有结果,避免重复创建作业、修订及创建事件。
  • 历史列表分页:教师和大屏的修订历史接口支持按版本游标分页,默认每页 20 条,减少一次性返回全部完整快照的开销。
  • 待处理中心按页读取详情:在数据库内完成范围筛选、分类、排序和汇总,先选出当前页,再加载该页正文与认证快照,减少将全部候选作业载入服务进程的开销。
  • 分页结果更一致:待处理中心为同时间记录补充稳定排序,并在同一数据库事务快照中读取汇总与当前页,减少单次响应内数据不一致的情况。
  • 历史清理持续推进:按稳定游标遍历候选记录,减少因前面一批记录始终不可清理,导致后续符合条件的历史长期积压。

Bug 修复

作业提交与版本一致性

  • 修复服务器已保存、响应丢失后重试可能再次创建作业的问题。请求身份、首次创建和修订快照在同一事务中保存,并以唯一索引保障去重。
  • 同一请求标识携带不同内容时返回冲突,避免把另一份输入误当作原请求的成功结果。
  • 将创建请求身份与后续编辑来源分离,教师修改、确认或撤回作业后,旧请求重试不会覆盖这些后续操作。

通知回执

  • 修复旧版本的迟到回执覆盖新版已确认状态的问题。
  • 修复同一版本的并发回执、同批重复条目使确认状态倒退的问题;同版本状态只向前推进。
  • 修复并发首次回执出现唯一约束冲突,以及通知撤回后等待中的请求仍创建回执的问题。
  • 在回执写事务内重新核验大屏凭据、通知版本和发布状态,保证批次写入顺序与结果一致。

历史清理

  • 修复只检查最早 200 条候选,后面的可清理记录可能一直得不到处理的问题。
  • 修复分页边界、相同时间戳及数据库微秒时间精度下可能跳过候选记录的问题。
  • 修复清理等待期间班级已重新启用,或历史已成为当前、已认证版本后,仍按旧状态清理内容的问题。
  • 保留现有历史清理条件和时长;当前版本、已认证版本、近期记录及通知历史继续受到保护。

安全与权限修复

  • 学校所有者保护:阻止 ADMIN 授予 OWNER、降级或删除现有 OWNER,以及通过账号创建或批量导入覆盖 OWNER 的路径。
  • 最后所有者保护:成员变更和账号写入在事务内重新检查角色,防止并发操作使学校失去最后一位 OWNER。
  • 草稿可见范围:修复只读教师在未指定班级的列表中看到无权草稿的问题,使列表与详情的授权规则保持一致。
  • 通知历史保护:阻止大屏通过恢复历史修改教师通知,或将作业恢复为通知快照。
  • 初始化令牌校验:初始化密钥缺失时明确拒绝请求,不接受以空密钥签名的令牌。
  • 撤销与写入并发保护:大屏创建、补传、修改、历史恢复和考勤保存均在写事务内重新核验绑定与凭据。撤销先提交时,旧令牌不能继续写入;已先取得授权锁的写事务完成后,撤销再生效。

测试与运维改进

  • 将真实 PostgreSQL 集成测试加入生产部署前验证,失败或超时不再继续请求部署代理。
  • 增加真实 HTTP 权限测试和隔离数据库并发测试,覆盖角色降权、大屏停用与解绑、幂等提交、通知回执、历史分页及清理。
  • 补充学校迁移包篡改场景测试,完善对损坏或被修改数据包的拒绝验证。
  • 在隔离数据库中实际运行备份与恢复脚本,核对账号、学校成员、教学空间、大屏凭据、作业及修订关系,并验证校验失败时拒绝恢复。
  • 升级脚本在取得部署锁后固定前后端提交 SHA,校验兼容性声明,并记录本次部署版本;成功部署或回滚时同步更新版本记录。
  • 部署代理程序和签名请求格式保持不变。固定提交取自取得部署锁时的仓库引用,不保证等同于某次 GitHub Actions 的触发提交。

升级与兼容性说明

  • 建议与 NPClassworks v1.0.1 配套升级,现有同源和独立 API 域名部署方式均继续支持。
  • 相比 v1.0.0,本版包含迁移 20260905000000_screen_publication_idempotency,为作业增加可空的创建请求身份字段及复合唯一索引;无需重建学校或重新录入已有作业。
  • 使用现有 Docker 自动部署流程时,启动命令会先执行 prisma migrate deploy,成功后启动后端;无需手动登录服务器执行这项迁移。自定义非 Docker 部署需在启动新版服务前应用迁移。
  • 无需手动修改或重启 deploy/agent/server.js。 版本配对检查随升级脚本更新;首次安装新脚本的那次升级仍由服务器原有脚本执行,后续调用才使用新检查。
  • 不带请求标识的旧客户端仍可提交,但不具备本次请求级幂等保证;升级前已创建且没有记录请求标识的数据不能追溯建立去重关系。
  • 历史接口不带分页参数时仍返回旧数组格式,兼容尚未刷新的旧前端。现有通知回执、作业恢复和考勤接口格式保持不变。

详细说明见[自动部署文档](./automatic-deployment.md)、[提交幂等说明](./screen-publication-idempotency.md)和[版本配对说明](./deployment-version-pairing.md)。

Full Changelog

[查看后端完整变更:v1.0.0...v1.0.1](v1.0.0...v1.0.1)