Cat Online Judge 判题系统

news2024/10/7 6:44:22

Cat Online Judge

作者:猫十二懿

项目介绍

本项目是基于 Spring Boot + Spring Cloud Alibaba 微服务 + Docker + RabbitMQ + Vue 3 的 编程算法题目在线评测系统
(简称OJ)。

在线访问:http://oj.kongshier.top/

源项目来自编程导航(https://yupi.icu)

Cat OJ(Cat Online Judge)系统是一个在线算法评测系统,用户可以选择题目、编写代码并提交代码进行评测,而且是高效、稳定的 OJ
在线判题评测系统,它能够根据用户提交的代码、出题人预先设置的题目输入和输出用例,进行编译代码、运行代码、判断代码运行结果是否正确。

项目功能 🎊

题目模块

  1. 创建题目(管理员)
  2. 删除题目(管理员)
  3. 修改题目(管理员)
  4. 搜索题目(用户/管理员)
  5. 题目管理(管理员)
  6. 在线做题(用户/管理)
  7. 提交题目代码(用户/管理)
  8. 消息队列:防止判题服务执行时间过长,并使用死信队列处理判题失败的题目,避免消息积压。

用户模块

  1. 注册
  2. 登录,在微服务中使用JWT Token实现登录,在网关层面获取token登录消息,实现用户鉴权
  3. 用户管理(管理员)
  4. 用户上传头像功能,使用阿里云对象存储OSS存储图片
  5. 用户限流。本项目使用到令牌桶限流算法,使用Redisson实现简单且高效分布式限流,限制用户每秒只能调用一次提交一次题目,防止用户恶意占用系统资源

判题模块

  1. 提交判题:结果是否正确与错误
  2. 错误处理:内存益出、安全性、超时
  3. 代码沙箱:执行代码,返回执行信息
  4. 开放接口:提供一个独立的新服务

代码沙箱

  • 只负责接受代码和输入,运行代码,返回编译运行的结果,不用管用户提交的程序是否正确(不负责判题)

OJ系统调研

  1. https://github.com/HimitZH/HOJ (适合学习)
  2. https://github.com/QingdaoU/OnlineJudge (python,不好学,很成熟)
  3. https://github.com/hzxie/voj (在Github上的Start⭐⭐没那么多,没那么成熟,但相对好学)
  4. https://github.com/fleaking/uoj (php实现的)
  5. https://github.com/zhblue/hustoj (成熟,但是php实现)
  6. https://github.com/hydro-dev/Hydro (功能强大,Node.js实现)

项目核心亮点 ⭐

  1. 权限校验:用户权限校验
  2. 代码沙箱(安全沙箱)
    • 用户代码藏毒:写个木马文件、修改系统权限
    • 沙箱:隔离的、安全的环境,用户的代码不会影响到沙箱之外的系统的运行
    • 资源分配:限制用户程序的占用资源
  3. 判题规则
    • 题目用例的比对,结果的验证
  4. 任务调度(消息队列执行判题)
    • 服务器资源有限,用户要排队,按照顺序去依次执行判题

快速启动 🏃‍♂️

  1. 下载/拉取本项目到本地(shieroj-backend-single、shieroj-code-sandbox、shieroj-frontend)
  2. 通过 IDEA 代码编辑器进行打开项目,等待依赖的下载
  3. 修改配置文件 application.yaml 的信息,比如数据库、Redis、RabbitMQ等
  4. 修改信息完成后,通过 ShierApplication 程序进行运行项目

项目结构图 🌟

在这里插入图片描述

项目核心业务流程 🔥

判题服务:获取题目信息、预计的输入输出结果,返回给主业务后端:用户的答案是否正确
代码沙箱:只负责运行代码,给出程序运行的结果,不用管用户提交的程序是否正确。 因此 判题服务 和 代码沙箱 实现了解耦
在这里插入图片描述

核心流程时序图
在这里插入图片描述

微服务项目

服务模块划分

  1. shieroj-backend-common:系统通用模块,比如用户角色权限校验,异常处理,统一返回值,常量,工具类等
  2. shieroj-backend-file-service:系统文件模块,比如用户头像上传等
  3. shieroj-backend-gateway:系统网关模块:实现了给前端返回统一接口路由,聚合文档(Knife4j),全局跨域配置,权限校验(JWT Token)等
  4. shieroj-backend-judge-service:系统判题模块:调用远程代码沙箱接口,实现工厂模式、策略模式、代理模式,验证代码沙箱执行结果是否正确与错误,使用消息队列实现异步处理消息
  5. shieroj-backend-model:系统实体模块,比如用户实体类、题目实体类,VO、枚举等
  6. shieroj-backend-question-service:系统题目模块:题目的增删改查、题目提交限流、使用消息队列异步处理消息
  7. shieroj-backend-service-client:系统内部调用模块,给内部系统提供调用接口
  8. shieroj-backend-user-service:系统用户模块,管理员对用户的增删改查,用户自己信息查询,修改,头像上传。

项目技术栈和特点 ❤️‍🔥

后端

  1. Spring Boot:简化Spring开发框架
  2. Spring MVC:
  3. Spring Boot 调试工具和项目处理器
  4. Spring AOP 切面编程
  5. Spring 事务注解
  6. Spring Cloud Alibaba
  7. Spring Gateway
  8. MyBatis + MyBatis Plus 数据访问(开启分页)
  9. MyBatis-Plus 数据库访问结构
  10. Redis:分布式存储用户信息
  11. Redisson:限流控制
  12. JWT Token:用户鉴权
  13. RabbitMQ:消息队列
  14. Docker 代码沙箱,实现隔离环境运行Java程序
  15. Java安全管理器:保护 JVM、Java 安全的机制,实现对资源的操作限制
  16. Nacos:服务注册管理中心
  17. OpenFeign:微服务模块之间调用

前端

  1. Vue 3
  2. Vue Router: 路由管理
  3. Vue-Cli 脚手架
  4. Axios: HTTP客户端
  5. Bytemd: Markdown 编辑器
  6. Monaco Editor: 代码编辑器
  7. highlight.js: 语法高亮
  8. Moment.js: 日期处理库
  9. Arco Design Vue: UI组件库
  10. TypeScript: 静态类型系统

数据存储

  • MySQL 数据库
  • 阿里云 OSS 对象存储

通用特性

  • Spring Session Redis 分布式登录
  • 全局请求响应拦截器(记录日志)
  • 全局异常处理器
  • 自定义错误码
  • 封装通用响应类
  • Swagger + Knife4j 接口文档
  • 自定义权限注解 + 全局校验
  • 全局跨域处理
  • 长整数丢失精度解决
  • 多环境配置
  • IDEA插件 MyBatisX : 根据数据库表自动生成
  • Hutool工具库 、Apache Common Utils、Gson 解析库、Lombok 注解

单元测试

  • JUnit5 单元测试、业务功能单元测试

设计模式

  • 静态工厂模式
  • 代理模式
  • 策略模式

远程开发

  • VMware Workstation虚拟机
  • Ubuntu Linux 18
  • Docker环境
  • 使用JetBrains Client连接

单体项目目录结构

├─sql  // 项目的SQL文件:创建数据库和数据表
├─src
   ├─main
      ├─java
      │  └─com
      │      └─shieroj
      │          ├─annotation // 权限控制
      │          ├─aop    //AOP切面
      │          ├─common // 通用类
      │          ├─config // 项目配置
      │          ├─constant // 项目常量
      │          ├─controller // 前端请求
      │          ├─exception  // 项目异常
      │          ├─judge      // 判题服务
      │          │  ├─codesandbox  // 代码沙箱
      │          │  │  ├─impl
      │          │  │  └─model
      │          │  └─strategy
      │          ├─manager  // 管理
      │          ├─mapper   // 数据访问(操作数据库)
      │          ├─model    // 项目实体
      │          │  ├─dto
      │          │  │  ├─file
      │          │  │  ├─question
      │          │  │  ├─questionsumbit
      │          │  │  └─user
      │          │  ├─entity
      │          │  ├─enums
      │          │  └─vo
      │          ├─mq      // 消息队列
      │          ├─service // 项目服务
      │          │  └─impl
      │          └─utils   // 项目工具
      └─resources // 项目资源配置
          └─mapper

OJ项目展示

项目首页

在这里插入图片描述

用户登录注册

在这里插入图片描述
在这里插入图片描述

管理员创建题目

在这里插入图片描述
在这里插入图片描述

题目管理

在这里插入图片描述

修改题目信息

在这里插入图片描述

用户管理(管理员)

在这里插入图片描述

管理员修改用户信息
在这里插入图片描述

个人信息

在这里插入图片描述

点击头像即可重新上传用户头像
在这里插入图片描述

提交题目展示

在这里插入图片描述

后续项目扩展

  • 多语言代码沙箱

❤️‍🔥❤️‍🔥❤️‍🔥需要项目请评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman接口自动化

一、接口测试的简介和分类 接口测试就是测试系统组件接口之间的一种测试。 分类 : 测试外部接口: 测试被测系统和外部系统之间的接口。( 只需要测试正例即可 ) 测试内部接口 : 1、内部接口只提供给内部系统使用。( 预算系统,承保系统 )( 只需要测试正例即可 ) 2、…

【算法】分治法

文章目录 概念原理和步骤代码示例 总结 概念 分治法(Divide and Conquer)是一种算法设计策略,其思想是将一个大问题划分为若干小规模的子问题,然后递归地解决每个子问题,并将它们的解合并起来以得到原始问题的解。分治…

记一次springboot的@RequestBody json值注入失败的问题(字段大小写的问题)

有时候做后端开发时,难免会与算法联调接口,很多算法的变量命名时全部大写,在实际springmvc开发中会遇到无法赋值的问题。 先粘贴问题代码 entity类 Data NoArgsConstructor EqualsAndHashCode(callSuper true) ToString(callSuper true) …

Linux命令之chattr命令

一、chattr命令简介 chattr命令用于更改文件或目录的属性,包括不可修改属性、同步属性、追加属性、无尽属性、压缩属性、无尽属性、不可删除属性等。chattr命令只能由超级用户或文件的所有者使用。 二、chattr命令使用示例 1、给文件设置版本 -v参数设置版本信息只…

数据库备份的几种方式

数据已成为当今数字时代公司的主要资产。然而,数据的安全性和完整性也成为企业经营的主要挑战。数据库备份对于维护这些宝贵的数据尤为重要。本文将详细介绍几种比较常见的数据库备份方式,帮助用户掌握如何有效地保护数据,保证业务的可持续发…

linux使用操作[1]

文章目录 版权声明快捷键ctrl c 强制停止ctrl d 退出、登出history命令光标移动快捷键清屏快捷键 软件安装命令常见linux系统包管理器yum命令apt命令 systemctl命令软连接日期&时区修改linux时区ntp程序 IP地址&主机名ip&主机名域名解析win配置主机名映射虚拟机…

Mysql003:基础查询

目录: 1. 基本查询 2. 条件查询(where) 3. 聚合函数(count、max、min、avg、sum) 4. 分组查询(group by) 5. 分组后查询(having) 6. 排序查询(order by&#…

【空间-光谱联合注意网络:多时相遥感图像】

A Spatial–Spectral Joint Attention Network for Change Detection in Multispectral Imagery (一种用于多光谱图像变化检测的空间-光谱联合注意网络) 变化检测是通过比较双时相图像来确定和评估变化,这是遥感领域的一项具有挑战性的任务…

Wireshark抓包分析ICMP协议

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 分析目的:分析ICMP协议的数据格式、报文…

【赠书活动】无测试组织:测试团队的敏捷转型

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

不可忽视的字符函数与字符串函数:它们如何改变你的编程世界

💓博客主页:江池俊的博客⏩收录专栏:C语言进阶之路👉专栏推荐:✅C语言初阶之路 ✅数据结构探索💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐ 文…

苹果恢复出厂设置怎么操作?方法在这!

手机恢复出厂设置,简单点来说就是将手机恢复到出厂时的默认状态。如果在使用手机的过程中遇到内存不足、系统闪退、应用卡顿等问题,可以尝试通过将手机恢复出厂设置来解决问题。那么,苹果恢复出厂设置的方法是什么?还不知道如何操…

API接口自动化测试框架

前言 接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率,仍然是大部分公司需要解决的问题。 框架定位 数据驱动设计模式,无需写测试代码脚本即可实现自动化等价类非等价类覆盖, E2E…

浅谈如何预防高层小区电气火灾的发生

【摘要】:随着国民经济的发展和人民生活水平的不断提高,我国工业用电和家庭用电量逐年增加。电气火灾造成的人员伤亡和财产损失巨大,时刻威胁着人们的生命及财产安全。众所周知,因供电线路或用电设备的损坏引发的接地电气火灾的例…

Seata入门系列【2】Spring Cloud 2021.0.5集成seata 1.7.1

1 引出分布式事务问题 1.1 seata-service-account编写查询用户、远程调用下订单接口 RestController RequestMapping("/accountTbl") public class AccountTblController {AutowiredAccountTblMapper accountTblMapper;AutowiredOrderFeign orderFeign;GetMapping(…

西门子KTP触摸屏做画面时如何把设备图片或Logo做到画面上?

西门子KTP触摸屏做画面时如何把设备图片或Logo做到画面上? 如下图所示,新建一个项目,添加一个触摸屏设备,这里以TP1200 Comfort触摸屏为例进行说明,双击进入根画面, 如下图所示,在右侧的工具箱中…

SpringBoot 学习(一)自动装配

本系列文章为【狂神说 Java 】视频的课堂笔记,若有需要可配套视频学习。 1.1 pom.xml (1) 父工程( spring-boot-starter-parent ) 核心依赖,静态资源过滤等配置。编写或导入 springboot 依赖时不需要指定版本号,继承…

MySQL 连接查询(多表查询 二)

基本介绍 作用:连接查询(Join)操作,用于联结多个表以获取更全面和准确的数据 基本分类: 内连接:相当于查询A、B交集部分数据(去掉迪卡尔积无效组合)外连接: 左外连接&…

nginx: 部署前端项目的详细步骤(vue项目build打包+nginx部署)

目录 第一章 前言 第二章 准备工作 2.1 项目打包理解 2.1.1 打包命令 2.1.2 理解npm run serve/dev 和 npm run build命令 2.2 nginx参数配置理解 2.2.1 nginx常用基本命令 2.2.2 默认配置 2.2.3 搭建不同网站的站点 2.2.4 禁止访问的目录以及一键申请SSL证书验证目录…

Red Hat更新开发套件了,有你期待的功能吗?

导读近日,Red Hat公司将Red Hat Development Suite更新到了2.0版本,其中包括对Red Hat JBoss Development Suite和Red Hat Container Development Kit的一系列优化。 Red Hat Development Suite 2.0版本的主题是扩展可用性与产品集成,以及扩展…