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

news2024/9/24 1:26:50

文章目录

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

代码仓库连接 点击这里✈

一、项目介绍

本项目是实现一个仿 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
└── temp

20 directories, 68 files

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

‘#‘ is not followed by a macro parameter 关于宏定义的错误

今天在项目代码上想定义一个这样的宏,结果编译错误,这个宏定义类似这样的: #define DELETE_FILE_DPP(key) \ #ifdef PLATFORM_DPP \delete_file(&key); \ #endif 因为有平台之分需要用到编译宏,但不想每个调用的地方都写 #i…

HTML 专业词汇与语法规则

目录 1. 专业词汇 2. 语法规则 1. 专业词汇 标签&#xff08;tag&#xff09;&#xff1a;一堆尖叫号&#xff08;<>&#xff09;&#xff0c; 属性&#xff08;attribute&#xff09;&#xff1a;对标签特征设置的方式&#xff1b; 文本&#xff08;text&#xff0…

【外排序】--- 文件归并排序的实现

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 数据结构 我们之前学习的八大排序&#xff1a;冒泡&#xff0c;快排&#xff0c;插入&#xff0c;堆排等都是内排序&#xff0c;这些排序算法处理的都是…

java对接kimi详细说明,附完整项目

需求&#xff1a; 使用java封装kimi接口为http接口&#xff0c;并把调用kimi时的传参和返回数据&#xff0c;保存到mysql数据库中 自己记录一下&#xff0c;以做备忘。 具体步骤如下&#xff1a; 1.申请apiKey 访问&#xff1a;Moonshot AI - 开放平台使用手机号手机号验证…

SuccBI+低代码文档中心 — 低代码应用(SuccAP)(概论)

概述&#xff1a; 低代码是什么&#xff1f; 低代码就是通过易用的、可视化的操作、加上少量的代码或脚本的方式快速的搭建业务应用。 低代码的优势&#xff1f; 低代码可以提升开发人员的效率&#xff0c;也可以让非开发人员也能进行应用开发。 低代码的分类&#xff1a;…

基于SpringBoot的大学生信息兼职服务网站系统,源码、部署+讲解

目 录 摘 要 Abstract 目 录 绪 论 1 系统分析 1.1可行性分析 1.1.1经济可行性分析 1.1.2技术可行性分析 1.1.3操作可行性分析 1.2需求分析 1.2.1从学生的角度 1.2.2从企业的角度 1.2.3从管理员的角度 1.3用例建模 1.3.1识别参与者用例 1.3.2用…

3.5 菜单资源

菜单分类 窗口的顶层菜单弹出式菜单&#xff08;鼠标右键的那些选项&#xff0c;记事本窗口左上角点击“文件”弹出的这些&#xff09;系统菜单&#xff08;记事本左上角的图标&#xff09; HMENU类型表示菜单&#xff0c;ID表示菜单项 资源相关 资源脚本文件:*.rc文件编译器…

python入门基础篇(一)

基础篇 Python基础安装与配置Python环境理解Python解释器第一个Python程序&#xff1a;"Hello, World!" 基础语法注释与文档字符串变量与数据类型数字类型&#xff1a;整数、浮点数、复数字符串布尔值None值 运算符算术运算符比较运算符逻辑运算符赋值运算符位运算符…

WEB渗透Web突破篇-SSRF

定义 服务端请求伪造 构造一个由服务器发出请求的漏洞 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制成因 file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()等函数使用不当会造成SSRF漏洞挖掘 转码服务 在线翻译 获取超链接…

JavaScript入门day6

目录 1.Web API 基本认知 1.1 变量声明 1.2 作用和分类 1.3 什么是DOM 1.4 DOM树 1.5 DOM对象&#xff08;重要&#xff09; 2.获取DOM对象 2.1 获取DOM元素 2.2 操作元素内容 2.3 操作元素属性 2.3.1 操作元素常用属性 2.3.2 操作元素样式属性 2.3.3 操作表单元素…

C Primer Plus 第5章——第一篇

你该逆袭了 第5章:重点摘录 零、章节介绍一、基本运算符1、赋值运算符(1)、数据对象(2)、左值(3)、右值(4)、运算符 2、加法运算符3、减法运算符4、符号运算符&#xff1a;- 和 5、乘法运算符&#xff1a;*1、指数增长 6、除法运算符&#xff1a;/7、运算符优先级8、优先级 和 …

Python实战:wxauto与百度千帆大模型结合快速实现微信智能回复机器人

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

VGA接口驱动设计验证

前言 VGA接口是一个很有历史的接口&#xff0c;全称为Video Graphics Array&#xff08;VGA&#xff09;视频图形阵列&#xff0c;是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。时至今日&#xff0c;这个接口依然还在大量使用&#xff0c;因为这个接口…

普乐蛙VR航天科普展厅VR虚拟现实项目激发青少年对太空探索

普乐蛙品牌VR沉浸体验式业态&#xff0c;定位文旅科教领域&#xff0c;助力中国航天发展。普乐蛙VR航天航空主题拥有华夏神舟、天宫一号、华夏月球车、太空飞船、华夏方舟、地震平台、暴风空间等众多科普体验设备和原创优质的航天航空内容&#xff0c;通过沉浸互动式体验&#…

USB 2.0 规范摘录

文章目录 1、USB 体系简介2、USB 数据流模型四种传输类型 3、USB 物理规范和电气规范4、USB 协议层规范事务传输&#xff08;Transaction&#xff09;的流程 5、USB 框架6、USB 主机&#xff1a;硬件和软件7、USB HUB 规范数据的转发唤醒信号的转发USB HUB 的帧同步HUB Repeate…

11087 统计逆序对(优先做)

这个问题可以通过使用分治策略来解决&#xff0c;这种策略是在归并排序的基础上进行的。我们可以将数组分为两部分&#xff0c;然后分别计算两部分的逆序对数量&#xff0c;最后计算跨越两部分的逆序对数量。 以下是使用C的代码实现&#xff1a; #include <iostream> #…

C++初学者指南-5.标准库(第二部分)--更改元素算法

C初学者指南-5.标准库(第二部分)–更改元素算法 文章目录 C初学者指南-5.标准库(第二部分)--更改元素算法填充/覆盖范围fill / fill_ngenerate / generate_n 更改/替换值transformreplace / replace_ifreplace_copy / replace_copy_if 相关内容 不熟悉 C 的标准库算法&…

【数据泄露】最新 FBI 官员数据库泄露事件

前言 近日&#xff0c;一名化名为 “rpk” 的威胁行为者在 breachforums 论坛上声称泄露了包含 22,175 名 FBI 官员数据的数据库。此事件迅速引起了广泛关注&#xff0c;主要因为 FBI 作为美国联邦调查局&#xff0c;不仅是美国司法部的主要调查机构&#xff0c;还是美国情报界…

太离谱!曝 GPT-4o mini 没做安全测试就开庆功会!OpenAI 严重违背政府协议,被立法者犀利追问 12 条

OpenAI又被曝违约了!这次是违反了对白宫的安全承诺。 去年夏天,OpenAI向美国政府承诺,将严格对其前沿的突破性技术进行安全测试,以确保AI不会造成损害,比如教用户制造生化武器或帮助黑客开发新型网络攻击。 然而,为了应对OpenAI领导层设定的GPT-4o mni 5月份的“deadli…

RabbitMQ高级特性 - 消息分发(限流、负载均衡)

文章目录 RabbitMQ 消息分发概述如何实现消费分发机制&#xff08;限制每个队列消息数量&#xff09;使用场景限流背景实现 demo 非公平发送&#xff08;负载均衡&#xff09;背景实现 demo RabbitMQ 消息分发 概述 RabbitMQ 的队列在有多个消费者订阅时&#xff0c;默认会通过…