缩略图

基于Springboot框架的云平台线上考试系统

作者

马永杰 陈振东 严婉如 苟娜娜 张航

沈阳理工大学 辽宁 沈阳 110000

(创新项目:2022年省级大学生创新创业训练项目,项目编号:S202310144060)

摘要:云平台在线考试系统解决了疫情期间学校考试和练习问题,支持在线练习与反馈,帮助学生巩固代码内容,并让老师了解学生学习情况。系统包括登录注册、题目编辑、小组管理、在线编程、答题、数据统计等功能模块,实现从出题到答题反馈的全流程。目前系统存在效率较低、耦合度高的问题,部分功能需调整。后端采用Spring Boot和Dubbo构建分布式应用,前端以Vue、ECharts、Element-UI开发,数据存储使用MySQL和Redis,Docker部署编程题判题沙盒。

关键词:在线考试;网站开发;Dubbo;MySQL

一、项目概述

(一).项目的选题背景、目的与意义

在传统考试在企业、学校广泛应用,但存在耗费人力、易作弊、智能化低等缺点。线上考试系统则节约资源、提高效率、更公平公正,但面临网络不稳定、技术限制、开发成本高等问题。不过,它能显著减少教师备考时间,提升企业信息化管理水平,带来更高效率。

(二).考试系统的国内外研究现状

1.国内研究方向:

(1) 算法优化:如哈尔滨工业大学的AC自动机优化研究。

(2) 教育应用:如北京大学的程序设计竞赛课程。

(3) 评测系统设计:如清华大学的OJ评测系统。

(4) 数据库管理:如中国科学院软件研究所的数据管理研究。

2.国外研究方向:

(1) 算法优化:如麻省理工学院的算法优化研究。

(2) 教育应用:如斯坦福大学的在线编程课程。

(3) 评测系统设计:如卡内基梅隆大学的评测系统研究。

(4) 数据库管理:如加州大学伯克利分校的数据库管理研究。

二、项目预期成果完成情况和创新点

创新之处主要体现在以下几个方面:

(一)采用分布式架构:该项目采用了Spring Boot加Dubbo的分布式方案,可以将系统拆分为多个服务,每个服务可以部署在不同的服务器上,通过Dubbo框架实现服务之间的通信和协作。

(二)使用Vue框架:前端采用Vue框架进行开发,Vue框架具有轻量级、易学易用等特点,可以提高开发效率和用户体验。

(三)使用Docker容器:该项目使用Docker容器作为沙箱,可以实现快速部署和隔离性,保证考试环境的安全性和稳定性,同时判断题目过程不影响整体服务。

三、项目说明

(一)整体项目流程

云平台考试系统包括用户和管理员端。用户登录后可查看小组信息、审批通知、个人信息、做题数量、题目排行等。用户可使用多种语言编程并提交,系统判题并提示结果,出错显示异常信息。选择题和填空题按要求作答,统计数据可在统计页查询。完成度高的用户可申请出题。

管理员分为低权限出题者和老师。低权限出题者是申请的学生,仅能出题。老师拥有最高权限,可访问所有页面,包括出题、添加代码过滤项、创建小组、分配任务、查看学生统计数据,并审批申请。学生数据含题目完成情况等。老师通过定时任务平台删除题目,并可添加低权限出题者,还可使用数据查询、数据库设置、服务监控等功能。

(二)系统架构

在线考试系统基于Spring Boot和Dubbo实现分布式架构,提升可靠性和性能。系统采用敏捷开发,便于高效开发和维护。结构上分为用户显示层、缓存层、核心层、Docker容器管理层、沙箱层和数据存储层。Vue框架用于前端,Vue UI管理依赖,Docker通过K8s实现服务隔离。数据存储采用MySQL持久化,Redis作缓存,使用双删策略保持数据一致性。

1.系统功能模块

云平台在线考试系统主要分为三大模块,学生答题、教师出题、系统判题。三个系统中,系统判题模块最为重要,其架构设计图如下图所示,其中数据输入为学生答题所输入端内容,而在代码构造阶段会获取教书出题中的相关信息。

2.系统功能模块描述

(1).学生用户答题模块

用户在编程题页面填写代码,预设函数不可修改。完成后点击提交,系统将用户代码和题目信息发送后端判题。选择题和填空题通过选择框和输入框填写。用户信息保存在cookie中,后端解析cookie以验证身份并获取用户信息。

(2).教师出题模块

教师在创建编程题时需要添加展示的测试用例、题目名称、题目描述、系统测试用例、用户编写函数、时间与空间限制。而选择题与填空题只需要填写题目描述、标题、选项、正确答案即可。

(3).系统判题模块

系统判题模块采用分布式部署。用户代码经Redis过滤语言和非法内容,不合规直接返回错误。通过后,代码与测试用例拼接,通过RPC传至Docker容器执行,由K8s管理。执行成功则返回结果并持久化;若失败则反馈用户;若容器崩溃,系统重试,超限则通知用户和管理员。

(4).信息统计模块

统计信息模块分为学生端和教师端。学生只能查看个人信息和排行榜;教师可查询任意学生的题目完成情况,如完成人数、时间等,并通过排行榜分析需重点关注的学生及完成较好的题目。教师还可按题目标签查看学生在不同类型题目上的表现。

(5)、 小组创建及任务分配模块

小组创建模块允许老师填写小组信息、选择成员并创建小组。创建后,老师可在任务分配页面分配任务给小组,小组成员会收到通知。老师还能查看未查看任务的学生。

(6)、 申请审批模块

学生可在申请页提交申请,教师在审批页处理未批示的申请。批示后,发起用户可在首页查看结果。该模块用于低权限出题者的申请,帮助形成用户生态,并通知相关用户结果。

(7)、系统监控及定时任务模块

系统监控通过整合框架实现,包括druid和dubbo-admin监控中心,监控SQL、分布式服务、调用链、响应时间等。dubbo-admin还支持服务控制。系统使用xxl-job管理定时任务,通过配置和引用starter编写定时业务。

(8)、登陆注册模块

在注册页,学生填写身份信息、UID及学号(外校用户可选填,系统自动分配)。系统对手机号、密码、邮箱格式进行基础校验,并发送邮箱验证码至Redis。验证成功后完成注册,返回token并跳转首页。

在登录页,学生输入用户名和密码,系统将密码转为MD5格式并与数据库比对。验证成功则返回token并跳转首页,失败则提示重新输入。

(9)、 证件识别模块

证件识别模块通过摄像头拍摄学生证件,并使用SDK进行比对,帮助老师在线验证证件真伪。模块将图片上传至第三方服务进行对比,若匹配度达到设定比例,则验证通过;否则提示教师检查相关学生。

(10)、 讨论模块

讨论模块是实现用户间交流学习的模块,方便学生将内容在讨论模块中进行提出,其他用户进行解答或讨论的设计。针对讨论的发言,采用第三方的服务进行检测用户发送的内容中是否包含不合法的内容。

(三)数据库设计

1.数据库总体结构

云平台在线考试系统使用mysql作为持久化数据支持,redis作为系统缓存。Redis存储数据为快速存取修改的少量数据和永久或半永久行的大量数据。而mysql作为持久化数据库使用,缓存与数据库的同步遵循双删策略,保证缓存内容与数据库内容一致。

2.数据表详细设计

为提高查询效率,避免父子表和外键关系,数据整合至单表,通过type字段区分题目类型。使用工厂模式构建对象,避免复杂连表查询。所有表含type字段用于逻辑删除,保护索引树。索引采用B+树,数据库使用InnoDB引擎,默认事务确保并发安全。

(1)problem_info问题表

问题表保存所有题目信息,通过工厂模式处理以避免连表查询。create_id设为索引,用于查询特定老师创建的题目:

Select * from problem_info where create_id = ? and status = 1

(2)problem_submit_log提交记录表

提交记录表查询用户提交记录,并作为判题业务对象,保存用户代码。表中建立user_id和problem_id的联合索引,以及user_id的普通索引,用于:

Select * from problem_submit_log where user_id = ? and problem_id = ? and status = 1

(3)problem_result结果表

结果表保存用户做题结果,更新时间自动更新。表中建立user_id单字段索引,以及user_id、success_number、is_success的联合索引,用于:

Select * from problem_result where user_id = ? and status = 1

Select user_id,is_success,success_number from problem_result where user_id = ? and is_success = 1 and status = 1

联合索引用于覆盖索引,避免回表操作。

(四)系统实现

1.用户注册流程设计

用户注册需填信息,系统校验邮箱、电话、密码格式。通过邮箱判断是否已注册,未输入统一uid则分配。用户点击发送验证码后,系统向邮箱发送验证码。注册时验证码防攻击,验证成功返回token并跳转首页。密码使用MD5加密保障安全。

2. 编程题判断流程设计

用户在指定区域编写代码,不可修改预设函数,否则会编译出错。系统根据语言合并代码与教师用例,提交前进行校验并过滤不合规内容以确保符合要求。

3. 选择及填空题判断流程设计

用户进入选择题界面,系统展示题目和选项,用户选择后提交。系统将题目和答案发送到后端,OJ核心系统比对数据库结果,若为空则结果错误,反之正确。填空题用户按要求以"##"分割答案,提交后OJ核心系统分割比对,若有不匹配则返回错误,全对则返回正确。

四、项目总结

本文介绍了一种提高大学生知识内化效率的解决方案,设计了一个云平台在线考试系统。系统采用Spring Boot和Dubbo架构提升性能,前端使用Vue框架,容器化部署确保服务隔离。学生端提供编程题、选择题、填空题答题功能,查看排行榜和统计;教师端支持创建题目、分配任务、查看进度,辅助教学管理。系统虽已具备上线能力,但需优化信息反馈、统计结果、智能化出题和考试流程,部分页面也需美化及流程改进。

参考文献:

[1]徐燕萍.基于OJ的程序设计类课程实验混合教学模式研究[J].软件导刊,2022,21(02).5-15

[2]马倩,李伟达,程凤林.基于OJ平台的《程序设计基础》实践教学方法[J].科技创新导报,2019,16(22):10-15.

[3]侯帅,张立立.基于云课堂及OJ系统的编程语言实验课程教学改革探索与实践[J].电子世界,2018(22):1-5.

[4]刘刚.“互联网+”环境下程序设计类课程赛课结合教学模式的改革与实践[J].吉林省教育学院学报,2021,37(07):6-8.

[5]时慧琨.结合OJ及竞赛的算法设计与分析课程教学实践[J].电脑知识与技术,2021,17(10):149-151.

[6]刘勇,田凯,周晓琳.以OJ系统和学科竞赛为核心的程序设计实践教学[J].高教学刊,2021(06):28-31.

[7]余腊生,任炬.基于SSH三层架构的OJ系统研究与设计[J].电脑知识与技术,2008(26):1698-1701.

[8]潘皎. C语言程序自动评测系统的设计与实现[D].黑龙江大学硕士学位论文,2012.

[9]陈卓艳,仇丽青.基于在线开放课程+OJ的程序设计类课程教学模式探索与实践[J].软件,2020,41(04):282-285.

[10]孔钦,叶长青,吴淳阳.OJ平台在程序设计中的应用分析与实现[J].软件导刊,2020,19(01):172-175.

[11]闫晓琪,方若宇,吉顺如,李渊.基于python的在线评测系统的设计[J].轻工科技,2016,32(10):65-66.

[12]王金鹏,曹旗磊,王涵.基于Online Judge的程序设计基础教学改革与实践[J].计算机教育,2020(02):101-104.

[13]黄洪波. 大规模编程题在线评判技术研究[D].华南农业大学硕士学位论文,2016.10-15.

[14]陈鹏. 在线评判系统的设计和实现[D].东南大学硕士学位论文,2015.23-28.

[15]李荣荣,岳佳琪,崔美娜.基于代码评判技术的程序设计语言在线学习系统的设计[J].电子制作,2015(10):91.

[16]李香云,葛华.基于JSP的《C语言》作业在线提交批改系统设计与实现[J].安徽科技学院学报,2013,27(02):76-80.

[17]吴慧玲,武书彦.基于Moodel和程序在线评判的C语言教学资源平台建设[J].现代计算机,2013(10):40-42.

[18]余颖,李晓昀,欧阳纯萍.一种SSH框架的在线程序自动评判系统的设计与实现[J].南华大学学报(自然科学版),2012,26(04):65-68.

[19]乔少杰,杨燕,葛永明,张翠芳,戴齐.基于B/S架构的多用户在线程序评判系统设计与实现[J].计算机工程与科学,2011,33(S1):58-61.

[20]刘鑫标.基于B/S架构及Linux系统的ACM竞赛在线评判系统[J].福建电脑,2010,26(11):151-152.