基于SSM框架和RabbitMQ技术的OJ系统的设计与实现
来源:用户上传
作者:戴施伟 周凌珉 郑一泓
摘 要: 目前国内一些开发时间较早的OJ系统架构陈旧,技术更新缓慢,其运行的效率和使用的场景都不能满足当今的需求。本系统基于SSM框架,使用了Spring Boot作为后台服务开发的框架,并采用RabbitMQ消息队列技术进行后台服务端和判题端的通信。系统在设计上不仅涵盖了OJ的基础功能,还对日常的教学场景做了适配,更新并加强了对使用者作弊行为的监控,充分提高了使用者的学习效率。
关键词: SSM框架; RabbitMQ; Spring Boot; OJ系统; 教学场景
中图分类号:TP311.5 文献标识码:A 文章编号:1006-8228(2022)10-81-04
Design and implementation of OJ system based on SSM framework and RabbitMQ
Dai Shiwei, Zhou Lingmin, Zheng Yihong
(Department of software engineering, School of information engineering, Zhejiang University of Water Resources
and Electric Power, Wenzhou, Zhejiang 325204, China)
Abstract: At present, some domestic OJ systems with earlier development time have outdated architecture and slow technology updates. Their usage scenarios and operating efficiency could not meet today's needs. This system is based on the SSM framework and uses Spring Boot as the framework for back-end service development. The RabbitMQ message queue technology is used for the communication between the back-end server and the judging end. The design of the system not only covers the basic functions of OJ, but also adapts to daily teaching scenarios, updates and strengthens the monitoring of users' cheating behavior, and fully improves the learning efficiency of users.
Key words: SSM framework; RabbitMQ; Spring Boot; online judge; teaching scene
0 引言
OJ(Online Judge)系统,是近十几年随着ACM事业在中国的发展而引入的一种在线练习和比赛系统,最早设计服务于ACM-ICPC国际大学生程序竞赛的自动判题和排名,使用者可在线提交多种程序的源代码(如C、C++、Java),系统会对源代码进行编译并运行,再通过后台数据库的测试用例来检验代码的正确与否[1]。随着ACM的发展和我国的信息化教学方式的变革,国内一些高校也开发了属于自己的OJ系统,其中也不乏有许多主流的OJ,杭州电子科技大学的 HDOJ,浙江大学的ZOJ……。通过建立本校的OJ,不仅可以方便平时ACM队员的训练和竞赛模拟,还可以添加独创的题目,拥有属于本校自己的题库;在日常教学方面,OJ系统不仅可以提高计算机专业的学生学习数据结构算法的积极性和学习效率,也为所有想提高自己程序算法能力的学生提供了一个练习的平台。
1 系统框架及设计
1.1 系统总体设计
结合实际需求,在框架整体的设计中本系统着重考虑了在高并发访问下的效率问题。
系统使用了Spring Boot作为开发框架,它对于Spring中存在的重量级配置问题、项目的依赖管理、不支持分布式等问题进行了改善和优化[2],精简配置的同时方便对外输出各种形式的服务。考虑到安全性以及系统性能,采用判题服务与后台服务分离的架构优化方案,减少服务器负担的同时降低开发人员对系统维护的难度。两者间通信采用RabbitMQ消息队列,既可以提高并发量,又能降低服务之间的耦合度,且具有更好的时效性。采用MySQL进行数据持久化存储,其服务灵活,快速稳定。最后前端页面的开发使用Vue.js框架,简洁高效。
1.2 核心模块设计
本判题系统划分为三部分:前端交互、判题系统、后台系统(见图1)。在前端页面中,根据功能需要,分别对每个角色进行界面设计。下面主要介绍判题模块与后台服务模块的功能。
1.2.1 判}模块设计
为了系统的安全性,判题模块应与后台服务模块相分离,使用RabbitMQ消息队列实现通信,采用心跳机制,定时向后台服务端发送判题端系统信息,用于展示判题端在线情况。为了便于查看管理,判题系统应地向后台系统上报判题系统运作状态(见图2)。当收到用户提交信息时,判题系统应进行数据交互,使后台服务端处理判题请求(见图3)。
1.2.2 后台服务模块设计
nlc202210171518
后台系统是实现前端页面操作和系统功能的重要模块,本系统将后台系统分为七个模块,以下主要介绍四个功能模块的设计。
⑴ 竞赛模块:当收到判题结果信息后,系统会对竞赛信息进行相关更新(见图4)。管理员和教师能在后台添加新竞赛,并且可以设置竞赛显示时间、开始时间、结束时间、竞赛总时长等。管理员和教师也能对自己权限范围内的竞赛进行修改,进行用户管理。设置测试账号后可以进行竞赛测试。设立排行榜,对竞赛成绩按照编程竞赛规则排名。可以对前台采集的用户数据进行储存、分析、IP上报,防止用户作弊。提供竞赛加入功能,用户在竞赛过程中可以直接加入开放型竞赛,对于私人竞赛可以通过房间ID和密钥加入。对于竞赛数据如用户答题情况、用户提交情况、用户竞赛IP数据、排行榜,可以进行查阅和导出,同时竞赛的提交数据也可以进行重新判题。
⑵ 练习模块:用户可以查阅系统中公共类型的问题内容,并按答题情况差异化展示。设立排行榜,对用户按已解决问题数进行排名。
⑶ 问题模块:管理员或教师能添加新的问题,也对自己权限范围的问题信息进行修改、删除,还可以添加或删除测试数据。
⑷ 讨论模块:管理员可以在系统设置中开启讨论区,用户能在讨论区中发起讨论,可以和其他用户进行评论互动。
1.3 安全性设计
本判题系统数据储存使用MySQL。判题系统模块与后台服务模块分离,模块间通信摈弃现有OJ系统普遍采用的直接读取数据库的方案,使用RabbitMQ消息队列实现通信以提高安全性。规范数据库编码设计,防止攻击者通过sql注入对后台数据库的数据进行读取、删除、篡改[3]。
本系统采用Spring Boot自带的定时器定时调用MySQL自带的mysqldump命令来实现数据库导出到文件,然后通过SMTP邮件发送服务,将数据库备份文件打包发送给系统预置的管理员邮箱,实现数据库备份操作。设计时引入Docker,将判题服务封装成容器,一方面实现简易部署,另一方面Docker容器相较于直接在宿主机运行拥有更好的安全性。
1.4 UI设计
前端页面基于Vuexy Admin Template模板开发,界面基础辅助色为灰黑紫,简洁大方。页面设计中,为用户每一类型的操作提供明确的反馈,同时也设计了对话框以及错误提示。输入框采用简单的描述文字,并使用左对齐,以符合阅读视线规律,选择恰当的文字颜色给予用户输入反馈,对于错误输入给予红色提示,对于正确输入无提示或者给予绿色提示,对于危险输入给予黄色提示。致力于设计一款用户友好型操作界面[4]。
用户界面设计为左右布局,左边用于栏目导航,右边用于栏目内容的展示,便捷高效的同时让页面看起来更加活跃(见图5)。
引入插件apexcharts进行对部分场景数据的图形绘制,用更加直观的数据图展示内容(见图6)。
对于表格类数据进行数据分级,不同类数据采用不同配色,直观化展示各类信息,使用户在了解信息优先级的同时对信息有更快速更准确的定位(见图7)。
2 核心功能的实现
2.1 用户权限验证的实现
对于用户权限验证的实现,本系统通过客户端对Header(请求头)中的Authorization字段里携带的token令牌进行用户的权限校验,客户端发出的所有请求都会携带这个令牌,当用户注销,令牌就会在客户端进行销毁,由于token无状态的特点,服务器不需要保存令牌的状态,可以有效降低服务器进行数据库查询的次数[5]。在用户登录的时候,系统会根据用户的个人信息和登录时间生成一个具有有效时间限制的token(令牌)。
本系统使用filter(过滤器)和interceptor(拦截器)对部分需要权限的页面进行授权校验,从Header中@取令牌,对其进行Base64Decode解码后对authorization字段进行验证。验证通过后,修改Header注入用户ID和用户等级信息。当验证的令牌的信息无效或者错误时,拒绝访问当前请求的页面并返回授权错误信息。
2.2 后台服务与判题服务器通信的实现
本系统采用RabbitMQ消息队列实现后台服务与判题服务器之间的通信主要服务内容有:向判题服务器发送判题请求,向后台服务发送判题服务器返回的判题结果,实现心跳机制――定时向后台服务端发送判题端的系统信息[6]。MQ服务器中的重发机制所带来的因数据量过多导致内存溢出的危险,可以通过调用ChannelAwareMessageListener接口实现来ack机制来消除。
2.3 自动判题的实现
判题服务器在接收RabbitMQ消息队列中的判题请求之后,将提交的代码写入临时文件。根据请求者选择使用的语言类型,选择不同的编译器进行编译并生成可执行文件。文件生成完毕即使用题目所对应的测试用例进行测试,执行完的结果保存至.out后缀的文件中,通过用Ptrace对进程进行跟踪,执行完毕删除临时文件,并使用题目所对应的样本标准测试结果文件和执行生成的文件进行比对,判断的结果通过RabbitMQ消息队列返回[7]。
3 结束语
伴随信息化教育的普及,OJ系统的应用场景也顺应增加,本系统在保证原有功能的基础上,增加了对应教学场景的功能,对成绩和代码的导出,反作弊管理的加强。本系统的后期测试结果表明所有功能运行正常,也符合了预期性能要求。本系统正式运行后在日常教学环境中得到了良好应用,不仅能够满足ACM队员的日常训练、模拟比赛、开展竞赛,也能作为教师开展相应程序类设计课程的教学辅助工具,为学校所有计算机类学生和想提高自己算法能力的学生提供了一个便捷有效的平台。
参考文献(References):
[1] 张丽,尹红征,冯志慧.OJ平台在计算机专业教学中的应用[J].电脑知识与技术,2020,16(5):184-185
[2] 陶琳.基于Spring Boot和Vue框架的高校实验室耗材管理系统的分析与设计[J].电脑知识与技术,2021,17(13):83-85
[3] 孙亮.在线考试系统的安全性研究[D].北京:北方工业大学,2016
[4] 钱前,胡禄.基于教改课题的OJ平台建设[J].科技创新导报,2018,15(19):218-220,222
[5] 胡献宇.基于令牌认证方案的改进研究与实践[J].软件工程,2021,24(4):34-38
[6] 唐权,周蓉,张勇.RabbitMQ消息中间件在Spring Boot教学中的应用[J].现代信息科技,2020,4(18):125-127
[7] 任长安,罗庆云,曹水莲.湖南工学院ACM在线评测系统的设计[J].电子技术与软件工程,2020(1):55-56
nlc202210171518
转载注明来源:https://www.xzbu.com/8/view-15441138.htm