跳到主要内容

调研、技术选型

前言:这是跟着鱼皮做的OJ系统,截取内容来自公开直播,其他均为自己总结。

1. 前期:我们需要做的事

实现一个新系统,可以遵循以下步骤进行,以确保项目的顺利进行和最终的成功:

  1. 系统调研
    • 了解需求:明确系统需要解决什么问题,满足哪些用户需求。
    • 分析竞品:研究市场上已有的同类系统,了解它们的优缺点,避免重复造轮子。
    • 技术选型:根据系统需求和技术团队能力,选择合适的开发语言、框架、数据库等。
  2. 需求分析
    • 细化需求:将笼统的需求细化为具体的功能点,明确每个功能的具体实现方式。
    • 编写需求文档:将需求分析结果整理成文档,供团队成员参考。
  3. 系统设计
    • 架构设计:设计系统的整体架构,包括前端、后端、数据库等部分。
    • 接口设计:定义系统内部及系统间的接口规范。
    • 数据库设计:设计数据库结构,包括表结构、索引、关系等。
  4. 开发实现
    • 编码:按照系统设计进行编码实现。
    • 单元测试:编写单元测试,确保每个模块的功能正确。
    • 集成测试:将各个模块集成起来进行测试,确保模块间协作无误。
  5. 系统测试
    • 功能测试:测试系统是否满足所有需求。
    • 性能测试:测试系统的响应时间、吞吐量等性能指标。
    • 安全测试:检查系统是否存在安全漏洞。
  6. 部署上线
    • 环境准备:准备生产环境,包括服务器、数据库等。
    • 部署应用:将系统部署到生产环境。
    • 监控维护:对系统进行监控,及时处理可能出现的问题。
  7. 迭代优化
    • 收集反馈:收集用户反馈,了解系统使用情况。
    • 优化改进:根据反馈进行功能优化和性能提升。

简单概括一个项目流程:

  1. 项目介绍、项目调研、需求分析
  2. 核心业务流程
  3. 项目功能模块
  4. 技术选型
  5. 项目初始化
  6. 项目开发
  7. 项目测试
  8. 项目优化
  9. 代码提交、审核
  10. 产品验收
  11. 上线

2. 前期:粗略分析系统需求

安全性

首先,我们要明白一个OJ判题系统不能允许什么:

  1. 不能随便导包
  2. 不能暴力破解
  3. 不能随便遍历

需要保证使用了正确的算法。

异步性

判题过程是异步的。

时间、内存限制

提交之后,生成一个提交记录,有运行的结果及运行信息。

开放接口API

将OJ系统作为一个开放的API。

3. 调研开源OJ

比较合参考和复现的OJ:

  1. HUSTOJ:一个开源的在线编程评测系统,支持C、C++、Java、Pascal、C#、Python、PHP、JavaScript、VBScript、SQL、Ruby、Perl、Go、Lua、Pascal、C、C++、Java、Pascal、C#、Python、PHP、JavaScript、VBScript、SQL、Ruby、Perl、Go、Lua、Pascal
  2. HOJ
  3. judge0

judge0官网:https://judge0.com/

功能核心:

  1. 权限校验
  2. 代码沙箱(Sandbox,一个隔离、安全的环境,用户的代码不会影响到沙箱之外的运行)
  3. 判题规则
  4. 任务调度

核心业务流程:

https://github.com/user-attachments/assets/15090cff-8e5e-441c-947a-23579dda3dcd

项目扩展:

  1. 测评类型(支持SPJ特殊测评,程序接收题目的输入用例和输出用例)
  2. 多语言
  3. 远程判题(Remote Judge)

4. 技术选型

前端:Vue3、Arco Design组件库、项目模板、在线代码编辑器、在线文档浏览、Java进程控制、Java安全管理器、JVM 虚拟机实现云服务器、Docker实现代码沙箱、Spring Cloud微服务、消息队列

5. 架构设计

注意

确认环境:

nodeJS: 16.x/18.16.0

npm: 9.5.1

6. 初始化

使用vue-cli脚手架:

npm install -g @vue/cli
vue -v
vue create my-oj
# 选择Manually select features
# 空格选择TS、Router、Vuex、Linter / Formatter, enter
# 选3.x
# No
# Yes
# Y
# ESLint + Prettier
# Lint on save
# In dedicated config files
# Y
cd my-oj
npm install
npm run serve

VUE3 installation