Build Phase 2 judge vertical slice

This commit is contained in:
2026-08-06 22:42:39 -06:00
parent e6329ecabb
commit ec274419c3
41 changed files with 2945 additions and 669 deletions

View File

@@ -0,0 +1,45 @@
# 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前端对应实时配置连接暂不启动。