跳至主要內容

OJ 项目概要

holic-x...大约 11 分钟项目oj-platform

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)任务调度

服务器资源有限,用户要排队,按照顺序去依次执行判题,而不是直接拒绝

核心业务流程

image-20240421225200652

为啥要编译? 因为有些语言不编译不能运行

image-20240421225235200

判题服务:获取题目信息、预计的输入输出结果,返回给主业务后端:用户的答案是否正确

代码沙箱:只负责运行代码,给出结果,不管什么结果是正确的。

功能模块构建

1.题目模块

a.创建题目(管理员)

b.删除题目(管理员)

修改题目管理员)

d.搜索题目(用户)

e.在线做题

f.提交题目代码

2.用户模块

a.注册

b.登录

3.判题模块

a.提交判题!(结果是否正确与错误)

b.错误处理(内存溢出、安全性、超时)

c.自主实现 代码沙箱(安全沙箱)

d.开放接口(提供一个独立的新服务)

项目扩展思路

1.支持多种语言

  1. Remote Judge 3.完善的评测功能:普通测评、特殊测评、交互测评、在线自测、子任务分组评测、文件IO 4.统计分析用户判题记录 5.权限校验

技术选型

前端:Vue3、Arco Design 组件库、手撸项目模板、在线代码编辑器

在线文档浏览Java 进程控制、Java 安全管理器、部分 JVM 知识点虚拟机(云服务器)、Docker(代码沙箱实现)Spring Cloud 微服务、消息队列、多种设计模式

架构设计

image-20240421225458010

1.介绍 O〕系统概念、介绍 OJ原理、介绍做项目流程、介绍需求分析、技术选型、架构设计、主流实现方案、前后端项目初始化、前端通用项目模板的搭建

2.主业务流程的前后端开发(争取把代码沙箱之外的全部搞定

3.专攻代码沙箱(自主实现,不止一种实现方案,层层递进,通过实战用例来进行安全优化)

4.系统优化(微服务改造、系统扩展思路)

主流的 OJ系统实现方案

开发原则:能用别人现成的,就不要自己写

1、用现成的 OJ系统

网上有很多开源的 OJ项目,比如青岛 0」、HustOJ等,可以直接下载开源代码自己部署比较推荐的是judge0,这是一个非常成熟的商业 OJ项目,支持 60 多种编程语言!

judge0open in new window

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

Judge0open in new window:注册登录,查看官方文档open in new window选择示例运行测试

image-20240422212450666

3.自主开发

​ 判题服务和代码沙箱都自行实现,适合学习但不适用于商业项目

4.把 AI 来当做代码沙箱 现在 AI 的能力已经十分强大了,我们可以把各种本来很复杂的功能直接交给 A1 来实现。比如把 A1 当做代码沙箱,我们直接扔给他一段代码、输入参数,问他能否得到预期的结果,就实现了在线判题逻辑!

​ 之前做的 智能 BI 项目,就是把 Al 当做了智能数据分析师,来生成图表和分析结论。只要你脑洞够大,AI +编程=无限的可能~

5.移花接木

​ 这种方式最有意思、也最“缺德”。很多同学估计想不到。那就是可以通过让程序来操作模拟浏览器的方式,用别人已经开发好的 OJ系统来帮咱们判题。比如使用 Puppeteer + 无头浏览器,把咱们系统用户提交的代码,像人一样输入到别人的 O)网页中,让程序点击提交按钮,并且等别人的 O)系统返回判题结果后,再把这个结果返回给我们自己的用户。这种方式的缺点就是把核心流程交给了别人,如果别人服务挂了,你的服务也就挂了;而且别人 OJ系统不支持的题目,可能你也支持不了。

项目概要

功能模块设计

1. 用户模块

  • 注册: 允许新用户创建账户并填写必要信息。
  • 登录: 提供安全的登录途径,确保用户能够访问个人账户。
  • 密码找回: 提供忘记密码时的找回机制,保障账户安全。
  • 信息查看与修改: 用户可以查看和修改个人信息,以保持信息的准确性。
  • 关注、取关: 提供关注和取关其他用户的功能,以建立用户之间的社交网络。

2. 题目模块

  • 智能出题与改题: 基于智能算法,系统能够生成和改进编程题目。
  • 在线做题: 提供用户在线解答题目的平台,记录用户的提交历史。
  • 查看提交结果: 用户能够查看他们的题目提交结果,包括通过或失败的状态。
  • 题解发布: 允许用户分享他们对题目的解答,促进知识分享。

3. 文章模块

  • 查看文章: 提供用户浏览系统内发布的文章的功能。
  • 分析文章: 支持用户对文章进行分析,以促进学术交流。
  • 点赞文章: 用户可以为喜欢的文章点赞,以表达赞同或支持。
  • 评论文章: 允许用户在文章下方发表评论,提供交流的平台。
  • 导出文章: 用户可以导出文章以便离线阅读或分享。

4. 题单模块

  • 题单创建与修改: 用户可以创建和修改题单,用于组织相关题目。
  • 题单权限说明: 系统提供详细的题单权限说明,确保合适的权限设置。
  • 题单信息查看: 用户可以查看题单的详细信息,包括包含的题目和权限设置。

5. 组织模块

  • 组织创建与修改: 用户可以创建和修改组织,建立自己的学术团体或社群。
  • 加入组织: 提供用户加入不同组织的入口,扩大社交圈。
  • 组织信息查看: 用户能够查看组织的详细信息,包括成员和活动。
  • 组织权限: 提供灵活的组织权限管理,确保组织内部运作顺畅。
  • 退出组织: 允许用户主动退出不再感兴趣的组织。
  • 转让组织: 组织管理员可以将组织的管理权限转交给其他成员。
  • 组织成员管理: 管理员可以查看和管理组织成员,确保组织的稳定运行。

6. 竞赛模块

  • 竞赛创建与修改: 用户能够创建和修改编程竞赛,设定相关参数。
  • 竞赛设置: 提供灵活的竞赛设置,包括时间、题目集、权限等。
  • 竞赛参与: 允许用户报名参与竞赛,挑战编程能力。
  • 竞赛成员管理: 竞赛管理员可以管理竞赛成员的权限和状态。
  • 竞赛排行榜统计: 实时更新竞赛成绩,提供排行榜展示。

7. 问题反馈与申请

  • 提交问题或申请: 提供用户一个途径向开发团队提交问题或提出申请。
  • 修改问题或申请: 允许用户修改之前提交的问题或申请。
  • 撤回反馈或申请: 用户有权撤回之前提交的问题或申请。
  • 查看申请进度: 提供用户查看问题反馈或申请处理进度的途径。

8. 系统配置

  • 服务器信息查看: 管理员可以查看服务器运行状态和信息。
  • 系统参数配置: 提供管理员配置系统参数的权限,以满足特定需求。
  • 系统操作日志管理: 记录系统的操作日志,以便后期审查。
  • 在线用户管理: 管理员能够查看和管理当前在线的用户。
  • 用户信息管理: 管理员可以查看和管理系统用户的基本信息。
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3