OJ 项目概要
01-项目概要
需求分析
OJ=Online Judge 在线判题评测系统
用户可以选择题目,在线做题,编写代码并且提交代码;系统会对用户提交的代码,根据我们出题人设置的答案来判断用户的提交结果是否正确, ACM(程序设计竞赛),也是需要依赖判题系统来检测参赛者的答案是否合理
OJ系统最大的难点在于 判题系统
用于在线评测编程题目代码的系统,能够根据用户提交的代码、出题人预先设置的题目输入和输出用例,进行编译代码、运行代码、判断代码运行结果是否正确。
判题系统作为一个开放 API提供给大家,便于开发者开发自己的 OJ系统。
OJ系统的常用概念
ac 表示你的题目通过,结果正确
题目限制:时间限制、内存限制
题目介绍
题目输入
题目输出
题目输入用例
题目输出用例
普通测评:管理员设置题目的输入和输出用例,比如我输入1,你要输出2才是正确的;交给判题机去执行用户的代码,给用户的代码喂输入用例,比如1,看用户程序的执行结果是否和标准答案的输出一致。(比对用例文件)
特殊测评 (SP)):管理员设置题目的输入和输出,比如我输入1,用户的答案只要是>0或<2都是正确的;特判程序,不是通过对比用例文件是否一致这种死板的程序来检验,而是要专门根据这道题目写一个特殊的判断程序,程序接收题目的输入(1)、标准输出用例(2)、用户的结果(1.5),特判程序根据这些值来比较是否正确。
交互测评:让用户输入一个例子,就给一个输出结果,交互比较灵活,没办法通过简单的、死板的输入输出文件来搞定
不能让用户随便引入包、随便遍历、暴力破解,需要使用正确的算法。=>安全性判题过程是异步的 =>异步化 提交之后,会生成一个提交记录,有运行的结果以及运行信息(时间限制、内存限制)
为什么做这个项目?
1.这个项目网上教程很少,基本上找不到教程
2.比较新颖,写在简历上会有区分度、有亮点(人家写外卖,你写 OJ)
3.能学到东西,相比于传统的 CRUD 来讲,这个项目的 CRUD 成分很少,更多的在于一些编程思想、计算机基础、架构设计方面的知识
4.复杂度“高”,很多同学觉得 OJ很难做,一起来攻克它
5.可扩展性非常强
项目构建流程
1.项目介绍、项目调研、需求分析
2.核心业务流程
3.项目要做的功能(功能模块)
4.技术选型(技术预研)
5.项目初始化
6.项目开发
7.测试
8.优化
9.代码提交、代码审核
10.产品验收
11.上线
现有系统调研
https://github.com/HimitZH/HOJ(适合学习)
https://github.com/QingdaoU/OnlineJudge(python,不好学,很成熟)https://github.com/hzxie/voj(星星没那么多,没那么成熟,但相对好学)
https://github.com/vfleaking/uoj(php 实现的)
https://github.com/zhblue/hustoj(成熟,但是 php)https://github.com/hydro-dev/Hydro(功能强大,Node.js 实现)
实现核心
1)权限校验
谁能提代码,谁不能提代码
2)代码沙箱(安全沙箱)
用户代码藏毒:写个木马文件、修改系统权限
沙箱:隔离的、安全的环境,用户的代码不会影响到沙箱之外的系统的运行
资源分配:系统的内存就2个G,用户疯狂占用资源占满你的内存,其他人就用不了了。所以要限制用户程序的占用资源。
3)判题规则
题目用例的比对,结果的验证
4)任务调度
服务器资源有限,用户要排队,按照顺序去依次执行判题,而不是直接拒绝
核心业务流程
为啥要编译? 因为有些语言不编译不能运行
判题服务:获取题目信息、预计的输入输出结果,返回给主业务后端:用户的答案是否正确
代码沙箱:只负责运行代码,给出结果,不管什么结果是正确的。
功能模块构建
1.题目模块
a.创建题目(管理员)
b.删除题目(管理员)
修改题目管理员)
d.搜索题目(用户)
e.在线做题
f.提交题目代码
2.用户模块
a.注册
b.登录
3.判题模块
a.提交判题!(结果是否正确与错误)
b.错误处理(内存溢出、安全性、超时)
c.自主实现 代码沙箱(安全沙箱)
d.开放接口(提供一个独立的新服务)
项目扩展思路
1.支持多种语言
- Remote Judge 3.完善的评测功能:普通测评、特殊测评、交互测评、在线自测、子任务分组评测、文件IO 4.统计分析用户判题记录 5.权限校验
技术选型
前端:Vue3、Arco Design 组件库、手撸项目模板、在线代码编辑器
在线文档浏览Java 进程控制、Java 安全管理器、部分 JVM 知识点虚拟机(云服务器)、Docker(代码沙箱实现)Spring Cloud 微服务、消息队列、多种设计模式
架构设计
1.介绍 O〕系统概念、介绍 OJ原理、介绍做项目流程、介绍需求分析、技术选型、架构设计、主流实现方案、前后端项目初始化、前端通用项目模板的搭建
2.主业务流程的前后端开发(争取把代码沙箱之外的全部搞定
3.专攻代码沙箱(自主实现,不止一种实现方案,层层递进,通过实战用例来进行安全优化)
4.系统优化(微服务改造、系统扩展思路)
主流的 OJ系统实现方案
开发原则:能用别人现成的,就不要自己写
1、用现成的 OJ系统
网上有很多开源的 OJ项目,比如青岛 0」、HustOJ等,可以直接下载开源代码自己部署比较推荐的是judge0,这是一个非常成熟的商业 OJ项目,支持 60 多种编程语言!
2、用现成的服务
如果你不希望完整部署一套大而全的代码,只是想复用他人已经实现的、最复杂的判题逻辑,那么可以直接使用现成的 判题 API、或者现成的 代码沙箱 等服务。
比如 judge0 提供的判题 API,非常方便易用。只需要通过 HTTP 调用 submissions 判题接口,把用户的代码、输入值、预期的执行结果作为请求参数发送给judge0 的服务器,,它就能自动帮你编译执行程序,并且返回程序的运行结果。
如下图,发送了一段打印"hello word" 的程序,得到了程序执行的时间、状态等
API的作用:接受代码、返回执行结果
Judge0 APl地址:https://rapidapi.com/judge0-official/api/judge0-ce
官方文档:https://ce.judge0.com/#submissions-submission-post
构建流程:
(1)先注册
(2)再开通订阅
(3)然后测试 language 接口
(4)测试执行代码接口 submissions
3.自主开发
判题服务和代码沙箱都自行实现,适合学习但不适用于商业项目
4.把 AI 来当做代码沙箱 现在 AI 的能力已经十分强大了,我们可以把各种本来很复杂的功能直接交给 A1 来实现。比如把 A1 当做代码沙箱,我们直接扔给他一段代码、输入参数,问他能否得到预期的结果,就实现了在线判题逻辑!
之前做的 智能 BI 项目,就是把 Al 当做了智能数据分析师,来生成图表和分析结论。只要你脑洞够大,AI +编程=无限的可能~
5.移花接木
这种方式最有意思、也最“缺德”。很多同学估计想不到。那就是可以通过让程序来操作模拟浏览器的方式,用别人已经开发好的 OJ系统来帮咱们判题。比如使用 Puppeteer + 无头浏览器,把咱们系统用户提交的代码,像人一样输入到别人的 O)网页中,让程序点击提交按钮,并且等别人的 O)系统返回判题结果后,再把这个结果返回给我们自己的用户。这种方式的缺点就是把核心流程交给了别人,如果别人服务挂了,你的服务也就挂了;而且别人 OJ系统不支持的题目,可能你也支持不了。
项目概要
功能模块设计
1. 用户模块
- 注册: 允许新用户创建账户并填写必要信息。
- 登录: 提供安全的登录途径,确保用户能够访问个人账户。
- 密码找回: 提供忘记密码时的找回机制,保障账户安全。
- 信息查看与修改: 用户可以查看和修改个人信息,以保持信息的准确性。
- 关注、取关: 提供关注和取关其他用户的功能,以建立用户之间的社交网络。
2. 题目模块
- 智能出题与改题: 基于智能算法,系统能够生成和改进编程题目。
- 在线做题: 提供用户在线解答题目的平台,记录用户的提交历史。
- 查看提交结果: 用户能够查看他们的题目提交结果,包括通过或失败的状态。
- 题解发布: 允许用户分享他们对题目的解答,促进知识分享。
3. 文章模块
- 查看文章: 提供用户浏览系统内发布的文章的功能。
- 分析文章: 支持用户对文章进行分析,以促进学术交流。
- 点赞文章: 用户可以为喜欢的文章点赞,以表达赞同或支持。
- 评论文章: 允许用户在文章下方发表评论,提供交流的平台。
- 导出文章: 用户可以导出文章以便离线阅读或分享。
4. 题单模块
- 题单创建与修改: 用户可以创建和修改题单,用于组织相关题目。
- 题单权限说明: 系统提供详细的题单权限说明,确保合适的权限设置。
- 题单信息查看: 用户可以查看题单的详细信息,包括包含的题目和权限设置。
5. 组织模块
- 组织创建与修改: 用户可以创建和修改组织,建立自己的学术团体或社群。
- 加入组织: 提供用户加入不同组织的入口,扩大社交圈。
- 组织信息查看: 用户能够查看组织的详细信息,包括成员和活动。
- 组织权限: 提供灵活的组织权限管理,确保组织内部运作顺畅。
- 退出组织: 允许用户主动退出不再感兴趣的组织。
- 转让组织: 组织管理员可以将组织的管理权限转交给其他成员。
- 组织成员管理: 管理员可以查看和管理组织成员,确保组织的稳定运行。
6. 竞赛模块
- 竞赛创建与修改: 用户能够创建和修改编程竞赛,设定相关参数。
- 竞赛设置: 提供灵活的竞赛设置,包括时间、题目集、权限等。
- 竞赛参与: 允许用户报名参与竞赛,挑战编程能力。
- 竞赛成员管理: 竞赛管理员可以管理竞赛成员的权限和状态。
- 竞赛排行榜统计: 实时更新竞赛成绩,提供排行榜展示。
7. 问题反馈与申请
- 提交问题或申请: 提供用户一个途径向开发团队提交问题或提出申请。
- 修改问题或申请: 允许用户修改之前提交的问题或申请。
- 撤回反馈或申请: 用户有权撤回之前提交的问题或申请。
- 查看申请进度: 提供用户查看问题反馈或申请处理进度的途径。
8. 系统配置
- 服务器信息查看: 管理员可以查看服务器运行状态和信息。
- 系统参数配置: 提供管理员配置系统参数的权限,以满足特定需求。
- 系统操作日志管理: 记录系统的操作日志,以便后期审查。
- 在线用户管理: 管理员能够查看和管理当前在线的用户。
- 用户信息管理: 管理员可以查看和管理系统用户的基本信息。