Files
OJ2/docs/plans/2026-08-06-phase2-judge-vertical.md

2.4 KiB
Raw Blame History

Phase 2判题竖线

出口标准

一名学生可以在 OJ2 前端登录、读取公开题、提交代码,并通过 WebSocket 看到真实 JudgeServer 返回的判题结果。

已实现链路

Vue → Hono → PostgreSQL submission → BullMQ/Redis → worker
    → QDU JudgeServer → PostgreSQL 事务写回 → Redis pub/sub
    → Bun WebSocket → Vue SubmissionMonitor
  • 认证使用 Redis 中的 32 字节随机会话令牌和 HttpOnlySameSite=Lax Cookie。
  • 每个受保护请求都重新读取用户表;账号禁用会立即让 HTTP/WS 鉴权失效。
  • 兼容 Django pbkdf2_sha256,验证走异步 node:crypto.pbkdf2;成功登录后透明改存 Bun argon2id
  • 公开题详情隐藏测试点、答案、AST 规则,只返回模板中的学生可编辑区。
  • BullMQ worker 负责模板拼接、JudgeServer HTTP 调用、C/Python AST 检查、结果聚合和统计事务。
  • WebSocket 在订阅时重放数据库现状,覆盖“判题先完成、浏览器后连上”的竞态;轮询仍作为前端保底。
  • JudgeServer 心跳保留镜像要求的旧 { error, data } 信封,其余新接口使用 { data } / { error: { code, message } }

本地启动

docker compose -f docker/compose.dev.yml up -d
bun run seed:dev
bun run dev

默认开发账号是 student / student123,可用 OJ2_DEV_USERNAMEOJ2_DEV_PASSWORD 覆盖。真实测试点放在 data/test_case/,该目录只读挂载给 JudgeServer 且不进入 Git。

验收记录

  • API 与共享契约 TypeScript 静态检查通过。
  • Vue 生产构建通过,保留 Chrome 90 兼容构建。
  • Django PBKDF2 正确/错误密码兼容检查通过AST C/Python WASM 加载与规则判定通过。
  • 使用生产样本题 1004 的真实测试点完成 AC 和 WA题目计数、用户提交数和首次 AC 状态在同一事务中更新。
  • WebSocket 实测收到 pending → judging → finished,并验证完成后再订阅仍会重放最终结果。
  • 真实浏览器完成登录、读题、编辑、提交并显示“答案正确”。
  • Compose 配置有效PostgreSQL、Redis 和 JudgeServer 健康检查均通过。

Phase 3 边界

本阶段仅切换登录、本人资料、非比赛公开题详情、普通提交与本人提交详情。比赛、题目统计/点评、登录速报、成就、代码格式化等端点继续留给 Phase 3前端对应实时配置连接暂不启动。