Skip to content

acm309/rePutongOJ

Repository files navigation

请注意,本项目目前还未完成,请勿在生产环境中调用!!!

PutongOJ Spring Boot 重构版

这是 PutongOJ(开源 Online Judge)到 Spring Boot 框架的渐进式迁移项目。

快速开始

前置条件

  • Java 17+
  • Maven 3.6+
  • MongoDB 5.0+(本地或远程)
  • Redis 6.0+(用于消息队列和 Token 存储)

本地开发启动

1. 启动 MongoDB 与 Redis

# 使用 Docker Compose(推荐)
docker-compose up -d

# 或使用本地安装
mongod --dbpath ./data/mongodb
redis-server

2. 配置应用

编辑 src/main/resources/application.yml

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/putongoj
  redis:
    host: localhost
    port: 6379

sa-token:
  token-name: Authorization
  timeout: 86400

3. 启动应用

cd d:\code\putongoj-springboot
mvn spring-boot:run

应用将在 http://localhost:8080 启动,并自动执行数据库字段迁移。

Docker 启动

# 构建镜像
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+ 项目构建

API 示例

用户认证(Sa-Token)

# 注册
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 判题器会消费

开发指南

添加新 API 端点

  1. 创建 DTO(可选,用于请求/响应)
  2. 实现 Service 业务逻辑
  3. 创建 Controller 端点
  4. 添加权限注解(如需要)
  5. 编写测试

数据库迁移

若修改了 model 字段名,需要在 DatabaseMigrationRunner 中添加迁移规则。详见 DATABASE_MIGRATION.md

本地测试

# 运行所有测试
mvn test

# 运行特定测试
mvn test -Dtest=UserControllerTest

常见问题

Q: 支持现有 Node.js 前端吗?

A: 是的。REST API 兼容现有前端,仅需将会话改为 JWT 或提供兼容层。

Q: 现有判题器如何保持兼容?

A: 在 SolutionService.create() 后自动推入 Redis 队列 oj:solutions,现有 Node.js 判题器继续消费。

Q: 数据库字段会自动迁移吗?

A: 是的。启动时 DatabaseMigrationRunner 自动执行 MongoDB $rename 操作。详见 DATABASE_MIGRATION.md

Q: 如何添加新集合/字段迁移?

A: 编辑 DatabaseMigrationRunner.java 中的 FIELD_MAPPINGS 静态块。

Q: 性能如何?

A:

  • 小数据集(< 10 万条):启动延迟 < 1 秒
  • 大数据集(百万级):预计 1-10 秒
  • 生产环境建议在低峰期部署

贡献与反馈

欢迎提交 Issue 与 Pull Request!

License

MIT


最后更新:2024年12月5日 当前版本:0.0.1-SNAPSHOT

About

重构了整个后端的代码, 将框架修改为spring boot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages