目录
1. 项目描述
该系统类似于LeetCode的代码练习功能,提供了一个用户可以在线编写代码并且能够进行编译的环境,在编写代码的同时提供了语法纠错、代码高亮、自动补全等基本功能。
用户可以通过域名访问服务器,系统内置了多道编程题,用户点击对应题目就可以进行练习。并且题目内含有大量测试样例,服务器会根据用户代码会进行用例的测试,检测用户代码是否符合题意。并且可以将编译出错的原因返回给用户端。
2. 模块
2.1 在线编译器模块
能够将网页中用户输入的代码内容放入服务器中,并进行编译,运行,比对结果。
实现功能
- 获取需要编译代码的临时文件
- 调用g++进行编译,将编译结果进行存储
- 如果文件编译错误或运行时错误,需要记录到文件中去
- 运行可执行文件,执行测试用例代码,将运行结果进行记录
- 将记录结果发送给客户端
2.2 题目管理模块
管理当前系统中的所有OJ题目及具体题目描述,用例代码。页面以列表形式显示所管理的题目,并且用户点击题目可以跳转到详情页进行代码的编写及提交。
具体功能
- 获取所有的题目列表
/all_question
- 点击指定题目,可以获取题目的详细内容,并且可以书写代码
/quesion
- 调用在线编译模块进行编译和运行
/compile
- 解析运行结果,如果正确返回正确结果,如果错误返回错误情况
result
2.3 工具模块
该模块提供了许多具体工具,可以提高开发效率。
具体工具
- 时间戳工具: 用来生成不重复文件名
文件名: tmp_ + “时间戳” + 序号 + ‘.类型’ (保证了文件名的唯一性)- 日志打印工具: 用来记录代码执行记录
- 文件读写功能: 重新封装文件读写函数,方便使用
- URL解析模块: 使用boost库提供的函数进行解析,解析出有效载荷,分离出用户提交代码与用户输入。
3. 模块实现细节
3.1 在线编译
3.1.1 搭建HTTP服务器
使用第三方库HttpLib
进行搭建,搭建出的服务器支持多连接。通过库中的函数进行请求的接收与响应。
server.Post("/compile", [](const Request& req, Response& resp) {
});
server.list