当前位置: 首页 > news >正文

『C++实战项目 负载均衡式在线OJ』一、项目介绍与效果展示(持续更新)

文章目录

  • 一、项目介绍
  • 二、开发环境
  • 三、第三方库
  • 四、相关技术
  • 五、项目整体框架
      • 代码目录框架

代码仓库连接 点击这里✈

一、项目介绍

本项目是实现一个仿 leetcode 的 OJ (Online-Judge)系统。更准确的说应该称之为leetcode 的裁剪版。因为本项目只实现了leetcode中展示题目列表 + 在线测评的功能。至于leetcode中的其他功能例如:社区、论坛、求职等功能暂未实现,大家可自行进行扩展。

想必大家多多少少都体验过 OJ,这里就不谈如何使用了。项目最终成果如下,可自行体验:

  • 主界面
    在这里插入图片描述
  • 题目列表(题库自行扩充 我这里偷懒了)
    在这里插入图片描述
  • OJ 界面
    在这里插入图片描述

二、开发环境

本项目我使用的开发环境如下:

  • 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 将结果相应给用户;

在这里插入图片描述

通过以上流程,不难看出本项目主要由以下模块构成:

  • oj_server:使用 MVC 架构完成前后端的联动;
    • Model 模块:负责数据的存储和业务逻辑。即题库的加载和存储;
    • View 模块:负责将数据呈现给用户。将题库展现在前端页面上并于用户进行交互;
    • Controller 模块:主要的逻辑控制模块。Model 与 View 的中介;
  • compiler:编译运行模块。只负责 oj_server 所提供的代码的编译和运行,并返回结果;
    • 编译模块(使用程序替换执行 g++ 进行编译工作)
    • 运行模块(运行可执行程序,收集程序的标准输出、标准错误内容)
    • 编译运行模块(整合编译和运行的功能)

除此之外还有一些辅助的模块:

  • log:日志模块。负责打印日志信息(这里使用的是我的另一个项目——多功能日志系统,当然你们可以用 cout 来代替);
  • comm:公共模块。主要是一个通用工具类和第三方库;

代码目录框架

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
└── temp20 directories, 68 files

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python实现图像分割算法3
  • SuccBI+低代码文档中心 — 低代码应用(SuccAP)(概论)
  • Node.js(5)——包
  • SAP项目管理基础与实践第一章完结
  • ansible,laas,pass,sass
  • 《LlamaIndex 之美》-01-LLM、Prompt、Embedding基础入门
  • 【JavaEE】线程状态
  • Linux5:Shell编程——流程控制
  • 借助Aspose.html控件, 将SVG 转PNG 的 C# 图像处理库
  • JDK-java.nio包详解
  • 我出一道面试题,看看你能拿 3k 还是 30k!
  • 2024 年最值得阅读的 10 个外国技术网站
  • Linux网络-小结
  • mysql 分析慢查询
  • Opencv学习-图像翻转变换
  • $translatePartialLoader加载失败及解决方式
  • 【Linux系统编程】快速查找errno错误码信息
  • AngularJS指令开发(1)——参数详解
  • Apache的80端口被占用以及访问时报错403
  • gcc介绍及安装
  • gops —— Go 程序诊断分析工具
  • Java,console输出实时的转向GUI textbox
  • js操作时间(持续更新)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • React+TypeScript入门
  • Vue官网教程学习过程中值得记录的一些事情
  • 安装python包到指定虚拟环境
  • 开源SQL-on-Hadoop系统一览
  • 聊聊flink的TableFactory
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 突破自己的技术思维
  • 我感觉这是史上最牛的防sql注入方法类
  • 我看到的前端
  • 移动端高清、多屏适配方案
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ## 基础知识
  • #laravel 通过手动安装依赖PHPExcel#
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (20)docke容器
  • (function(){})()的分步解析
  • (poj1.2.1)1970(筛选法模拟)
  • (补)B+树一些思想
  • (二)JAVA使用POI操作excel
  • (二)PySpark3:SparkSQL编程
  • (二十六)Java 数据结构
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)linux文件内容查看
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)LINQ之路
  • (转)菜鸟学数据库(三)——存储过程
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil