# OnlineJudge **Repository Path**: li-yuanjiu/online-judge ## Basic Information - **Project Name**: OnlineJudge - **Description**: 负载均衡式在线OJ - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-15 - **Last Updated**: 2024-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](文章目录) [**代码仓库连接 点击这里✈**](https://gitee.com/li-yuanjiu/online-judge) # 一、项目介绍 本项目是实现一个仿 leetcode 的 `OJ (Online-Judge)系统`。更准确的说应该称之为leetcode 的裁剪版。因为本项目只实现了leetcode中`展示题目列表 + 在线测评`的功能。至于leetcode中的其他功能例如:社区、论坛、求职等功能暂未实现,大家可自行进行扩展。 想必大家多多少少都体验过 OJ,这里就不谈如何使用了。项目最终成果如下,可自行体验: - **主界面** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3c81587a46d246209331bf93d80cc8dd.png) - **题目列表**(题库自行扩充 我这里偷懒了) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/32d20ed6eda94a62a19cbd1e7949d5f2.png) - **OJ 界面** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b31df2abc4fe4b679efb633422fddbf8.png) # 二、开发环境 本项目我使用的开发环境如下: - Linux(CentOS 8); - vscode + vim; - g++/gdb; - MakeFile; - Docker; - MySQL; # 三、第三方库 - Boost:实现字符串切割; - cpp-httplib:一个简单好用的开源网络库; - ctemplate:一个简单好用的开源前端网络渲染库; - jsoncpp:用于序列化与反序列化; - mysqlclient:C++ 操作 MySQL; 本项目虽然用到了前端相关的库,但是本项目相对的弱化了前端的部分,只实现了必要的功能。 # 四、相关技术 - C/C++ 基础知识; - STL 库; - C++11 语法; - Linux 基础; - 网络基础; - 多进程 + 多线程(httplib 库); - 负载均衡; - MySQL 增删改查(非必须本项目提供文件版与MySQL版); - Docker 基础操作; # 五、项目整体框架 本项目是一个OJ系统,意味着以下的流程是必要的: 1. 用户访问 OJ 服务网站; 2. 用户通过网页选择获取题目列表; 3. 服务端 oj_server 模块读取题库信息进行响应; 4. 用户选择题目进入OJ界面; 5. 服务端 oj_server 读取题目信息进行响应 + 网页渲染(题目标题,题目内容,预设代码等); 6. 用户进行编程并提交代码; 7. 服务端 oj_server 模块获取用户提交的代码,并整合题目信息; 8. 之后 oj_server 的判题功能启动(Judge 函数),Judge 内部请求编译运行服务(compile_and_run模块),并得到运行结果; 9. 服务端 oj_server 将结果相应给用户; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/26fd5e1bbb5647549b5b6a9e8b594c07.png) 通过以上流程,不难看出本项目主要由以下模块构成: - **`oj_server`**:使用 MVC 架构完成前后端的联动; - `Model` 模块:负责数据的存储和业务逻辑。即题库的加载和存储; - `View` 模块:负责将数据呈现给用户。将题库展现在前端页面上并于用户进行交互; - `Controller` 模块:主要的逻辑控制模块。Model 与 View 的中介; - **`compiler`**:编译运行模块。只负责 oj_server 所提供的代码的编译和运行,并返回结果; - `编译模块`(使用程序替换执行 g++ 进行编译工作) - `运行模块`(运行可执行程序,收集程序的标准输出、标准错误内容) - `编译运行模块`(整合编译和运行的功能) 除此之外还有一些辅助的模块: - **`log`**:日志模块。负责打印日志信息(这里使用的是我的另一个项目——多功能日志系统,当然你们可以用 cout 来代替); - **`comm`**:公共模块。主要是一个通用工具类和第三方库; ### 代码目录框架 ```bash contos 8 $ tree online-judge/ online-judge/ ├── comm │ ├── httplib.h │ └── util.hpp ├── compiler │ ├── compile_and_run.cpp │ ├── compile_and_run.hpp │ ├── compiler.hpp │ ├── compiler_server │ ├── makefile │ └── runner.hpp ├── Dockerfile ├── LICENSE ├── log │ ├── example │ │ ├── makefile │ │ └── test.cc │ ├── extend │ │ └── test.cc │ ├── LICENSE │ ├── logs │ │ ├── buffer.hpp │ │ ├── format.hpp │ │ ├── level.hpp │ │ ├── logger.hpp │ │ ├── log.h │ │ ├── looper.hpp │ │ ├── message.hpp │ │ ├── sink.hpp │ │ └── util.hpp │ ├── practice │ │ ├── Agency.cc │ │ ├── arg.c │ │ ├── arg.cc │ │ ├── Builder.cc │ │ ├── Factory.cc │ │ └── Singleton.cc │ ├── README.en.md │ └── README.md ├── oj_server │ ├── conf │ │ └── service_machine.conf │ ├── makefile │ ├── oj_control.hpp │ ├── oj_model.hpp │ ├── oj_model_sql.hpp │ ├── oj_server │ ├── oj_server.cpp │ ├── oj_view.hpp │ ├── questions │ │ ├── 1 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 2 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 3 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 4 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 5 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 6 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ ├── 7 │ │ │ ├── desc.txt │ │ │ ├── pre_code.cpp │ │ │ └── test_code.cpp │ │ └── questions.list │ ├── template │ │ ├── all_questions.html │ │ └── one_question.html │ └── wwwroot │ └── index.html ├── README.en.md ├── README.md └── temp 20 directories, 68 files ```