# cpp-oj-vibecoding-teach **Repository Path**: lzf7240/cpp-oj-vibecoding-teach ## Basic Information - **Project Name**: cpp-oj-vibecoding-teach - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-03 - **Last Updated**: 2026-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cpp-oj-vibecoding-teach > 一个仿 LeetCode 的教学型在线判题系统(OJ) > 后端 **C++17**(cpp-httplib + nlohmann/json) > 前端 **原生 HTML/CSS/JS**(无构建) > 沙箱 **firejail**(v1.1 起替代 Docker) > 运行时 **apt 直装 MySQL/Redis + systemd**(v1.1 起替代 docker-compose) > ⚠️ 规格源:`SPEC.md`(v1.1)。本文档只是快速上手。 --- ## 0. 30 秒速览 ```text ┌────────┐ HTTP/WS ┌──────────────┐ BRPOP ┌────────┐ firejail ┌────────┐ │ 浏览器 │ ─────────▶ │ oj-backend │ ◀──────▶ │oj-worker│ ────────▶ │用户代码│ │ (web/) │ │ /api /web │ │ │ │ 沙箱 │ └────────┘ └──────┬───────┘ └────┬────┘ └────────┘ │ MySQL │ Redis ▼ ▼ ┌────────┐ ┌────────┐ │mysql │ │redis │ │(apt) │ │(apt) │ └────────┘ └────────┘ ``` --- ## 1. 一键起(v1.1,apt + systemd) > 目标系统:**Ubuntu 22.04 LTS**,x86_64。 ```bash git clone --recurse-submodules https://github.com//cpp-oj-vibecoding-teach cd cpp-oj-vibecoding-teach sudo bash deploy/scripts/dev_up.sh ``` 脚本依次做: 1. `apt` 装依赖(firejail / g++/gcc / python3 / openjdk-17-jdk / mysql-server / redis-server) 2. 启 `mysql` / `redis-server`(systemd) 3. 建 `oj` 库 + `oj` 用户 4. 编译 `backend/build/oj-backend` + `worker/build/oj-worker` 5. 写 `/etc/oj/backend.env` / `worker.env` / `*.yaml` 6. 装 `oj-backend.service` / `oj-worker.service` 并 `enable --now` 7. 烟测 `/api/health` 烟测通过后访问 ,5 个页面:登录/注册/题库/详情/后台。 --- ## 2. 项目结构 ```text cpp-oj-vibecoding-teach/ ├── SPEC.md # 唯一规格源(v1.1) ├── AGENTS.md # 给编码 Agent 的工程约定 ├── README.md # 本文件 ├── LICENSE ├── .gitignore .gitmodules ├── backend/ # 主进程(HTTP + WS + 静态) │ ├── CMakeLists.txt │ ├── include/oj//... │ ├── src//... │ ├── src/main.cpp # 入口(阶段 0 骨架) │ ├── third_party/ # git submodule: cpp-httplib / json │ └── config/config.example.yaml ├── worker/ # 判题 worker 进程 │ ├── CMakeLists.txt │ ├── src/main.cpp # 阶段 0 骨架(占位 BRPOP + 心跳) │ └── config/worker.example.yaml ├── web/ # 前端纯静态 │ ├── login.html register.html index.html problem.html admin.html │ └── assets/ │ ├── app.js api.js ws.js store.js editor.js markdown.js │ ├── styles.css │ ├── components/ │ └── codemirror/ marked/ highlight.js/ purify/ # vendor(阶段 4+ 填) ├── deploy/ │ ├── .env.example │ ├── mysql/init/ # 01_schema.sql 02_seed.sql │ ├── scripts/dev_up.sh reset_db.sh backup.sh │ └── systemd/oj-backend.service oj-worker.service ├── tools/ │ ├── import_problems.py # 题库 JSON → DB │ ├── seed/builtin_problems.json │ ├── verify_runtime.sh # 沙箱攻击验证 │ └── stress/concurrent_submit.py # A12 压测 ├── scripts/install_deps.sh └── docs/ # ARCHITECTURE / API / DEPLOY / CONTRIBUTING / dependence ``` --- ## 3. 阶段路线(SPEC §14) | 阶段 | 主题 | 状态 | | --- | --- | --- | | 0 | 工程脚手架 | ✅ | | 1 | 基础设施(db_pool / redis / ws_hub / logger / 错误中间件) | ⏳ | | 2 | 鉴权 & 用户(bcrypt + JWT + 限流) | ⏳ | | 3 | 题库 CRUD + 内置题 | ⏳ | | 4 | 提交 & 判题(firejail + 状态机) | ⏳ | | 5 | WebSocket 实时日志 | ⏳ | | 6 | 题解 / 讨论(Markdown) | ⏳ | | 7 | 管理后台 UI | ⏳ | | 8 | 打磨(暗色主题 / Loading / Toast) | ⏳ | | 9 | 验收测试(A1-A14) | ⏳ | --- ## 4. 常用命令 ```bash # 单独构建 cmake -S backend -B backend/build && cmake --build backend/build -j cmake -S worker -B worker/build && cmake --build worker/build -j # 服务管理(systemd) sudo systemctl status oj-backend oj-worker sudo journalctl -u oj-backend -f sudo journalctl -u oj-worker -f # 排障 mysql -uoj -pojpass oj -e "SELECT VERSION();" redis-cli ping firejail --profile=/etc/firejail/oj-judge.profile --noprofile -- bash -c 'echo ok' ``` --- ## 5. 沙箱攻击验证 ```bash sudo bash tools/verify_runtime.sh # 覆盖:A3 TLE / A4 MLE / A5 读 /etc/passwd / A6 联网 ``` --- ## 6. 致谢 / License - [cpp-httplib](https://github.com/yhirose/cpp-httplib) — MIT - [nlohmann/json](https://github.com/nlohmann/json) — MIT - [firejail](https://github.com/netblue30/firejail) — GPL-2.0 本仓库代码以 MIT 发布,详见 `LICENSE`。