基于 Vibe Coding 的 OJ 平台
基于 Vibe Coding 的 OJ 平台Github: https://github.com/wjlwjlwjlwjl-cmd/vibe-coding-based-oj-platformGitee: https://gitee.com/wangs-joyful-home/vibe-coding-based-oj-platform一个类 LeetCode 的在线编程评测平台支持题目管理、代码提交、自动判题、提交历史查询等功能。功能一览功能描述用户注册与登录用户名/密码注册登录Session-Cookie 会话管理题目浏览展示题目列表支持按标题/难度搜索过滤在线编程Ace.js 代码编辑器Monokai 主题C 在线编写代码提交提交代码到判题系统异步轮询获取判题结果判题沙箱独立判题服务支持编译运行、超时/超内存检测提交历史分页查看提交记录按状态过滤查看详细判题结果后台管理管理员创建/编辑/删除题目管理测试用例系统架构┌──────────┐ HTTP ┌──────────┐ HTTP ┌──────────┐ │ Browser │ ────────▶│ Backend │ ────────▶│ Judge │ │ (Vanilla │ │ (C │ │ (C │ │ HTML/JS) │ ◀────────│ httplib) │ ◀────────│ forkexe)│ └──────────┘ └────┬─────┘ └──────────┘ │ ▼ ┌──────────┐ │ MySQL │ └──────────┘前端: 原生 HTML CSS JSAce.js 代码编辑器无框架依赖后端: C 17 cpp-httplib HTTP 服务器RESTful API判题: 独立 HTTP 服务 (127.0.0.1:9090)forkexecve 编译运行数据库: MySQL 8.0存储用户、题目、提交记录核心实现机制认证与会话管理Session-Cookie方案登录成功后在服务端内存unordered_map中创建 session返回HttpOnlyCookieSession ID 为 64 字符随机字母数字串默认 24 小时过期所有/api/*路由健康检查、注册、登录除外均需认证密码存储SHA-256 哈希 16 字节随机盐格式salt$hash兼容旧版无盐哈希判题引擎独立进程运行通过 HTTP/judge接口与后端通信沙箱隔离setitimer(ITIMER_REAL)微秒级超时 setrlimit(RLIMIT_AS)内存限制编译运行fork()execve()子进程父进程通过select()gettimeofday()监控执行支持状态pending→judging→accepted/wrong_answer/compile_error/time_limit/memory_limit/runtime_error数据库设计users— 用户表id, username, password, role (user/admin), created_atproblems— 题目表id, title, description, difficulty, time_limit, memory_limit, test_cases (JSON), user_id, created_atsubmissions— 提交表id, user_id, problem_id, code, language, status, score, judge_result (JSON), submitted_at外键约束 ON DELETE CASCADE确保删除题目或用户时关联提交自动清理题目管理管理员创建/编辑/删除题目设置标题、难度、时间/内存限制、描述测试用例以 JSON 数组存储支持多组输入/输出快速开始环境要求MySQL8.0localhost:3306g11C17cmake3.16libmysqlclient-dev、libssl-dev、libgtest-dev运行测试时需要启动# 1. 初始化数据库./scripts/init_db.sh# 按提示输入 MySQL root 密码# 2. 启动所有服务构建 启动判题服务 后端./scripts/start.sh# 3. 打开浏览器访问# http://localhost:8080停止./scripts/stop.sh项目结构v0.2/ ├── backend/ # C HTTP 后端cpp-httplib ├── judge/ # 判题服务forkexecve 沙箱 ├── frontend/ # 前端静态文件HTML/CSS/JS ├── scripts/ # 构建与部署脚本 ├── sql/ # 数据库建表与种子数据 ├── config/ # 配置文件config.json ├── png/ # 项目截图 └── test/ # 单元测试与集成测试配置说明编辑config/config.json配置项说明server.host/port后端监听地址默认0.0.0.0:8080db.host/port/user/password/databaseMySQL 连接信息judge.host/port判题服务地址默认127.0.0.1:9090session.expiry_hoursSession 过期时间小时frontend_dir默认为../../frontend路径相对于可执行文件所在目录由/proc/self/exe解析为绝对路径。手动启动无需脚本# 终端 1判题服务cdjudgemkdir-pbuildcdbuild cmake..make-j$(nproc)./oj-judge# 终端 2后端cdbackendmkdir-pbuildcdbuild cmake..make-j$(nproc)./oj-backend# 访问 http://localhost:8080运行测试./scripts/build.sh# 构建所有模块及测试# 判题单元测试28 项./test/todo-05-judge/build/oj-judge-test# 提交 API 测试21 项./test/todo-06-submission-api/build/oj-submission-test# 集成测试15 项全流程 HTTP./test/todo-08-integration/build/oj-integration-test管理员账号初始化数据库后默认账号用户名admin密码admin123也可注册新用户后在数据库中手动设置角色UPDATEusersSETroleadminWHEREusername你的用户名;技术栈层级技术前端原生 HTML5 / CSS3 / JavaScriptES6代码编辑器Ace.jsMonokai 主题后端C17 cpp-httplib判题C17 POSIX (fork/execve/pipe/select)数据库MySQL 8.0构建CMake测试Google Test 1.17.0