2.4 KiB
2.4 KiB
Phase 2:判题竖线
出口标准
一名学生可以在 OJ2 前端登录、读取公开题、提交代码,并通过 WebSocket 看到真实 JudgeServer 返回的判题结果。
已实现链路
Vue → Hono → PostgreSQL submission → BullMQ/Redis → worker
→ QDU JudgeServer → PostgreSQL 事务写回 → Redis pub/sub
→ Bun WebSocket → Vue SubmissionMonitor
- 认证使用 Redis 中的 32 字节随机会话令牌和
HttpOnly、SameSite=LaxCookie。 - 每个受保护请求都重新读取用户表;账号禁用会立即让 HTTP/WS 鉴权失效。
- 兼容 Django
pbkdf2_sha256,验证走异步node:crypto.pbkdf2;成功登录后透明改存 Bunargon2id。 - 公开题详情隐藏测试点、答案、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_USERNAME 和 OJ2_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;前端对应实时配置连接暂不启动。