大连做企业网站排名,开发的某网站建设公司网站源码,不想让网站保存密码怎么做,有了网址怎么做网站一.前言
前文讲到了OJ模块的设计思路#xff0c;毫无疑问这是一个网络服务#xff0c;我们先使用httplib#xff0c;将源文件的路由功能实现#xff0c;先把框架写好#xff0c;后续再更改回调方法。
随后计划编写Modify模块#xff0c;提供增删查改题库的功能(主要是查…一.前言
前文讲到了OJ模块的设计思路毫无疑问这是一个网络服务我们先使用httplib将源文件的路由功能实现先把框架写好后续再更改回调方法。
随后计划编写Modify模块提供增删查改题库的功能(主要是查)所以在这之前我们必须先构建一个题库。题库有文件和MySQL两种版本我们暂时先写文件版的。
二.源文件路由功能
所谓的路由即用户访问不同的URL我们调用不同的方法来构建response这需要我们在启动服务之前注册回调函数。
#include iostream
#include ../Common/httplib.husing namespace httplib;int main()
{Server svr;//获取题目列表svr.Get(/all_questions, [](const Request req, Response resp){resp.set_content(这是所有题目的列表, text/plain; charsetutf-8);});//根据题目编号获取题目内容svr.Get(R(/questions/(\d)), [](const Request req, Response resp){std::string number req.matches[1]; //拿到正则表达式匹配到的内容resp.set_content(这是指定的一道题 number, text/plain; charsetutf-8);});//提交代码判题获取结果svr.Get(R(/judge/(\d)), [](const Request req, Response resp){std::string number req.matches[1]; //拿到正则表达式匹配到的内容resp.set_content(这是指定的一道题判题 number, text/plain; charsetutf-8);});//设置web根目录首页就是wwwroot下的index.htmlsvr.set_base_dir(./wwwroot);svr.listen(0.0.0.0, 8080);return 0;
} 回调函数中的内容等我们完成MVC三个模块后再更改
三.文件版题库构建
一道题目的相关信息如下 题目编号题目名称题目难度题目内容时间和空间资源约束预设的初始代码用来测试用户提交代码正确性的代码包含多组测试用例 其中1-6是会展示给用户而用来测试的代码是OjServer自己内部使用的。OjServer收到了用户提交的代码再把测试代码拼接到尾部构造一个完整的源文件再放到编译运行模块去运行得到运行结果看看通过了几组测试用例。 也就是说我们设计的是类似leetcode的OJ模式只让用户实现核心功能用户不能自己编写main函数。 把这些内容都放在一个文件里不太合适题目内容初始代码测试代码内容较多应该分开存放其余内容用一个文件存放即可。
即所有题目的题号名称难度时间约束空间约束都放在questions.list中一个题目相关的信息占一行。
一个题目的内容初始代码测试代码放到一个文件以题号命名的文件夹中分三个文件存放。有多少个题目就建立多少个文件夹。结构如下图 将来题库是需要加载到内存中的先加载questions.list文件而每行都含有题号根据题号去相应的以题号命名的文件夹中就能找到对应的题目内容初始代码和测试代码。所以这两批文件就通过用题号给文件夹命名的方法关联起来了。
四.题目实例
下面以题库中的第一题为例看看文件里都有什么内容
questions.list: 1/desc.txt: 1/header.cpp: 1/tail.cpp:
说明如果不引入header.cpp就没有Solution类编写测试代码时就会有语法报错所以开头的条件编译是为了编写tail.cpp时更加方便不产生语法报错。
正式提交给编译模块的时候用户提交的代码和tail.cpp已经合并到一块。我们可以在稍微更改一下编译模块加上-D COMPILE_ONLINE引入这个宏常量后就不会执行#include了