负载均衡式在线OJ

news2024/9/28 19:26:33

目录

  • 项目介绍
  • 所用技术与开发环境
    • 所用技术
    • 开发环境
  • 项目各种安装
    • 升级 gcc
    • 安装 jsoncpp
    • 安装 cpp-httplib
    • 安装boost库
    • 安装与测试 ctemplate
  • 项目宏观结构
  • 总体文件目录
  • comm : 公共模块
  • compile_run_server:编译和运行
    • compiler.hpp编译
    • runner.hpp 运行
    • compiler_runner.hpp调用编译和运行
    • compile_run_server.cc
    • temp_files 存放临时文件
  • oj_server
    • oj_server.cc
    • MVC
    • 其它文件
  • makefile

项目介绍

此项目只实现类似 leetcode 的题目列表+在线编程功能;
此项目核心是三个模块:

  1. comm : 公共模块
  2. compile_server : 编译与运行模块
  3. oj_server : 获取题目列表,查看题目编写题目界面,负载均衡,其他功能

所用技术与开发环境

所用技术

  • C++ STL 标准库
  • Boost 准标准库(字符串切割)
  • cpp-httplib 第三方开源网络库
  • ctemplate 第三方开源前端网页渲染库
  • jsoncpp 第三方开源序列化、反序列化库
  • 负载均衡设计
  • 多进程、多线程
  • MySQL C connect
  • Ace前端在线编辑器
  • html/css/js/jquery/ajax

开发环境

  • Centos 7 云服务器
  • vscode
  • Mysql Workbench

项目各种安装

升级 gcc

因为cpp-httplib 用老的编译器,要么编译不通过,要么直接运行报错,所以需要升级
// 查看 gcc 版本
gcc -v
//安装scl
$ sudo yum install centos-release-scl scl-utils-build
//安装新版本gcc,这里也可以把7换成8或者9,也可以都安装
$ sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++
// 查看安装
$ ls /opt/rh/

//启动: 注意:命令行启动只能在本会话有效
$ scl enable devtoolset-7 bash

// 如果想每次登陆的时候,都是较新的gcc,需要把上面的命令添加到你的~/.bash_profile中
// 打印查看:  ~/.bash_profile
$ cat ~/.bash_profile

/**********我查看的内容******************
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
**************************************/

// #添加下面的命令在里面,每次启动的时候,都会执行这个scl命令(看自己的gcc版本,数字自己改7 或 8 或 9)
scl enable devtoolset-7 bash

安装 jsoncpp

$ sudo yum install -y jsoncpp-devel

安装 cpp-httplib

最新的cpp-httplib在使用的时候,如果gcc不是特别新的话有可能会有运行时错误的问题
我的下载:cpp-httplib 0.7.15
下载zip安装包,上传到服务器即可

v0.7.15版本链接: https://gitee.com/yuanfeng1897/cpp-httplib/tree/v0.7.15

解压后里面有一个 httplib.h,把httplib.h拷贝到我们的项目中,包含头文件和命名空间后可以直接使用

//使用文档: https://gitee.com/yuanfeng1897/cpp-httplib/tree/v0.7.15

安装boost库

$ sudo yum install -y boost-devel

安装与测试 ctemplate

https://hub.fastgit.xyz/OlafvdSpek/ctemplate
下载zip安装包,上传到服务器即可

解压后得到一个 这样的 ctemplate-master 文件
进入执行下面命令:
$ ./autogen.sh
$ ./configure
$ make //编译
$ make install //安装到系统中

注意: gcc版本, 如果安装报错,注意使用sudo

还有就是在使用时: 可能存在链接报错,找不到ctemplate-masterd动态库位置
// 查看自己配置文件
ls /etc/ld.so.conf.d/ -l
// 创建一个自己的配置文件
sudo touch  /etc/ld.so.conf.d/my.conf
// 打开自己创建的配置文件
sudo vim /etc/ld.so.conf.d/my.conf
// 将ctemplate-masterd动态库的路径写入里面
/home/sz/third_party/ctemplate-master/.libs
// 加载一下,使其生效
sudo idconfig
// 使用示例:
int main()
{
    // 要渲染的html页面,文件所在路径
    std::string html = "./text.html";
    // 1.建立ctemplate参数目录结构 [相当于创建一个可以存储kv结构的对象,对象名字是text]
    ctemplate::TemplateDictionary root("test");
    // 向结构中添加你要替换的数据,kv的
    root.SetValue("information", "测试ctemplate");

    // 2.获取被渲染对象
    ctemplate::Template *tpl = ctemplate::Template::GetTemplate(html,\
ctemplate::DO_NOT_STRIP); //DO_NOT_STRIP:保持html网页原貌

    //3.开始渲染,返回新的网页结果到out_html
    std::string out_html;
    tpl->Expand(&out_html, &root);

    // std::cout << "原本html是:" << std::endl;
    // std::cout << html << std::endl;
    std::cout << "渲染的带参html是:" << std::endl;
    std::cout << out_html << std::endl;

    return 0;
}
渲染前:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!--渲染参数,会被我们C++代码中的数据替换, information就是上面SetValue("information", "测试ctemplate")代码中的
information::测试ctemplate中的内容替换-->
    <p>{{information}}</p>
    <p>{{information}}</p>
    <p>{{information}}</p>
    <p>{{information}}</p>
</body>

</html>
渲染后:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!--渲染参数,会被我们C++代码中的数据替换, information就是上面SetValue("information", "测试ctemplate")代码中的
information::测试ctemplate中的内容替换-->
    <p>{{测试ctemplate}}</p>
    <p>{{测试ctemplate}}</p>
    <p>{{测试ctemplate}}</p>
    <p>{{测试ctemplate}}</p>
</body>

项目宏观结构

在这里插入图片描述

总体文件目录

[sz@VM-8-9-centos LinuxProject]$ tree
.
|-- common
|   |-- httplib.h
|   |-- log.hpp
|   `-- util.hpp
|-- compile_run_server
|   |-- compiler.hpp
|   |-- compiler_runner.hpp
|   |-- compile_run_server.cc
|   |-- makefile
|   |-- runner.hpp
|   `-- temp_files
|-- makefile
|-- oj_server
|   |-- conf
|   |   `-- service_machine.conf
|   |-- makefile
|   |-- oj_controlcopy.hpp
|   |-- oj_control.hpp
|   |-- oj_model.hpp
|   |-- oj_server.cc
|   |-- oj_view.hpp
|   |-- questions
|   |   |-- 1
|   |   |   |-- desc.txt
|   |   |   |-- header.cpp
|   |   |   `-- tail.cpp
|   |   |-- 2
|   |   |   |-- desc.txt
|   |   |   |-- header.cpp
|   |   |   `-- tail.cpp
|   |   `-- questions.list
|   |-- template_html
|   |   |-- all_questions.html
|   |   `-- one_question.html
|   `-- wwwroot
|       `-- index.html
|-- ReadMe.md
|-- text
|-- text.cc
`-- text.html

10 directories, 30 files

comm : 公共模块

httplib.h :  第三方开源网络库
log.hpp   :  日志,主要用于打印信息
util.hpp  : 工具类
   包含: 
       时间工具类: 获得秒时间戳 、 获得毫秒时间戳
       对文件路径操作: 添加文件后缀(: .cpp / .exe / .stdin / .stdout / .stderr)
       对文件操作: 对文件读写,判断是否存在,获取唯一的文件名
 	   对字符串的操作: 主要是使用boost库对字符串切割(切割ip和port)

compile_run_server:编译和运行

在这里插入图片描述

compiler.hpp编译

在这里插入图片描述

runner.hpp 运行

在这里插入图片描述

compiler_runner.hpp调用编译和运行

在这里插入图片描述

compile_run_server.cc

在这里插入图片描述

temp_files 存放临时文件

保存编译和运行产生的临时文件

oj_server

oj_server.cc

在这里插入图片描述

oj_server.cc 会有三个路由功能
1. 获取首页,首页是一个题目列表,里面有很多题目,和leetcode题目列表一样
2. 但我们选择好题目列表中大的一个题目后,点击,进入题目的编辑页面
3. 在编辑好题目后,需要提交,后台服务器会编译这份代码,并将结果显示给用户,提交代码后的页面

M: Model,通常是和数据交互的模块,比如,对题库进行增删改查(文件版,MySQL)
V: view, 通常是拿到数据之后,要进行构建网页,渲染网页内容,展示给用户的(浏览器)
C: control, 控制器,就是我们的核心业务逻辑

MVC

在这里插入图片描述

其它文件

在这里插入图片描述

makefile

.PHONY:all
all:
	cd compile_run_server;\
	make;\
	cd -;\
	cd oj_server;\
	make;\
	cd -;
.PHONY:procedure
procedure:
	mkdir -p procedure/compile_run_server;\
	mkdir -p procedure/oj_server;\
	cd compile_run_server;\
	cp -rf `ls | grep -v ".hpp" | grep -v ".cc" | xargs` ../procedure/compile_run_server;\
	cd -;\
	cd oj_server;\
	cp -rf `ls | grep -v ".hpp" | grep -v ".cc" | xargs` ../procedure/oj_server;\
	cd -;
.PHONY:clean
clean:
	cd compile_run_server;\
	make clean;\
	cd -;\
	cd oj_server;\
	make clean;\
	cd -;\
	rm -rf procedure;

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

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

相关文章

ChatGPT 速通手册——开源社区的进展

开源社区的进展 在 ChatGPT 以外&#xff0c;谷歌、脸书等互联网巨头&#xff0c;也都发布过千亿级参数的大语言模型&#xff0c;但在交谈问答方面表现相对 ChatGPT 来说都显得一般。根据科学人员推测&#xff0c;很重要的一部分原因是缺失了RLHF(Reinforcement Learning with…

Banana Pi CM4 计算机模组评测(VS 树莓派计算模块 CM4)

如果您正在寻找一款可靠的单板计算机来提升您的下一个项目&#xff0c;但找不到满足您需求的 Raspberry Pi&#xff0c;让我们看看我是否可以提供帮助。在这篇详细的评论中&#xff0c;我将向您介绍 Banana Pi CM4&#xff0c;这是一款适用于各种任务的多功能且功能强大的解决方…

【OpenCV 例程 300篇】257.OpenCV 生成随机矩阵

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】257. OpenCV 生成随机矩阵 3.2 OpenCV 创建随机图像 OpenCV 中提供了 cv.randn 和 cv.randu 函数生成随机数矩阵&#xff0c;也可以用于创建随机图像。 函数 cv.randn 生成的矩阵服从正态分布&…

【caddy】 caddy反向代理api服务 聚合go-zero微服务 放过nginx让caddy来快速实现吧

帮助go-zero开发者聚合api 相关视频一、go-zero 微服务整体架构1、微服务的基本架构2、go-zero 微服务的 apiauthrpc.api 文件routes.go 文件 二、本地开发的痛点1、本地多个端口开启的服务2、apifox、postman 三、caddy1、mac下caddy安装2、配置我们自己的caddyfile1&#xff…

SpringBootWeb入门-HTTP协议

一、SpringBootWeb-快速入门 建好springboot工程之后&#xff0c;只留下这几个文件。 这个是springboot的父工程&#xff0c;其实就是继承 二、HTTP协议-概述 •HTTP-概述 三、HTPP协议-请求协议 四、HTTP协议-响应协议 一、状态码大类 状态码分类说明1xx响应中——临时状态码…

buuctf -2

目录 你竟然赶我走 大白 N种方法解决 [ACTF2020 新生赛]Include 1 php://filter的一些学习 [ACTF2020 新生赛]Exec [强网杯 2019]随便注 你竟然赶我走 1.下载文件&#xff0c;得到一张图片 2.放进010分析&#xff0c;在文件尾得到flag 大白 1.根据题目提示&#xff0…

Python安装模块总失败?一次教你学会镜像安装

人生苦短&#xff0c;我用python 安装模块总是不成功&#xff1f; 这次一次性讲清楚~ 还是安装报错指路:点击此处跳转文末名片获取 为什么会出现安装模块失败? 首先我们要知道 其实大部分我们在用的模块, 都是歪果仁开发的, 然而我们在输入 “pip install 模块名” 的时候,…

「 JVM 」常见的垃圾收集器Garbage collector(GC)

「 JVM 」常见的垃圾收集器Garbage collector&#xff08;GC&#xff09; 参考&鸣谢 【JVM系统学习之路】常见垃圾回收器 山间木匠 Java 的七种垃圾收集器 | Linux 中国 Jayashree Huttanagoudar 带你走近Java虚拟机到底有哪些经典的垃圾收集器 码上遇见你 文章目录 「 JV…

2023.04.17 运行开源代码tinyriscv步骤及遇到问题

tinyriscv&#xff1a;https://gitee.com/liangkangnan/tinyriscv/tree/verilator 如有错误之处还请不吝赐教&#xff01; 1、安装gcc工具链 下载gcc工具链(百度云链接&#xff0c;提取码&#xff1a;yaib)&#xff0c;使用下面的命令解压到/opt/riscv32目录下&#xff1a; …

Spring定时任务常用Cron表达式

目录 一、SpringBoot定时任务 定时任务概述 创建定时任务 代码开启定时任务 执行结果 &#xff08;单线程&#xff09; 多线程处理定时任务 执行结果&#xff08;并发&#xff09; 二、Cron详解 Cron表达式是什么 Cron表达式的结构 每个域可出现的字符类型和各字符的…

花生采摘

[NOIP2004 普及组] 花生采摘 题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都…

linux 安装神州通用数据库 V7.0

linux 安装神州通用数据库 V7.0 操作系统、数据库1、官方下载链接2、windows客户端下载链接3、官方安装手册4、安装前准备3.1、创建安装用户3.2、以root 用户修改神通数据库安装包的所有者为shentong 用户3.3、以root 用户创建神通数据库主目录并修改所有者为shentong 用户3.4、…

学成在线笔记+踩坑(2)——【内容模块】课程基础查询,swagger+数据库字典+Httpclient+跨域

目录 1.【内容模块】需求分析 2.【内容模块】模块工程的结构 3.【课程查询功能1】通用 3.1 分析数据模型 3.2 mybatis-plus代码生成器 3.3 内容模块聚合api,model,service模块 3.4 接口设计分析 3.5 【基础模块】分页查询模型类 3.6【基础模块】日期配置类 3.7【内容…

Ae 入门系列之九:表达式

与使用关键帧相比&#xff0c;Ae 的表达式 Expression也用于控制属性值。 只不过使用表达式能简化操作&#xff0c;大大提高工作效率&#xff0c;使复杂动画的制作变得更加轻松。 ◆ ◆ ◆ 表达式语法基础 表达式基于标准的 JavaScript 语言。 如果熟悉脚本语言编程&#xff…

AutoGPT初次探索:免费体验、使用指南与心得总结

AutoGPT初次探索&#xff1a;免费体验、使用指南与心得总结 写在前面的废话一、部署 Auto-GPT二、试运行 Auto-GPT三、我踩过的坑四、后续探索 AutoGPT是一种基于GPT的自动化系统&#xff0c;为GPT提供了一个身体和内存&#xff0c;使其能够自主执行任务&#xff0c;例如市场分…

自己的完整c++ cuda包

pytorch关于c的所有文档集合 Welcome to PyTorch Tutorials — PyTorch Tutorials 2.0.0cu117 documentation 1.前置条件 使用编辑器clion&#xff0c;安装好cudatoolkit&#xff0c;cudnn&#xff0c;pytorch环境&#xff0c;编译工具gcc等等。 记得要设置好cudatoolkit的…

【C++】哈希的应用——布隆过滤器

哈希的应用——布隆过滤器 文章目录 哈希的应用——布隆过滤器一、布隆过滤器的概念与性质1.布隆过滤器的引出2.布隆过滤器的概念3.布隆过滤器的误判4.布隆过滤器的应用场景5.布隆过滤器优缺点6.如何选择哈希函数个数和布隆过滤器长度 二、布隆过滤器的实现1.布隆过滤器基本框架…

机器学习——SVM原理

问&#xff1a;支持向量机是基于经验风险最小化(ERM) 原则构建的&#xff0c;因此有更好的泛化性能。 答&#xff1a;错误。支持向量机是一种基于结构风险最小化原则构建的机器学习算法&#xff0c;它可以通过寻找合适的分割超平面来实现分类任务&#xff0c;并且具有较好的泛…

设计模式:软件设计原则

文章目录 1.开闭原则2.里氏代换原则3.依赖倒转原则4.接口隔离原则5.迪米特法则6.合成复用原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&#xff0c;从而提高软件开…

QGIS绘制一张地图学习笔记01——配准栅格数据并解决配准导出的栅格文件不能显示的问题

1、进入配准工具主页面 首先&#xff0c;打开我们的绘制底图或者叫配准目标底图&#xff0c;我这里用的是高德的在线地图&#xff0c;具体qgis加载在线地图的方法见我前面的章节。加载的在线地图如下所示。 接着我们点击上方菜单栏的 栅格 菜单&#xff0c;点击菜单中的 配准工…