调研、技术选型
前言:这是跟着鱼皮做的OJ系统,截取内容来自公开直播,其他均为自己总结。
1. 前期:我们需要做的事
实现一个新系统,可以遵循以下步骤进行,以确保项目的顺利进行和最终的成功:
- 系统调研:
- 了解需求:明确系统需要解决什么问题,满足哪些用户需求。
- 分析竞品:研究市场上已有的同类系统,了解它们的优缺点,避免重复造轮子。
- 技术选型:根据系统需求和技术团队能力,选择合适的开发语言、框架、数据库等。
- 需求分析:
- 细化需求:将笼统的需求细化为具体的功能点,明确每个功能的具体实现方式。
- 编写需求文档:将需求分析结果整理成文档,供团队成员参考。
- 系统设计:
- 架构设计:设计系统的整体架构,包括前端、后端、数据库等部分。
- 接口设计:定义系统内部及系统间的接口规范。
- 数据库设计:设计数据库结构,包括表结构、索引、关系等。
- 开发实现:
- 编码:按照系统设计进行编码实现。
- 单元测试:编写单元测试,确保每个模块的功能正确。
- 集成测试:将各个模块集成起来进行测试,确保模块间协作无误。
- 系统测试:
- 功能测试:测试系统是否满足所有需求。
- 性能测试:测试系统的响应时间、吞吐量等性能指标。
- 安全测试:检查系统是否存在安全漏洞。
- 部署上线:
- 环境准备:准备生产环境,包括服务器、数据库等。
- 部署应用:将系统部署到生产环境。
- 监控维护:对系统进行监控,及时处理可能出现的问题。
- 迭代优化:
- 收集反馈:收集用户反馈,了解系统使用情况。
- 优化改进:根据反馈进行功能优化和性能提升。
简单概括一个项目流程:
- 项目介绍、项目调研、需求分析
- 核心业务流程
- 项目功能模块
- 技术选型
- 项目初始化
- 项目开发
- 项目测试
- 项目优化
- 代码提交、审核
- 产品验收
- 上线
2. 前期:粗略分析系统需求
安全性
首先,我们要明白一个OJ判题系统不能允许什么:
- 不能随便导包
- 不能暴力破解
- 不能随便遍历
需要保证使用了正确的算法。
异步性
判题过程是异步的。
时间、内存限制
提交之后,生成一个提交记录,有运行的结果及运行信息。
开放接口API
将OJ系统作为一个开放的API。
3. 调研开源OJ
比较合参考和复现的OJ:
- 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
- HOJ
- judge0
judge0官网:https://judge0.com/
功能核心:
- 权限校验
- 代码沙箱(Sandbox,一个隔离、安全的环境,用户的代码不会影响到沙箱之外的运行)
- 判题规则
- 任务调度
核心业务流程:
https://github.com/user-attachments/assets/15090cff-8e5e-441c-947a-23579dda3dcd
项目扩展:
- 测评类型(支持SPJ特殊测评,程序接收题目的输入用例和输出用例)
- 多语言
- 远程判题(Remote Judge)
4. 技术选型
前端:Vue3、Arco Design组件库、项目模板、在线代码编辑器、在线文档浏览、Java进程控制、Java安全管理器、JVM 虚拟机实现云服务器、Docker实现代码沙箱、Spring Cloud微服务、消息队列
5. 架构设计
warning
确认环境:
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