在线判题系统(online judge)后端

流程图

image

业务划分

用户模块、题目模块、题目提交、判题模块、代码沙箱、定时数据同步、定时爬虫、接口调用统计

使用技术

web框架gin

jwt身份认证

orm框架gorm

持久化存储mysql

数据缓存redis:缓存题目信息和用户提交信息。使用更改数据时删除缓存,查询时再同步缓存

消息队列rabbitmq:用户提交题目后通过rabbitmq传输提交的id信息给判题模块,判题模块通过id查询数据库获取提交信息和题目信息。

代码执行沙箱docker:负责编译和执行用户提交的代码,判题模块通过执行结果进行判断是否答题正确。

搜索功能elasticsearch:提供使用关键字搜索题目信息和提交信息。

爬虫功能chromedp:爬取某一个网站的图片作为头像,用于提供给用户生成头像的数据来源,仅测试用。

ai建议科大讯飞星火大模型:判题通过后,会将用户代码交给ai进行时间和空间复杂度分析以及提供代码优化建议。

定时任务cron: 定时爬虫和定时同步mysql数据到redis和elasticsearch,同步方式:增量同步。

业务功能

管理员:管理用户(查询用户,更新用户,禁用用户,删除用户)、管理题目(创建题目、更新题目、删除题目)、管理提交(删除提交)、查看接口调用情况。

普通用户:登录注册、获取题目列表、搜索题目列表、创建提交、获取提交列表、搜索提交列表、获取随机头像。

业务流程

管理员创建题目并发布,普通用户注册登录后通过搜索或查询获取到题目列表,做完题后提交后会返回给用户提交id,通过判题模块进行判题,判题成功则会交给ai进行时间复杂度和空间复杂度分析并给出代码优化建议,用户可以通过提交id查询到判题结果。