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

46 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 2判题竖线
## 出口标准
一名学生可以在 OJ2 前端登录、读取公开题、提交代码,并通过 WebSocket 看到真实 JudgeServer 返回的判题结果。
## 已实现链路
```text
Vue → Hono → PostgreSQL submission → BullMQ/Redis → worker
→ QDU JudgeServer → PostgreSQL 事务写回 → Redis pub/sub
→ Bun WebSocket → Vue SubmissionMonitor
```
- 认证使用 Redis 中的 32 字节随机会话令牌和 `HttpOnly``SameSite=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 } }`
## 本地启动
```bash
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前端对应实时配置连接暂不启动。