【考試報(bào)名數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)13000字(論文)】_第1頁
【考試報(bào)名數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)13000字(論文)】_第2頁
【考試報(bào)名數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)13000字(論文)】_第3頁
【考試報(bào)名數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)13000字(論文)】_第4頁
【考試報(bào)名數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)13000字(論文)】_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

I第1章緒論1.1研究背景隨著我國IT辦公技術(shù)的不斷進(jìn)步和產(chǎn)業(yè)飛速發(fā)展,互聯(lián)網(wǎng)辦公應(yīng)用的廣泛普及與大大推廣,信息化企業(yè)辦公逐步取代了目前傳統(tǒng)的企業(yè)辦公管理模式。信息化辦公取代傳統(tǒng)辦公模式是當(dāng)下辦公模式發(fā)展的必然趨勢(shì)。在現(xiàn)有的考試信息處理系統(tǒng)中對(duì)于學(xué)生進(jìn)行報(bào)名信息處理也可以說是一個(gè)很重要的考驗(yàn),學(xué)生對(duì)于考試信息的掌握程度很重要,并針對(duì)目前現(xiàn)有的報(bào)名信息處理系統(tǒng)中存在的功能而言進(jìn)行了優(yōu)化,定制一套更加能夠適用于當(dāng)前現(xiàn)有場景的更具靈活性的考試報(bào)名系統(tǒng),將會(huì)有助于大大降低報(bào)名信息處理工作量和工作強(qiáng)度,提升學(xué)校的教務(wù)管理水平與工作效率。本文簡要詳細(xì)介紹了考試報(bào)名數(shù)據(jù)處理系統(tǒng)的理論基礎(chǔ)及其設(shè)計(jì)開發(fā)應(yīng)用全過程,包括了系統(tǒng)需求管理分析、系統(tǒng)結(jié)構(gòu)設(shè)計(jì)、系統(tǒng)功能實(shí)現(xiàn)等詳細(xì)理論內(nèi)容。考試報(bào)名數(shù)據(jù)處理系統(tǒng)基于Java8進(jìn)行開發(fā),使用SpringBoot作為基礎(chǔ)框架,前端使用Jquery+Layui作為主要技術(shù),服務(wù)器的軟件采用Nginx+Tomcat,后臺(tái)數(shù)據(jù)庫系統(tǒng)采用Mysql。1.2系統(tǒng)研究意義為了數(shù)字化校園建設(shè)內(nèi)涵,提高考務(wù)報(bào)名工作的效率,為考生提供優(yōu)質(zhì)、便捷的報(bào)名服務(wù),設(shè)計(jì)考試報(bào)名數(shù)據(jù)處理系統(tǒng),目的有幾個(gè)方面??荚噲?bào)名數(shù)據(jù)處理系統(tǒng),采用高度信息化的流程可以避免紙質(zhì)填報(bào)、現(xiàn)場核對(duì)等不必要的工作流程,減少信息流轉(zhuǎn)過程中操作失誤,可能帶來的錯(cuò)誤數(shù)據(jù)??荚噲?bào)名信息處理系統(tǒng),實(shí)現(xiàn)對(duì)考試報(bào)名工作的情況的實(shí)時(shí)掌握,讓老師可以更加自如地開展考試報(bào)名工作,避免信息采集與數(shù)據(jù)統(tǒng)計(jì)滯后的情況,同時(shí)能更加方便地通過各種圖表了解報(bào)名信息的變化趨勢(shì),強(qiáng)化系統(tǒng)操作的簡易性。同時(shí)在探索通過前后端完全分離的方式,減輕系統(tǒng)服務(wù)器的壓力[1]。1.3國內(nèi)外研究現(xiàn)狀計(jì)算機(jī)技術(shù)的發(fā)源可以追溯到1946年,由濱夕法尼亞大學(xué)的摩爾學(xué)院開發(fā)了一種大規(guī)模的電子數(shù)字集成計(jì)算機(jī),成為計(jì)算機(jī)時(shí)代到來的標(biāo)志。20世紀(jì)中期計(jì)算機(jī)技術(shù)進(jìn)入快速發(fā)展期,而在20世紀(jì)后期計(jì)算機(jī)技術(shù)得以普及,計(jì)算機(jī)技術(shù)得以進(jìn)入千家萬戶,而如今計(jì)算機(jī)技術(shù)已經(jīng)進(jìn)入移動(dòng)互聯(lián)網(wǎng)時(shí)代。我國早期計(jì)算機(jī)技術(shù)嚴(yán)重落后于美國等西方國家,信息化普及程度相較于國外還是比較低。近年來隨著國家對(duì)信息化建設(shè)的重視,我國計(jì)算機(jī)及IT技術(shù)已經(jīng)進(jìn)入千家萬戶,各類計(jì)算機(jī)及移動(dòng)應(yīng)用也相繼出現(xiàn)。由于計(jì)算機(jī)技術(shù)與IT技術(shù)首先在國外發(fā)展和普及,早在20世紀(jì)90年代國外就開始推行信息化校園,我國考試報(bào)名工作信息化相較于國外發(fā)展較晚,當(dāng)時(shí)我國的教學(xué)考試模式還處于傳統(tǒng)模式。隨著管理系統(tǒng)的普及考務(wù)工作的信息化的持續(xù)推進(jìn),信息化初期僅僅是將線下工作盡可能地移植到線上系統(tǒng),現(xiàn)階段我國也逐漸在脫離傳統(tǒng)思維,使用互聯(lián)網(wǎng)思維設(shè)計(jì)實(shí)現(xiàn)考試報(bào)名系統(tǒng)、在線課堂系統(tǒng)等教育相關(guān)應(yīng)用。從以前的線下提供報(bào)名表繳費(fèi)考試等,再到現(xiàn)在線上報(bào)名、選擇科目、打印準(zhǔn)考證、查詢成績的報(bào)考工作模式,這不僅大大便利了廣大考生和減少考務(wù)工作者壓力,同時(shí)也減少了人工操作帶來的失誤及考生排查等問題。1.4本文主要研究內(nèi)容本文旨在建設(shè)高性能及高可用性的考試報(bào)名數(shù)據(jù)處理系統(tǒng),給考生提供更加方便和考務(wù)工作者易于管理的體驗(yàn)。主要參考已有的考試考報(bào)名系統(tǒng),考務(wù)管理的實(shí)際需求,根據(jù)現(xiàn)有的軟件開發(fā)技術(shù)、數(shù)據(jù)存儲(chǔ)及系統(tǒng)架構(gòu)知識(shí),從開發(fā)語言及業(yè)務(wù)流程等方面研究設(shè)計(jì)易于使用、操作流暢以及更加現(xiàn)代的考試報(bào)名數(shù)據(jù)處理系統(tǒng)。為解決傳統(tǒng)考試報(bào)名系統(tǒng)無法更好地利用現(xiàn)代瀏覽器特性和性能、以及可擴(kuò)展性和可維護(hù)性不足,從提高系統(tǒng)效率、UI交互、降低瀏覽器與應(yīng)用服務(wù)器通信數(shù)據(jù)流量等多方面進(jìn)行考量。本文針對(duì)基于C/S模式及傳統(tǒng)B/S模式的報(bào)名數(shù)據(jù)處理系統(tǒng)存在的缺陷和不足之處,通過調(diào)整系統(tǒng)架構(gòu)、軟件架構(gòu)、需求實(shí)現(xiàn)等研究如何通過減少應(yīng)用服務(wù)器壓力來提高系統(tǒng)整體性能。1.5本文組織結(jié)構(gòu)第一章:說明所選題目的重要工作意義,描述項(xiàng)目當(dāng)前的國內(nèi)外研究現(xiàn)況,說明開發(fā)該項(xiàng)目的內(nèi)容和目標(biāo)。第二章:系統(tǒng)相關(guān)技術(shù)介紹。第三章:系統(tǒng)建設(shè)初期的重要環(huán)節(jié),通過需求分析確認(rèn)系統(tǒng)功能區(qū)域,按照功能劃分若干模塊。第四章:架構(gòu)設(shè)計(jì)、針對(duì)各個(gè)功能模塊進(jìn)行分析以及數(shù)據(jù)庫的設(shè)計(jì)。第五章:本文實(shí)現(xiàn)系統(tǒng)的重點(diǎn)章節(jié),詳細(xì)的闡述功能并演示系統(tǒng)界面。第六章:針對(duì)本文的系統(tǒng)完成情況進(jìn)行測試,判斷功能完整性正確性。第七章:系統(tǒng)實(shí)施過程中安全十分的重要尤其是考務(wù)工作中涉及很多敏感信息。第八章:總結(jié)本文的工作內(nèi)容以及實(shí)現(xiàn)情況。第2章相關(guān)理論概述2.1JAVA技術(shù)Java是一門面向?qū)ο缶幊陶Z言,它隸屬于C語言家族。他吸收了C系語言的各種特點(diǎn),除去了很多難以理解的概念如多繼承等,當(dāng)然也引入了一些缺點(diǎn),部分場景運(yùn)行效率不高。當(dāng)然這些都阻擋不了Java在Web應(yīng)用開發(fā)中的流行。Java這種開發(fā)語言可以廣泛用來用于編制各種桌面軟件應(yīng)用程序,web軟件應(yīng)用程序,分布式系統(tǒng)和其他嵌入式的操作系統(tǒng)軟件應(yīng)用程序[2]。2.2Springboot技術(shù)Springboot是由Pivotal團(tuán)隊(duì)提供的框架,其目的是為了簡化Spring應(yīng)用的開發(fā)配置過程。該框架使用的特定的方式來進(jìn)行配置,并提供了方便的外部化配置(環(huán)境變量,執(zhí)行參數(shù),java變量等)可以通過調(diào)整配置而不必重新修改代碼并編譯。SpringBoot已經(jīng)成為Java快速開發(fā)領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。同時(shí)SpringCloud項(xiàng)目是基于SpringBoot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具,是Java開發(fā)分布式云應(yīng)用的首選[3]。SpringBoot提供自動(dòng)配置的starter項(xiàng)目對(duì)象模型簡化了Maven和應(yīng)用內(nèi)配置,盡可能自動(dòng)配置Spring容器,去掉Spring開發(fā)的大量Xml配置[3]。并提供了大量準(zhǔn)備好的特性,如指標(biāo)、健康檢查等常用功能[4]。2.3MySQL數(shù)據(jù)庫技術(shù)MySQL是一個(gè)開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應(yīng)用方面十分的廣泛。關(guān)系數(shù)據(jù)庫的特點(diǎn)是不將所有數(shù)據(jù)放在一個(gè)大容器內(nèi),而是將數(shù)據(jù)保存在不同的表中,這樣就可以增加處理速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫,并且在目前科技行業(yè)開源技術(shù)優(yōu)先的前提下,MySql數(shù)據(jù)庫也大量應(yīng)用與大型應(yīng)用及云原生應(yīng)用[5]。2.4Nginx簡介Nginx是一個(gè)高性能的HTTP和反向代理web服務(wù)器,其特點(diǎn)是使用epollandkqueue作為開發(fā)模型,其能夠支持高達(dá)50,000個(gè)迸發(fā)連接數(shù)的響應(yīng)。因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名[6]。Nginx的強(qiáng)大并發(fā)能力和開源特點(diǎn)使得各大科技公司都有對(duì)Nginx進(jìn)行過二層開發(fā),比如淘寶的Tengine就是基于Nginx進(jìn)行開發(fā)這無疑證明了Nginx強(qiáng)大。2.5B/S模式簡介B/S(Browser/Server)結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。它是隨著Internet技術(shù)的興起一直處于高速發(fā)展中,它已經(jīng)成為新建系統(tǒng)優(yōu)先考慮的架構(gòu)模式。B/S結(jié)構(gòu)能大大提高系統(tǒng)開發(fā)(無需考慮跨平臺(tái)問題)、維護(hù)(極大減少客戶端維護(hù)成本)和升級(jí)效率(C/S結(jié)構(gòu)的系統(tǒng)升級(jí)問題都不存在)。B/S結(jié)構(gòu)也有他的不足之處,在于應(yīng)用服務(wù)器(Server)的壓力更大[7]。第3章系統(tǒng)需求分析本系統(tǒng)的定制開發(fā)是為了提升學(xué)??荚噲?bào)名工作效率,使得考試報(bào)名信息精確無誤、成績查詢、考務(wù)統(tǒng)計(jì)直觀。3.1系統(tǒng)功能性需求通過對(duì)現(xiàn)有需求進(jìn)行分析以及參考現(xiàn)有成果及文獻(xiàn),并結(jié)合現(xiàn)有用戶進(jìn)行調(diào)研。對(duì)需求進(jìn)行整合優(yōu)化。系統(tǒng)主要分為考生功能、管理員客功能??荚噲?bào)名數(shù)據(jù)處理系統(tǒng)采用RBAC(基于角色的訪問控制)對(duì)不同類型用戶賦予不同的角色來控制權(quán)限。3.1.1考生功能需求考生注冊(cè):輸入電子郵箱、手機(jī)、證件號(hào)碼、姓名等基本信息完成賬號(hào)注冊(cè)流程,注冊(cè)用戶后方可使用本系統(tǒng)。登錄:根據(jù)用戶名、手機(jī)號(hào)、電子郵箱或者身份證號(hào)加上密碼信息登錄系統(tǒng)。個(gè)人信息:查看及修改部分個(gè)人信息。修改用戶密碼:修改的用戶原來的密碼要求校驗(yàn)好用戶原來的密碼,以提高安全性??荚噲?bào)名:在考試窗口的報(bào)名時(shí)間段內(nèi)考生可以選擇該考試窗口的考試類型、級(jí)別、考試科目、日期、時(shí)間、考點(diǎn)進(jìn)行報(bào)考??荚?yán)U費(fèi):可以再報(bào)名完成后自動(dòng)跳轉(zhuǎn)至支付頁面進(jìn)行支付,也可以在報(bào)考列表中對(duì)未支付的報(bào)名進(jìn)行繳費(fèi)。打印準(zhǔn)考證:考生可以對(duì)待考狀態(tài)的報(bào)考信息打印準(zhǔn)考證。成績查詢:考試完成后在成績公布日期后可以在報(bào)名列表中進(jìn)行查詢成績??忌美龍D如圖3-1所示圖3-1考生用例圖3.1.2管理員功能需求用戶管理:管理員可以查詢、添加、刪除、編輯系統(tǒng)用戶。角色管理:管理員可以查詢、添加、刪除、編輯系統(tǒng)角色。資源管理:管理員可以查詢、添加、刪除、編輯系統(tǒng)資源資源主要分為菜單和權(quán)限類。授權(quán)管理:管理員可以對(duì)角色的資源進(jìn)行授權(quán)并添加刪除角色下的用戶。字典管理:管理員可以查詢、添加、刪除、編輯系統(tǒng)字典。系統(tǒng)參數(shù)設(shè)置:管理員可以查詢、添加、刪除、編輯系統(tǒng)參數(shù)如系統(tǒng)名稱,軟件版本等。系統(tǒng)字典管理:管理員可以查詢、添加、刪除、編輯系統(tǒng)字典目前系統(tǒng)字典主要有考試類型、考試級(jí)別、考試時(shí)間、支付狀態(tài)、考試狀態(tài)、審核狀態(tài)其中考試級(jí)別與考試類型有級(jí)聯(lián)關(guān)系??荚嚧翱诠芾恚汗芾韱T可以查詢、添加、刪除、編輯考試窗口,設(shè)置窗口的報(bào)名時(shí)間、考試時(shí)間等??荚嚳颇抗芾恚汗芾韱T可以查詢、添加、刪除、編輯考試科目,設(shè)置科目的名稱、代碼、考試類型、級(jí)別、考試費(fèi)用等信息。考點(diǎn)管理:管理員可以查詢、添加、刪除、編輯考點(diǎn),設(shè)置考點(diǎn)名稱、位置、可容納人數(shù)等。報(bào)考管理:管理員可以查詢、添加、編輯考試科目,退回報(bào)名信息并退回報(bào)考費(fèi)用。報(bào)考報(bào)表:管理員可以在該頁面實(shí)時(shí)查看報(bào)考統(tǒng)計(jì)信息。考試成績導(dǎo)入:管理員可以導(dǎo)入考試成績。管理員用例圖如圖3-2。圖3-2管理員用例圖3.2系統(tǒng)非功能性需求3.2.1性能需求界面清爽,考生使用時(shí)頁面平均響應(yīng)時(shí)間快,能夠支持至少1000人迸發(fā)使用。同時(shí)需要保證系統(tǒng)的可維護(hù)性,以及可擴(kuò)展性,以供將來對(duì)接其他系統(tǒng),將來支持移動(dòng)APP及H5頁面以及功能擴(kuò)展等。3.2.2兼容性需求系統(tǒng)軟件要求為B/S架構(gòu),應(yīng)用應(yīng)該能部署到常用的服務(wù)器系統(tǒng)(Unix,Linux,Windows),客戶端能支持常見的瀏覽器(IE、Firefox、360、Chrome、Edge等)3.2.3安全性需求涉及到考生身份證、姓名等大量敏感數(shù)據(jù),要求支持加密(Https)訪問,系統(tǒng)確保安全可靠。3.3系統(tǒng)分析3.3.1系統(tǒng)解決痛點(diǎn)考試報(bào)名數(shù)據(jù)處理系統(tǒng)通過使用B/S技術(shù)解決系統(tǒng)的可維護(hù)和可擴(kuò)展性。通過前后端分離和Nginx等技術(shù)減少B/S模式帶來的應(yīng)用服務(wù)器壓力,將傳統(tǒng)WEB應(yīng)用的服務(wù)端渲染模式改為應(yīng)用僅提供API接口不負(fù)責(zé)頁面渲染,增加系統(tǒng)的負(fù)載能力[8]。當(dāng)前大部分單點(diǎn)應(yīng)用系統(tǒng)應(yīng)用和數(shù)據(jù)庫是性能的主要瓶頸,通過調(diào)查和測試Nginx可以大大緩解Tomcat作為應(yīng)用服務(wù)器的壓力,并且Nginx可以通過負(fù)載均衡大大提高系統(tǒng)的負(fù)載能力及可用性[9]。3.3.2技術(shù)可行性考試報(bào)名數(shù)據(jù)處理系統(tǒng),使用SpringBoot、Mybatis、Shiro作為系統(tǒng)的基礎(chǔ)框架,并且使用前后端分離的開發(fā)模式。相比于現(xiàn)存的大量使用JSP和Struts2以及其他模板技術(shù)在后端生成html頁面,Java應(yīng)用的負(fù)載會(huì)更低[10]。3.3.3業(yè)務(wù)流程分析考試報(bào)名信息化工作整體考試報(bào)名主要是考生注冊(cè)賬號(hào)-登錄系統(tǒng)-考生報(bào)名考試-考務(wù)進(jìn)行審核-考生打印準(zhǔn)考證-考務(wù)導(dǎo)入成績-考生查詢成績這么一個(gè)主流程,當(dāng)然其中會(huì)有多個(gè)分叉的情況會(huì)在后面詳細(xì)說明。3.3.4數(shù)據(jù)處理分析涉及到考生身份證、姓名等大量敏感數(shù)據(jù)對(duì)部分?jǐn)?shù)據(jù)需要進(jìn)行加密處理,本系統(tǒng)中需要在報(bào)考查詢管理頁面對(duì)考生個(gè)人信息進(jìn)行了隱藏。第4章系統(tǒng)概要設(shè)計(jì)4.1整體架構(gòu)設(shè)計(jì)4.1.1系統(tǒng)架構(gòu)設(shè)計(jì)考試報(bào)名數(shù)據(jù)處理系統(tǒng)使用Nginx作為web訪問入口減少應(yīng)用系統(tǒng)壓力,并通過Nginx開啟Https來提高網(wǎng)站安全性,防止使用Http訪問時(shí)用戶請(qǐng)求信息被攔截。用戶通過網(wǎng)絡(luò)訪問系統(tǒng)時(shí)首先被Nginx處理如果是靜態(tài)文件請(qǐng)求就直接被Nginx進(jìn)行處理并直接返回給用戶,如果為API請(qǐng)求則轉(zhuǎn)發(fā)至Tomcat容器處理并獲取返回結(jié)果轉(zhuǎn)發(fā)給用戶,這里通過url來區(qū)分靜態(tài)資源請(qǐng)求和API請(qǐng)求,考試報(bào)名數(shù)據(jù)處理系統(tǒng)使用Nginx。Tomcat去訪問Mysql數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)存取操作。這么做是因?yàn)槭褂肗ginx處理靜態(tài)資源遠(yuǎn)比Tomcat處理靜態(tài)資源更加效率,服務(wù)器的資源占用率更低。圖4-1系統(tǒng)架構(gòu)圖4.1.2軟件架構(gòu)設(shè)計(jì)考試報(bào)名數(shù)據(jù)處理系統(tǒng)是基于開源的SpringBoot應(yīng)用框架的一套B/S應(yīng)用系統(tǒng),軟件架構(gòu)設(shè)計(jì)如圖4-2所示。圖4-2軟件架構(gòu)圖(1)前端展現(xiàn)前端使用了layui和jquery來實(shí)現(xiàn),做這個(gè)選擇是因?yàn)榭忌姆秶容^廣,不能完全保證設(shè)備的性能。因此沒有使用vue、react等重前端框架,使用了相對(duì)比較輕量的框架,以保障前端頁面的渲染速度及響應(yīng)時(shí)間。(2)Shiro權(quán)限框架考試報(bào)名數(shù)據(jù)處理系統(tǒng)使用了B/S架構(gòu),因此我們要假設(shè)所有的接口訪問都有可能是偽造的不可靠的,需要對(duì)敏感操作進(jìn)行鑒權(quán)。而Shiro是一個(gè)很好的開源權(quán)限框架,它有很靈活的機(jī)制和強(qiáng)大的功能。使用了Shiro作為系統(tǒng)的權(quán)限控制框架,以保護(hù)考生的隱私數(shù)據(jù)安全。同時(shí)防止越權(quán)操作發(fā)生[11]。(3)Restful接口前端通過Ajax與后面的Resfull接口之間進(jìn)行了交互,從而實(shí)現(xiàn)了前后端的分離,能夠更好地協(xié)助系統(tǒng)框架。后端專注于業(yè)務(wù)邏輯處理,不用關(guān)心前端頁面渲染減少后端應(yīng)用壓力。并且可以實(shí)現(xiàn)多端統(tǒng)一接口只需要做前端適配不需要前端調(diào)整,擴(kuò)展性也更好,適應(yīng)變化能力也更強(qiáng)[12]。(4)后端功能劃分后端功能整體被拆為兩個(gè)部分,基礎(chǔ)功能主要包含權(quán)限管理、系統(tǒng)管理和通用功能這些都屬于系統(tǒng)的公共功能并且也是較少改動(dòng)的功能。而其他的則為業(yè)務(wù)功能。(5)數(shù)據(jù)訪問層考試報(bào)名數(shù)據(jù)處理系統(tǒng)使用Mybatis作為系統(tǒng)ORM框架,它的主要特點(diǎn)是使用方便及關(guān)聯(lián)查詢處理功能強(qiáng)大。并且它可以很方便的對(duì)數(shù)據(jù)庫查詢進(jìn)行優(yōu)化,因?yàn)樗牟樵冞壿嬍呛苋菀最A(yù)見的,多數(shù)情況是直接書寫sql加上少量的判斷標(biāo)簽。它的Interceptor機(jī)制也很方便擴(kuò)展一些自定義處理寶庫數(shù)據(jù)庫自動(dòng)物理分頁、排序或者權(quán)限處理及通用日志等強(qiáng)大功能。4.2模塊設(shè)計(jì)報(bào)名數(shù)據(jù)處理系統(tǒng)基本功能菜單模塊設(shè)計(jì)如表4-1所示。表4-1報(bào)名數(shù)據(jù)處理系統(tǒng)基本功能設(shè)計(jì)表一級(jí)功能二級(jí)功能功能描述通用功能注冊(cè)學(xué)生通過注冊(cè)添加賬號(hào),以身份證號(hào)碼為用戶;管理員及教師賬號(hào)不允許注冊(cè)由管理員創(chuàng)建登錄用戶使用用戶名、手機(jī)號(hào)、電子郵箱及身份證號(hào)和密碼登錄系統(tǒng)個(gè)人信息管理姓名、性別、手機(jī)號(hào)、個(gè)人照片這些信息可以進(jìn)行修改,身份證號(hào)不允許修改考試報(bào)名報(bào)考申請(qǐng)報(bào)名表單包括個(gè)人信息、考試科目、考試時(shí)間、考試場地,個(gè)人信息可以從注冊(cè)信息中獲取并自動(dòng)填充報(bào)考列表考試報(bào)名信息列表:(1)可以查看本人的報(bào)考?xì)v史記錄(2)可以對(duì)未知的報(bào)考進(jìn)行支付(3)待考考試可以打印準(zhǔn)考證(4)考試成績公布后可以查看考試成績?cè)诰€支付頁面報(bào)考完成后會(huì)跳轉(zhuǎn)到該頁面進(jìn)行支付操作權(quán)限管理用戶賬號(hào)管理超級(jí)管理員可以增加、刪除、修改、查詢賬號(hào)并賦予角色角色管理針對(duì)教師賬號(hào),進(jìn)行分角色管理,有超級(jí)管理員計(jì)算機(jī)考試審核等等資源管理對(duì)系統(tǒng)的菜單及權(quán)限進(jìn)行管理授權(quán)管理控制各個(gè)角色的菜單及擁有的權(quán)限,系統(tǒng)管理字典管理對(duì)系統(tǒng)的字典進(jìn)行維護(hù)系統(tǒng)參數(shù)管理對(duì)系統(tǒng)的參數(shù)信息進(jìn)行維護(hù)考務(wù)管理考試窗口管理設(shè)置窗口的報(bào)名時(shí)間、考試時(shí)間等課程科目管理設(shè)置科目的代碼、名稱等考點(diǎn)管理考試信息管理考試類型等級(jí)、費(fèi)用、報(bào)名時(shí)間、考試場次報(bào)考信息管理可以查看權(quán)限范圍內(nèi)的考試報(bào)名信息:(1)對(duì)考生報(bào)名部分信息進(jìn)行編輯(2)管理員可以對(duì)異常的考生報(bào)名信息進(jìn)行退回操作考試成績導(dǎo)入以準(zhǔn)考證號(hào)、身份證號(hào)、考試場次為唯一標(biāo)識(shí),導(dǎo)入考試成績。并且需要逐條驗(yàn)證數(shù)據(jù)準(zhǔn)確信如果信息有誤,需要給出錯(cuò)誤原因報(bào)考信息統(tǒng)計(jì)查看權(quán)限范圍內(nèi)的計(jì)算機(jī)等級(jí)考試學(xué)生報(bào)名情況,統(tǒng)計(jì)每日?qǐng)?bào)名人數(shù)并生成趨勢(shì)圖,并可以按照考試類型及科目進(jìn)行篩選從權(quán)限的角度來看報(bào)名數(shù)據(jù)處理系統(tǒng)可以分為考生、教務(wù)、系統(tǒng)管理員三大類模塊,在他們下面又分為若干功能獨(dú)立的子模塊,考生、教務(wù)、系統(tǒng)管理員都可以登錄系統(tǒng)去使用自己的模塊將考試報(bào)名完成相應(yīng)功能。4.3數(shù)據(jù)庫設(shè)計(jì)4.3.1數(shù)據(jù)庫結(jié)構(gòu)化設(shè)計(jì)圖4-3系統(tǒng)E-R圖數(shù)據(jù)庫的整體實(shí)體關(guān)系如圖4-3所示,數(shù)據(jù)實(shí)體關(guān)系是通過對(duì)需求的調(diào)研,以及對(duì)現(xiàn)有文獻(xiàn)及研究成功進(jìn)行歸納總結(jié),這也是整個(gè)數(shù)據(jù)庫設(shè)計(jì)的很重要的部分。關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可維護(hù)性以及數(shù)據(jù)完整性等。4.3.2數(shù)據(jù)庫表的設(shè)計(jì)用戶信息如表4-4所示表4-4用戶信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1user_idint11是否2user_type20否3PAGEXXXhinese_namevarchar10否4usernamevarchar18否5id_cardchar18否6emailvarchar50是7mobilevarchar14是8saltchar21是9passwordchar64是10statusint1否角色信息如表4-5所示表4-5角色信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1role_idint11是否2role_codevarchar50否3role_namevarchar50否資源信息表如表4-6所示表4-6資源信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1res_idint11是否2res_typevarchar20否3res_namevarchar200否4res_permvarchar200是5res_descvarchar200是6res_urlvarchar200是7enabletinyint1否8parent_idint11是用戶角色信息如表4-7所示表4-7用戶角色信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1int11ur_id是否2int11user_id否3int11role_id否角色資源信息如表4-8所示表4-8角色資源信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1rr_idint11是否2role_idint11否3res_idint11否字典信息表如表4-9所示表4-9字典信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1dict_idint11是否2dict_namevarchar255否3dict_valuevarchar255否4parent_idvarchar255否考試窗口信息表如表4-10所示表4-10考試批次信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1batch_idint11否2batch_namevarchar255否3exam_typevarchar100否4reg_start_timedatetime0否5reg_end_timedatetime0否6exam_start_datedate0否7exam_end_datedate0否考試科目信息如表4-11所示表4-11考試科目信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1subject_idint11是否2exam_typevarchar255否3exam_rankint11否4subject_namevarchar255否5subject_codeint11否6exam_feedecimal8否考點(diǎn)信息如表4-12所示表4-12考點(diǎn)信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1site_idint11是否2site_namevarchar200否3site_locationvarchar255否4site_capacityint11否5enabledtinyint1否報(bào)考信息如表4-13所示表4-13報(bào)考信息表序號(hào)列名數(shù)據(jù)類型長度主鍵允許空1apply_idint11是否2batch_idint11否3exam_typevarchar200否4user_idint11否5subject_idint11否6site_idint11否7exam_datedate0否8exam_timevarchar100否9pay_statustinyint1否10pay_feedecimal8,2否11pay_timedatetime0是12create_atdatetime0否13apply_statustinyint1否第5章系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)5.1基礎(chǔ)數(shù)據(jù)基礎(chǔ)數(shù)據(jù)是系統(tǒng)運(yùn)行必不可少的部分,在本系統(tǒng)中主要涉及有參數(shù)字典和配置參數(shù)。5.1.1參數(shù)字典考試報(bào)名時(shí)間處理系統(tǒng)主要有考試類型、考試時(shí)間、考試級(jí)別。根據(jù)需求調(diào)研發(fā)下它們都屬于簡單的鍵值對(duì)字典,但是它們部分字典之間有級(jí)聯(lián)關(guān)系。5.1.2配置參數(shù)配置參數(shù)主要用于系統(tǒng)運(yùn)行的部分行為,如系統(tǒng)名稱顯示等。5.2系統(tǒng)實(shí)現(xiàn)環(huán)境搭建硬件環(huán)境采用普通PC設(shè)備軟件環(huán)境:服務(wù)器端操作系統(tǒng):windows10數(shù)據(jù)庫:MysqlWeb服務(wù)器:nginx、tomcat客戶端操作系統(tǒng):windows10Nginx配置截取關(guān)鍵部分如下:upstreamemis{server:8080weight=1;}server{listen80;server_namelocalhost;location/api/{proxy_passhttp://emis;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}location/{root/www/static;indexindex.htmlindex.htm;}error_page500502503504/50x.html;location=/50x.html{roothtml;}}5.3系統(tǒng)業(yè)務(wù)流程設(shè)計(jì)通過需求對(duì)考試報(bào)名數(shù)據(jù)處理系統(tǒng)主要業(yè)務(wù)流程梳理如圖5-1。圖5-1主要業(yè)務(wù)流程圖5.4考生端的功能5.4.1用戶注冊(cè)登錄訪客的用戶直接訪問后系統(tǒng)將自動(dòng)跳轉(zhuǎn)至注冊(cè)的登錄頁面,在輸入正確的用戶名和注冊(cè)密碼后即可進(jìn)行注冊(cè),界面結(jié)構(gòu)如圖5-2所示。關(guān)鍵代碼如下:Stringusername=(String)authenticationToken.getPrincipal();SysUseruser=ShiroUtils.getUserByUK(username);if(user==null){//賬號(hào)不存在thrownewUnknownAccountException(“賬號(hào)不存在”);}if(user.getStatus()!=0){//賬號(hào)被鎖定thrownewLockedAccountException(“賬號(hào)已被鎖定”);}SimpleAuthenticationInfoauthenticationInfo=newSimpleAuthenticationInfo(user,user.getPassword(),ByteSource.Util.bytes(user.getUserId()+user.getSalt()),getName());returnauthenticationInfo;圖5-2用戶登錄若考生還沒有通過注冊(cè)后就可以直接通過注冊(cè)的頁面進(jìn)行注冊(cè),用戶注冊(cè)只能注冊(cè)考生類型的賬號(hào),界面結(jié)構(gòu)如圖5-3。關(guān)鍵代碼如下:@Overridepublicintregister(SysUsersysUser){sysUser.setUserType(UserType.CANDIDATE);returnaddUser(sysUser);}@Override@Transactional(rollbackFor=Throwable.class)publicintaddUser(SysUsersysUser){EmisValidUtils.validate(sysUser,ValidGroups.Insert.class);if(sysUser.getLocked()==null){sysUser.setLocked(0);}intadd=sysUserMapper.addUser(sysUser);ShiroUtils.encryptPassword(sysUser);sysUserMapper.changePasswordById(sysUser);switch(sysUser.getUserType()){//管理員添加到管理員角色caseADMIN:add+=userLinkRole(sysUser.getUserId(),Collections.singleton(EmisConst.ROLE_ADMIN));break;//考生添加到考生角色caseCANDIDATE:Set<Integer>roleIds=newHashSet<>();roleIds.add(2);roleIds.add(3);add+=userLinkRole(sysUser.getUserId(),roleIds);break;default:break;}returnadd;}圖5-3用戶注冊(cè)5.4.2網(wǎng)上報(bào)考考生登錄成功后可以通過報(bào)考申請(qǐng)菜單進(jìn)入報(bào)考頁面,考試類型通過報(bào)考批次進(jìn)行關(guān)聯(lián),考生只允許選擇當(dāng)前可以報(bào)名的批次,如果沒有可報(bào)考批次則無法進(jìn)行報(bào)考操作,界面如圖5-4。關(guān)鍵代碼如下:@Overridepublicintadd(ExamApplyreg){EmisValidUtils.validate(reg,ValidGroups.Insert.class);returnexamApplyMapper.insertSelective(reg);}圖5-4報(bào)考申請(qǐng)5.4.3成績查詢學(xué)生報(bào)考成功后可以通過報(bào)考列表查看支付狀態(tài)、申請(qǐng)狀態(tài),以及考試成績導(dǎo)入后查詢考試成績,如果支付狀態(tài)為未支付可以通過點(diǎn)擊立即支付跳轉(zhuǎn)至支付頁面,如果申請(qǐng)被退回會(huì)顯示退款原因,界面如圖5-5、圖5-6。關(guān)鍵代碼如下:@OverridepublicPage<ExamApplyDto>list(ExamApplyQueryquery){PageHelper.startPage(query.getPage(),query.getLimit());return(Page<ExamApplyDto>)examApplyMapper.listByQuery(query);}@OverridepublicExamApplyDtogetById(IntegerapplyId){ExamApplyfilter=newExamApply();filter.setApplyId(applyId);List<ExamApplyDto>examRegPage=examApplyMapper.listByQuery(filter);if(examRegPage.size()==1){returnexamRegPage.get(0);}returnnull;}圖5-5報(bào)考列表圖5-6未支付狀態(tài)5.4.4準(zhǔn)考證打印如報(bào)考申請(qǐng)通過則會(huì)顯示打印準(zhǔn)考證按鈕可以跳轉(zhuǎn)至打印準(zhǔn)考證頁面,這里使用js的print()方法實(shí)現(xiàn)頁面打印,界面如圖5-7。打印代碼如下:$(‘#printBtn’).hide();//隱藏打印按鈕window.print();//調(diào)用瀏覽器打印圖5-7打印準(zhǔn)考證5.5管理端功能的實(shí)現(xiàn)管理端功能主要針對(duì)考務(wù)工作者和系統(tǒng)管理員5.5.1基礎(chǔ)功能權(quán)限管理分為四大模塊,整體使用RBAC(基于角色的權(quán)限控制)的模型設(shè)計(jì)。用戶管理如上圖5-8所示,用戶主要分為管理員和考生兩種類型,其中考生賬號(hào)可以通過考生注冊(cè)管理員賬號(hào)則只能同超級(jí)管理或者其他有權(quán)限賬號(hào)添加,在這里可以修改用戶屬性以及重置用戶密碼,添加、編輯及刪除頁面如圖5-9、圖5-10和圖5-11所示。除了密碼外其他都是必填,如填入密碼則表示需要重置密碼,刪除時(shí)會(huì)彈出確認(rèn)框讓管理員二次確認(rèn)。關(guān)鍵代碼如下:@OverridepublicPage<SysUser>userList(UserReqDtouserReq){PageHelper.startPage(userReq.getPage(),userReq.getLimit());List<SysUser>userList=sysUserMapper.selectAll();for(inti=0;i<userList.size();i++){userList.set(i,UserDto.of(userList.get(i)));}return(Page<SysUser>)userList;}@OverridepublicinteditUser(SysUseruser){EmisValidUtils.validate(user,ValidGroups.Update.class);UserDtoupdate=newUserDto();update.setUserId(user.getUserId());update.setUserType(user.getUserType());update.setChineseName(user.getChineseName());update.setIdCard(user.getIdCard());update.setEmail(user.getEmail());update.setMobile(user.getMobile());update.setUsername(user.getUsername());if(StringUtils.hasText(user.getPassword())){update.setPassword(user.getPassword());ShiroUtils.encryptPassword(update);}returnsysUserMapper.updateByPrimaryKeySelective(update);}@OverridepublicintchangePassword(IntegeruserId,StringoldPassword,StringnewPassword){SysUseruser=getUserByPk(userId);if(ShiroUtils.doCredentialsMatch(user,oldPassword)){user.setPassword(newPassword);ShiroUtils.encryptPassword(user);returnsysUserMapper.changePasswordById(user);}else{thrownewServiceException(403,"原密碼錯(cuò)誤");}}@Override@Transactional(rollbackFor=Throwable.class)publicintaddUser(SysUsersysUser){EmisValidUtils.validate(sysUser,ValidGroups.Insert.class);if(sysUser.getLocked()==null){sysUser.setLocked(0);}intadd=sysUserMapper.addUser(sysUser);ShiroUtils.encryptPassword(sysUser);sysUserMapper.changePasswordById(sysUser);switch(sysUser.getUserType()){//管理員添加到管理員角色caseADMIN:add+=userLinkRole(sysUser.getUserId(),Collections.singleton(EmisConst.ROLE_ADMIN));break;//考生添加到考生角色caseCANDIDATE:Set<Integer>roleIds=newHashSet<>();roleIds.add(2);roleIds.add(3);add+=userLinkRole(sysUser.getUserId(),roleIds);break;default:break;}returnadd;}@Override@Transactional(rollbackFor=Throwable.class)publicintdelUser(IntegeruserId){SysUsersysUser=getUserByPk(userId);if(sysUser==null){thrownewServiceException(400,"未找到用戶");}intmod=sysUserMapper.deleteUserLinkedRole(userId);mod+=sysUserMapper.deleteUserByPk(userId);returnmod;}圖5-8用戶管理圖5-9用戶添加圖5-10用戶編輯圖5-11用戶刪除(1)角色管理角色主要有角色代碼和角色名稱屬性其添加和編輯頁面與用戶管理頁面雷同這里不再贅述,如圖5-12所示。關(guān)鍵代碼如下:@OverridepublicList<SysRole>list(SysRolequery){returnsysRoleMapper.listByQuery(query);}@OverridepublicSysRoledetails(IntegerroleId){returnsysRoleMapper.selectByPrimaryKey(roleId);}@Overridepublicintadd(SysRolerole){EmisValidUtils.validate(role,ValidGroups.Insert.class);returnsysRoleMapper.insertSelective(role);}@Overridepublicintedit(SysRolerole){EmisValidUtils.validate(role,ValidGroups.Update.class);returnsysRoleMapper.updateByPrimaryKey(role);}@Overridepublicintdel(IntegerroleId){returnsysRoleMapper.deleteByPrimaryKey(roleId);}圖5-12角色管理(2)資源管理資源管理是對(duì)系統(tǒng)的資源進(jìn)行管理,主要分為兩大類資源菜單和權(quán)限,其中菜單用與頁面菜單動(dòng)態(tài)控制,而權(quán)限則是控制接口和頁面的訪問權(quán)限防止用戶越權(quán)訪問不屬于自己的資源,本系統(tǒng)中很多敏感信息權(quán)限控制是重中之重。權(quán)限控制基本細(xì)化到了每個(gè)接口除了通用的資源接口不做控制其他都有控制如圖5-13所示。關(guān)鍵代碼如下:@OverridepublicList<ResDto>list(SysResourcequery){returnsysResourceMapper.listByQuery(query);}@Overridepublicintadd(SysResourcedict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysResourceMapper.insertSelective(dict);}@Overridepublicintedit(SysResourcedict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysResourceMapper.updateByPrimaryKeySelective(dict);}@Overridepublicintdel(IntegerresId){if(resId==null){thrownewServiceException(400,"缺少資源ID參數(shù)");}SysResourcefilter=newSysResource();filter.setResId(resId);List<ResDto>resList=sysResourceMapper.listByQuery(filter);if(resList==null||resList.isEmpty()){thrownewServiceException(400,"未找到指定ID資源或已刪除");}returnsysResourceMapper.deleteByPrimaryKey(resId);}圖5-13資源管理(3)授權(quán)管理授權(quán)管理承擔(dān)了管理誰有什么權(quán)限的功能。用戶與角色一對(duì)多關(guān)聯(lián),角色又與資源一對(duì)多關(guān)聯(lián),這樣的組合控制了每個(gè)用戶的具體資源權(quán)限。用戶角色授權(quán):控制用戶有什么角色,先選中左邊的角色通過然后添加和刪除該角色關(guān)聯(lián)的用戶如圖5-14所示。角色資源授權(quán):控制角色可以看到那些菜單頁面以及可以訪問哪些接口,先選中左邊的角色反顯角色擁有的菜單,然后通過選中右邊的資源并點(diǎn)擊保存來修改角色擁有的資源。這里使用了java8的新特性對(duì)兩個(gè)集合做對(duì)比,摘取關(guān)鍵代碼如下:/***比較新舊集合判斷哪些需要更新哪些需要?jiǎng)h除哪些需要添加*@paramsrc原集合*@paramtarget目標(biāo)集合*@paramequals判斷元素相等的方法*@paramneedUpdate判斷元素需要更新的方法*@param<E>元素類型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target,BiFunction<E,E,Boolean>equals,BiFunction<E,E,E>needUpdate){ComparativeResult<E>result=newComparativeResult<E>();if(equals==null){equals=Objects::equals;}for(Es:src){booleanhas=false;for(Et:target){if(equals.apply(s,t)){has=true;if(needUpdate==null){result.getNothing().add(t);}else{Eu=needUpdate.apply(s,t);if(u!=null){result.getUpdate().add(u);}else{result.getNothing().add(t);}}}}if(!has){result.getDel().add(s);}}for(Et:target){booleanhas=false;for(Es:src){if(equals.apply(s,t)){has=true;break;}}if(!has){result.getAdd().add(t);}}returnresult;}/***比較新舊集合判斷哪些需要更新哪些需要?jiǎng)h除哪些需要添加*@paramsrc原集合*@paramtarget目標(biāo)集合*@param<E>元素類型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target){returncomparative(src,target,null,null);}/***比較新舊集合判斷哪些需要更新哪些需要?jiǎng)h除哪些需要添加*@paramsrc原集合*@paramtarget目標(biāo)集合*@paramgetKey獲取元素的唯一KEY*@param<E>元素類型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target,Function<E,Object>getKey){returncomparative(src,target,(s,t)->Objects.equals(getKey.apply(s),getKey.apply(t)),null);}publicRroleNotLinkedUser(IntegerroleId){returnR.data(sysUserRoleMapper.roleNotLinkedUser(roleId));}publicRaddRoleUser(@RequestParamIntegerroleId,@RequestParamIntegeruserId){SysUserRoleuserRole=newSysUserRole();userRole.setUserId(userId);userRole.setRoleId(roleId);sysUserRoleMapper.insertSelective(userRole);returnR.ok("關(guān)聯(lián)用戶成功");}publicRdelRoleUser(@RequestParamIntegerroleId,@RequestParamIntegeruserId){SysUserRoleuserRole=newSysUserRole();userRole.setUserId(userId);userRole.setRoleId(roleId);sysUserRoleMapper.delete(userRole);returnR.ok("取消關(guān)聯(lián)用戶成功");}privateintuserLinkRole(IntegeruserId,Set<Integer>roleIds){List<SysRole>role=sysUserMapper.userLinkedRole(userId);ComparativeResult<Integer>rs=ComparativeUparative(role.stream().map(SysRole::getRoleId).collect(Collectors.toList()),roleIds);intadd=0;if(rs.getDel().size()>0){//刪除需要?jiǎng)h除的角色add+=sysUserMapper.userClearRole(userId,newHashSet<>(rs.getDel()));}if(rs.getAdd().size()>0){//添加需要關(guān)聯(lián)的角色add+=sysUserMapper.userLinkRole(userId,newHashSet<>(rs.getAdd()));}returnadd;}@OverridepublicRroleResLink(Map<Integer,List<Integer>link){if(!link.isEmpty()){for(Map.Entry<Integer,List<Integer>e:link.entrySet()){SysRoleResoldFilter=newSysRoleRes();oldFilter.setRoleId(e.getKey());List<SysRoleRes>oldRes=sysRoleResMapper.select(oldFilter);List<SysRoleRes>newRes=e.getValue().stream().map(rid->{SysRoleResr=newSysRoleRes();r.setRoleId(e.getKey());r.setResId(rid);returnr;}).collect(Collectors.toList());ComparativeResult<SysRoleRes>rs=ComparativeUparative(oldRes,newRes,SysRoleRes:getResId);rs.getAdd().forEach(sysRoleResMapper:insert);rs.getDel().forEach(d->sysRoleResMapper.deleteByPrimaryKey(d.getRrId()));}}else{returnR.err(400,"參數(shù)缺失");}returnR.ok("更新成功");}圖5-14用戶角色授權(quán)圖5-15角色資源授權(quán)(4)字典管理考試報(bào)名系統(tǒng)的字典主要用于系統(tǒng)各功能的下拉選擇框的值進(jìn)行管理增加系統(tǒng)可維護(hù)性,字典管理用于對(duì)系統(tǒng)的字典進(jìn)行管理,這里采用樹形列表進(jìn)行展示能更加直觀地看出部門層級(jí),如圖5-16所示。關(guān)鍵代碼如下:@OverridepublicList<DictDto>list(SysDictquery){returnsysDictMapper.listByQuery(query);}@Overridepublicintadd(SysDictdict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysDictMapper.insert(dict);}@Overridepublicintedit(SysDictdict){EmisValidUtils.validate(dict,ValidGroups.Update.class);returnsysDictMapper.updateByPrimaryKeySelective(dict);}@Overridepublicintdel(IntegerdictId){if(dictId==null){thrownewServiceException(400,"缺少字典ID參數(shù)");}SysDictfilter=newSysDict();filter.setDictId(dictId);List<DictDto>dictList=sysDictMapper.listByQuery(filter);if(dictList==null||dictList.isEmpty()){thrownewServiceException(400,"未找到指定ID字典或已刪除");}returnsysDictMapper.deleteByPrimaryKey(dictId);}圖5-16字典管理(5)系統(tǒng)參數(shù)管理系統(tǒng)參數(shù)管理用于對(duì)系統(tǒng)性配置進(jìn)行管理,更加靈活的變更系統(tǒng)的運(yùn)行狀態(tài),運(yùn)行方式等,如圖5-17所示這里修改了系統(tǒng)顯示名稱。關(guān)鍵代碼如下:publicSysConfServiceImpl(SysConfMappersysConfMapper){this.sysConfMapper=sysConfMapper;reloadConf();}privateMap<String,String>confMap;@OverridepublicMap<String,String>getConfMap(){returnconfMap;}@OverridepublicList<SysConf>list(){returnsysConfMapper.selectAllConf();}@Overridepublicintedit(SysConfsysConf){if(sysConf==null){thrownewServiceException(400,"缺少參數(shù)");}if(sysConf.getConfKey()==null){thrownewServiceException(400,"缺少配置key");}if(sysConf.getConfValue()==null){thrownewServiceException(400,"缺少配置值");}returnsysConfMapper.updateValue(sysConf);}@OverridepublicbooleanreloadConf(){List<SysConf>allConf=sysConfMapper.selectAllConf();confMap=allConf.stream().collect(Collectors.toMap(SysConf:getConfKey,SysConf:getConfValue));returntrue;}圖5-17系統(tǒng)參數(shù)管理5.5.2報(bào)考管理報(bào)名數(shù)據(jù)查詢頁面管理員可以對(duì)考生的報(bào)考信息進(jìn)行編輯、審核決定考生的報(bào)考申請(qǐng)是否通過如果通過生成準(zhǔn)考證號(hào),并可以按照批次狀態(tài)等篩選??荚嚦煽兛梢栽诳荚嚦煽儗?dǎo)入后及進(jìn)行查詢并且對(duì)部分信息進(jìn)行隱藏處理,界面如圖5-18、圖5-19所示。關(guān)鍵代碼如下:publicStringgetMobile(){returnmobile!=null?mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"):null;}@Overridepublicintapprove(ExamApplyapply){EmisValidUtils.validate(apply,ValidGroups.ExamApprove.class);ExamApplyapproveUpdate=newExamApply();approveUpdate.setApplyId(apply.getApplyId());approveUpdate.setApplyStatus(apply.getApplyStatus());approveUpdate.setReturnRemark(apply.getReturnRemark());//如果審核通過生成準(zhǔn)考證號(hào)if(Integer.valueOf(1).equals(approveUpdate.getApplyStatus())){approveUpdate.setExamNo(genExamNo(approveUpdate));//不通過則退款}elseif(Integer.valueOf(2).equals(approveUpdate.getApplyStatus())){refund(approveUpdate);}else{thrownewValidationException("審核狀態(tài)錯(cuò)誤:不支持的審核狀態(tài)"+approveUpdate.getApplyStatus());}returnexamApplyMapper.updateByPrimaryKeySelective(apply);}@OverridepublicRimportExamGrade(MultipartFilefile){PathtempDir=Paths.get(System.getProperty("java.io.tmpdir"),UUID.randomUUID().toString());tempDir.toFile().mkdirs();PathfilePath=Paths.get(tempDir.toString(),file.getOriginalFilename());try{//保存文件到臨時(shí)文件file.transferTo(filePath);List<ImportExamDto>examList=ExcelUtils.toExamList(filePath,ImportExamDto.class);intlineNo=0;interrCount=0;StringBuildererrMsgSb=newStringBuilder();for(ImportExamDtod:examList){lineNo+=1;try{//數(shù)據(jù)校驗(yàn)EmisValidUtils.validate(d,ValidGroups.ExamGradeImport.class);//更新考試成績ExamApplyexamImport=newExamApply();examImport.setBatchId(d.getBatchId());examImport.setSubjectId(d.getSubjectId());examImport.setExamNo(d.getExamNo());examImport.setGrade(d.getGrade());examApplyMapper.examGradeImport(examImport);}catch(Exceptione){errCount+=1;errMsgSb.append("第").append(lineNo).append("行導(dǎo)入失敗:").append(e.getMessage()).append("\r\n");logger.error("第{}行導(dǎo)入失敗",lineNo,e);}}if(errMsgSb.length()>0){returnR.ok("導(dǎo)入考試成績成功:"+(lineNo-errCount)+"條,失敗"+errCount+"條錯(cuò)誤條目詳情:"+errMsgSb);}else{returnR.ok("導(dǎo)入考試成績成功"+lineNo+"條");}}catch(Exceptione){logger.error("導(dǎo)入考試成績讀取文件失敗",e);returnR.err(500,"讀取文件失?。?+e.getMessage());}}圖5-18報(bào)考管理圖5-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論