这是 PutongOJ(开源 Online Judge)到 Spring Boot 框架的渐进式迁移项目。
- Java 17+
- Maven 3.6+
- MongoDB 5.0+(本地或远程)
- Redis 6.0+(用于消息队列和 Token 存储)
# 使用 Docker Compose(推荐)
docker-compose up -d
# 或使用本地安装
mongod --dbpath ./data/mongodb
redis-server编辑 src/main/resources/application.yml:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/putongoj
redis:
host: localhost
port: 6379
sa-token:
token-name: Authorization
timeout: 86400cd d:\code\putongoj-springboot
mvn spring-boot:run应用将在 http://localhost:8080 启动,并自动执行数据库字段迁移。
# 构建镜像
docker build -t putongoj-springboot .
# 使用 docker-compose 一键启动所有服务
docker-compose -f docker-compose.yml up- ✅ 用户认证(JWT)与权限管理
- ✅ 题目管理(CRUD)
- ✅ 代码提交(与 Redis 队列集成)
- ✅ 数据库字段自动迁移(MongoDB $rename)
- ✅ 自增 ID 生成(序列服务)
- 🔄 题目与提交的完整 REST API
- 🔄 比赛与排行榜功能
- 🔄 前后端兼容性测试
- 📋 Swagger/OpenAPI 文档
- 📋 单元测试与集成测试
- 📋 Docker 容器化部署
- 📋 关系型数据库(可选迁移)
putongoj-springboot/
├── src/
│ ├── main/
│ │ ├── java/com/putongoj/
│ │ │ ├── config/ # 配置层(Security、MongoDB、Redis、迁移)
│ │ │ ├── model/ # MongoDB Document 模型
│ │ │ ├── repository/ # Spring Data MongoDB 仓储
│ │ │ ├── service/ # 业务逻辑层
│ │ │ ├── controller/ # REST API 控制器
│ │ │ └── util/ # 工具类
│ │ └── resources/
│ │ ├── application.yml # 应用配置
│ │ └── logback.xml # 日志配置
│ └── test/
│ └── java/com/putongoj/ # 单元与集成测试
├── pom.xml # Maven 依赖与构建
├── Dockerfile # Docker 镜像定义
├── docker-compose.yml # Docker Compose 编排
├── ARCHITECTURE.md # 架构文档
├── DATABASE_MIGRATION.md # 数据库迁移文档
└── README.md # 本文件
| 组件 | 技术 | 用途 |
|---|---|---|
| 框架 | Spring Boot 3.1.5 | 主应用框架 |
| 数据库 | MongoDB | 文档数据库 |
| 数据访问 | Spring Data MongoDB | Repository 层 |
| 缓存/队列 | Redis | 任务队列、Token 存储 |
| 认证 | Sa-Token 1.37.0 | 轻量级权限认证框架 |
| 代码生成 | Lombok | 减少样板代码 |
| 构建 | Maven 3.6+ | 项目构建 |
# 注册
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{"uid":"user1","nick":"User One","pwd":"password123"}'
# 登录
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"uid":"user1","pwd":"password123"}'
# 返回: { "token": "5f8f8c9c-...", "profile": { "uid": "user1", ... } }
# 获取个人资料(需要 Sa-Token)
curl -X GET http://localhost:8080/api/auth/profile \
-H "Authorization: Bearer <token>"
# 登出
curl -X POST http://localhost:8080/api/auth/logout \
-H "Authorization: Bearer <token>"# 创建题目(需要登陆)
curl -X POST http://localhost:8080/api/problem/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"title": "Hello World",
"description": "...",
"timeLimit": 1000,
"memoryLimit": 32768
}'
# 返回: { "problemId": 1 }# 提交代码(需要登陆)
curl -X POST http://localhost:8080/api/solution/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"problemId": 1,
"code": "int main() { return 0; }",
"language": 1
}'
# 返回: { "solutionId": 1 }
# 自动推入 Redis 队列 oj:solutions,现有 Node.js 判题器会消费- 创建 DTO(可选,用于请求/响应)
- 实现 Service 业务逻辑
- 创建 Controller 端点
- 添加权限注解(如需要)
- 编写测试
若修改了 model 字段名,需要在 DatabaseMigrationRunner 中添加迁移规则。详见 DATABASE_MIGRATION.md。
# 运行所有测试
mvn test
# 运行特定测试
mvn test -Dtest=UserControllerTestA: 是的。REST API 兼容现有前端,仅需将会话改为 JWT 或提供兼容层。
A: 在 SolutionService.create() 后自动推入 Redis 队列 oj:solutions,现有 Node.js 判题器继续消费。
A: 是的。启动时 DatabaseMigrationRunner 自动执行 MongoDB $rename 操作。详见 DATABASE_MIGRATION.md。
A: 编辑 DatabaseMigrationRunner.java 中的 FIELD_MAPPINGS 静态块。
A:
- 小数据集(< 10 万条):启动延迟 < 1 秒
- 大数据集(百万级):预计 1-10 秒
- 生产环境建议在低峰期部署
欢迎提交 Issue 与 Pull Request!
MIT
最后更新:2024年12月5日 当前版本:0.0.1-SNAPSHOT