# Vibe-Coding-Oj-V2 **Repository Path**: yuyka/vibe-coding-oj-v2 ## Basic Information - **Project Name**: Vibe-Coding-Oj-V2 - **Description**: 使用 kimi2.6 + opencode 完成 oj 项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-01 - **Last Updated**: 2026-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 仿 LeetCode 在线判题系统 (OJ) 基于 C++ 从零构建的在线判题(Online Judge)系统,支持用户提交 C++ 代码,由从机在安全沙箱中编译执行,通过 SSE 实时推送判题结果。 ## 功能特性 - **用户系统**:注册、登录、登出,Session Cookie 认证(bcrypt 密码哈希) - **题目浏览**:分页列表、难度筛选,Markdown 渲染题目详情 - **代码编辑**:Ace Editor 语法高亮,自动保存草稿(防抖 3s) - **在线判题**:提交代码 → Redis 队列 → Worker 编译运行 → SSE 实时推送结果 - **Run Code**:运行公开测试用例,查看输出(调试用) - **从机管理**:动态注册、心跳保活、自动下线检测与故障恢复 - **限流保护**:每用户每题目 Pending 上限 + 滑动窗口全局提交频率限制 - **管理后台**:题目 CRUD、系统状态监控(在线从机数 / 队列长度) - **安全沙箱**:`setrlimit` 资源限制 + `chroot` 隔离 + 低权限 `uid` 运行 ## 技术栈 | 层级 | 技术 | |------|------| | 后端 (主机 + 从机) | C++ 17 + cpp-httplib | | 数据库 | MySQL 8.0 | | 缓存 / 队列 | Redis 7.0 | | 前端 | HTML + CSS (Tailwind CDN) + JS (Ace Editor 1.36.2 + marked.js) | | 密码哈希 | bcrypt (cost=10) | | JSON | nlohmann/json | | 构建 | GNU Make | ## 系统架构 ``` Browser (Ace Editor + SSE) │ HTTP/SSE ▼ ┌─────────────────┐ Redis List (judge:queue) ┌─────────────────┐ │ Host (Web) │ ──────────────────────────────▶ │ Worker Node │ │ cpp-httplib │ │ Compiler │ │ Session/SSE │ ◀────────────────────────────── │ Sandbox │ │ Rate Limiter │ Redis Hash (judge:result) │ TestRunner │ └────────┬────────┘ └─────────────────┘ │ ▲ │ MySQL (users/problems/submissions/...) │ Heartbeat ▼ │ ┌─────────────────┐ ┌─────────────────┐ │ MySQL │ │ Worker Node N │ └─────────────────┘ └─────────────────┘ ``` 判题流程:提交 → 入队 (Redis List) → Worker 取任务 → 编译 (g++) → 沙箱执行 (setrlimit/chroot) → 比对输出 → 结果回写 Redis → SSE 推送到浏览器。 ## 项目结构 ``` oj-system/ ├── config/ # 配置文件 │ ├── default.conf # 默认配置模板 │ ├── host.conf # 主机配置 │ └── worker.conf # 从机配置 ├── docs/ # 开发文档(CONFIG_MANAGER、MYSQL_POOL 等) ├── host/ # 主机服务源码 │ ├── main.cpp # 入口 │ ├── handlers/ # HTTP 路由处理器 │ ├── services/ # 业务逻辑层 │ ├── models/ # 数据访问层 │ ├── middleware/ # 认证/权限中间件 │ └── config/ # 主机配置包装 ├── worker/ # 从机服务源码 │ ├── main.cpp # 入口 │ ├── client/ # 主机通信 (注册/心跳) │ ├── compiler/ # g++ 编译模块 │ ├── sandbox/ # 安全沙箱 │ ├── runner/ # 测试运行器 │ └── reporter/ # 结果回写 (Redis + MySQL) ├── frontend/ # 前端静态文件 ├── shared/ # 共享库(配置、DB/Redis 连接池、日志、JSON) ├── tests/ # 单元测试 + 接口测试 ├── scripts/ # 脚本(建表、种子数据、服务控制、API 测试) ├── problems/ # 题目 Markdown 与测试用例数据 └── Makefile # 构建文件 ``` ## 快速开始 ### 环境要求 - Ubuntu 24.04 LTS(推荐) - g++ 11+(Ubuntu 24.04 自带 13.x) - MySQL 8.0+、Redis 6.0+ - 依赖库:`libmysqlclient-dev`、`libhiredis-dev`、`libcpp-httplib-dev`、`nlohmann-json3-dev`、`bcrypt` 完整依赖安装见 [docs/DEPENDENCIES.md](docs/DEPENDENCIES.md) 或 [DEPLOY.md](DEPLOY.md)。 ### 安装依赖 ```bash # APT 依赖 sudo apt-get install -y build-essential cmake mysql-server libmysqlclient-dev \ redis-server libhiredis-dev libcpp-httplib-dev nlohmann-json3-dev libssl-dev # 手动编译 bcrypt cd /tmp && git clone --depth 1 https://github.com/trusch/libbcrypt.git cd libbcrypt && mkdir build && cd build && cmake .. && make -j$(nproc) && sudo make install && sudo ldconfig ``` ### 初始化数据库 ```bash # 建表 mysql -u root -p < scripts/init_db.sql # 导入种子数据(3 用户 + 10 题目 + 48 测试用例) mysql -u root -p < scripts/full_seed_data.sql ``` 默认账号:`admin` / `admin123`(管理员),`testuser` / `admin123`(普通用户)。 ### 编译 ```bash make all # 编译主机 + 从机 # 或分别编译: make host # 仅编译主机 make worker # 仅编译从机 ``` ### 启动服务 **方式一:一键启停(推荐)** ```bash # 启动(自动检测并启动 Redis,启动 host + worker) bash scripts/oj_ctl.sh start # 查看状态 bash scripts/oj_ctl.sh status # 查看日志 bash scripts/oj_ctl.sh logs host # 主机日志 bash scripts/oj_ctl.sh logs worker # 从机日志 # 停止 bash scripts/oj_ctl.sh stop # 重启 bash scripts/oj_ctl.sh restart ``` **方式二:手动启动** ```bash # 1. 启动 Redis redis-server --daemonize yes # 2. 启动主机 ./build/host/host_server --config config/host.conf # 3. 启动从机 ./build/worker/worker --config config/worker.conf ``` 启动后访问 `http://localhost:8080` 进入系统。 ### 配置说明 配置优先级(从高到低):命令行参数 > 环境变量 > 配置文件 > 默认值。 **命令行参数覆盖:** ```bash ./build/host/host_server --port 8080 --worker-token mysecret ``` **环境变量(自动扫描 `OJ_` 前缀):** ```bash OJ_SERVER_PORT=8080 OJ_SECURITY_WORKER_TOKEN=mysecret ./build/host/host_server ``` **配置文件:** 编辑 `config/host.conf` 或 `config/worker.conf`(INI 格式,支持 `${ENV_VAR}` 变量替换)。 热更新支持:限流阈值、日志级别、性能参数(修改配置文件后发送 `SIGHUP` 信号重载);端口、数据库连接、安全策略需重启生效。 ## API 接口一览 | # | Method | Path | Auth | 说明 | |---|--------|------|------|------| | 1 | GET | `/api/health` | — | 健康检查 | | 2 | POST | `/api/register` | — | 用户注册 | | 3 | POST | `/api/login` | — | 用户登录 | | 4 | POST | `/api/logout` | — | 用户登出 | | 5 | GET | `/api/me` | Cookie | 获取当前用户 | | 6 | GET | `/api/problems` | — | 题目列表 | | 7 | GET | `/api/problems/{slug}` | — | 题目详情 | | 8 | POST | `/api/submit` | Cookie | 提交代码 | | 9 | GET | `/api/events` | — | SSE 判题结果流 | | 10 | GET | `/api/submissions` | Cookie | 提交历史 | | 11 | POST | `/api/autosave` | Cookie | 代码自动保存 | | 12 | GET | `/api/draft` | Cookie | 读取代码草稿 | | 13 | POST | `/api/admin/problems` | Admin | 创建题目 | | 14 | PUT | `/api/admin/problems/{id}` | Admin | 编辑题目 | | 15 | GET | `/api/admin/system/status` | Admin | 系统状态 | | 16 | POST | `/api/worker/register` | Token | 从机注册 | | 17 | POST | `/api/worker/heartbeat` | Token | 从机心跳 | 详细文档见 [SPEC.md](SPEC.md) 第 7 章。 ## 判题状态 | 状态 | 含义 | |------|------| | `pending` | 等待判题(已入队) | | `compiling` | 正在编译 | | `running` | 正在执行测试用例 | | `accepted` | 全部通过 | | `wrong_answer` | 答案错误 | | `time_limit_exceeded` | 运行超时 | | `memory_limit_exceeded` | 内存超限 | | `runtime_error` | 运行时错误(SIGSEGV/SIGFPE 等) | | `compile_error` | 编译错误 | | `system_error` | 系统内部错误 | ## 测试 ```bash # 运行全部单元测试(基础设施 + 主机 Phase 2) make test # 运行 Phase 3 从机测试 make test-m3 # 运行接口自动化测试(HTTP,需先启动主机) python3 tests/test_api.py # 运行单个模块测试 make test-config # 配置管理 make test-db # MySQL 连接池 make test-redis # Redis 连接池 make test-m1 # 主机 Milestone 1 make test-m2 # 主机 Milestone 2 ``` ## 数据库重置 ```bash # soft: 仅清空提交/草稿/Session(保留题目和测试用例) bash scripts/reset_db.sh soft # full: 完全重建(清空所有表,保留 admin 用户) bash scripts/reset_db.sh full # seed-only: 仅补充种子数据(不删除已有数据) bash scripts/reset_db.sh seed-only ``` ## 文档 | 文档 | 说明 | |------|------| | [SPEC.md](SPEC.md) | 完整系统规格说明 | | [DEPLOY.md](DEPLOY.md) | 部署指南 | | [docs/DEPENDENCIES.md](docs/DEPENDENCIES.md) | 依赖安装说明 | | [docs/CONFIG_MANAGER.md](docs/CONFIG_MANAGER.md) | 配置管理模块文档 | | [docs/MYSQL_POOL.md](docs/MYSQL_POOL.md) | MySQL 连接池文档 | | [docs/REDIS_POOL.md](docs/REDIS_POOL.md) | Redis 连接池文档 | | [docs/JSON_HELPER.md](docs/JSON_HELPER.md) | JSON 工具模块文档 | | [docs/ERROR_CODES.md](docs/ERROR_CODES.md) | 错误码规范 | | [docs/FRONTEND.md](docs/FRONTEND.md) | 前端架构文档 | | [docs/API_TEST.md](docs/API_TEST.md) | 接口测试文档 | ## 后续迭代方向 1. **沙箱升级**:替换为 nsjail / isolate(完整 namespace + cgroup + seccomp) 2. **多语言支持**:Python、Java、Go(通过 Docker 镜像隔离) 3. **讨论区 / 比赛模式 / 排行榜** 4. **前端现代化**:迁移至 Vue/React + TypeScript