支持 C++ / Java / Python / Rust / JavaScript 多语言评测
内置代码游戏与代码画画两大趣味编程模块
🌐 在线体验 · 🚀 快速开始 · ✨ 功能特性 · GitHub · Gitee
📢 国内用户:如果 GitHub 访问较慢,可使用 Gitee 镜像仓库克隆项目
git clone https://gitee.com/glowxq/glowxq-oj.git
| 地址 | 账号 | 密码 | |
|---|---|---|---|
| 👨💼 管理员 | oj.glowxq.com | 13667753053 | 123456 |
| 🎓 学生 | oj.glowxq.com | 13667753055 | 123456 |
| 👩🏫 老师 | oj.glowxq.com | 13667753056 | 123456 |
|
💻 多语言在线评测 支持 C++ / Java / Python / Rust / JavaScript,基于 go-judge 安全沙盒,同时支持 x86_64 与 arm64 架构 |
📝 多题型支持 编程题、单选题、多选题、判断题、填空题、简答题,满足多样化教学与考核需求 |
|
🎮 代码游戏 关卡式编程挑战,通过编写代码控制角色移动、战斗、收集宝藏,寓教于乐 |
🎨 代码画画 可视化编程环境,支持画笔绘图及数组/网格/树/链表等数据结构动态可视化 |
|
🐳 一键 Docker 部署 两种方案可选:Docker Compose(多容器)和 All-in-One 单容器全家桶,无需宿主机安装 Java/Maven/Node |
🏗 跨架构支持 同时兼容 x86_64 (amd64) 和 aarch64 (arm64 / Apple Silicon),Docker 构建自动适配 |
除了传统 OJ 评测,GlowXQ OJ 还提供两个独立的趣味编程模块,可单独访问:
在线体验:coderun.glowxq.com/code-game | 组件:
oj-web/src/components/Oj/Games/MoveCodeGame/
关卡式编程闯关游戏,玩家通过编写代码指令控制角色在网格地图上行动:
- 10+ 关卡 — 从基础移动指令到循环、条件判断、路径规划逐步进阶
- 战斗系统 — 物理攻击(剑)与魔法攻击(法杖)对应不同怪物类型
- 地图编辑器 — 可视化拖拽设计关卡,支持 JSON 导入/导出
- 实时反馈 — 代码执行后动画展示角色移动、战斗、宝藏收集过程
在线体验:coderun.glowxq.com/code-draw | 组件:
oj-web/src/components/Oj/Glowc/
可视化编程绘图与数据结构教学环境:
- 画笔模式 (Pen) — 通过代码控制画笔绘制线条与形状
- 数组可视化 (Array) — 一维数组动态展示
- 网格可视化 (Grid) — 二维数组热力图展示
- 树可视化 (Tree) — 二叉树/多叉树结构渲染
- 链表可视化 (List) — 链表节点与指针动态展示
- 内置 CodeMirror 6 代码编辑器,支持代码模板与命令提示
| 层级 | 技术 |
|---|---|
| 后端 | Java 21 + Spring Boot 3.4 + MyBatis-Flex |
| 前端 | Vue 3.5 + Element Plus + Vite 5 + TypeScript |
| 代码编辑器 | CodeMirror 6 |
| 判题沙盒 | go-judge(支持 amd64 / arm64) |
| 数据库 | MySQL 8.0 |
| 缓存 | Redis 7 |
| 对象存储 | MinIO |
| 容器化 | Docker + Docker Compose |
| 语言 | 编译 / 运行时 |
|---|---|
| C++ | g++ (GCC) |
| Java | JDK 21 |
| Python | Python 3 |
| Rust | rustc |
| JavaScript | Node.js |
一键部署仅需 Docker,无需安装 Java / Maven / Node! 后端 Maven 编译和前端 pnpm 构建均在 Docker 多阶段构建中自动完成。
| 依赖 | 版本 | 必须? |
|---|---|---|
| Docker | >= 20 | 必须 |
| Docker Compose | V2 | 必须 |
| JDK 21 / Maven 3.6+ | >= 21 | 仅本地开发 |
| pnpm / Node 20 | >= 20 | 仅本地开发 |
两种部署方案对比:
方案 适用场景 容器数 是否自带数据库 Docker Compose 本地开发 / 首次体验 / 需要独立管理各服务 5 个 ✅ 独立 MySQL + Redis 容器 All-in-One 全家桶 生产部署 / 一台服务器 / 追求极简 1 个 ✅ 内置 MySQL + Redis
# 1. 克隆项目(GitHub 或 Gitee 二选一)
git clone https://github.com/glowxq/glowxq-oj.git
# git clone https://gitee.com/glowxq/glowxq-oj.git # 国内镜像
cd glowxq-oj
# 2. 一键部署(自动检查环境 → 生成配置 → 构建 → 启动)
chmod +x deploy.sh
./deploy.sh部署完成后自动可用:
| 服务 | 地址 |
|---|---|
| 前端页面 | http://localhost |
| 后端 API | http://localhost:7101 |
| API 文档 | http://localhost:7101/doc.html |
| MinIO 控制台 | http://localhost:9001 |
端口可在
.env中自定义,详见 环境变量说明
📋 Docker Compose 脚本命令一览
# ─── 部署 ─────────────────────────────────
./deploy.sh # 一键全栈部署(默认)
./deploy.sh start # 启动(不重新构建)
./deploy.sh stop # 停止所有服务
./deploy.sh restart # 重启所有服务
./deploy.sh update # 重新编译 + 构建 + 部署
# ─── 开发 ─────────────────────────────────
./deploy.sh dev # 仅启动 MySQL + Redis + MinIO
./deploy.sh dev-stop # 停止基础设施
./deploy.sh build-api # 仅构建后端镜像
./deploy.sh build-web # 仅构建前端镜像
# ─── 运维 ─────────────────────────────────
./deploy.sh status # 容器状态
./deploy.sh health # 健康面板 + 资源使用
./deploy.sh logs oj-api # 查看后端日志
./deploy.sh backup # 备份数据
./deploy.sh prune # 清理无用镜像
# ─── 危险(需确认)────────────────────────
./deploy.sh clean # 清理所有容器和数据
./deploy.sh reset-db # 重置数据库6 个服务打包成 1 个 Docker 容器,内置 MySQL + Redis + Nginx + Spring Boot + go-judge + MinIO,仅暴露 80 端口,数据持久化到 Docker Volume。零依赖,开箱即用。
# 1. 克隆项目(GitHub 或 Gitee 二选一)
git clone https://github.com/glowxq/glowxq-oj.git
# git clone https://gitee.com/glowxq/glowxq-oj.git # 国内镜像
cd glowxq-oj
chmod +x deploy-allinone.sh
# 2. 一键部署(自动生成配置 → 构建 → 启动 → 初始化数据库)
./deploy-allinone.sh
# 3. (可选)编辑配置后重启
vim .env.allinone # 修改站点 URL、密码等
./deploy-allinone.sh restart# ─── 站点配置 ────────────────────────────
SITE_URL=https://oj.example.com # 生产环境必填,决定文件 URL 域名
WEB_PORT=80 # 容器 80 → 宿主机端口
# ─── 内置数据库密码 ─────────────────────
MYSQL_ROOT_PASSWORD=glowxq123456 # 容器内 MySQL root 密码
MYSQL_DATABASE=glowxq_oj # 数据库名
REDIS_PASSWORD=glowxq123456 # 容器内 Redis 密码全自动初始化:首次启动时自动创建数据库、导入表结构、初始化 MinIO。无需手动操作。
🌐 宿主机 Nginx SSL 反代配置示例
宿主机已有 Nginx 时,将以下配置放入 /etc/nginx/conf.d/oj.conf(完整配置见项目根目录 nginx.conf):
# HTTP → HTTPS 重定向
server {
listen 80;
server_name oj.example.com;
return 301 https://$host$request_uri;
}
# HTTPS 反向代理到 OJ 容器
server {
server_name oj.example.com;
listen 443 ssl;
http2 on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/cert.key;
location / {
proxy_pass http://127.0.0.1:80; # 对应 .env.allinone 中的 WEB_PORT
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(在线通知、踢人下线等功能依赖 WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
# 文件上传大小限制
client_max_body_size 50m;
}
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}注意:
proxy_pass端口需与.env.allinone中的WEB_PORT一致,WebSocket 相关头部(Upgrade、Connection)不可省略。
📋 All-in-One 脚本命令一览
./deploy-allinone.sh # 构建 + 启动(默认)
./deploy-allinone.sh stop # 停止容器
./deploy-allinone.sh restart # 重启容器
./deploy-allinone.sh update # 重新构建部署
./deploy-allinone.sh logs # 查看日志
./deploy-allinone.sh status # 查看状态
./deploy-allinone.sh shell # 进入容器 Shell
./deploy-allinone.sh reset-db # 重置数据库(删除所有数据)🐳 等效 docker run 命令
docker build -f Dockerfile.allinone -t glowxq-oj:allinone .
docker run -d --name glowxq-oj \
--privileged --restart unless-stopped \
-p 80:80 \
-v oj-data:/data \
-v oj-judge:/goj \
-e MYSQL_ROOT_PASSWORD=glowxq123456 \
-e MYSQL_DATABASE=glowxq_oj \
-e REDIS_PASSWORD=glowxq123456 \
-e SITE_URL=https://oj.example.com \
-e JWT_SECRET_KEY=your_jwt_secret \
glowxq-oj:allinone💾 数据持久化
通过 Docker Volume 持久化,容器重建后数据不丢失:
| Volume | 容器路径 | 说明 |
|---|---|---|
oj-data |
/data |
MySQL 数据 + Redis 数据 + MinIO 文件 |
oj-judge |
/goj |
测试用例、上传文件等 |
如需完全重置数据:
./deploy-allinone.sh reset-db
| 服务 | 容器名 | 端口 | 说明 |
|---|---|---|---|
| MySQL | oj-mysql | 3306 | 主数据库,用户/题目/提交 |
| Redis | oj-redis | 6379 | 缓存 + 会话 + 排行榜 |
| MinIO | oj-minio | 9000 / 9001 | 文件存储(附件、头像等) |
| OJ API | oj-api | 7101 / 5050 | 后端 + 判题沙盒 |
| OJ Web | oj-web | 80 | 前端 Nginx 托管 |
单容器内通过 supervisord 管理 6 个进程,仅暴露 80 端口:
| 进程 | 内部端口 | 说明 |
|---|---|---|
| MySQL | 3306 | 内置数据库 |
| Redis | 6379 | 内置缓存 |
| Nginx | 80 | 前端 SPA + /api 反代 |
| Spring Boot | 7101 | 后端 API |
| go-judge | 5050 | 代码沙盒 |
| MinIO | 9000 | 文件存储 |
开发时无需全量部署,只需启动基础设施:
# 1. 启动 MySQL + Redis + MinIO
./deploy.sh dev
# 2. 后端
cd glowxq-api
mvn spring-boot:run -pl app/app-oj
# 3. 前端
cd oj-web
pnpm install
pnpm dev # 默认端口 9848,自动代理 /api 到后端
# 4. 开发结束
./deploy.sh dev-stopcd glowxq-api
mvn clean package -DskipTests # 编译
mvn spring-boot:run -pl app/app-oj # 运行
mvn spotless:apply # 格式化Maven 模块结构:
| 模块 | 职责 |
|---|---|
app/app-oj |
应用启动入口 + 判题沙盒 |
business/business-oj |
OJ 判题业务逻辑 |
business/business-system |
系统管理业务逻辑 |
common |
公共工具类和模型 |
dependencies |
依赖版本管理 |
cd oj-web
pnpm install # 安装依赖
pnpm dev # OJ 开发服务器
pnpm build-only --mode oj # 构建生产包
pnpm lint # 代码检查
pnpm format # 格式化环境配置文件:
| 文件 | 用途 |
|---|---|
oj-web/env/.env |
通用配置(端口等) |
oj-web/env/.env.oj |
生产环境 API 地址 |
oj-web/env/dev/.env.oj |
开发环境 API 地址 |
开发模式下 Vite 自动将
/api请求代理到后端(默认http://127.0.0.1:7101/api)。
glowxq-oj/
├── glowxq-api/ # 后端(Java / Maven 多模块)
│ ├── app/app-oj/ # 启动模块 + Dockerfile + go-judge
│ ├── business/ # 业务模块
│ │ ├── business-oj/ # OJ 判题
│ │ └── business-system/ # 系统管理
│ ├── common/ # 公共模块
│ └── script/ # init.sql + 独立部署脚本
│
├── oj-web/ # 前端(Vue 3 + TypeScript)
│ └── src/
│ ├── components/Oj/Games/ # 代码游戏
│ └── components/Oj/Glowc/ # 代码画画
│
├── docs/ # 文档资源
│ ├── svg/ # 架构图 & 装饰性 SVG
│ └── img/ # 二维码等图片
│
├── docker-compose.yml # Docker Compose 编排
├── deploy.sh # Compose 部署脚本
├── Dockerfile.allinone # All-in-One 多阶段构建
├── deploy-allinone.sh # All-in-One 部署脚本
├── supervisord.conf # All-in-One 进程管理
├── nginx.allinone.conf # All-in-One Nginx 配置
├── entrypoint.sh # All-in-One 启动入口
├── nginx.deploy.conf # Compose Nginx 配置
├── .env.example # 环境变量模板
└── README.md
所有配置在 .env 文件中管理(首次部署自动从 .env.example 生成):
# ─── 站点 ─────────────────────────────
SITE_URL= # 站点公网地址(生产部署时设置)
# ─── MySQL ────────────────────────────
MYSQL_ROOT_PASSWORD=glowxq123456 # root 密码
MYSQL_DATABASE=glowxq_oj # 数据库名
MYSQL_PORT=3306 # 对外端口
# ─── Redis ────────────────────────────
REDIS_PASSWORD=glowxq123456 # 密码
REDIS_PORT=6379 # 对外端口
REDIS_DATABASE=1 # DB 编号
# ─── MinIO ────────────────────────────
MINIO_ACCESS_KEY=minioadmin # 访问密钥
MINIO_SECRET_KEY=minioadmin # 密钥
MINIO_BUCKET=nexus-oj # 默认 Bucket
MINIO_API_PORT=9000 # API 端口
MINIO_CONSOLE_PORT=9001 # 控制台端口
# ─── JWT ──────────────────────────────
JWT_SECRET_KEY=xxx # 部署脚本自动生成
# ─── 后端 ─────────────────────────────
APP_PORT=7101 # API 端口
SANDBOX_PORT=5050 # go-judge 端口
JAVA_OPTS=-Xms256m -Xmx512m # JVM 参数
# ─── 前端 ─────────────────────────────
WEB_PORT=80 # 前端端口
# ─── 数据 ─────────────────────────────
DATA_DIR=./data # 持久化目录
# ─── 飞书集成(可选)──────────────────
# FEISHU_INTERNAL_WEBHOOK=
# FEISHU_BUSINESS_WEBHOOK=
# FEISHU_APP_ID=
# FEISHU_APP_SECRET=如果不使用一键脚本,可手动操作(仅需 Docker):
# GitHub 或 Gitee 二选一
git clone https://github.com/glowxq/glowxq-oj.git
# git clone https://gitee.com/glowxq/glowxq-oj.git
cd glowxq-oj
cp .env.example .env
# 编辑 .env,至少修改 JWT_SECRET_KEY
DOCKER_BUILDKIT=1 docker compose up -d --build
docker compose logs -f # 查看日志
docker compose down # 停止服务端口冲突怎么办?
修改 .env 中对应的端口:
MYSQL_PORT=3307
REDIS_PORT=6380
APP_PORT=7102
WEB_PORT=8080
MINIO_API_PORT=9002
MINIO_CONSOLE_PORT=9003后端日志如何查看?
./deploy.sh logs oj-api # Docker Compose 方案
./deploy-allinone.sh logs # All-in-One 方案如何重置数据库?
# Docker Compose 方案
./deploy.sh reset-db
# All-in-One 方案
./deploy-allinone.sh reset-dbDocker 构建很慢?
Dockerfile 已内置国内加速:Maven 阿里云镜像 + npm 淘宝镜像,国内服务器构建无需额外配置。
如果 Docker 拉取基础镜像慢,配置 Docker 镜像加速器,编辑 /etc/docker/daemon.json:
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}重启 Docker:sudo systemctl restart docker
如何备份数据?
./deploy.sh backup
# 自动导出 MySQL + 打包数据目录,保存在 ./backups/只更新后端 / 前端代码?
./deploy.sh build-api && docker compose up -d oj-api # 后端
docker compose up -d --build oj-web # 前端
./deploy.sh update # 或全部重建Docker Compose 还是 All-in-One?
| 场景 | 推荐 | 原因 |
|---|---|---|
| 首次体验 / 本地开发 | Docker Compose | 各服务独立,方便调试 |
| 一台服务器生产部署 | All-in-One | 单容器零依赖,管理简单 |
| 需要独立扩展数据库 | Docker Compose | 灵活扩展各组件 |
| 追求极简一键部署 | All-in-One | 内置全部服务,开箱即用 |
All-in-One API 返回 404?
通常是 Spring Boot 尚未启动完成(首次启动需初始化数据库,约 1-2 分钟):
./deploy-allinone.sh logs # 查看日志
./deploy-allinone.sh status # 查看各进程状态All-in-One 上传文件 / 头像无法显示?
文件通过 Nginx /nexus-oj/ 代理到容器内 MinIO。如果无法访问:
- 检查
SITE_URL是否已设置(生产环境必须为公网域名) - 确认宿主机 Nginx 正确代理到容器端口
- 本地测试访问
http://localhost/nexus-oj/应返回 200
go-judge 在哪里?
集成在后端 Docker 镜像中(app/app-oj/Sandbox-amd64 和 Sandbox-arm64),启动时自动检测 CPU 架构。沙盒端口默认 5050。
内存不足怎么调整?
修改 .env 中的 JVM 参数:
JAVA_OPTS=-Xms128m -Xmx256m # 小内存(2GB)
JAVA_OPTS=-Xms256m -Xmx512m # 标准(4GB+)
JAVA_OPTS=-Xms512m -Xmx1024m # 大内存(8GB+)GitHub 克隆太慢?
使用 Gitee 国内镜像:
git clone https://gitee.com/glowxq/glowxq-oj.git如果您有软件开发需求(Web 应用、小程序、系统定制等),欢迎联系:
| 渠道 | 详情 |
|---|---|
| 接单案例 | case.glowxq.com |
| 邮箱 | glowxq@qq.com |
| 微信 | glowxq |
提供全栈开发、系统架构设计、技术咨询等服务,欢迎洽谈合作。
如果本项目对你有帮助,欢迎打赏支持,你的鼓励是持续开源的动力:
感谢以下优秀开源项目对本项目的启发与支持:
| 项目 | 简介 |
|---|---|
| Hydro | 高性能在线评测系统 |
| HOJ | 基于 Spring Cloud 的分布式开源在线评测系统 |
| go-judge | 安全高效的代码沙盒评测引擎 |
| Sz-Admin | 基于 Spring Boot 3 + Vue 3 的开源 RBAC 权限框架 |
| Sa-Token | 轻量级 Java 全功能权限认证框架 |
| MyBatis-Flex | 优雅的 MyBatis 增强框架 |
Apache License 2.0 © 2025 GlowXQ