




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
緒論研究背景與意義隨著我國(guó)高等教育水平近年來(lái)的不斷提升,對(duì)于管理學(xué)生的日常生活變得越來(lái)越難。在目前的高校學(xué)生管理工作中,很多高校已經(jīng)采用了各種形式的信息管理系統(tǒng)REF_Ref24098\r\h[1]。此外,計(jì)算機(jī)相對(duì)于人工,工作會(huì)更精準(zhǔn)也更加安全可靠。計(jì)算機(jī)技術(shù)憑借著自己無(wú)可撼動(dòng)的絕對(duì)優(yōu)勢(shì),很快就成為了各個(gè)高校不可或缺的重要的工作工具,我們的生活也無(wú)時(shí)無(wú)刻都需要數(shù)據(jù)處理,這也因此是人們廣泛的私用計(jì)算機(jī)來(lái)做為數(shù)據(jù)庫(kù)管理系統(tǒng)的原因。計(jì)算機(jī)最突出的優(yōu)點(diǎn)在于,能使用他能夠精確化管理大批量的數(shù)據(jù),也可以控制數(shù)據(jù)的精確量,這不但大幅提高了學(xué)校的工作效率,有了這些豐富的記錄方式,人們可以按照自身的需求和愛好進(jìn)行選擇REF_Ref24363\r\h[2],這也極大的提高了數(shù)據(jù)存儲(chǔ)的安全性。隨著高校招生規(guī)模的不斷擴(kuò)大,學(xué)生數(shù)量不斷增加REF_Ref24396\r\h[3],學(xué)生信息管理依舊是高等院校日常管理工作的基礎(chǔ)之一。目前,很多學(xué)校已經(jīng)建立了學(xué)生個(gè)人信息查詢窗口,大多數(shù)學(xué)校都有自己的局域網(wǎng)絡(luò),登錄校園網(wǎng)便可查詢個(gè)人信息REF_Ref24468\r\h[4],但在教師對(duì)學(xué)生的日常管理中,經(jīng)常需要修改學(xué)生的信息,例如對(duì)學(xué)生的課程信息的添加或修改、考試信息、成績(jī)信息等,重復(fù)的操作加重了教師對(duì)學(xué)生信息管理的復(fù)雜度也消耗了教師的教學(xué)熱情。并且,隨著技術(shù)的不斷進(jìn)步,現(xiàn)有的學(xué)生信息管理系統(tǒng)已經(jīng)不能夠滿足學(xué)生工作的發(fā)展需要,這出現(xiàn)了許多問題REF_Ref25846\r\h[5]例如,所使用的數(shù)據(jù)庫(kù)存儲(chǔ)量小,無(wú)法支持大量且長(zhǎng)時(shí)間的數(shù)據(jù)穩(wěn)定性和安全性保障;部分高校目前所使用的依舊是較老的單機(jī)版信息管理系統(tǒng),這使得教師和學(xué)生無(wú)法在校外得到信息,這使得軟件的維護(hù)成本較高REF_Ref25901\r\h[6]。尤其重要的是要開發(fā)一套學(xué)生信息管理系統(tǒng),提高教師管理工作的成果,實(shí)現(xiàn)信息的交流和分享,能很大程度的提升整個(gè)教育教學(xué)的質(zhì)量,能夠更加規(guī)范化。學(xué)生管理系統(tǒng)的應(yīng)用也方便了學(xué)生和教師在線的信息查詢,很大程度的降低了管理學(xué)生信息的工作難度,適當(dāng)降低了老師的工作復(fù)雜性,提高了學(xué)校的信息化校園的建設(shè)以及數(shù)字化教學(xué)的建設(shè)。1.2國(guó)內(nèi)外現(xiàn)狀學(xué)生管理也是各高校的最主要的日常管理工作項(xiàng)目之一,這涉及到了高校、院系、教師、學(xué)生等的許多方面,由于我國(guó)教育系統(tǒng)的日益更新?lián)Q代,特別是隨著高校的學(xué)分制、選課制度改革的深入開展,學(xué)生信息的日常管理和保存工作都變得越來(lái)越繁瑣,使用老舊的管理系統(tǒng)非常容易被黑客滲透,導(dǎo)致信息的大規(guī)模泄露、病毒感染等信息安全事件REF_Ref25940\r\h[7]。因此迫切需要研制和開發(fā)一種功能齊全、運(yùn)行簡(jiǎn)單、安全可靠且富有個(gè)性化特點(diǎn)的學(xué)生信息管理系統(tǒng)。國(guó)外的高等院校,和我國(guó)國(guó)內(nèi)高等院校明顯不同的是,他們通常都擁有相當(dāng)規(guī)模且固定的信息技術(shù)隊(duì)伍,來(lái)為信息系統(tǒng)建設(shè)進(jìn)行業(yè)務(wù)和技術(shù)上的支撐,而反觀我國(guó)國(guó)內(nèi)高等院校的信息化建設(shè),則因?yàn)橄鄬?duì)起步較晚,技術(shù)水平也相對(duì)比較滯后,這就造成了學(xué)校的信息化建設(shè)依舊只能在后面看別人的臉色,在數(shù)字學(xué)校理論逐步應(yīng)用的過程中,由于我國(guó)的信息化基礎(chǔ)建設(shè)程度與理念相對(duì)落后并且常常因?yàn)榻?jīng)濟(jì)跟不上等原因,國(guó)內(nèi)高等院校的信息管理在人員、結(jié)構(gòu)設(shè)置、服務(wù)范圍、服務(wù)質(zhì)量等方面都略差于國(guó)外的高校,因此國(guó)內(nèi)的學(xué)生管理信息化建設(shè)還有很長(zhǎng)的路要走。縱觀我國(guó)當(dāng)前信息化建設(shè)的研究狀況,在信息系統(tǒng)的可靠性和保證信息系統(tǒng)迭代更新等方面還存在著相當(dāng)打的不足,而且目前的信息系統(tǒng)每一個(gè)項(xiàng)目都需要單獨(dú)建立,信息共享性也不好;在以管理者為主導(dǎo)的方式中,獲得的方式取決于領(lǐng)導(dǎo)者自身對(duì)于需要獲取信息的認(rèn)識(shí)及理解,必較不容易清楚了解用戶們的真正需求,也因此沒有辦法充分地滿足他們的實(shí)際需要。信息管理系統(tǒng)他所服務(wù)的對(duì)象是數(shù)據(jù),而數(shù)據(jù)經(jīng)過封裝之后,保證了安全和實(shí)用,對(duì)高校管理工作具有突出應(yīng)用價(jià)值REF_Ref26097\r\h[8]。因此,學(xué)生管理系統(tǒng)應(yīng)該充分使用學(xué)校的校園網(wǎng)絡(luò)資源做到實(shí)現(xiàn)集中同一管理學(xué)校信息、用戶分散管理、教育資源的共用,能促進(jìn)傳統(tǒng)的學(xué)校管理方法盡快地向著現(xiàn)代化、綜合化、數(shù)字化、無(wú)紙化的方向穩(wěn)固推進(jìn),根據(jù)現(xiàn)狀規(guī)劃人才建設(shè)方案,提出人才再教育方法,拓展當(dāng)前人才質(zhì)量REF_Ref26126\r\h[9]。1.3主要研究?jī)?nèi)容本文的主要研究?jī)?nèi)容如下:1.了解相關(guān)系統(tǒng)現(xiàn)有的狀況,通過走訪和調(diào)查多個(gè)信息系統(tǒng)的運(yùn)行模式,經(jīng)過消化學(xué)習(xí)并納入自己的系統(tǒng)使用,進(jìn)行多方比對(duì)分析,發(fā)現(xiàn)了系統(tǒng)在運(yùn)行工作中存在問題并加以改進(jìn)。2.了解客戶需求,充分了解客戶對(duì)于系統(tǒng)所需要的服務(wù),并完善記錄,對(duì)的系統(tǒng)架構(gòu)、功能需求等工作做好前期規(guī)劃。3.對(duì)系統(tǒng)進(jìn)行設(shè)計(jì),創(chuàng)建E-R圖等結(jié)構(gòu),根據(jù)項(xiàng)目所需的功能,規(guī)范化設(shè)計(jì)進(jìn)行系統(tǒng)設(shè)計(jì),系統(tǒng)雛形出現(xiàn)后,開始設(shè)計(jì)客戶提到的功能需求和其他需求,對(duì)于系統(tǒng)的模塊化功能和Mysql數(shù)據(jù)庫(kù)等其他內(nèi)容,需要進(jìn)行更為細(xì)致的設(shè)計(jì)且加以測(cè)試。4.在編寫了實(shí)現(xiàn)本系統(tǒng)的系統(tǒng)代碼并且通過測(cè)試之后,完成了設(shè)計(jì)和開發(fā)學(xué)生信息管理系統(tǒng)的工作。1.4論文組織結(jié)構(gòu)本文的組織結(jié)構(gòu)如下:第一章,緒論:對(duì)于學(xué)生管理的歷史背景、管理系統(tǒng)能夠?qū)Ξa(chǎn)生高校的現(xiàn)狀、課題研究的目和為什么要設(shè)計(jì)這個(gè)系統(tǒng)進(jìn)行了簡(jiǎn)單的描述,最后結(jié)合描述。第二章,理論和技術(shù):對(duì)設(shè)計(jì)和開發(fā)這款系統(tǒng)的技術(shù)進(jìn)行了特點(diǎn)說明,為什么要用這些技術(shù)來(lái)開發(fā)系統(tǒng),他們對(duì)開發(fā)有什么好處,通過實(shí)際的開發(fā)過程進(jìn)行技術(shù)闡述。第三章,系統(tǒng)需求分析:從用戶和管理員到數(shù)據(jù)庫(kù)的多方面進(jìn)行需求分析,通過使用軟件畫出ER圖和用例圖,并畫出用例圖。第四章,系統(tǒng)設(shè)計(jì):從最開始需要的架構(gòu)框架開始設(shè)計(jì),在完成框架之后,進(jìn)行體系結(jié)構(gòu)的設(shè)計(jì),最后設(shè)計(jì)系統(tǒng)的功能模塊部分。第五章,系統(tǒng)實(shí)現(xiàn):大致說明了主要功能所需要的技術(shù)要點(diǎn),并附上核心代碼加以介紹。第六章,系統(tǒng)測(cè)試:編寫測(cè)試用例,對(duì)系統(tǒng)進(jìn)行軟件測(cè)試,使用黑白盒方法和測(cè)試工具,完成性能測(cè)試和壓力測(cè)試,并寫下測(cè)試結(jié)果。相關(guān)技術(shù)綜述B/S結(jié)構(gòu)B/S結(jié)構(gòu)是Browser/Server的簡(jiǎn)稱REF_Ref28089\r\h[10],由此可以看出B/S結(jié)構(gòu)體系主要由瀏覽器、服務(wù)器和服務(wù)器兩部分組成。B/S中的服務(wù)器能夠?qū)?shù)據(jù)和應(yīng)用程序整合在一起,服務(wù)器的這一特性,決定了B/S結(jié)構(gòu)的拓展性和靈活性。Java上世紀(jì)的90年代,由詹姆斯.高斯林、帕特里克、等幾位杰出的美國(guó)工程師在C語(yǔ)言的基礎(chǔ)上,設(shè)計(jì)并開發(fā)了一款面向?qū)ο笄覙O為好用的編程語(yǔ)言,在1995年被SUN公司正式將其命名為Java。目前java任然是使用最廣泛的編程語(yǔ)言之一REF_Ref17428\r\h[11]。SSM企業(yè)中,最受歡迎同時(shí)也是使用最多的框架就是SSM,SSM是Java語(yǔ)言中最能夠代表web框架的一種。MVC的設(shè)計(jì)框架參照是SSM的標(biāo)準(zhǔn)進(jìn)行設(shè)計(jì)的,但是MVC與SSM并不相同,MVC主要分為分為四層:視圖層、控制層、dao層與服務(wù)層。而SSM則是三個(gè)模塊:SpringMVC、Spring和mybatis所組成,他們結(jié)合起來(lái)完成整個(gè)業(yè)務(wù)。SpringSpring是一種亦在解決企業(yè)應(yīng)用開發(fā)所設(shè)計(jì)創(chuàng)建的,他的存在是為了解決邏輯類和其他類之間所產(chǎn)生出來(lái)的問題。Spring它是基于接口編程而來(lái),不管是從他自生的體積還是開發(fā)的成本來(lái)說,最好最優(yōu)的必定是Spring。Spring的Java工廠模式是他的核心技術(shù)之一。這個(gè)模式是開發(fā)人員最為喜愛的一種創(chuàng)建模式之一。開發(fā)人員可以通過new關(guān)鍵字創(chuàng)建一個(gè)新的對(duì)象。SpringMVCSpringMVC是用于Web開發(fā)的一個(gè)功能模塊,MVC是model(模型)、views(視圖)以及controller(控制器)REF_Ref19531\r\h[12]三個(gè)部分的縮寫。它也是目前使用得最多的一種Web框架,在開發(fā)界非常的受歡迎,同時(shí)也在辦公開發(fā)領(lǐng)域也全面施展。MyBatisMyBatis其實(shí)就是一個(gè)JDBC包,它能使底層的數(shù)據(jù)庫(kù)操作更加透明。MyBatis解決了JDBC代碼中參數(shù)在Java類中手動(dòng)配置問題和對(duì)結(jié)果集的手工檢索問題REF_Ref12755\r\h[13],MyBatis能夠通過配置文件關(guān)聯(lián)實(shí)體類映射器文件,數(shù)據(jù)庫(kù)中的類可以通過配置SQL映射到數(shù)據(jù)庫(kù)中進(jìn)行操作。用戶通過點(diǎn)擊瀏覽器,控制器獲取到動(dòng)作后發(fā)送請(qǐng)求。只有所有業(yè)務(wù)都被處理完畢之后,才會(huì)把數(shù)據(jù)送到控制臺(tái),控制臺(tái)接收到處理完畢的數(shù)據(jù)后,通過視圖將處理完畢的數(shù)據(jù)顯示在當(dāng)前頁(yè)面,從而完成處理工作。Ajax自從Ajax誕生以后,Ajax技術(shù)廣泛應(yīng)用于web應(yīng)用中REF_Ref28530\r\h[14]。Ajax它允許頁(yè)面的本地刷新,以及前后站之間的異步數(shù)據(jù)交換,對(duì)于交互方面,他能夠給客戶帶來(lái)更好的一個(gè)體驗(yàn)。Ajax技術(shù)對(duì)比Web技術(shù)具有以下特點(diǎn)優(yōu)點(diǎn):1.與傳統(tǒng)的Web程序不一樣的是,Ajax要完成數(shù)據(jù)的請(qǐng)求的話,只能使用JavaScript中的XMLHttprequest對(duì)象。2.Ajax發(fā)出數(shù)據(jù)請(qǐng)求之后,服務(wù)端收到請(qǐng)求并開始處理,Ajax的服務(wù)的只處理客戶端發(fā)出請(qǐng)求的數(shù)據(jù),而不是像以前的web服務(wù)對(duì)整個(gè)界面進(jìn)行響應(yīng),這樣的好處就是在客戶的體驗(yàn)上要明顯高于之前。3.Ajax不需要像web端一樣,要等數(shù)據(jù)響應(yīng)處理完才能打開界面,它通過特有的異步刷新模式,減少了客戶等待的時(shí)間。MySQLMySQL他是一款關(guān)系型的數(shù)據(jù)庫(kù),它擁有很多版本。MySQL中有五個(gè)部分負(fù)責(zé)日常的工作,他們分別是:連接模塊單元、SQL解析模塊單元、查詢緩存模塊單元、SQL優(yōu)化器模塊單元和存儲(chǔ)引擎模塊單元。數(shù)據(jù)庫(kù)操作組件DatabaseOperator為了保留調(diào)試和SQL優(yōu)化的特性,選擇采用JDBC來(lái)直接操作數(shù)據(jù)庫(kù)。REF_Ref28569\r\h[15]需求分析每一款程序系統(tǒng)在設(shè)計(jì)初期,通常第一步就是獲得用戶的需求,通過客戶的需求來(lái)制定這款系統(tǒng)的主體功能。系統(tǒng)需求第一步得看系統(tǒng)的整體,第二步看用例的分析報(bào)告,從而得出分析方案。系統(tǒng)其他細(xì)微功能則是看系統(tǒng)完成后的整體性能、各個(gè)功能模塊的交互性時(shí)候達(dá)標(biāo)和系統(tǒng)的安全性等方面。系統(tǒng)可行性是從經(jīng)濟(jì)可行性、技術(shù)可行性、使用可行性等多個(gè)角度來(lái)判斷該系統(tǒng)的開發(fā)能不能行得通。系統(tǒng)流程分析每一個(gè)系統(tǒng)在開發(fā)的時(shí)候都有一個(gè)流程,在收到開發(fā)任務(wù)之后的第一時(shí)間,找到用戶詢問對(duì)于系統(tǒng)想要的功能,然后對(duì)癥下藥進(jìn)行分析,最后,根據(jù)自己獲取到的功能需求,做前期的數(shù)據(jù)庫(kù)設(shè)計(jì)和系統(tǒng)框架的設(shè)計(jì)。學(xué)生信息管理系統(tǒng)的開發(fā)過程如圖3-1所示。圖3-1系統(tǒng)流程系統(tǒng)完成開發(fā)后,用戶就可以登錄系統(tǒng)了,在登錄之前需要用戶注冊(cè)賬號(hào),完成后登錄系統(tǒng)。當(dāng)在此登錄界面時(shí),用戶需要已注冊(cè)的賬號(hào)和驗(yàn)證碼,完成后點(diǎn)擊登錄,數(shù)據(jù)庫(kù)對(duì)拿注冊(cè)時(shí)的信息進(jìn)行比對(duì),成功的話,就可以順利的進(jìn)入系統(tǒng),失敗就會(huì)收到提示,告訴用戶哪里出錯(cuò)了,需要改哪里的信息進(jìn)行登錄。系統(tǒng)登錄執(zhí)行流程如圖3-2所示。圖3-2系統(tǒng)執(zhí)行流程圖系統(tǒng)功能需求分析功能需求也是設(shè)計(jì)系統(tǒng)功能模塊的一部分,是根據(jù)用戶提出的要求進(jìn)行分析的過程,同時(shí)對(duì)分析出來(lái)的信息和用戶的實(shí)際情況進(jìn)行調(diào)查,唯一的目標(biāo)是實(shí)現(xiàn)用戶所期望的學(xué)生信息管理系統(tǒng)。根據(jù)不同用戶提出來(lái)的不同需求,系統(tǒng)在開始開發(fā)之前,需要和用戶詳細(xì)溝通,了解用戶喜好,與客戶溝通協(xié)商的基本功能需求,為下個(gè)階段的設(shè)計(jì)開發(fā)做準(zhǔn)備。系統(tǒng)非功能需求性分析為了設(shè)計(jì)和開發(fā)系統(tǒng),需要檢測(cè)和準(zhǔn)備系統(tǒng)的功能模塊和能需求,為了在體驗(yàn)上給客戶帶來(lái)良好的感受,非功能需求也同樣不能少。對(duì)于系統(tǒng)非功能性的要求必須具備以下幾點(diǎn):便捷性、安全性、可增添性、低延時(shí)等。這直接掌握著系統(tǒng)能夠給客戶帶來(lái)良好體驗(yàn)的關(guān)鍵,下面簡(jiǎn)要介紹一下系統(tǒng)非功能性的分析指標(biāo)。1.易操作性:用戶永遠(yuǎn)是開發(fā)前第一個(gè)考慮到的,在各行各業(yè)或多或少都存在使用學(xué)生信息管理系統(tǒng)的用戶,因此,在設(shè)計(jì)學(xué)生信息管理系統(tǒng)的頁(yè)面結(jié)構(gòu)和業(yè)務(wù)邏輯時(shí),要保證系統(tǒng)的干凈整潔、簡(jiǎn)單實(shí)用。2.安全性:用戶是否使用本系統(tǒng),它的安全性是需要特別關(guān)注的,用戶的個(gè)人信息將會(huì)大量的存著與學(xué)生信息管理系統(tǒng)中,如果發(fā)生大面積的數(shù)據(jù)信息泄露,會(huì)給用戶造成很多不必要的影響。因此,應(yīng)加強(qiáng)系統(tǒng)安全性設(shè)計(jì),如防御SQL注入、頁(yè)面授權(quán)等。3.可增添性:隨著系統(tǒng)運(yùn)行的時(shí)間增加,用戶數(shù)量也在不斷增加。因此,在系統(tǒng)設(shè)計(jì)開始時(shí),一定要考慮到系統(tǒng)未來(lái)的升級(jí),做好后背模塊的預(yù)留,并根據(jù)可擴(kuò)展性的要求編寫一些關(guān)鍵代碼,而不是直接編寫一些簡(jiǎn)單的函數(shù)來(lái)快速開發(fā)。4.系統(tǒng)日志:系統(tǒng)日志要搭配著系統(tǒng)的安全來(lái)使用,系統(tǒng)在運(yùn)行時(shí),系統(tǒng)日志需要記錄整個(gè)系統(tǒng)運(yùn)行時(shí)的狀態(tài),并保存?zhèn)浞荩送猓芾韱T也要時(shí)刻注意日志的報(bào)錯(cuò)信息和收攻擊的信息,做到及時(shí)發(fā)現(xiàn)及時(shí)處理。5.低延時(shí):延時(shí)低才能給用戶帶來(lái)最好的體驗(yàn),在開發(fā)之前,想好用什么技術(shù),必須要保證系統(tǒng)的延時(shí)不能夠高于500毫秒。系統(tǒng)可行性分析經(jīng)濟(jì)可行性分析為了確保系統(tǒng)的開發(fā)不會(huì)因?yàn)橘Y金問題而暫?;蚪K止,我首先分析了開發(fā)整個(gè)系統(tǒng)的經(jīng)濟(jì)可行性。本系統(tǒng)所使用的軟件都是開源的軟件,在官網(wǎng)就能下載。在開發(fā)的時(shí)候,可以把自己的主機(jī)當(dāng)作服務(wù)器并直接部署,當(dāng)系統(tǒng)能夠完成并下線,這樣就可以部署到企業(yè)的服務(wù)器中了,所以,本項(xiàng)目不存在資金問題是可行的。技術(shù)可行性分析系統(tǒng)所使用的開發(fā)語(yǔ)言為Java語(yǔ)言,數(shù)據(jù)庫(kù)則采用Mysql。從編程語(yǔ)言到數(shù)據(jù)庫(kù)所涉及的知識(shí)通常是學(xué)習(xí)的,此外,這些都是目前非常實(shí)用的主流技術(shù),不清楚的可以直接上網(wǎng)搜索教程,非常的方便。MySQL在操作上非常簡(jiǎn)單,可以在Navicat等可視化工具的幫助下建表和構(gòu)圖。對(duì)于以上介紹得出結(jié)論,開發(fā)學(xué)生信息管理系統(tǒng)所用到的技術(shù)是完全沒問題的。使用可行性分析學(xué)生信息管理系統(tǒng)頁(yè)面結(jié)構(gòu)美觀大氣,操作功能時(shí)方便快捷。不管用戶能不能很好的使用電腦,用戶都可以快速啟動(dòng)系統(tǒng)。對(duì)于以上介紹得出結(jié)論,該系統(tǒng)在實(shí)際應(yīng)用中是完全沒問題的。管理可行性分析學(xué)生信息管理系統(tǒng)是一款web應(yīng)用系統(tǒng),它對(duì)于學(xué)生管理工作有著很好的意義。對(duì)于前端管理、后臺(tái)管理、用戶管理、日志管理等,都是由管理員進(jìn)行日常的維護(hù)。系統(tǒng)用例分析管理員用例分析管理員的功能有:老師信息管理、學(xué)生信息管理、通知公告發(fā)布、課程信息管理、留言信息管理、教學(xué)任務(wù)管理、成績(jī)信息管理和成績(jī)統(tǒng)計(jì)管理功能的操作。為了方便用戶賬戶信息的管理工作,當(dāng)發(fā)現(xiàn)用戶的帳戶出現(xiàn)了問題時(shí),管理員能夠及時(shí)處理,發(fā)現(xiàn)用戶的賬號(hào)做出疑問行操作后,管理員在數(shù)據(jù)庫(kù)中有權(quán)禁用賬戶、解除禁用甚至可以直接刪除該帳戶。管理員的用例如圖3-3所示。圖3-3管理員用例圖教師用例分析在本系統(tǒng)中,只有登錄的教師才能進(jìn)行通知公告查看、課程信息管理、選課學(xué)生管理、學(xué)生留言管理,教學(xué)任務(wù)管理,成績(jī)信息管理,成績(jī)統(tǒng)計(jì)操作。教師的用例如圖3-4所示。圖3-4教師用例圖學(xué)生用例分析在本系統(tǒng)中,只有登錄的學(xué)生才可以進(jìn)行通知公告查看、課程信息查看、我的選課操作、我的留言管理、成績(jī)信息查看操作。學(xué)生的用例如圖3-5所示。圖3-5學(xué)生用例圖系統(tǒng)設(shè)計(jì)系統(tǒng)總體架構(gòu)本系統(tǒng)的整體架構(gòu)是在B/S體系結(jié)構(gòu)上進(jìn)行搭建和完善的,整個(gè)系統(tǒng)從上到下分別為:前端UI、展示層、業(yè)務(wù)層、數(shù)據(jù)層和數(shù)據(jù)庫(kù)。系統(tǒng)的架構(gòu)圖如圖4-1所示。圖4-1系統(tǒng)整體架構(gòu)圖系統(tǒng)流程系統(tǒng)的流程圖如圖4-2所示。圖4-2系統(tǒng)操作流程圖數(shù)據(jù)庫(kù)設(shè)計(jì)通過對(duì)系統(tǒng)的需求分析,本系統(tǒng)分為三個(gè)角色,分別是:管理員和教師和學(xué)生。每個(gè)角色都有不同的權(quán)限。數(shù)據(jù)庫(kù)主要表的表結(jié)構(gòu)如下:1.課程信息(course)表,如表4-1所示。表4-1course表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1idint(20)是是2namevarchar(255)否否名稱3userint(20)否否所屬教師4contenttext否否課程介紹5xieshivarchar(255)否否課程學(xué)時(shí)6gmtTimedatetime否否添加時(shí)間7begindatetime否否8enddatetime否否2.選課信息(courseord)表,如表4-2所示。表4-2courseord表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1idint(20)是是2courseint(20)否否課程3userint(20)否否選課學(xué)生4teacherint(20)否否所屬教師5gmtTimedatetime否否添加時(shí)間6statevarchar(255)否否7scoredouble(22)否否3.通知公告(news)表,如表4-3所示。表4-3news表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1idint(20)是是2titlevarchar(255)否否標(biāo)題3contenttext否否內(nèi)容4gmtTimedatetime否否添加時(shí)間4.留言信息(reply)表,如表4-4所示。表4-4reply表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1idint(20)是是2contenttext否否內(nèi)容3userint(20)否否留言人4teacherint(20)否否老師5replyvarchar(255)否否回復(fù)6gmtTimedatetime否否添加時(shí)間5.角色(sys_role)表,如表4-5所示。表4-5sys_role表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1role_idint(20)是是2role_namevarchar(100)否否角色名稱3remarkvarchar(100)否否備注4create_user_idint(20)否否創(chuàng)建者ID5create_timedatetime否否創(chuàng)建時(shí)間6.系統(tǒng)用戶(sys_user)表,如表4-6所示。表4-6sys_user表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1user_idint(20)是是2usernamevarchar(50)否是用戶名3passwordvarchar(100)否否密碼4emailvarchar(100)否否郵箱5mobilevarchar(100)否否手機(jī)號(hào)6statustinyint(4)否否狀態(tài)0:禁用1:正常7create_user_idint(20)否否創(chuàng)建者ID8create_timedatetime否否創(chuàng)建時(shí)間9typevarchar(255)否否7.教學(xué)任務(wù)(task)表,如表4-7所示。表4-7task表序號(hào)字段名數(shù)據(jù)類型主鍵非空描述1idint(20)是是2namevarchar(255)否否名稱3userint(20)否否教學(xué)教師4timedatetime否否教學(xué)日期5contentnvarchar(255)否否教學(xué)內(nèi)容6urlvarchar(255)否否備案文件7gmtTimedatetime否否添加時(shí)間系統(tǒng)功能設(shè)計(jì)登錄注冊(cè)對(duì)于沒有賬號(hào)的用戶,本系統(tǒng)將不開發(fā)給這類用戶使用,如果想使用,那就必須要注冊(cè),注冊(cè)成功夠測(cè)才能使用系統(tǒng)。如圖4-10,4-11所示。圖4-10注冊(cè)時(shí)序圖圖4-11用戶登錄時(shí)序圖用戶管理管理員可以對(duì)教師和學(xué)生的賬戶進(jìn)行增刪查改鎖等管理性操作。如圖4-12所示:圖4-12用戶信息管理活動(dòng)圖信息管理為了確保個(gè)人信息在系統(tǒng)中的安全,就必須先成功登錄系統(tǒng),才能夠使用。系統(tǒng)時(shí)序圖如圖4-13所示。圖4-13信息管理時(shí)序圖信息檢索用戶可以使用搜索查詢功能對(duì)想查找的信息進(jìn)行快速查詢。信息查詢功能流程圖如圖4-14所示。圖4-14信息檢索流程圖系統(tǒng)功能實(shí)現(xiàn)管理員在進(jìn)入系統(tǒng)后,用戶需要輸入之前注冊(cè)的賬戶信息和驗(yàn)證碼。系統(tǒng)判斷信息和驗(yàn)證碼是否正確。只有當(dāng)數(shù)據(jù)庫(kù)中的信息驗(yàn)證通過,才能夠成功登錄系統(tǒng)并跳轉(zhuǎn)到系統(tǒng)的主頁(yè)。如果輸入的信息和驗(yàn)證碼其中一個(gè)錯(cuò)誤,系統(tǒng)也不會(huì)成功登錄,登錄失敗后,會(huì)向用戶提示錯(cuò)誤消息,讓用戶自行修改信息。登錄界面如圖5-1所示。圖5-1登錄界面管理員依次輸入賬號(hào)、密碼,點(diǎn)擊登陸按鈕,login頁(yè)面調(diào)用login方法把數(shù)據(jù)傳送到后端SysLoginController中,之后數(shù)據(jù)會(huì)傳到shiro中的UserRealm中驗(yàn)證賬號(hào)、密碼是否正確。代碼如下Login.html代碼login:function(event){vardata="username="+this.username+"&password="+this.password+"&captcha="+this.captcha;$.ajax({type:"POST",url:"sys/login",data:data,dataType:"json",success:function(result){if(result.code==0){//登錄成功parent.location.href='index.html';}else{vm.error=true;vm.errorMsg=result.msg;vm.refreshCode();}}});}SysLoginController代碼/***登錄*/@ResponseBody@RequestMapping(value="/sys/login",method=RequestMethod.POST)publicRlogin(Stringusername,Stringpassword,Stringcaptcha)throwsIOException{ Stringkaptcha=ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY); if(!captcha.equalsIgnoreCase(kaptcha)){ returnR.error("驗(yàn)證碼不正確"); }try{Subjectsubject=ShiroUtils.getSubject();//sha256加密password=newSha256Hash(password).toHex();UsernamePasswordTokentoken=newUsernamePasswordToken(username,password);subject.login(token);}catch(UnknownAccountExceptione){returnR.error(e.getMessage());}catch(IncorrectCredentialsExceptione){returnR.error(e.getMessage());}catch(LockedAccountExceptione){returnR.error(e.getMessage());}catch(AuthenticationExceptione){returnR.error("賬戶驗(yàn)證失敗");}returnR.ok();}UserRealm代碼/***認(rèn)證(登錄時(shí)調(diào)用)*/@OverrideprotectedAuthenticationInfodoGetAuthenticationInfo( AuthenticationTokentoken)throwsAuthenticationException{Stringusername=(String)token.getPrincipal();Stringpassword=newString((char[])token.getCredentials());//查詢用戶信息SysUserEntityuser=sysUserService.queryByUserName(username);//賬號(hào)不存在if(user==null){thrownewUnknownAccountException("賬號(hào)不正確");}//密碼錯(cuò)誤if(!password.equals(user.getPassword())){thrownewIncorrectCredentialsException("密碼不正確");}//賬號(hào)鎖定if(user.getStatus()==0){ thrownewLockedAccountException("賬號(hào)已鎖定,請(qǐng)通知管理員");}SimpleAuthenticationInfoinfo=newSimpleAuthenticationInfo(user,password,getName());returninfo;}}教師信息管理教師信息管理頁(yè)面如圖5-2所示。圖5-2教師信息管理管理員點(diǎn)擊系統(tǒng)教師信息后,頁(yè)面會(huì)調(diào)用List方式跳轉(zhuǎn)到SysUserControlle之后SysUserControlle中的list查詢到學(xué)生信息并列表返回user,js中,之后user.js通過type查詢到教師信息并列表返回到前端界面到前端界面。教師信息管理關(guān)鍵代碼如下。SysUserControlle代碼@RestController@RequestMapping("/sys/user")publicclassSysUserControllerextendsAbstractController{@AutowiredprivateSysUserServicesysUserService;@AutowiredprivateSysUserRoleServicesysUserRoleService;/***所有用戶列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<SysUserEntity>userList=sysUserService.queryList(query);inttotal=sysUserService.queryTotal(query);PageUtilspageUtil=newPageUtils(userList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}/sys/user.js代碼$(function(){$("#jqGrid").jqGrid({url:'../sys/user/list?type=1',datatype:"json",colModel:[{name:'userId',index:'userId',width:0,hidden:true,key:true}, {label:'用戶名',name:'username',width:75},{label:'郵箱',name:'email',width:90}, {label:'手機(jī)號(hào)',name:'mobile',width:100}, {label:'狀態(tài)',name:'status',width:80,formatter:function(value,options,row){returnvalue===0? '<spanclass="labellabel-danger">禁用</span>': '<spanclass="labellabel-success">正常</span>';}}, {label:'創(chuàng)建時(shí)間',name:'createTime',index:"create_time",width:80}],學(xué)生信息管理學(xué)生信息管理如圖5-3所示。圖5-3學(xué)生信息管理頁(yè)面管理員點(diǎn)擊系統(tǒng)學(xué)生信息后,頁(yè)面會(huì)調(diào)用List方式跳轉(zhuǎn)到SysUserControlle之后SysUserControlle中的list查詢到學(xué)生信息并列表返回user,js中,之后user.js通過type查詢到學(xué)生信息并列表返回到前端界面到前端界面。學(xué)生信息管理關(guān)鍵代碼如下。SysUserControlle代碼@RestController@RequestMapping("/sys/user")publicclassSysUserControllerextendsAbstractController{@AutowiredprivateSysUserServicesysUserService;@AutowiredprivateSysUserRoleServicesysUserRoleService;/***所有用戶列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<SysUserEntity>userList=sysUserService.queryList(query);inttotal=sysUserService.queryTotal(query);PageUtilspageUtil=newPageUtils(userList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}/admin/user.js代碼$(function(){$("#jqGrid").jqGrid({url:'../sys/user/list?type=3',datatype:"json",colModel:[{name:'userId',index:'userId',width:0,hidden:true,key:true}, {label:'用戶名',name:'username',width:75},{label:'郵箱',name:'email',width:90}, {label:'手機(jī)號(hào)',name:'mobile',width:100}, {label:'狀態(tài)',name:'status',width:80,formatter:function(value,options,row){returnvalue===0? '<spanclass="labellabel-danger">禁用</span>': '<spanclass="labellabel-success">正常</span>';}}, {label:'創(chuàng)建時(shí)間',name:'createTime',index:"create_time",width:80}],通知公告信息管理通知公告信息管理頁(yè)面如圖5-4所示。圖5-4通知公告管理頁(yè)面管理員點(diǎn)擊通知公告后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到NewController,之后NewController中的list方法查詢到通知公告信息并返回到前端。相關(guān)代碼如下。***通知公告*/@RestController@RequestMapping("news")publicclassNewsControllerextendsAbstractController{@AutowiredprivateNewsServicenewsService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){//查詢列表數(shù)據(jù)Queryquery=newQuery(params); List<NewsEntity>newsList=newsService.queryList(query);inttotal=newsService.queryTotal(query); pageUtilspageUtil=newPageUtils(newsList,total,query.getLimit(),query.getPage()); returnR.ok().put("page",pageUtil);}留言信息管理留言信息頁(yè)面如圖5-5所示。圖5-5留言信息頁(yè)面管理員點(diǎn)擊留言信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到ReplyController,之后ReplyController中的list方法查詢到留言信息并返回到前端。相關(guān)代碼如下。/***留言信息*/@RestController@RequestMapping("reply")publicclassReplyControllerextendsAbstractController{@AutowiredprivateReplyServicereplyService;/***列表*/@RequestMapping("/list") publicRlist(@RequestParamMap<String,Object>params){ if(super.getUserId()>1&&"3".equals(super.getUser().getType()))params.put("user",super.getUserId()); if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("teacher",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params); List<ReplyEntity>replyList=replyService.queryList(query);inttotal=replyService.queryTotal(query); PageUtilspageUtil=newPageUtils(replyList,total,query.getLimit(),query.getPage()); returnR.ok().put("page",pageUtil);}教學(xué)任務(wù)信息教學(xué)任務(wù)信息頁(yè)面如圖5-6所示。圖5-6教學(xué)任務(wù)頁(yè)面管理員點(diǎn)擊教學(xué)任務(wù)后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到TaskController,之后TaskController中的list方法查詢到教學(xué)任務(wù)信息并返回到前端。相關(guān)代碼如下。/***教學(xué)任務(wù)*/@RestController@RequestMapping("task")publicclassTaskControllerextendsAbstractController{@AutowiredprivateTaskServicetaskService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){if(super.getUserId()>1)params.put("user",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<TaskEntity>taskList=taskService.queryList(query);inttotal=taskService.queryTotal(query); PageUtilspageUtil=newPageUtils(taskList,total,query.getLimit(),query.getPage()); returnR.ok().put("page",pageUtil);}成績(jī)信息管理成績(jī)信息頁(yè)面如圖5-7所示。圖5-7成績(jī)信息頁(yè)面管理員點(diǎn)擊成績(jī)信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseordController,之后CourseordController中的list方法查詢到成績(jī)信息并返回到前端。相關(guān)代碼如下。/***成績(jī)信息*/@RestController@RequestMapping("courseord")publicclassCourseordControllerextendsAbstractController{@AutowiredprivateCourseordServicecourseordService;@AutowiredprivateSysUserServicesysUserService;@AutowiredprivateCourseServicecourseService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){if(super.getUserId()>1&&"3".equals(super.getUser().getType()))params.put("user",super.getUserId());if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("teacher",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<CourseordEntity>courseordList=courseordService.queryList(query);inttotal=courseordService.queryTotal(query);PageUtilspageUtil=newPageUtils(courseordList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}課程信息管理課程信息頁(yè)面如圖5-8所示。圖5-8課程信息頁(yè)面管理員點(diǎn)擊課程信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseController,之后CourseController中的list方法查詢到課程信息并返回到前端。相關(guān)代碼如下。/***課程信息*/@RestController@RequestMapping("course")publicclassCourseControllerextendsAbstractController{@AutowiredprivateCourseServicecourseService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("user",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<CourseEntity>courseList=courseService.queryList(query);inttotal=courseService.queryTotal(query);PageUtilspageUtil=newPageUtils(courseList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}成績(jī)統(tǒng)計(jì)成績(jī)統(tǒng)計(jì)頁(yè)面如圖5-9所示。圖5-9成績(jī)統(tǒng)計(jì)頁(yè)面管理員點(diǎn)擊成績(jī)統(tǒng)計(jì)后,頁(yè)面會(huì)調(diào)用map方法跳轉(zhuǎn)到CourseordController,之后CourseordController中的map方法查詢到信息并返回到前端。相關(guān)代碼如下。//成績(jī)統(tǒng)計(jì)@RequestMapping("/tj/{id}")publicRtj(@PathVariable("id")Longid){Map<String,Object>params=newHashMap<>();params.put("course",id);Map<String,Integer>params1=newHashMap<>();for(CourseordEntityentity:this.courseordService.queryList(params)){if(entity.getScore()>0&&entity.getScore()<60){Integernum=params1.get("0-59");num=num==null?1:num+1;params1.put("0-59",num);}if(entity.getScore()>=60&&entity.getScore()<80){Integernum=params1.get("60-79");num=num==null?1:num+1;params1.put("60-79",num);}if(entity.getScore()>=80&&entity.getScore()<90){Integernum=params1.get("80-89");num=num==null?1:num+1;params1.put("80-89",num);}if(entity.getScore()>=90&&entity.getScore()<=100){Integernum=params1.get("90-100");num=num==null?1:num+1;params1.put("90-100",num);}}學(xué)生公告信息學(xué)生用戶打開公告信息,可以查看所有的公告信息,課程信息頁(yè)面如圖5-10所示。圖5-10公告信息頁(yè)面學(xué)生點(diǎn)擊通知公告后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到NewsController,之后NewsController中的list方法查詢到通知公告信息并返回到前端。相關(guān)代碼如下。***通知公告*/@RestController@RequestMapping("news")publicclassNewsControllerextendsAbstractController{@AutowiredprivateNewsServicenewsService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){//查詢列表數(shù)據(jù)Queryquery=newQuery(params); List<NewsEntity>newsList=newsService.queryList(query);inttotal=newsService.queryTotal(query); pageUtilspageUtil=newPageUtils(newsList,total,query.getLimit(),query.getPage()); returnR.ok().put("page",pageUtil);}課程信息課程信息頁(yè)面如圖5-11所示。圖5-11課程信息頁(yè)面學(xué)生點(diǎn)擊課程信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseController,之后CourseController中的list方法查詢到課程信息并返回到前端。相關(guān)代碼如下。/***課程信息*/@RestController@RequestMapping("course")publicclassCourseControllerextendsAbstractController{@AutowiredprivateCourseServicecourseService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("user",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<CourseEntity>courseList=courseService.queryList(query);inttotal=courseService.queryTotal(query);PageUtilspageUtil=newPageUtils(courseList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}我的選課我的選課頁(yè)面如圖5-12所示。圖5-12我的選課頁(yè)面學(xué)生點(diǎn)擊我要選課后,頁(yè)面會(huì)調(diào)用方法跳轉(zhuǎn)到CourseServicelmpl。相關(guān)代碼如下。@Overridepublicvoidsave(CourseordEntitycourseord){ courseord.setTeacher(this.courseService.queryObject(courseord.getCourse()).getUser());Map<String,Object>map=newHashMap<>();map.put("user",courseord.getUser());map.put("course",courseord.getCourse());if(this.courseordDao.queryList(map).size()>0){thrownewRRException("請(qǐng)勿重復(fù)選擇");} CourseEntitycourse=this.courseService.queryObject(courseord.getCourse()); if(System.currentTimeMillis()<course.getBegin().getTime()||System.currentTimeMillis()>course.getEnd().getTime()){ thrownewRRException("無(wú)法選課,課程時(shí)間未到或者已過");}我的成績(jī)成績(jī)信息頁(yè)面如圖5-13所示。圖5-13成績(jī)信息頁(yè)面學(xué)生點(diǎn)擊成績(jī)信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseordController,之后CourseordController中的list方法查詢到成績(jī)信息并返回到前端。相關(guān)代碼如下。/***成績(jī)信息*/@RestController@RequestMapping("courseord")publicclassCourseordControllerextendsAbstractController{@AutowiredprivateCourseordServicecourseordService;@AutowiredprivateSysUserServicesysUserService;@AutowiredprivateCourseServicecourseService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){if(super.getUserId()>1&&"3".equals(super.getUser().getType()))params.put("user",super.getUserId());if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("teacher",super.getUserId());//查詢列表數(shù)據(jù)Queryquery=newQuery(params);List<CourseordEntity>courseordList=courseordService.queryList(query);inttotal=courseordService.queryTotal(query);PageUtilspageUtil=newPageUtils(courseordList,total,query.getLimit(),query.getPage());returnR.ok().put("page",pageUtil);}教師通知公告通知公告頁(yè)面如圖5-14所示。圖5-14通知公告頁(yè)面教師點(diǎn)擊通知公告后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到NewsController,之后NewsController中的list方法查詢到通知公告信息并返回到前端。相關(guān)代碼如下。***通知公告*/@RestController@RequestMapping("news")publicclassNewsControllerextendsAbstractController{@AutowiredprivateNewsServicenewsService;/***列表*/@RequestMapping("/list")publicRlist(@RequestParamMap<String,Object>params){//查詢列表數(shù)據(jù)Queryquery=newQuery(params); List<NewsEntity>newsList=newsService.queryList(query);inttotal=newsService.queryTotal(query); pageUtilspageUtil=newPageUtils(newsList,total,query.getLimit(),query.getPage()); returnR.ok().put("page",pageUtil);}課程信息課程信息頁(yè)面如圖5-15所示。圖5-15課程信息頁(yè)面教師點(diǎn)擊課程信息后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseController,之后CourseController中的list方法查詢到通知課程信息并返回到前端。相關(guān)代碼如下。/***列表*/@RequestMapping("/list2")publicRlist2(@RequestParamMap<String,Object>params){if(super.getUserId()>1&&"1".equals(super.getUser().getType()))params.put("user",super.getUserId());Queryquery=newQuery(params);List<CourseEntity>courseList=courseService.queryList(query);returnR.ok().put("list",courseList);}/***信息*/@RequestMapping("/info/{id}")publicRinfo(@PathVariable("id")Longid){CourseEntitycourse=courseService.queryObject(id);returnR.ok().put("course",course);}/***保存*/@RequestMapping("/save")publicRsave(@RequestBodyCourseEntitycourse){if(course.getUser()==null)course.setUser(super.getUserId());courseService.save(course);returnR.ok();}/***修改*/@RequestMapping("/update")publicRupdate(@RequestBodyCourseEntitycourse){courseService.update(course);returnR.ok();}/***刪除*/@RequestMapping("/delete")publicRdelete(@RequestBodyLong[]ids){courseService.deleteBatch(ids);returnR.ok();}}選課學(xué)生選課學(xué)生頁(yè)面如圖5-16所示。圖5-16選課學(xué)生頁(yè)面教師點(diǎn)擊選課學(xué)生后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到CourseordController,之后CourseordController中的list方法查詢到選課學(xué)生信息并返回到前端。相關(guān)代碼如下。/***列表*/@RequestMapping("/list2")publicRlist2(@RequestParamMap<String,Object>params){Queryquery=newQuery(params);List<CourseordEntity>courseordList=courseordService.queryList(query);returnR.ok().put("list",courseordList);}/***信息*/@RequestMapping("/info/{id}")publicRinfo(@PathVariable("id")Longid){CourseordEntitycourseord=courseordService.queryObject(id);returnR.ok().put("courseord",courseord);}教學(xué)任務(wù)教學(xué)任務(wù)頁(yè)面如圖5-17所示。圖5-17教學(xué)任務(wù)頁(yè)面教師點(diǎn)擊教學(xué)任務(wù)后,頁(yè)面會(huì)調(diào)用list方法跳轉(zhuǎn)到TaskController,之后TaskController中的list方法查詢到教學(xué)任務(wù)信息并返回到前端。相關(guān)代碼如下。/** *列表 */ @RequestMapping("/list2") publicRlist2(@RequestParamMap<String,Object>params){Queryquery=newQuery(params); List<TaskEntity>taskList=taskService.queryList(query); returnR.ok().put("list",taskList); } /** *信息 */ @RequestMapping("/info/{id}") publicRinfo(@PathVariable("id")Longid){ TaskEntitytask=taskService.queryObject(id); returnR.ok().put("task",task); }成績(jī)信息成績(jī)信息頁(yè)面如圖5-18所示。圖5-18成績(jī)信息頁(yè)面成績(jī)批量導(dǎo)入頁(yè)面如圖5-19所示。圖5-19成績(jī)批量導(dǎo)入頁(yè)面教師點(diǎn)擊導(dǎo)入成績(jī)后,頁(yè)面會(huì)調(diào)用map方法跳轉(zhuǎn)到CourseordController,之后CourseordController會(huì)把獲取到的excel表上傳到tomcat服務(wù)器中并分析數(shù)據(jù),完成后返回前端。相關(guān)代碼如下。//從用戶表中查詢出老師idSysUserEntityteacher=sysUserService.queryByUserName(teacherNm);if(teacher==null){thrownewRRException("老師"+teacherNm+"不存在,錄入失敗");}LongteacherId=teacher.getUserId();if(super.getUserId()>1&&"1".equals(super.getUser().getType())){if(super.getUserId()!=teacherId){thrownewRRException("僅可導(dǎo)入老師自己的課程成績(jī),錄入失敗");}}//獲取課程名稱lineContent=recordList.get(2);lineArr=lineContent.split("\t");StringcourseNm=lineArr[0].substring(lineArr[0].indexOf(":")+1);//從課程表中查詢出課程idqueryMap.put("name",courseNm);queryMap.put("user",teacherId);List<CourseEntity>courseList=courseService.queryList(queryMap);if(courseList==null||courseList.size()==0){thrownewRRException("老師"+teacherNm+"的課程《"+courseNm+"》不存在,錄入失敗");}LongcourseId=courseList.get(0).getId();queryMap.put("course",courseId);//獲取學(xué)生成績(jī)intrecordSize=recordList.size();for(inti=6;i<recordSize;i++){lineContent=recordList.get(i);lineArr=lineContent.split("\t");StringstudentNm=lineArr[2];//從用戶表中查詢學(xué)生idSysUserEntitystudent=sysUserService.queryByUserName(studentNm);if(student==null){StringerrMsg="學(xué)生"+studentNm+"不存在,該條錄入失敗";rslt.add(errMsg);continue;}LongstudentId=student.getUserId();queryMap.put("user",studentId);Stringscore=lineArr[3];//判斷這個(gè)用戶是否選擇這門課List<CourseordEntity>qrycourseList=courseordService.queryList(queryMap);if(qrycourseList.size()>0){courseordEntitycourseord=qrycourseList.get(0);courseord.setCourse(courseId);courseord.setScore(Double.valueOf(score));courseord.setUser(studentId);courseord.setTeacher(teacherId);courseord.setGmttime(newDate());courseord.setState("最終");courseordService.update(courseord);}else{StringerrMsg="學(xué)生"+studentNm+"沒選這個(gè)課,無(wú)法錄入";rslt.add(errMsg);continue;}}StringconcludeStr="成功條數(shù)為:"+(recordSize-6-rslt.size())+",失敗條數(shù)為:"+rslt.size();rslt.add(concludeStr);JSONObjectrsltStr=newJSONObject();rsltStr.put("code","00");rsltStr.put("rslt",rslt);returnrsltStr;}}系統(tǒng)測(cè)試測(cè)試基礎(chǔ)對(duì)于軟件的測(cè)試,通常都是在開發(fā)進(jìn)入了收尾階段,通常很多問題都是在測(cè)試中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新疆客運(yùn)資格證實(shí)操試題
- 2025年創(chuàng)新創(chuàng)業(yè)管理專業(yè)研究生入學(xué)考試試題及答案
- 未來(lái)的生活想象想象并描寫細(xì)節(jié)類作文(6篇)
- 小品(賣藥之八仙過海)劇本
- 某超市講解服務(wù)制度
- 2025年柔性制造單元(FMC)項(xiàng)目提案報(bào)告
- 運(yùn)動(dòng)場(chǎng)館設(shè)計(jì)與運(yùn)營(yíng)合作協(xié)議
- 2025年壓縮天然氣項(xiàng)目申請(qǐng)報(bào)告
- 2025年電梯司機(jī)(中級(jí))電梯設(shè)備維護(hù)保養(yǎng)與故障排除測(cè)評(píng)試題
- 2025年物流師(初級(jí))職業(yè)技能鑒定試卷物流企業(yè)人力資源戰(zhàn)略規(guī)劃
- 出租汽車巡網(wǎng)融合發(fā)展白皮書
- 農(nóng)產(chǎn)品安全生產(chǎn)技術(shù)與應(yīng)用
- 中國(guó)特色社會(huì)主義理論體系的形成的歷史條件
- 環(huán)境藝術(shù)設(shè)計(jì)專業(yè)職業(yè)生涯規(guī)劃
- 《BA培訓(xùn)教程》課件
- 2024-2025學(xué)年陜西省西安市雁塔區(qū)高新一中七年級(jí)(上)期中數(shù)學(xué)試卷
- 《西方經(jīng)濟(jì)學(xué)(本)》形考任務(wù)(1-6)試題答案解析
- 重慶市森林資源二類調(diào)查操作細(xì)則2012年
- 分公司特種設(shè)備使用安全風(fēng)險(xiǎn)日管控、周排查、月調(diào)度管理制度特種設(shè)備安全風(fēng)險(xiǎn)管控清單記錄表等
- 《數(shù)據(jù)資產(chǎn)會(huì)計(jì)》 課件 第三章 數(shù)據(jù)資產(chǎn)的確認(rèn)和計(jì)量
- (小升初分班考)2023年小升初英語(yǔ)專題訓(xùn)練:閱讀理解(人與自然)(含答案解析)人教PEP版
評(píng)論
0/150
提交評(píng)論