基于Redis的高校选课系统的设计与实现_第1页
基于Redis的高校选课系统的设计与实现_第2页
基于Redis的高校选课系统的设计与实现_第3页
基于Redis的高校选课系统的设计与实现_第4页
基于Redis的高校选课系统的设计与实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章绪论1.1课题背景及意义随着互联网的普及越来越快,学生选课工作已经从人工手动选课的方式到线上自主选择的方式的转变。但随着选课使用人数的增多,就避免不了高并发选课造成的数据库存储上限的瓶颈、服务器宕机的情况。在学生选课过程中,尤其是热点课程和大量学生都感兴趣的课程,业务类型已经由传统的选课流程变成了对课程剩余库存的秒杀过程。学生选课请求发起后,等待服务器的漫长响应,甚至服务器宕机需要重新选课,已成为众多学生不得不接受的无奈现实。本课题主要运用Redis技术,结合其他适用的高并发的技术,并考虑自身业务特点构建自己的基于Redis的选课系统。本课题调查研究了某高校教务系统选课模块,发现仍存在学生选课高峰期服务器宕机,安全功能不到位等情况,并对这些问题发起挑战。本课题主要以调研学生、老师、管理者的实际需求进行系统业务功能设计,并结合当前各大门户、电商、社交媒体平台等网站的系统部署方案,构建自己的高校教务系统,解决学生选课高并发情况下造成的数据库和存储上限的瓶颈、网络拥堵、漫长响应的情况,通过解决这些问题来设计实现一个优良的选课系统,从而给学生带来一个更好的体验的同时,保障教学工作能够正常、顺利的进行。1.2国内外现状及发展选课制度起源于19世纪德国的柏林大学,此校的首任校长著名哲学家J·G·费希特提议大学中需要各学派共存和竞争自由,学生能够结合各自的爱好选修学习的课程,选择课程研究的方向,在导师的引领各自在科研领域[12]。国外的计算机水平发展的比较快,因此在教学信息化方面研究比较深入,且经过多年的发展,已经形成了比较完善、成熟的选课体系。国外的选课系统大多数是基于C/S结构和B/S结构两者结合进行开发的,两者结合能使教学工作有序的进行,能提高教学的效率。多年的不断改进、迭代,使得这种模式在国外的高校中的规模逐渐扩大,系统功能基本完善、平台运行十分稳定,此外也在逐渐利用分布式系统进行性能提升和系统间整合。国内高校的信息化建设虽然起步较晚,但经过多年的努力和发展获得了巨大的进步。伴随着高校信息化进程的推进,计算机技术介入到了校园业务的方方面面,其中选课工作也逐渐完成从落后的人工安排课程计划,到学分制中学生自主选课再到线上实时自主选课的改造。我国的学生选课系统大多数是基于B/S模式进行开发,能使系统的开发周期大大的缩减,系统的易用性的得到了,用户可在任意地点操作系统。但随着我国教学水平的不断提高,学生人数在逐年增多,传统的选课系统已经不能满足教学需求,学生选课已经由传统的“选课”操作转变为“抢课”操作,大量的并发请求操作已经成为一个巨大挑战。1.3论文主要研究内容本文的主要研究内容是开发一个能满足某高校选课并发量的选课系统,具体的研究内容如下:1.研究国内外的选课系统,对它们的业务流程进行了解,总结出系统的主要功能模块为:课程管理、学生选课管理、选课信息管理等;通过结合时代的发展,使用B/S架构的设计模式,能使系统更具有易用性,使用更便捷。2.通过研究选课系统的可行性,考虑系统的需求以及建设方向和目标,使用SpringBoot框架来完成系统的开发,它的自动装配能快速的搭建系统环境,加快开发速度,再通使用Redis来提高系统的性能,并对系统的具体功能的设计进行介绍。3.结合实际的调研与分析,设计系统的各个功能模块,除了设计系统的文字表述,还要使用对应的时序图、类图、用例图等进行描述,以此来保证系统是可靠、稳定的,学生在选课过程中能稳定的运行,给用户提供良好的体验。4.实现选课系统的基本功能,并对系统的学生选课管理模块进行测试,研究系统测试实际结果、性能等,并对系统的未来发展方向做出展望。1.4论文组织结构本论文的组织结构如下:第一章:绪论。本章主要描述了课题的背景意义,而后介绍了选课系统在国内外的现状,最后得出课题的研究内容和目标。第二章:系统相关技术介绍。对系统使用到的相关技术进行了介绍,并简单描述使用这些技术的知识依据是课题的技术核心。第三章:系统需求分析。本章先对系统的可行性进行分析,接着分析系统角色,最后介绍系统的功能性需求和非功能性需求。第四章:系统总体设计。本章先给出系统总体设计的思路,根据给出的思路对系统的总体架构进行设计,而后设计系统的功能结构,最后根据系统的总体架构和功能结构设计出系统的关系数据库。第五章:系统详细设计与实现。本章是系统主要功能的实现,介绍系统的主要功能以及具体功能实现,主要针对学生选课模块实现的详细介绍,解决选课系统的选课时间过长、高并发等问题。第六章:系统测试。本章主要介绍系统的功能测试和性能测试,展示具体的测试结果以及测试过程。第七章:总结与展望。本章是对本课题的全部工作进行总结,结合系统指出系统功能的不足,最后对未来的工作进行展望。

第二章系统相关技术介绍2.1B/S结构介绍B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起而对C/S结构的一种变化或者改进的结构。使用这种结构,用户与系统进行交互都是在浏览器上进行的,不需要额外的安装指定的客户端。使用B/S结构能大大降低系统开发和维护的成本,降低电脑硬件的压力,工作量相对于客户端而言也极大减少,加快系统的开发速度,其原因在于系统的主要逻辑处理在服务端器(Server)进行,只有极少的逻辑处理在浏览器端(Browser)执行。对比C/S(Client/Server)结构即客户端和服务器结构,C/S结构需要在计算机安装客户端才能与服务端进行交互,且在对系统进行更新维护是,所需的成本更高、效率更低。本文实现选课系统使用的是B/S结构,这能使系统更快速的进行开发,用户使用系统也能更便捷,能在各个地方使用操作系统。2.2前端技术介绍Layui是一款很不错的国产前端UI框架,它入门的门槛低,拿来即用,易上手,还是一款轻量级的前端UI框架。Layui主要是面向后端开发者,它的组件非常丰富,还不需要做前端复杂的配置,因此它能让开发者能更快的实现界面开发工作,也能让开发者能更快的整合前端和后端,实现项目编写。Layui的使用也很简单轻便,定义了很多底层方法,如全局配置、自定义模块、加载模块、本地存储等,想要调用这些模块只需要执行这些方法即可。2.3后端技术介绍2.3.1SpringBoot介绍SpringBoot是基于Spring推出的全新框架,其设计的目的是为了简化Spring配置,让开发者能够轻松、快速的构建独立运行的项目,大大的提升开发效率。SpringBoot能够极大的提升开发者的体验,主要是在开发中大量的使用“约定大于配置”的思想来减少许多复杂的手动配置,并提供了许多组件,且直接内嵌了web服务器,让开发者更加专注业务逻辑的实现,无需过多的关注框架本身。SpringBoot能让开发者无需做过多的配置工作,关键在于它的自动配置,SpringBoot自动配置有三个核心注解,分别是配置类、自动配置功能和组件包扫描器,能自动将配置类注册到IOC容器,减少代码冗余度,从而实现快速开发。2.3.2MyBatis介绍MyBatis是一个持久层框架,主要功能是数据持久化操作。MyBatis支持持久化SQL、存储过程和高级映射。MyBatis底层几乎将JDBC的所有操作封装了起来,也进行了解耦合,大大降低了代码冗余度,提高了开发效率。MyBatis框架也是一个ORM(对象关系映射)框架,主要用来解决面向对象与关系型数据库中数据类型不匹配的问题,它的工作原理则是使程序不直接访问数据库,而是以面向对象的方式自动持久化到关系型数据库中。具体工作原理如图2-1所示。图2-1工作原理2.4Redis缓存数据库介绍Redis是BSD许可的一个开源软件,内存中的数据结构存储系统,它可以用作数据库、也可以作为缓存或者消息中间件。Redis的数据存取非常快,虽说他是单线程的,但它的存值操作可执行110000次每秒,读取操作可执行81000次每秒,原因在于它的请求操作几乎是基于内存来实现的。数据结构以及数据操作非常简单,且使用单线程速度非常快,原因在于它减少了不必要的上下文切换的竞争,多线程的切换也不消耗CPU性能。Redis是一个高性能的NoSQL数据库,也被称为数据结构服务器,能持久化的保存数据,主要使用了两种持久化方式,一种是使用RDB方式来实现,将数据写入临时文件,而后替换之前的临时文件,再用二进制进行存储;另一种是使用AOF方式来实现,主要是以日志的形式一点一点的将数据记录起来后再进行持久化,而不是一下子将所有数据进行持久化。Redis是以键值对(key/value)的方式进行数据存取,且支持丰富的数据类型存储,例如存取字符串(String)、列表(list)、集合(sets)、哈希(hash)和有序集合(sortedset)。Redis的所有操作是原子性的,对于客户端的并发访问,Redis服务端都能进行处理。2.5RabbitMQ介绍RabbitMQ是基于AMQP协议实现的,是一个高级消息队列协议。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ使用的是Erlang语言进行开发,Erlang语言是用来处理高并发的编程语言,且具有高可用的特性,因此很适合应用于高并发场景。RabbitMQ还能对数据进行持久化,可以将需要持久化的信息写入磁盘上的持久化日志文件,待消费完成后RabbitMQ会将信息进行垃圾回收,但缺点是容易造成性能降低。RabbitMQ消息中间件能解决许多难题,如应用解耦、异步处理、流量削峰、分布式事务管理等问题,使用消息中间件可开发出一个高性能、高可用、易扩展的系统。RabbitMQ还是一个第三方消息代理的消息中间件,用于接收发送者发布的信息以及消费者推送信息,具体工作过程如图2-2。图2-2RabbitMQ工作过程由图可看出消息由消息发布者发送消息,交换机将消息传递并存储到绑定(Bingding)的消息队列中,最后通过网络连接(Connection)与消息中间件进行连接,消息消费者在连接内使用了多路复用的信道(Channel)接收信息。2.6本章小结本章对选课系统所用到的技术进行了介绍,先介绍B/S结构的特点以及使用这种设计结构的优势,前端简单介绍了Layui框架,后端介绍了SpringBoot框架的特点和MyBatis框架的工作原理,而后介绍了Redis的缓存数据库的特点、优点以及数据缓存的实现,最后则是对RabbitMQ中间件进行介绍,介绍它的概念和特征,以及消息中间件的工作过程。

第三章系统需求分析本章主要从选课系统的功能性需求和非功能性需求展开分析和讨论,分析Redis数据缓存在选课系统中需实现的功能,并根据分析给出系统的总体设计方案。3.1系统可行性分析3.1.1技术可行性随着社会的不断发展,高校的信息化建设越来越快,高校选课系统已经由传统的选课演变为抢课,而关系型数据库处理数据的能力比较有限,如果还是采用传统的数据库对数据进行处理,过大的并发量容易造成系统处理能力下降的问题,所以系统的高并发请求是对系统的稳定、性能发出巨大挑战。为解决这个问题,对于主要的业务功能,采用Redis缓存数据库来处理高并发问题,Redis的读写能力非常快,读的速度是110000次/s,写的速度是81000次/s,对于高并发下造成的关系型数据库处理能力下降,系统的稳定性、系统性能得到很好地提升,足够满足学生选课的需求。3.1.2经济可行性选课系统的主要使用用户为教务处、教师和学生,用于高校进行学生选课任务,提高学校的教学效率。项目的开发周期大约在一个半月左右,系统开发成本主要在系统软件的开发,在系统投入运行后,大大节约了人力物力,所以项目在经济上是可行的。3.1.3操作可行性系统界面简洁明了,美观大方,操作简单,用起来易上手,满足用户的基本需求,是社会的发展趋势,所以系统在操作上是可行的。3.2系统角色分析系统角色分析主要是对系统所有角色信息进行分析,主要角色有管理员、教务处、教师、学生,通过对系统的分析可得出教务处是基本信息管理、课程管理、数据统计的主要参与者;教师是导出学生选课名单的主要参与者;学生是学生选课、查看选课信息的主要参与者,具体分析如下:(1)教务处。教务处可以对二级学院管理、教师管理、学生管理、开设课程管理、开放选课、数据统计等进行一系列的操作。(2)教师。教师可以查看授课的课程列表,可以查看具体一门授课课程的学生列表,也可以导出具体一门课程选择这门课程的学生名单。(3)学生。学生是系统的主要角色,可以进行学生选课操作,也可以查看选课信息,对课程进行退选等相关操作。3.3功能性需求性分析本文通过对高校的调研与分析确定出系统分为五大功能模块,分别是基本信息管理模块、课程管理模块、学生选课模块、选课信息模块、数据统计模块,其中学生选课模块是最主要的功能模块,具体的功能需求如表3-1所示:表3-1系统功能列表系统模块功能点功能描述基本信息管理个人信息管理用于教师和学生修改、查看自己的个人信息二级学院管理对二级学院、教务处、教师、学生的管理,包括信息的修改、删除、添加、查看操作教务处管理教师管理学生管理课程管理开设课程对课程的管理,包括删除、修改、添加、查询详情等开放选课时间对学生选课时间进行开设,设计学生选课时间的开始和结束学生选课管理学生选课可查看课程列表,勾选课程并提交选课信息管理学生选课情况查询学生可查已选课程,也可对课程进行退课操作教师导出学生选课名单教师可查看自己授课的课程,也可查看具体一门课程选择本门课程的学生信息,并导出学生信息到excel表数据统计学时学分统计教务处可查看学时和学分段各有多少课程统计教务处可查看每个二级学院开设多少门课程3.3.1课程管理分析课程管理模块的主要操作者为教务处,模块主要包括开设课程、开放选课时间功能,教务处开设课程可对课程信息的二级学院、授课教师、学时、学分和课程库存进行增删改查;开放选课时间还可对选课时间段进行开放,学生只有在开放选课时间段内才能进行选课操作。课程管理模块用例图如图3-1所示。图3-1课程管理模块用例图3.3.2学生选课管理分析学生选课管理是系统的主要模块,主要操作者为学生,学生在未到选课时间只能查看课程列表,选课开放内学生课进行选课操作,系统并对选课操作进行一系列的校验。学生选课管理模块用例图如图3-2所示。图3-2学生选课管理模块用例图3.3.3选课信息管理分析选课信息管理模块的主要操作者是学生和教师,其中选课情况查询是学生查看已选择的课程列表信息,还可选择课程进行退课,点击退课选线可对课程退选;教师可进行导出学生列表操作,教师进入课程列表页面查看授课课程,可选择某一门课程进入查看选择本门课程的学生,可选择导出选项即可导出学生所有信息,系统将学生信息导出到excel表。选课信息管理模块用例图如图3-3所示。图3-3选课信息管理模块用例图3.3.4系统统计功能分析系统统计的主要操作者是教务处,包含学时学分统计和课程统计,教务处可以操作这两个功能,学时学分统计的课程学分统计可以统计查看每个学分段所拥有的课程数量,课程学时统计可以统计查看每个学时所拥有的的课程数量;课程统计则是统计查看各二级学院开设的课程数量。系统统计模块用例图如图3-4所示。图3-4系统统计模块用例图3.4非功能性需求分析非功能性需求分析也是系统分析的重要环节,是系统能否正常运行,是否满足需求的重要保障。因此,系统界面设计应有简洁性、易用性以及系统的安全性和易维护性。对于系统的简洁性,界面要做到内容简练,能够做到立足全局,抓住特征,正确反映整体;系统的易用性要使系统界面操作简单明了易上手,内容通俗易懂,能让用户觉得很好用,很顺手;系统的安全性要能够保证用户的信息能实时防护,对用户登录密码进行加密处理,还能够对用户进行身份认证及请求拦截,为系统的安全提供保障。系统的可维护性要求系统代码编写按规范文档编写,使用封装将经常使用的代码进行封装,减少代码冗余,实现系统代码的复用性,便于系统的维护。3.5本章小结本章首先介绍了系统的可行性分析,分析系统在各方面上是否可行的,然后对系统角色、功能性和非功能性展开系统需求分析,讨论系统设计的大致方向以及实现效果,描述系统的雏形,得出系统的主要功能模块设计,最后根据需求分析来对系统进行总体设计。

第四章系统总体设计本章主要对选课系统的功能模块进行设计,包括系统总体设计思路、系统总体结构设计、系统功能模块设计以及关系数据库设计。4.1系统总体设计思路学生选课系统总体采用的是B/S(浏览器/服务器)架构模式。用户通过使用PC端对服务器进行访问,通过服务器获取后台数据库的数据,也可以对数据库数据进行操作,主要操作PC端所展示的页面功能。系统采用MySQL关系型数据库服务器,保证数据的唯一性、持久性、一致性等。系统物理架构图如4-1所示。图4-1系统物理架构图4.2系统总体架构设计系统的总体架构设计相当一个工程的施工方向,一个设计严谨的总体架构,能让系统的实现更加快速、思路更加清晰,还能使系统更好的进行开发。本课题是以java语言为基础,软件工程理论为指导,以SpringBoot为主要开发框架的B/S结构系统开发。SpringBoot框架作为现在最流行的框架之一,是因为它是一个快速整合第三方框架,简化xml,内置Http服务器也就是之前所用Tomcat服务器。系统前端是使用Layui前端框架,能使系统开发进度加快,页面开起来更简洁。系统开发工具使用IDEA进行开发,数据库使用MySQL关系型数据库,并使用Redis缓存对热门数据进行存储,从而减少数据库压力。系统采用的设计模式是MVC架构,可将系统实现划分为四层:视图层、控制层、业务层、数据持久层。下面对具体介绍系统的四层划分:1.视图层视图层是用来将数据展示给用户并用于系统与用户的交互操作。系统使用的是html结构Layui的界面容器向用户展示数据,也使系统更简洁明了。2.控制层控制层是前端与后台交互的入口,前端可以通过请求控制层自定义的接口实现数据的前后端交互,也可以调用业务层对应的方法将数据传给业务层。3.业务层业务层是对数据进行逻辑处理的地方,主要用来处理系统主要的业务逻辑,并与数据访问层和控制层交互。4.数据持久层数据持久层是一个代码类库,提供访问位于持久化容器中数据的功能,本系统采用的数据持久层框架是Mybatis框架,可以对数据库数据进行操作。系统的总体架构设计图如图4-2所示。图4-2系统总体设计图4.3系统功能结构设计通过系统的需求分析可以知道,系统的使用角色有管理员、教务处、教师和学生四种角色,基于Redis的高校选课系统通过系统分析出主要功能划分为五个大功能子模块,分别为用户登录子模块、基本信息管理子模块、课程管理子模块、学生选课子模块和数据统计子模块,除了五大功能子模块,还细分了许多小模块。学生选课系统功能结构图如图4-3所示。图4-3学生选课系统功能结构图(1)基本信息管理模块的主要功能有用户个人信息管理、教务处列表、教师列表、二级学院列表、学生列表的增删改查功能。管理员可以管理此模块的教务处列表进行增删改查工作;教务处可以管理此模块的教师列表、二级学院列表和学生列表进行增删改查工作;教师和学生可以操作个人信息管理并修改个人密码。(2)课程管理模块的主要功能模块有开设课程和开放课程时间管理,教务处可以管理此模块的开设课程的增删改查,对开设本门课程的授课教师进行任命,并设置本门课程库存数量;教务处还可以管理开放课程时间,选择开放学生选课的起始时间,只有在选课时间内才能看到课程列表进行选课。(3)学生选课模块是系统的主要功能,学生可以进行操作,学生可以查看课程信息,查看课程库存数量,在选课时间段内进行选课,学生可以多选但不能重复选课,课程库存不足不能选课。(4)选课信息管理模块的主要功能模块有学生选课情况查询和教师导出学生选课名单,学生可以管理学生选课情况查询,查看学生本人已选择的课程,还可以对选错或者不想选修的课程进行退课;教师可以管理教师导出学生选课名单,教师可以查看自己授课具体哪一门课程的学生选课名单,并可以将学生选择本门课程的学生信息导出到excel表格;(5)系统统计模块的主要功能模块有学时学分统计和课程统计,管理员和教务处都可以操作这两个功能,学时学分统计的课程学分统计可以统计查看每个学分段所拥有的课程数量,课程学时统计可以统计查看每个学时所拥有的的课程数量;课程统计则是统计查看各二级学院开设的课程数量。4.4关系数据库设计模块由于计算机非常擅长处理大量的数据,作为独立的实用程序或者其他应用的一部分,数据库管理系统在计算中扮演着非常核心的角色。本系统采用的数据库是MySQL关系型数据库,通过对数据库的增删改查进行业务扩展,一个优良的数据库结构设计影响了系统的实现效果和系统应用效率。4.4.1数据库概念结构设计根据前面需求分析得出系统实体,实体的具体属性如下:1.用户:用户账号(学号、工号)、用户姓名、密码、权限id、权限;2.教务处:教务处编号、教务处名称、电话;3.二级学院:二级部门id、二级部门名称;4.教师:教师工号、教师姓名、教师职称、所属二级学院、电话;5.学生:学生学号、学生姓名、所属二级学院、专业、班级、年级;6.课程:课程编号、课程名称、教师工号、课程属性、所属二级学院、课程学时、课程学分、课程库存数量;7.学生选课信息:选课编号、课程编号、学生学号;8.开设课程时间:学生选课开始时间、学生选课结束时间;教务处可开设多门课程,与课程是一对多的关系;一个学生可以选择多门课程,一门课程也可被多个学生选择,两者之间的关系是多对多关系;教师可以授课多门课程,与课程的关系是一对多的关系;一门课程只能从属一个二级学院,一个二级学院可以有多门课程,两者之间的关系是一对多关系。通过总体的E-R可以更加直观的看出各不同实体之间的关联。高校选课系统总体E-R图如图4-4所示。图4-4系统总体E-R图4.4.2数据库表设计本小结主要说明系统中数据表的设计结构,根据数据库概念结构设计得的实体类属性,可将此转化为数据结构模型。表4-1为数据结构说明。表4-1数据结构说明数据库表名称功能说明用户信息表(sys_user)保存用户登录的信息教务处信息表(sys_dean)保存教务处的基本信息二级学院表(sys_department)保存二级学院的基本信息教师表(sys_teacher)保存教师的基本信息学生表(sys_student)保存学生的基本信息学生选课信息表(sys_course_selection)保存学生所选课程的基本信息1.用户信息表用户信息如表4-2所示。表4-2用户信息表(sys_user)序号代码字段名称类型字段长度可否为空主键1IdIdint否是2user_id用户账号varchar50是否3user_name用户名称varchar30是否4password密码varchar255是否5authority权限varchar20是否2.教务处信息表教务处信息如表4-3所示。表4-3教务处信息表(sys_dean)序号代码字段名称类型字段长度可否为空主键外码1IdIdint否是否2dean_id教务处编号varchar50是否是3dean_name教务处名称varchar30是否否4dean_tel教务处电话varchar11是否否3.二级学院信息表二级学院信息如表4-4所示。表4-4二级学院信息表(sys_department)序号代码字段名称类型字段长度可否为空主键外码1IdIdint否是否2dep_id二级学院编号varchar50是否是3dep_name二级学院名称varchar30是否否4.教师信息表教师信息如表4-5所示。表4-5教师信息表(sys_teacher)序号代码字段名称类型字段长度可否为空主键外码1IdIdint否是否2teacher_id教师工号varchar50是否否3teacher_name教师名称varchar30是否否4teacher_title教师职称varchar30是否否5dep_id所属二级学院varchar50是否是6telephone教师电话varchar11是否否5.学生信息表学生信息如表4-6所示。表4-6学生信息表(sys_student)序号代码字段名称类型字段长度可否为空主键外码1IdIdint否是否2student_id学生学号varchar50是否否3student_name学生名称varchar30是否否4dep_id所属二级学院varchar50是否是5major专业varchar30是否否6class_name班级名称varchar30是否否7grade年级varchar30是否否6.课程信息表课程信息如表4-7所示。表4-7课程信息表(sys_course)序号代码字段名称类型字段长度小数点可否为空主键外码1IdIdint0否是否2course_id课程编号varchar500是否否3course_name课程名称varchar300是否否4teacher_id教师工号varchar500是否是5course_attribute课程属性varchar200是否否6dep_id所属二级学院varchar500是否是7hours课程学时varchar101是否否8credit课程学分float100是否否9limit_number课程库存int100是否否7.学生选课信息表学生选课信息如表4-8所示。表4-8学生选课信息表(sys_course_selection)序号代码字段名称类型字段长度可否为空主键外码1IdIdint否是否2sel_corse_id学生选课编号varchar50是否否3course_id课程编号varchar50是否是4stu_id学生学号varchar50是否是4.5本章小结本章内容为网上选课系统设计,首先对系统总体架构进行设计,而后则是对系统功能结构进行设计,最后则是结合系统架构设计实现系统的功能模块以及给出流程时序图介绍模块,本章末尾介绍了数据库的设计,分别给出了系统的实体类,并通过实体类设计出系统的数据库表,对各数据库表的功能进行了说明。

第五章系统详细设计与实现本章围绕网上选课系统的需求分析及系统设计展开,依据这些业务需求及具体实现系统的功能,重点讲述选课系统的课程管理模块、选课管理模块以及教师导出学生名单。5.1课程管理模块的实现5.1.1开设课程课程管理模块是系统的重要功能之一,教务处可以管理课程的增删改查,对课程进行开设修改。具体的流程分析如下所示:1.教务处点在系统页面点击开设课程列表链接进入课程列表显示页面,点击添加按钮,系统弹出开设课程弹窗,填写相关信息,系统会判断课程编号是否重复,完成开设课程;2.教务处可以对课程选课时间进行开放,设置选课的起始和结束时间,在时间段内可以进行选课,其他时间不能选课;图5-1课程管理模块流程图图5-2课程列表5.1.2开放选课时间课程管理模块是系统必不可少的一部分,是学生能否正常进行选课的前提。实现课程管理模块需要先分别建立开设课程、开放选课时间的相应controller类,去调用service层的对应方法,最后Dao层继承MyBatis的接口类来对数据库进行操作。具体设计实现步骤如下:1.在entity层新建实体类,用于存放数据库基本字段数据,并建立get()、set()方法;2.在resources资源目录下的mapper包下新建xml文件,用来存放数据库语句;3.新建Mapper接口,声明各种接口方法可以映射到对应的xml文件;4.新建Service接口,在接口内编写开设课程、开发选课时间对应操作的方法;5.新建ServiceImpl实现类,实现Service接口内对应的方法;6.新建Controller控制类,用于实现的调用Service层的方法,与前端界面进行交互;7.新建html文件,用于展示后台数据并通过URL的方式对后台发起请求获取数据,实现前后端交互。该模块的相关类图如图5-3所示。图5-3课程管理模块类图课程管理模块的开放选课时间为重点实现代码,具体实现是通过选择起始时间,系统将数据存入数据库和Redis缓存,在需要时只用从Redis获取,具体实现代码如下://开放选课先删除redis存入的时间redisTemplate.delete("startDate");redisTemplate.delete("endDate");//将开始时间存入redisredisTemplate.opsForValue().set("startDate",opentime.getStartDate());//将结束时间存入redisredisTemplate.opsForValue().set("endDate",opentime.getEndDate());系统实现效果如图5-4所示:图5-4开放选课时间实现图前端可以获取课程起始时间来实现倒计时效果,提示学生选课开始的具体时间,具体实现代码如下;$(function(){countDown();countDownEnd();});//选课开始倒计时functioncountDown(){//获取隐藏input框的valuevarremainSeconds=$("#remainSeconds").val();vartimeout;if(remainSeconds>0){//选课未开始时按钮隐藏$("#toSelectButton").attr("style","display:none;");timeout=setTimeout(function(){$("#countDown").text(remainSeconds-1);$("#remainSeconds").val(remainSeconds-1);countDown();},1000);}elseif(remainSeconds==0){//选课开始时按钮显示$("#toSelectButton").attr("style","display:block;");if(timeout){clearTimeout(timeout);}$("#courseTip").html("选课进行中..");}else{//选课结束时按钮隐藏$("#toSelectButton").attr("style","display:none;");$("#courseTip").html("选课已结束");}}; 系统实现效果如图5-5所示:图5-5选课倒计时实现图5.2学生选课模块的实现本系统的最主要功能为学生选课,学生只有在选课时间段内才可以进行选择,系统显示课程名称、教师名称以及课程库存等,学生可以选择有库存的课程,学生选课成功后会提示选课成功,已经选过这门课程会提示课程已选择,库存不足学生继续选课会提示课程库存不足。学生选课模块流程图如图5-6所示。图5-6学生选课模块流程图系统的功能重点在学生选课上,主要使用Redis进行开发,系统启动时,会自动初始化查询数据库课程库库存,然后将查询到的库存存入Redis,学生访问课程选课列表,使用同步代码块先从数据库获取一次数据存入Redis进行缓存,后续的数据请求都会从Redis获取课程列表信息,从而减少对Mysql数据库的访问,降低数据库的访问压力。具体代码如下。CourseSelectionController.java@OverridepublicvoidafterPropertiesSet()throwsException{//系统初始化,启动项目时把课程库存数量加载到redisList<Course>list=courseService.findCourse();if(CollectionUtils.isEmpty(list)){return;}list.forEach(course->{redisTemplate.opsForValue().set("course:"+course.getCourseId(),course.getLimitNumber());//将课程编号标记为false,如果有课程编号,返回false,没有返回trueemptyStockMap.put(course.getCourseId(),false);});}学生进行选课过程中,会先判断课程库存是否足够,这里的库存判断使用的是系统内存标记,适当减少Redis的访问;当课程足够则继续判断学生是否重复抢课,系统会通过自定义的key从Redis获取当前选课的学生进行是否选课的判断,查询到的自定义的key则说明当前学生已选课,这里的Redis的key是通过自主命名加上学生学号作为唯一的标识;选课成功后则是进行预减库存,预减库存是先从Redis数据库预减课程库存,而后再预减数据库的课程库存。具体代码如下。CourseSelectionController.javafor(inti=0;i<courseIds.length;i++){//内存标记,减少redis访问,判断课程库存是否足够,没有课程编号则返回trueif(emptyStockMap.get(courseIds[i])){returnRespBean.error(RespBeanEnum.EMPTY_STOCK);}//判断是否重复选课,从redis读取SelectionMessageselectionMessage1=(SelectionMessage)redisTemplate.opsForValue().get("courseSelection:"+courseIds[i]+":"+principal.getUsername());if(selectionMessage1!=null){returnRespBean.error(RespBeanEnum.REPEATE_ERROR);}//同步代码块synchronized(this.getClass()){//redis预减库存Longstock=redisTemplate.opsForValue().decrement("course:"+courseIds[i]);if(stock<0){emptyStockMap.put(courseIds[i],true);//预减库存超过0为-1时,redis预增库存redisTemplate.opsForValue().increment("course:"+courseIds[i]);returnRespBean.error(RespBeanEnum.EMPTY_STOCK);}//数据库预减库存Coursecourse=courseService.findCourseBycourseId(courseIds[i]);course.setLimitNumber(course.getLimitNumber()-1);courseSelectionMapper.updateCourseLimitNumber(course);}CourseSelectionServiceImpl.java@OverridepublicintaddCourseSelection(SelectionMessageselectionMessage){courseSelectionMapper.addCourseSelection(selectionMessage);//选课成功后存入redis中redisTemplate.opsForValue().set("courseSelection:"+selectionMessage.getCourseId()+":"+selectionMessage.getStuId(),selectionMessage);return0;}最后将选课数据写入Redis缓存和数据库,写入数据库使用了RabbitMQ,通过消息发送者将选课数据发送到消息队列,再从消息队列将选课数据异步发送给消息接受者,而后消息接受者将选课数据写入数据库。具体实现代码如下。RabbitMq消息队列入队:CourseSelectionController.java//principal.getUsername()为当前用户的登录编号//消息队列入队SelectionMessageselectionMessage=newSelectionMessage(UUIDUtil.getOrderIdByUUId(),courseIds[i],principal.getUsername());//消息队列可以发送字符串、字节数组、序列化对courseRabbitmqSender.sendCourseMessage(JsonUtil.object2JsonStr(selectionMessage));}returnRespBean.success(0);添加选课信息发送者发送选课数据:CourseRabbitmqSender.java//消息队列可以发送字符串、字节数组、序列化对象rabbitTemplate.convertAndSend(CourseRabbitMQConfig.COURSE_EXCHANGE,CourseRabbitMQConfig.COURSE_ROUNTINGKEY,message);消费者接受消息发送者发送的信息,而后将选课数据存入数据库:CourseRabbitmqReceiver.javaSelectionMessageselectionMessage=JsonUtil.jsonStr2Object(message,SelectionMessage.class);StringselCourseId=selectionMessage.getSelCourseId();StringcourseId=selectionMessage.getCourseId();StringstuId=selectionMessage.getStuId();//判断是否重复选课,从redis读取SelectionMessageselectionMessage1=(SelectionMessage)redisTemplate.opsForValue().get("courseSelection:"+courseId+":"+stuId);if(selectionMessage1!=null){return;}courseSelectionService.addCourseSelection(selectionMessage);学生选课模块的类图如图5-7所示:图5-7学生选课模块的类图通过代码的详细编写,实现了学生选课的功能,实现的界面效果如图5-8所示。图5-8学生选课实现图5.3选课信息管理模块的实现学生选完课可以查看选课信息,查看已选择的课程列表,对于不满意或者不想选学的课程可以进行退课。学生选课信息时序图如图5-9所示。图5-9学生选课信息时序图教师操作导出学生名单功能,点击导出学生名单选项,系统显示教师授课课程列表,教师选择需要导出哪门课程的学生名单,系统显示选择本门课程的所有学生的信息,教师点击导出选项,系统将学生信息导出到Excel表。教师导出学生名单时序图如图5-10所示。图5-10教师导出学生名单时序图选课信息管理模块主要是学生退课操作,学生进行退课是先操作Redis缓存的数据,先对Redis缓存的课程库存进行操作,使用Redis的自增方法对退选一门课程后Redis缓存的课程库存数量加一,而后才是操作数据库的库存进行加一,具体的代码实现如下;StuCourseDetailsServiceImpl.java@Override

publicintDropCourse(StringselCourseId,StringcourseId){

//获取应用上下文

SecurityContextcontext=SecurityContextHolder.getContext();

//获取用户相关信息,获取当前登录人的账号id

Authenticationauthentication=context.getAuthentication();

UserDetailsprincipal=(UserDetails)authentication.getPrincipal();

//选课表学生退选课程后增加库存

Coursecourse=courseMapper.findCourseBycourseId(courseId);

course.setLimitNumber(course.getLimitNumber()+1);

courseSelectionMapper.updateCourseLimitNumber(course);

//退课成功后删除redis中指定的key

redisTemplate.delete("courseSelection:"+courseId+":"+principal.getUsername());

returnstuCourseDetailsMapper.DropCourse(selCourseId,courseId);

} StuCourseDetailsController.java@ResponseBody

@RequestMapping("/todrop")

publicRespBeantoDropCourse(StringselCourseId,StringcourseId){

//redis退课后返还名额,预增库存

redisTemplate.opsForValue().increment("course:"+courseId);

//学生退课

stuCourseDetailsService.DropCourse(selCourseId,courseId);

returnRespBean.success(RespBeanEnum.SUCCESS);

}通过代码的详细编写,实现了学生选课信息的功能,实现的界面效果如图5-11所示。图5-11学生选课信息实现图5.4本章小结本章主要对选课系统的主要功能进行了实现,通过给出系统流程图、时序图进行详细设计,最终得出了具体的实现代码,从而得出系统实现的功能截图,达到了系统设计的目标。

第六章系统测试本章主要实现对选课系统的测试,分别从功能和性能测试系统设定是否满足要求,测试系统是否存在bug,并对测试结果进行分析。6.1测试内容与目的网上选课系统的系统测试内容主要包括系统的功能测试和性能测试,系统的功能测试主要是测试各个功能模块是否正常输入输出,各项流程能否正常执行。系统的性能测试主要是测试系统的并发情况的处理能、系统稳定性等能否满足用户的需求。本系统重点在于学生选课模块,所以主要对这个用例模块进行测试。6.2系统测试环境系统的测试环境通过表格罗列出来,如表6-1所示:表6-1学生选课信息表名称参数配置操作系统Windows10专业版64位操作系统CPU型号Intel(R)Core(TM)i5-7200UCPU@2.50GHz2.71GHz内存配置8.00GB开发环境IntelliJIDEA2021.2软件环境jdk1.8.0_131、MySQLServer5.7客户端浏览器GoogleChrome6.3系统功能测试1.系统用户登录功能测试用例如表6-2所示:表6-2用户登录功能测试用例用例编号TEST-001用例说明用户登录功能测试用例测试目的测试用户登录前置条件用户打开学生选课系统测试步骤1.用户打开学生选课系统登录界面。2.输入正确的账号、密码,是否记住我。3.点击登录按钮。4.系统能根据用户的登录账号查询用户的权限,并显示权限对应的页面。5.系统能够实现记住我功能。期望结果用户登录成功系统能显示出用户所拥有权限对应的界面,在系统重新启动或者关闭页面再重新输入系统地址,选择记住我的用户能不用登录直接进入系统。实际结果用户只能看到自己拥有权限对应的界面,记住我功能生效。2.系统开放课程功能测试用例如表6-3所示:表6-3开放课程功能测试用例用例编号TEST-002用例说明开放课程功能测试用例测试目的测试开放课程功能的增删改查,测试能否自动校验课程编号是否存在前置条件教务处登录进入系统测试步骤1.教务处进入学生选课系统点击“添加课程”选项。2.系统弹出开设课程添加界面。4.教务处输入已经存在的课程编号点击“提交”选项。5.系统提示课程编号已存在。6.教务处依次输入课程编号、课程名称、课程库存等信息并点击“提交”选项。7.系统自动保存信息关闭开设课程弹窗并刷新课程列表。8.教务处点击要删除的课程数据的“删除”选项。9.系统弹出确定弹窗。10.教务处点击“确定”选项。11.系统删除数据并提示删除成功。12.教务处选中要修改的课程数据点击“编辑”选项。13.系统弹出开设课程修改界面并统显示对应的课程数据。14.教务处修改课程数据并点击“提交”选项。15.系统自动将修改的数据保存到数据库,并关闭弹窗刷新课程列表。16.教务处在搜索框输入课程名称进行模糊查询,点击“搜索”选项。17.系统显示查询出来的课程数据列表。期望结果教务处输入已存在的课程编号,系统提示课程编号已存在,教务处对开设课程进行增删改查,系统实现开设课程的曾删改查。实际结果开设课程能实现进行增删改查,系统能自动校验课程编号是否存在。3.系统学生选课功能测试用例如表6-4所示:表6-4学生选课功能测试用例用例编号TEST-003用例说明学生选课功能测试用例测试目的测试学生选课功能能否正常进行选课,测试课程库存不足的课程能否继续选课,测试已选课程能后还否继续选课,测试高并发下是否会造成课程库存超选。前置条件学生登录进入系统测试步骤1.学生勾选课程,可选一门或多门课程后点击“选择课程”选项。2.系统弹出确认框确认是否选择课程。3.学生点击“确定”选项。4.系统弹出提示框提示选课成功。5.学生选择课程库存不足的课程后点击“选择课程”选项。6.系统弹出提示框提示课程库存数量不足。7.学生勾选已经选择的课程后点击“选择课程”选项。8.系统弹出提示框提示课程已选择,请重新选课。9.使用测试工具测试高并发学生选课库存超选。期望结果学生选课能选课成功,选择课

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论