基于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

提交評論