基于SSM的概念可视化程序设计学习系统毕业设计源码021009
SSM概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)
摘?要
隨著計(jì)算機(jī)技術(shù)的發(fā)展,特別是計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)與數(shù)據(jù)庫(kù)技術(shù)的發(fā)展,使用人們的生活與工作方式發(fā)生了很大的改觀。網(wǎng)絡(luò)技術(shù)的應(yīng)用使得計(jì)算機(jī)之間通信、在線學(xué)習(xí)成為可能,而數(shù)據(jù)庫(kù)技術(shù)的應(yīng)用則為人們提供了數(shù)據(jù)存儲(chǔ)、課程檢索等功能,從而使得工作更高效地進(jìn)行。
本課題研究的概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng),主要功能模塊包括學(xué)生管理、課程查詢、課程類別、已選課程、在線學(xué)習(xí)以及概念圖知識(shí)店管理等,采取面對(duì)對(duì)象的開發(fā)模式進(jìn)行軟件的開發(fā)和硬體的架設(shè),能很好的滿足實(shí)際使用的需求,完善了對(duì)應(yīng)的軟體架設(shè)以及程序編碼的工作,采取MySQL作為后臺(tái)數(shù)據(jù)的主要存儲(chǔ)單元,采用SSM框架進(jìn)行系統(tǒng)的開發(fā),實(shí)現(xiàn)了本系統(tǒng)的全部功能。本次報(bào)告,首先分析了研究的背景、意義,為研究工作的合理性打下了基礎(chǔ)。針對(duì)概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)的各項(xiàng)需求以及技術(shù)問題進(jìn)行分析,證明了系統(tǒng)的必要性和技術(shù)可行性,然后對(duì)設(shè)計(jì)系統(tǒng)需要使用的技術(shù)軟件以及設(shè)計(jì)思想做了基本的介紹,最后來實(shí)現(xiàn)系統(tǒng)各大模塊。
關(guān)鍵詞:概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng);SSM框架;MySQL數(shù)據(jù)庫(kù)
SSM concept visual programming learning systemAbstract
With the development of computer technology, especially the development of computer network technology and database technology, great changes have taken place in people's way of life and work. The application of network technology makes communication between computers and online learning possible, while the application of database technology provides people with functions such as data storage and course retrieval, so as to make the work more efficient.
The main functional modules of the concept visualization program learning system studied in this subject include student management, course query, course category, selected courses, online learning and concept map knowledge store management. The object-oriented development mode is adopted for software development and hardware architecture, which can well meet the needs of practical use, The corresponding software erection and program coding are improved. MySQL is used as the main storage unit of background data, and the SSM framework is used for system development to realize all the functions of the system. This report first analyzes the background and significance of the research, which lays a foundation for the rationality of the research work. This paper analyzes the requirements and technical problems of the concept visualization program learning system, proves the necessity and technical feasibility of the system, then makes a basic introduction to the technical software and design idea needed to design the system, and finally realizes the major modules of the system.
Key words:Concept visualization program learning system; SSM framework; Mysql database
目 ?錄
第1章 緒論
1.1?研究背景
1.2?本文的組織結(jié)構(gòu)
第2章 相關(guān)技術(shù)介紹
2.1 開發(fā)技術(shù)
2.2 ssm框架介紹
2.3 MySQL數(shù)據(jù)庫(kù)
2.4 B/S結(jié)構(gòu)
2.5 B/S體系工作原理
2.6?ssm框架各層關(guān)系
2.7JavaScript 運(yùn)行模式
第3章 系統(tǒng)分析
3.1?可行性分析
3.2?功能需求分析
3.2.1?前臺(tái)用戶功能
3.2.2?后臺(tái)管理員功能
3.3?非功能需求分析
3.4?安全性需求分析
3.4.1?系統(tǒng)的安全性
3.4.2?數(shù)據(jù)的安全性
3.5?數(shù)據(jù)流程分析
第4章 系統(tǒng)設(shè)計(jì)
4.1?系統(tǒng)架構(gòu)設(shè)計(jì)
4.2?系統(tǒng)總體設(shè)計(jì)
4.3?系統(tǒng)功能設(shè)計(jì)
4.4?數(shù)據(jù)庫(kù)設(shè)計(jì)
4.4.1?數(shù)據(jù)需求分析
4.4.2?數(shù)據(jù)庫(kù)概念設(shè)計(jì)
4.4.3?數(shù)據(jù)庫(kù)表設(shè)計(jì)
第5章 系統(tǒng)實(shí)現(xiàn)
5.1?注冊(cè)模塊的實(shí)現(xiàn)
5.2?登錄模塊的實(shí)現(xiàn)
5.3?用戶資料修改模塊的實(shí)現(xiàn)
5.4?課程信息數(shù)據(jù)管理模塊的實(shí)現(xiàn)
5.5?已選課程模塊的實(shí)現(xiàn)
5.6?在線學(xué)習(xí)管理模塊的實(shí)現(xiàn)
5.7?概念圖知識(shí)點(diǎn)管理模塊的實(shí)現(xiàn)
第6章 系統(tǒng)測(cè)試
6.1?測(cè)試目的
6.2?功能測(cè)試
6.3?性能測(cè)試
第7章 總結(jié)與展望
參考文獻(xiàn)
致謝
可視化有很多種方式,包括知識(shí)的可視化,界面的可視化等。在計(jì)算機(jī)語言中可視化還可以理解為:語句的可視化,界面設(shè)計(jì)的可視化,運(yùn)行結(jié)果的可視化等等。作為計(jì)算機(jī)語言和算法的教學(xué)平臺(tái),主要強(qiáng)調(diào)的是語句的可視化,以及運(yùn)行結(jié)果的可視化。語句的可視化,即把語句本身及語句間的關(guān)系用圖形的方式表示出來。
現(xiàn)代教育技術(shù)在教育中發(fā)揮著極其重要作用。近些年來移動(dòng)學(xué)習(xí)的發(fā)展對(duì)自主學(xué)習(xí)平臺(tái)的設(shè)計(jì)提出了更高的要求。隨著社會(huì)的快速發(fā)展,國(guó)民教育日益普及化、信息化和現(xiàn)代化,計(jì)算機(jī)和信息技術(shù)的飛速發(fā)展,使得自主學(xué)習(xí)在國(guó)民教育體系中占據(jù)了重要的地位。特別是移動(dòng)互聯(lián)網(wǎng)絡(luò)和移動(dòng)媒體技術(shù)的大規(guī)模應(yīng)用,為可以應(yīng)用在移動(dòng)設(shè)備上的自主學(xué)習(xí)環(huán)境提供了支持。近年來,在經(jīng)歷了遠(yuǎn)程學(xué)習(xí)和數(shù)字學(xué)習(xí)的發(fā)展階段之后,遠(yuǎn)程教育正在向著移動(dòng)學(xué)習(xí)的方向飛速發(fā)展。充分利用移動(dòng)計(jì)算技術(shù)和便攜式設(shè)備,使學(xué)習(xí)者可以不受空間和特定環(huán)境的限制自主學(xué)習(xí)。
本文旨在探討利用SSM框架開發(fā)的概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)。該系統(tǒng)可以在移動(dòng)設(shè)備上工作,以方便學(xué)生移動(dòng)學(xué)習(xí)。這種系統(tǒng)支持一種可以解釋執(zhí)行的腳本語言,這種語言不使用鍵盤錄入,而是使用觸摸屏拖動(dòng)選擇語言支持的元素和模塊進(jìn)行組合,使得其功能等同于一種圖形化的腳本語言。并且這一系統(tǒng)有限的支持一些多媒體功能,使學(xué)生的自主學(xué)習(xí)具有更強(qiáng)的趣味,降低計(jì)算機(jī)語言學(xué)習(xí)過程中,初學(xué)者的入門門檻。
本文首先概括分析了基于SSM的可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)在開發(fā)時(shí)所面臨的主要問題。針對(duì)如何解決概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)所需要實(shí)現(xiàn)的一些功能,圖形化腳本語言所需要的設(shè)計(jì)工具以及解釋器相關(guān)技術(shù)的具體解決方案。
第一章是緒論,本文章的開頭部分,對(duì)本題目的研究背景和研究意義等一些做文字性的描述。
第二章研究了概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)所采用的開發(fā)技術(shù)和開發(fā)工具。
第三章是系統(tǒng)分析部分,包括系統(tǒng)總體需求描述、功能性角度分析系統(tǒng)需求、非功能性等各個(gè)方面分析系統(tǒng)是否可以實(shí)現(xiàn)。
第四章是系統(tǒng)設(shè)計(jì)部分,本文章的重要部分,提供了系統(tǒng)架構(gòu)的詳細(xì)設(shè)計(jì)和一些主要功能模塊的設(shè)計(jì)說明。
第五章是系統(tǒng)的具體實(shí)現(xiàn),介紹系統(tǒng)的各個(gè)模塊的具體實(shí)現(xiàn)。
第六章在前幾章的基礎(chǔ)上對(duì)系統(tǒng)進(jìn)行測(cè)試和運(yùn)行。
最后對(duì)系統(tǒng)進(jìn)行了認(rèn)真的總結(jié),以此對(duì)未來有一個(gè)新的展望。
本系統(tǒng)前端部分基于MVVM模式進(jìn)行開發(fā),采用B/S模式,后端部分基于Java的ssm框架進(jìn)行開發(fā)。
前端部分:前端框架采用了比較流行的漸進(jìn)式JavaScript框架Vue.js。使用Vue-Router和Vuex實(shí)現(xiàn)動(dòng)態(tài)路由和全局狀態(tài)管理,Ajax實(shí)現(xiàn)前后端通信,Element UI組件庫(kù)使頁(yè)面快速成型,項(xiàng)目前端通過柵格布局實(shí)現(xiàn)響應(yīng)式,可適應(yīng)PC端、平板端、手機(jī)端等不同屏幕大小尺寸的完美布局展示。
后端部分:采用ssm作為開發(fā)框架,同時(shí)集成MyBatis、Redis等相關(guān)技術(shù)。
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個(gè)開源框架整合而成(SpringMVC是Spring中的部分內(nèi)容)。常作為數(shù)據(jù)源較簡(jiǎn)單的web項(xiàng)目的框架。
1.1 Spring
Spring就像是整個(gè)項(xiàng)目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數(shù)去調(diào)用實(shí)體類的構(gòu)造方法來實(shí)例化對(duì)象。也可以稱之為項(xiàng)目中的粘合劑。
Spring的核心思想是IoC(控制反轉(zhuǎn)),即不再需要程序員去顯式地`new`一個(gè)對(duì)象,而是讓Spring框架幫你來完成這一切。
1.2 SpringMVC
SpringMVC在項(xiàng)目中攔截用戶請(qǐng)求,它的核心Servlet即DispatcherServlet承擔(dān)中介或是前臺(tái)這樣的職責(zé),將用戶請(qǐng)求通過HandlerMapping去匹配Controller,Controller就是具體對(duì)應(yīng)請(qǐng)求所執(zhí)行的操作。SpringMVC相當(dāng)于SSH框架中struts。
1.3 mybatis
mybatis是對(duì)jdbc的封裝,它讓數(shù)據(jù)庫(kù)底層操作變的透明。mybatis的操作都是圍繞一個(gè)sqlSessionFactory實(shí)例展開的。mybatis通過配置文件關(guān)聯(lián)到各實(shí)體類的Mapper文件,Mapper文件中配置了每個(gè)類對(duì)數(shù)據(jù)庫(kù)所需進(jìn)行的sql語句映射。在每次與數(shù)據(jù)庫(kù)交互時(shí),通過sqlSessionFactory拿到一個(gè)sqlSession,再執(zhí)行sql命令。
頁(yè)面發(fā)送請(qǐng)求給控制器,控制器調(diào)用業(yè)務(wù)層處理邏輯,邏輯層向持久層發(fā)送請(qǐng)求,持久層與數(shù)據(jù)庫(kù)交互,后將結(jié)果返回給業(yè)務(wù)層,業(yè)務(wù)層將處理邏輯發(fā)送給控制器,控制器再調(diào)用視圖展現(xiàn)數(shù)據(jù)。
?????????????
?
科技的進(jìn)步,給日常帶來許多便利:教室的投影器用到了虛擬成像技術(shù),數(shù)碼相機(jī)用到了光電檢測(cè)技術(shù),比如超市貨物進(jìn)出庫(kù)的記錄需要一個(gè)信息倉(cāng)庫(kù)。這個(gè)信息倉(cāng)庫(kù)就是數(shù)據(jù)庫(kù),而這次的超市商品管理系統(tǒng)也需要這項(xiàng)技術(shù)的支持。
用MySQL這個(gè)軟件,是因?yàn)樗芙邮芏鄠€(gè)使用者訪問,而且里面存在Archive等。它會(huì)先把數(shù)據(jù)進(jìn)行分類,然后分別保存在表里,這樣的特別操作就會(huì)提高數(shù)據(jù)管理系統(tǒng)自身的速度,讓數(shù)據(jù)庫(kù)能被靈活運(yùn)用。MySQL的代碼是公開的,而且允許別人二次編譯升級(jí)。這個(gè)特點(diǎn)能夠降低使用者的成本,再搭配合適的軟件后形成一個(gè)良好的網(wǎng)站系統(tǒng)。雖然它有缺點(diǎn),但是綜合各方面來說,它是使用者的主流運(yùn)用的對(duì)象。
B/S(Browser/Server)比前身架構(gòu)更為省事的架構(gòu)。它借助Web server完成數(shù)據(jù)的傳遞交流。只需要下載瀏覽器作為客戶端,那么工作就達(dá)到“瘦身”效果, 不需要考慮不停裝軟件的問題。
B/S架構(gòu)采取瀏覽器請(qǐng)求,服務(wù)器響應(yīng)的工作模式。
用戶可以通過瀏覽器去訪問Internet上由Web服務(wù)器產(chǎn)生的文本、數(shù)據(jù)、圖片、動(dòng)畫、視頻點(diǎn)播和聲音等信息;
而每一個(gè)Web服務(wù)器又可以通過各種方式與數(shù)據(jù)庫(kù)服務(wù)器連接,大量的數(shù)據(jù)實(shí)際存放在數(shù)據(jù)庫(kù)服務(wù)器中;
從Web服務(wù)器上下載程序到本地來執(zhí)行,在下載過程中若遇到與數(shù)據(jù)庫(kù)有關(guān)的指令,由Web服務(wù)器交給數(shù)據(jù)庫(kù)服務(wù)器來解釋執(zhí)行,并返回給Web服務(wù)器,Web服務(wù)器又返回給用戶。在這種結(jié)構(gòu)中,將許許多多的網(wǎng)連接到一塊,形成一個(gè)巨大的網(wǎng),即全球網(wǎng)。而各個(gè)企業(yè)可以在此結(jié)構(gòu)的基礎(chǔ)上建立自己的Internet。
在 B/S 模式中,用戶是通過瀏覽器針對(duì)許多分布于網(wǎng)絡(luò)上的服務(wù)器進(jìn)行請(qǐng)求訪問的,瀏覽器的請(qǐng)求通過服務(wù)器進(jìn)行處理,并將處理結(jié)果以及相應(yīng)的信息返回給瀏覽器,其他的數(shù)據(jù)加工、請(qǐng)求全部都是由Web Server完成的。通過該框架結(jié)構(gòu)以及植入于操作系統(tǒng)內(nèi)部的瀏覽器,該結(jié)構(gòu)已經(jīng)成為了當(dāng)今軟件應(yīng)用的主流結(jié)構(gòu)模式。
DAO層、Service層這兩個(gè)層次都可以單獨(dú)開發(fā),互相的耦合度很低,完全可以獨(dú)立進(jìn)行,這樣的一種模式在開發(fā)大項(xiàng)目的過程中尤其有優(yōu)勢(shì)。
Controller,View層因?yàn)轳詈隙缺容^高,因而要結(jié)合在一起開發(fā),但是也可以看作一個(gè)整體獨(dú)立于前兩個(gè)層進(jìn)行開發(fā)。這樣,在層與層之前只需要知道接口的定義,調(diào)用接口即可完成所需要的邏輯單元應(yīng)用,一切顯得非常清晰簡(jiǎn)單。
JavaScript是一種屬于網(wǎng)絡(luò)的高級(jí)腳本語言,已經(jīng)被廣泛用于Web應(yīng)用開發(fā),常用來為網(wǎng)頁(yè)添加各式各樣的動(dòng)態(tài)功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實(shí)現(xiàn)自身的功能的。
1.1是一種解釋性腳本語言(代碼不進(jìn)行預(yù)編譯)。
1.2主要用來向HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)頁(yè)面添加交互行為。
1.3可以直接嵌入HTML頁(yè)面,但寫成單獨(dú)的js文件有利于結(jié)構(gòu)和行為的分離。
1.4跨平臺(tái)特性,在絕大多數(shù)瀏覽器的支持下,可以在多種平臺(tái)下運(yùn)行(如Windows、Linux、Mac、Android、iOS等)。
1.5 JavaScript腳本語言同其他語言一樣,有它自身的基本數(shù)據(jù)類型,表達(dá)式和算術(shù)運(yùn)算符及程序的基本程序框架。JavaScript提供了四種基本的數(shù)據(jù)類型和兩種特殊數(shù)據(jù)類型用來處理數(shù)據(jù)和文字。而變量提供存放信息的地方,表達(dá)式則可以完成較復(fù)雜的信息處理。
開發(fā)任何一個(gè)系統(tǒng),都要對(duì)其可行性進(jìn)行分析,對(duì)其時(shí)間和資源上的限制進(jìn)行考慮,這樣可以減少系統(tǒng)開發(fā)的風(fēng)險(xiǎn)。同時(shí),分析之后不僅能夠合理的運(yùn)用人力,還能在各方面資源的消耗上得到節(jié)省。下面就對(duì)技術(shù)、經(jīng)濟(jì)和社會(huì)三個(gè)方面來介紹。
實(shí)用性方面,本次設(shè)計(jì)的主要任務(wù)是在概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)內(nèi)課實(shí)現(xiàn)課程查詢、課程類別、已選課程學(xué)習(xí)、概念圖知識(shí)點(diǎn)管理等,符合當(dāng)前潮流的發(fā)展。從用戶角度出發(fā),同時(shí)也考慮系統(tǒng)運(yùn)營(yíng)成本和人力資源,采用網(wǎng)絡(luò)上的便捷方式,實(shí)現(xiàn)線上業(yè)務(wù),使得業(yè)務(wù)流程更系統(tǒng),也更方便用戶的體驗(yàn),比較實(shí)用。
經(jīng)濟(jì)性方面,由于本課題中設(shè)計(jì)的概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)的主要目的是為了能夠更加方便及快捷的進(jìn)行課程信息的查詢管理及檢索服務(wù),也就是能夠可以直接投入使用的信息化軟件。同時(shí)這個(gè)概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)所帶來的實(shí)際應(yīng)用方面的價(jià)值是遠(yuǎn)遠(yuǎn)的超過了實(shí)際系統(tǒng)進(jìn)行開發(fā)與維護(hù)方面的成本,因此,從經(jīng)濟(jì)上來說開發(fā)這個(gè)軟件是可行的。
概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)的功能主要分為臺(tái)用戶根據(jù)自己的需求進(jìn)行注冊(cè)登錄,學(xué)生瀏覽課程信息,在線學(xué)習(xí)。老師進(jìn)行課程知識(shí)點(diǎn)發(fā)布等,后臺(tái)系統(tǒng)管理員主要對(duì)注冊(cè)用戶,課程管理、課程類別管理、概念圖知識(shí)點(diǎn)管理維護(hù)。
學(xué)生用例圖如下所示。
?
圖3-1 學(xué)生用例圖
管理員用例圖如下所示。
?
圖3-2 管理員用例圖
老師用例圖如下所示。
??????????? ?
???????????????????
?
?????????????????????????圖3-3?老師用例圖
前臺(tái)學(xué)生功能如下:
注冊(cè)賬號(hào):學(xué)生填寫個(gè)人信息,并驗(yàn)證手機(jī)號(hào)碼。
登錄:根據(jù)賬號(hào)密碼進(jìn)行登錄操作。
瀏覽課程信息數(shù)據(jù):學(xué)生可以瀏覽主頁(yè)面的課程信息數(shù)據(jù)。
維護(hù)個(gè)人信息:學(xué)生因個(gè)人信息的變更可以隨時(shí)修改自己注冊(cè)信息。
課程查詢:學(xué)生可以查看課程名稱、課程類別、章節(jié)、知識(shí)點(diǎn)、課程附件信息等。
已選課程:學(xué)生可以查看已經(jīng)選擇的課程信息、知識(shí)點(diǎn)章節(jié)等。
教師功能如下:
課程信息:發(fā)布課程信息可供學(xué)生瀏覽。
課程查詢:可以添加課程信息、知識(shí)點(diǎn)、章節(jié)點(diǎn)、課程附件上傳系統(tǒng)供學(xué)生前臺(tái)查看。
概念圖知識(shí)點(diǎn)管理:主要發(fā)布概念圖知識(shí)點(diǎn)信息。
管理員功能如下:
修改密碼:管理員可以隨時(shí)修改自己進(jìn)入系統(tǒng)的登錄密碼,以保證系統(tǒng)的安全性。
課程信息管理:對(duì)課程信息進(jìn)行維護(hù),添加、刪除、修改信息。
學(xué)生管理:對(duì)學(xué)生信息進(jìn)行維護(hù)管理等。
課程查詢管理,已選課程管理,概念圖知識(shí)點(diǎn)管理。
首先主要考慮的是系統(tǒng)功能軟件,在具體設(shè)計(jì)的環(huán)節(jié)上,是不是能夠較好的滿足各類用戶的基本功能需求,如果不能較好的滿足用戶需求,那么這個(gè)系統(tǒng)的存在是沒有價(jià)值的。軟件系統(tǒng)的非功能性求分析,從7個(gè)方面展開,一個(gè)是性能分析,針對(duì)系統(tǒng);一個(gè)是安全分析,針對(duì)系統(tǒng),一個(gè)是完整度分析,針對(duì)系統(tǒng),一個(gè)是可維護(hù)分析,針對(duì)系統(tǒng),一個(gè)是可擴(kuò)展性分析,針對(duì)系統(tǒng),一個(gè)是適應(yīng)業(yè)務(wù)的性能分析。面對(duì)概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)存在的性能、安全、擴(kuò)展、完整度等7個(gè)方面性能綜合比對(duì)分析后發(fā)現(xiàn),需要相應(yīng)的非功能性需求分析。
安全性對(duì)每一個(gè)系統(tǒng)來說都是非常重要的。安全性很好的系統(tǒng)可以保護(hù)企業(yè)的信息和用戶的信息不被竊取。提高系統(tǒng)的安全性不僅是對(duì)用戶的負(fù)責(zé),更是對(duì)學(xué)校的負(fù)責(zé)。尤其針對(duì)于概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)來說,必須要有很好的安全性來保障整個(gè)系統(tǒng)。
系統(tǒng)具有對(duì)使用者有權(quán)限控制,針對(duì)角色的不通限制使用者的權(quán)限,以此來確保系統(tǒng)的安全性。
數(shù)據(jù)庫(kù)中的數(shù)據(jù)是從外界輸入的,當(dāng)數(shù)據(jù)的輸入時(shí),由于種種原因,輸入的數(shù)據(jù)會(huì)無效,或者是臟數(shù)據(jù)。因此,怎樣保證輸入的數(shù)據(jù)符合規(guī)定,成為了數(shù)據(jù)庫(kù)系統(tǒng),尤其是多用戶的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)首要關(guān)注的問題。
因此,在寫入數(shù)據(jù)庫(kù)時(shí),要保證數(shù)據(jù)完整性、正確性和一致性。
對(duì)系統(tǒng)的數(shù)據(jù)流進(jìn)行分析,系統(tǒng)的使用者分為二類,用戶與管理員。系統(tǒng)主要對(duì)界面信息傳送,登錄信息的驗(yàn)證,注冊(cè)信息的接收,用戶各種操作的響應(yīng)做處理。
系統(tǒng)頂層數(shù)據(jù)流圖如下圖所示。
?
圖3-2 頂層數(shù)據(jù)流圖
要判斷用戶是是什么身份,是根據(jù)登錄的數(shù)據(jù)來判斷后,跳轉(zhuǎn)到對(duì)應(yīng)的功能界面。在系統(tǒng)的內(nèi)部用戶就可以對(duì)數(shù)據(jù)進(jìn)行操作,數(shù)據(jù)庫(kù)中心就可以接收到系統(tǒng)傳輸?shù)挠行?shù)據(jù)流來對(duì)數(shù)據(jù)sql語句進(jìn)行對(duì)應(yīng)操作。
系統(tǒng)底層數(shù)據(jù)流圖如下圖所示。
?圖3-3 底層數(shù)據(jù)流圖
?
系統(tǒng)可以分為前臺(tái)和后臺(tái)兩部分,每一種操作后系統(tǒng)都返回操作結(jié)果。前臺(tái)和后臺(tái)的數(shù)據(jù)連接主要通過數(shù)據(jù)庫(kù),既分別對(duì)數(shù)據(jù)庫(kù)做不同的操作。
本概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)的架構(gòu)設(shè)計(jì)主要分為可以3層,主要有Web層,業(yè)務(wù)層,Model層。其中web層還包括View層和Controller層,Model層包括元數(shù)據(jù)擴(kuò)展層和數(shù)據(jù)訪問層。
系統(tǒng)架構(gòu)如下圖所示。
MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開。當(dāng)然這些事 ViewModel 已經(jīng)幫我們做了,它可以取出 Model 的數(shù)據(jù)同時(shí)幫忙處理 View 中由于需要展示內(nèi)容而涉及的業(yè)務(wù)邏輯。它強(qiáng)制性的把應(yīng)用程序的輸入、輸出和處理全部分開,將其分為三個(gè)核心部分,這三個(gè)部分分別有不同的功能。
?
圖4-1系統(tǒng)架構(gòu)圖
視圖層視圖是指被用戶所看到的并且能夠與之進(jìn)行交互的界面。視圖可以向用戶展示相關(guān)的數(shù)據(jù),并接收用戶輸入的數(shù)據(jù),但對(duì)用戶數(shù)據(jù)不進(jìn)行任何實(shí)際業(yè)務(wù)操作處理。
模型層通過控制層來處理視圖層傳遞的數(shù)據(jù),同一個(gè)模型可以給不同的視圖提供數(shù)據(jù),也可以被不同的視圖重復(fù)使用。由于 Model 的主要內(nèi)容是數(shù)據(jù)、方法和行為,其也是 MVVM?中邏輯最為復(fù)雜,代碼量最多的部分,其中包含了許多應(yīng)用中需要用到的業(yè)務(wù)邏輯,因此模型層的開發(fā)也變得尤為重要,后期一般不會(huì)對(duì)模型層進(jìn)行大規(guī)模改動(dòng),也是 MVVM最穩(wěn)定的部分。
控制層主要負(fù)責(zé)視圖層和模型層之間的數(shù)據(jù)傳輸和處理請(qǐng)求操作。當(dāng)用戶通過視圖發(fā)送數(shù)據(jù)和請(qǐng)求時(shí),控制層可以接收請(qǐng)求和數(shù)據(jù)并決定調(diào)用哪些模型、通過模型的哪些操來處理數(shù)據(jù)和請(qǐng)求,處理完成后,控制層再將數(shù)據(jù)返回給相應(yīng)的視圖。
概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)總體分為前臺(tái)用戶(學(xué)生、教師)模塊和后臺(tái)管理員模塊。兩個(gè)模塊表現(xiàn)上是分別獨(dú)立存在,但是訪問的數(shù)據(jù)庫(kù)是一樣的。每一個(gè)模塊的功能都是根據(jù)先前完成的需求分析,并查閱相關(guān)資料后整理制作的。
綜上所述,系統(tǒng)功能結(jié)構(gòu)圖如下圖所示。
?
圖4-2 系統(tǒng)功能結(jié)構(gòu)圖
登錄模塊:登錄模塊是進(jìn)入系統(tǒng)的入口,所有用戶必須登錄后才能訪問系統(tǒng)。登錄需要輸入用戶名和密碼,如果多次嘗試登錄需要輸入驗(yàn)證碼。登錄時(shí)需要選擇用戶的角色,是一般用戶還是管理員登錄等。登錄成功后,會(huì)通過數(shù)據(jù)庫(kù)獲取用戶的權(quán)限,并跳轉(zhuǎn)至用戶的主頁(yè)面。
課程信息數(shù)據(jù)模塊:可分為課程信息數(shù)據(jù)瀏覽、課程信息數(shù)據(jù)檢索、課程信息數(shù)據(jù)維護(hù)三個(gè)模塊,管理員對(duì)課程信息數(shù)據(jù)有維護(hù)的權(quán)限,發(fā)布新的課程信息數(shù)據(jù)、更新已有的課程信息數(shù)據(jù)等。
概念圖知識(shí)點(diǎn)管理模塊:概念圖知識(shí)點(diǎn)管理分為概念圖知識(shí)點(diǎn)添加、修改和刪除。概念圖知識(shí)點(diǎn)信息由管理員進(jìn)行修改、添加、刪除操作。
從前面可以分析到數(shù)據(jù)庫(kù)中最重要的是功能是:課程信息,學(xué)生、老師信息,已選課程信息,同時(shí)存在課程查詢和概念圖知識(shí)點(diǎn)管理。分析可以得到如下數(shù)據(jù)描述:
平臺(tái)用戶:用于記錄用戶的各種信息,包括姓名、性別、手機(jī)、郵箱、專業(yè)、照片等數(shù)據(jù)項(xiàng)。
管理員:記錄管理員的登錄信息。包括用戶名,密碼,權(quán)限等數(shù)據(jù)項(xiàng)。
課程信息:存儲(chǔ)課程信息數(shù)據(jù)項(xiàng)。
已選課程:存儲(chǔ)學(xué)生的已選課程信息。
概念圖知識(shí)點(diǎn)管理:存儲(chǔ)概念圖知識(shí)點(diǎn)信息數(shù)據(jù)項(xiàng)。
根據(jù)前面的數(shù)據(jù)流程圖,結(jié)合系統(tǒng)的功能模塊設(shè)計(jì),設(shè)計(jì)出符合系統(tǒng)的各信息實(shí)體。
系統(tǒng)ER圖如下圖所示。
?
圖4-3 系統(tǒng)ER圖
概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)所擁有的數(shù)據(jù)表有以下:課程查詢表,已選課程表,課程信息表,課程類別表,概念圖知識(shí)點(diǎn)表等。
由于數(shù)據(jù)表較多,只展示系統(tǒng)主要數(shù)據(jù)表,如下表所示。
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| student_user_id | int | 11 | 是 | 是 | 學(xué)生用戶ID |
| user_name | varchar | 64 | 是 | 否 | 用戶名 |
| full_name | varchar | 64 | 否 | 否 | 姓名 |
| age | varchar | 64 | 否 | 否 | 年齡 |
| gender | varchar | 64 | 否 | 否 | 性別 |
| class_name | varchar | 64 | 否 | 否 | 班級(jí)名稱 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| user_id | int | 11 | 是 | 否 | 用戶ID |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| teacher_user_id | int | 11 | 是 | 是 | 教師用戶ID |
| job_number | varchar | 64 | 是 | 否 | 工號(hào) |
| full_name | varchar | 64 | 否 | 否 | 姓名 |
| age | varchar | 64 | 否 | 否 | 年齡 |
| gender | varchar | 64 | 否 | 否 | 性別 |
| title | varchar | 64 | 否 | 否 | 職稱 |
| episcopal_curriculum | varchar | 64 | 否 | 否 | 主教課程 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| user_id | int | 11 | 是 | 否 | 用戶ID |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| welcome_to_the_system_id | int | 11 | 是 | 是 | 歡迎使用本系統(tǒng)ID |
| remarks | varchar | 64 | 否 | 否 | 備注 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| selected_courses_id | int | 11 | 是 | 是 | 已選課程ID |
| user_name | int | 11 | 否 | 否 | 用戶名 |
| course_name | varchar | 64 | 否 | 否 | 課程名稱 |
| course_type | varchar | 64 | 否 | 否 | 課程類型 |
| chapter | varchar | 64 | 否 | 否 | 章節(jié) |
| knowledge_points | varchar | 64 | 否 | 否 | 知識(shí)點(diǎn) |
| remarks | varchar | 64 | 否 | 否 | 備注 |
| course_attachment | varchar | 255 | 否 | 否 | 課程附件 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| course_inquiry_id | int | 11 | 是 | 是 | 課程查詢ID |
| course_name | varchar | 64 | 否 | 否 | 課程名稱 |
| course_type | varchar | 64 | 否 | 否 | 課程類型 |
| chapter | varchar | 64 | 否 | 否 | 章節(jié) |
| knowledge_points | varchar | 64 | 否 | 否 | 知識(shí)點(diǎn) |
| remarks | varchar | 64 | 否 | 否 | 備注 |
| course_attachment | varchar | 255 | 否 | 否 | 課程附件 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| course_category_id | int | 11 | 是 | 是 | 課程類別ID |
| course_type | varchar | 64 | 否 | 否 | 課程類型 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| concept_map_knowledge_point_management_id | int | 11 | 是 | 是 | 概念圖知識(shí)點(diǎn)管理ID |
| job_number | int | 11 | 否 | 否 | 工號(hào) |
| publish_courses | varchar | 64 | 否 | 否 | 發(fā)布課程 |
| course_type | varchar | 64 | 否 | 否 | 課程類型 |
| chapter | varchar | 64 | 否 | 否 | 章節(jié) |
| knowledge_points | varchar | 64 | 否 | 否 | 知識(shí)點(diǎn) |
| remarks | varchar | 64 | 否 | 否 | 備注 |
| course_attachment | varchar | 255 | 否 | 否 | 課程附件 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
用戶在填寫數(shù)據(jù)的時(shí)候必須與注冊(cè)頁(yè)面上的驗(yàn)證相匹配否則會(huì)注冊(cè)失敗,注冊(cè)頁(yè)面的表單驗(yàn)證是通過驗(yàn)證的,用戶名的長(zhǎng)度必須在6到18之間,郵箱必須帶有@符號(hào),密碼和密碼確認(rèn)必須相同,你輸入的密碼,系統(tǒng)會(huì)根據(jù)你輸入密碼的強(qiáng)度給出指定的值,電話號(hào)碼和身份證號(hào)碼必須要求輸入格式與生活相符合,當(dāng)你前臺(tái)驗(yàn)證通過的時(shí)候你點(diǎn)擊注冊(cè),表單會(huì)將你輸入的值通過name值傳遞給后臺(tái)并保存到數(shù)據(jù)庫(kù)中。
用戶注冊(cè)流程圖如下圖所示。
?
圖5-1用戶注冊(cè)流程圖
用戶注冊(cè)邏輯代碼如下:
/**
?????* 注冊(cè)
?????* @param user
?????* @return
?????*/
????@PostMapping("register")
????public Map<String, Object> signUp(@RequestBody User user) {
????????// 查詢用戶
????????Map<String, String> query = new HashMap<>();
????????query.put("username",user.getUsername());
????????List list = service.select(query, new HashMap<>()).getResultList();
????????if (list.size()>0){
????????????return error(30000, "用戶已存在");
????????}
????????user.setUserId(null);
????????user.setPassword(service.encryption(user.getPassword()));
????????service.save(user);
????????return success(1);
}
/**
?????* 用戶ID:[0,8388607]用戶獲取其他與用戶相關(guān)的數(shù)據(jù)
?????*/
????@Id
????@GeneratedValue(strategy = GenerationType.IDENTITY)
????@Column(name = "user_id")
????private Integer userId;
????/**
?????* 賬戶狀態(tài):[0,10](1可用|2異常|3已凍結(jié)|4已注銷)
?????*/
????@Basic
????@Column(name = "state")
????private Integer state;
????/**
?????* 所在用戶組:[0,32767]決定用戶身份和權(quán)限
?????*/
????@Basic
????@Column(name = "user_group")
????private String userGroup;
????/**
?????* 上次登錄時(shí)間:
?????*/
????@Basic
????@Column(name = "login_time")
????private Timestamp loginTime;
????/**
?????* 手機(jī)號(hào)碼:[0,11]用戶的手機(jī)號(hào)碼,用于找回密碼時(shí)或登錄時(shí)
?????*/
????@Basic
????@Column(name = "phone")
????private String phone;
????/**
?????* 手機(jī)認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
?????*/
????@Basic
????@Column(name = "phone_state")
????private Integer phoneState;
????/**
?????* 用戶名:[0,16]用戶登錄時(shí)所用的賬戶名稱
?????*/
????@Basic
????@Column(name = "username")
????private String username;
????/**
?????* 昵稱:[0,16]
?????*/
????@Basic
????@Column(name = "nickname")
????private String nickname;
????/**
?????* 密碼:[0,32]用戶登錄所需的密碼,由6-16位數(shù)字或英文組成
?????*/
????@Basic
????@Column(name = "password")
????private String password;
????/**
?????* 郵箱:[0,64]用戶的郵箱,用于找回密碼時(shí)或登錄時(shí)
?????*/
????@Basic
????@Column(name = "email")
????private String email;
????/**
?????* 郵箱認(rèn)證:[0,1](0未認(rèn)證|1審核中|2已認(rèn)證)
?????*/
????@Basic
????@Column(name = "email_state")
????private Integer emailState;
????/**
?????* 頭像地址:[0,255]
?????*/
????@Basic
????@Column(name = "avatar")
????private String avatar;
????/**
?????* 創(chuàng)建時(shí)間:
?????*/
????@Basic
????@Column(name = "create_time")
????@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
????private Timestamp createTime;
????@Basic
????@Transient
????private String code;
}
主要由兩部分組成,登錄前的登錄界面以及登錄后的用戶功能界面。登錄界面,要求用戶輸入用戶名和密碼,當(dāng)用戶名和密碼其中一個(gè)輸入為空時(shí),給出提示“用戶名,密碼不能為空”。獲取用戶名和密碼后到數(shù)據(jù)庫(kù)中查找,如果用戶名存在,以及對(duì)應(yīng)的密碼正確,則登錄成功,否則登錄失敗。登錄失敗后給出提示,并把焦點(diǎn)停在文本框中。登錄成功后將該次會(huì)話的全局變量username設(shè)置為用戶名。登錄成功后進(jìn)入會(huì)員的功能模塊,主要有會(huì)員基本信息修改,已經(jīng)發(fā)布考試信息管理,發(fā)布信息,和退出功能。退出功能是清除全局變量username的值,并跳回到首頁(yè)。
登錄流程圖如下圖所示。
?
圖5-2登錄流程圖
用戶登錄界面如下圖所示。
?
圖5-4用戶登錄界面
用戶登錄的邏輯代碼如下所示。
/**
?????* 登錄
?????* @param data
?????* @param httpServletRequest
?????* @return
?????*/
????@PostMapping("login")
????public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
????????log.info("[執(zhí)行登錄接口]");
????????String username = data.get("username");
????????String email = data.get("email");
????????String phone = data.get("phone");
????????String password = data.get("password");
????????List resultList = null;
????????Map<String, String> map = new HashMap<>();
????????if(username != null && "".equals(username) == false){
????????????map.put("username", username);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(email != null && "".equals(email) == false){
????????????map.put("email", email);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(phone != null && "".equals(phone) == false){
????????????map.put("phone", phone);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}else{
????????????return error(30000, "賬號(hào)或密碼不能為空");
????????}
????????if (resultList == null || password == null) {
????????????return error(30000, "賬號(hào)或密碼不能為空");
????????}
????????//判斷是否有這個(gè)用戶
????????if (resultList.size()<=0){
????????????return error(30000,"用戶不存在");
????????}
????????User byUsername = (User) resultList.get(0);
????????Map<String, String> groupMap = new HashMap<>();
????????groupMap.put("name",byUsername.getUserGroup());
????????List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
????????if (groupList.size()<1){
????????????return error(30000,"用戶組不存在");
????????}
????????UserGroup userGroup = (UserGroup) groupList.get(0);
????????//查詢用戶審核狀態(tài)
????????if (!StringUtils.isEmpty(userGroup.getSourceTable())){
????????????String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
????????????String res = String.valueOf(service.runCountSql(sql).getSingleResult());
????????????if (res==null){
????????????????return error(30000,"用戶不存在");
????????????}
????????????if (!res.equals("已通過")){
????????????????return error(30000,"該用戶審核未通過");
????????????}
????????}
????????//查詢用戶狀態(tài)
????????if (byUsername.getState()!=1){
????????????return error(30000,"用戶非可用狀態(tài),不能登錄");
????????}
????????String md5password = service.encryption(password);
????????if (byUsername.getPassword().equals(md5password)) {
????????????// 存儲(chǔ)Token到數(shù)據(jù)庫(kù)
????????????AccessToken accessToken = new AccessToken();
????????????accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
????????????accessToken.setUser_id(byUsername.getUserId());
????????????tokenService.save(accessToken);
????????????// 返回用戶信息
????????????JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
????????????user.put("token", accessToken.getToken());
????????????JSONObject ret = new JSONObject();
????????????ret.put("obj",user);
????????????return success(ret);
????????} else {
????????????return error(30000, "賬號(hào)或密碼不正確");
????????}
}
用戶登錄/注冊(cè)成功之后可以修改自己的基本信息。修改頁(yè)面的表單中每一個(gè)input的name值都要與實(shí)體類中的參數(shù)相匹配,在用戶點(diǎn)擊修改頁(yè)面的時(shí)候,如果改后用戶名與數(shù)據(jù)庫(kù)里面重復(fù)了,頁(yè)面會(huì)提示該用戶名已經(jīng)存在了,否則通過Id來查詢用戶,并將用戶的信息修改為表單提交的數(shù)據(jù)。
如果課程信息數(shù)據(jù)需要修改,管理員可以通過查詢課程名稱來查詢課程信息數(shù)據(jù),查詢課程信息數(shù)據(jù)是通過ajax技術(shù)來進(jìn)行查詢的,需要傳遞課程信息數(shù)據(jù)的標(biāo)題、編號(hào)等參數(shù)然后在返回到該頁(yè)面中,可以選中要修改或刪除的那條信息,如果選中了超過一條數(shù)據(jù),頁(yè)面會(huì)挑一個(gè)窗口提醒只能選擇一條數(shù),如果沒有選中數(shù)據(jù)會(huì)挑一個(gè)窗口題型必須選擇一條數(shù)據(jù)。當(dāng)選擇確認(rèn)修改的時(shí)候,后臺(tái)會(huì)根據(jù)傳過來的id到數(shù)據(jù)庫(kù)查詢,并將結(jié)果返回到修改頁(yè)面中,可以在修改頁(yè)面中修改剛剛選中的信息當(dāng)點(diǎn)擊確認(rèn)的時(shí)候from表單會(huì)將修改的數(shù)據(jù)提交到后臺(tái)并保存到數(shù)據(jù)庫(kù)中,就是說如果提交的數(shù)據(jù)數(shù)據(jù)庫(kù)中存在就修改,否則就保存。
課程信息展示界面如下圖所示。
?
圖5-5課程信息展示界面
課程信息的邏輯代碼如下:
?@PostMapping("/add")
????@Transactional
????public Map<String, Object> add(HttpServletRequest request) throws IOException {
????????service.insert(service.readBody(request.getReader()));
????????return success(1);
????}
????@Transactional
????public Map<String, Object> addMap(Map<String,Object> map){
????????service.insert(map);
????????return success(1);
}
????public Map<String,Object> readBody(BufferedReader reader){
????????BufferedReader br = null;
????????StringBuilder sb = new StringBuilder("");
????????try{
????????????br = reader;
????????????String str;
????????????while ((str = br.readLine()) != null){
????????????????sb.append(str);
????????????}
????????????br.close();
????????????String json = sb.toString();
????????????return JSONObject.parseObject(json, Map.class);
????????}catch (IOException e){
????????????e.printStackTrace();
????????}finally{
????????????if (null != br){
????????????????try{
????????????????????br.close();
????????????????}catch (IOException e){
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
????????return null;
}
????public void insert(Map<String,Object> body){
????????StringBuffer sql = new StringBuffer("INSERT INTO ");
????????sql.append("`").append(table).append("`").append(" (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
????????}
????????sql.deleteCharAt(sql.length()-1);
????????sql.append(") VALUES (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????Object value = entry.getValue();
????????????if (value instanceof String){
????????????????sql.append("'").append(entry.getValue()).append("'").append(",");
????????????}else {
????????????????sql.append(entry.getValue()).append(",");
????????????}
????????}
????????sql.deleteCharAt(sql.length() - 1);
????????sql.append(")");
????????log.info("[{}] - 插入操作:{}",table,sql);
????????Query query = runCountSql(sql.toString());
????????query.executeUpdate();
????}
已選課程功能需要考慮高并發(fā),防止出現(xiàn)課程重復(fù)選擇申請(qǐng)、課程狀態(tài)顯示出錯(cuò)等情況,特對(duì)課程信息這一共享數(shù)據(jù)增加鎖機(jī)制。在樂觀鎖、悲觀鎖以及線程鎖中,綜合考慮性能效率和錯(cuò)誤的可接受性選擇了樂觀鎖機(jī)制。樂觀鎖的實(shí)現(xiàn)方式是使用版本標(biāo)識(shí)來確定讀到的數(shù)據(jù)與提交時(shí)的數(shù)據(jù)是否一致,提交后修改版本標(biāo)識(shí),不一致時(shí)可以采取丟棄和再次嘗試的策略。在數(shù)據(jù)庫(kù)已選課程表(對(duì)應(yīng)已選課程實(shí)體)設(shè)計(jì)中增加了version字段,每次數(shù)據(jù)提交時(shí)(更改已選課程狀態(tài))會(huì)判斷version是否匹配,若不匹配停止本次提交,若匹配則提交成功并增加version的值。
已選課程功能整體流程:用戶瀏覽已選課程信息時(shí),同時(shí)會(huì)顯示已選課程的狀態(tài),系統(tǒng)會(huì)在其顯示詳細(xì)信息的頁(yè)面時(shí)便會(huì)判斷已選課程的狀態(tài),若課程狀態(tài)為可選,則會(huì)顯示課程列表的鏈接按鈕。在用戶點(diǎn)擊課程列表按鈕時(shí),會(huì)先通過攔截器判斷用戶是否登錄,若未登錄,會(huì)跳轉(zhuǎn)至登錄頁(yè)面,提示用戶先登錄,若為登錄用戶就會(huì)跳轉(zhuǎn)至在線課程信息的頁(yè)面,點(diǎn)擊已選課程,成功之后進(jìn)行學(xué)習(xí)。
已選課程流程圖如下圖所示。
?
圖5-6已選課程流程圖
已選課程界面如下圖所示。
?
圖5-7已選課程界面
已選課程界面邏輯代碼如下:
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
????????Query count = service.avg(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
此頁(yè)面的關(guān)鍵是學(xué)生在線學(xué)習(xí)已選課程,包括課程名稱,課程類別、章節(jié)、知識(shí)點(diǎn)等。管理員點(diǎn)擊左側(cè)菜單“在線學(xué)習(xí)管理”,頁(yè)面跳轉(zhuǎn)到在線學(xué)習(xí)管理外觀,調(diào)用后臺(tái)測(cè)試查詢。并將信息密封到數(shù)據(jù)集合List,綁定到請(qǐng)求對(duì)象,然后頁(yè)面跳轉(zhuǎn)到相應(yīng)的界面,顯示出學(xué)習(xí)信息。
在線學(xué)習(xí)流程圖如下圖所示。
?
圖5-8在線學(xué)習(xí)流程圖
在線學(xué)習(xí)界面邏輯代碼如下:
?@RequestMapping("/get_list")
????public Map<String, Object> getList(HttpServletRequest request) {
????????Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
????????return success(map);
}
根據(jù)需求,需要對(duì)概念圖知識(shí)點(diǎn)進(jìn)行添加、刪除或修改詳情信息。刪除或修改概念圖知識(shí)點(diǎn)時(shí),系統(tǒng)根據(jù)概念圖知識(shí)點(diǎn)的狀態(tài)判定為可刪除狀態(tài)下,才會(huì)給出刪除和修改鏈接,點(diǎn)擊刪除鏈接按鈕時(shí),請(qǐng)求到達(dá)后臺(tái),還會(huì)先查詢概念圖知識(shí)點(diǎn)狀態(tài)再次做出判定能否刪除。點(diǎn)擊修改鏈接按鈕時(shí),會(huì)跳轉(zhuǎn)到修改信息的頁(yè)面,重新填寫好數(shù)據(jù)后,數(shù)據(jù)提交到后臺(tái)會(huì)對(duì)數(shù)據(jù)庫(kù)中相應(yīng)的記錄做出修改。
添加概念圖知識(shí)點(diǎn)時(shí),會(huì)給出數(shù)據(jù)填寫的頁(yè)面,該頁(yè)面根據(jù)填寫好的概念圖知識(shí)點(diǎn)編號(hào)同樣會(huì)事先發(fā)送Ajax請(qǐng)求查詢編號(hào)是否已存在,數(shù)據(jù)填寫好之后提交到后臺(tái),會(huì)調(diào)用相關(guān)服務(wù)在數(shù)據(jù)庫(kù)中插入記錄。
概念圖知識(shí)點(diǎn)添加界面設(shè)計(jì)效果如下圖所示。
?
圖5-12概念圖知識(shí)點(diǎn)添加界面
概念圖知識(shí)點(diǎn)管理界面效果如下圖所示。
?
圖5-13概念圖知識(shí)點(diǎn)管理界面
概念圖知識(shí)點(diǎn)管理界面關(guān)鍵代碼如下:
@RestController
@RequestMapping("auth")
public class AuthController extends BaseController<Auth, AuthService> {
????/**
?????* 服務(wù)對(duì)象
?????*/
????@Autowired
????public AuthController(AuthService service) {
????????setService(service);
對(duì)任何系統(tǒng)而言,測(cè)試都是必不可少的環(huán)節(jié),測(cè)試可以發(fā)現(xiàn)系統(tǒng)存在的很多問題,所有的軟件上線之前,都應(yīng)該進(jìn)行充足的測(cè)試之后才能保證上線后不會(huì)Bug頻發(fā),或者是功能不滿足需求等問題的發(fā)生。下面分別從單元測(cè)試,功能測(cè)試和用例測(cè)試來對(duì)系統(tǒng)進(jìn)行測(cè)試以保證系統(tǒng)的穩(wěn)定性和可靠性。
下表是課程信息管理功能的測(cè)試用例,檢測(cè)了課程信息管理中對(duì)課程信息信息的增加,刪除,修改,查詢操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶登錄系統(tǒng)。
表6-1 課程信息管理的測(cè)試用例
| 功能描述 | 用于課程信息管理 | |
| 測(cè)試目的 | 檢測(cè)課程信息管理時(shí)的各種操作的運(yùn)行情況 | |
| 測(cè)試數(shù)據(jù)以及操作 | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 |
| 點(diǎn)擊添加課程信息,必填項(xiàng)合法輸入,點(diǎn)擊保存 | 提示添加成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊添加課程信息,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改課程信息,必填項(xiàng)修改為空,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改課程信息,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊刪除課程信息,選擇課程信息刪除 | 提示刪除成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索課程信息,輸入存在的課程信息名 | 查找出課程信息 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索課程信息,輸入不存在的課程信息名 | 不顯示課程信息 | 與預(yù)期結(jié)果一致 |
下表是已選課程管理功能的測(cè)試用例,檢測(cè)了已選課程管理中對(duì)已選課程信息的增加,刪除,修改,查詢操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶登錄系統(tǒng)。
表6-2 已選課程管理的測(cè)試用例
| 功能描述 | 用于已選課程管理 | |
| 測(cè)試目的 | 檢測(cè)已選課程管理時(shí)的各種操作的運(yùn)行情況 | |
| 測(cè)試數(shù)據(jù)以及操作 | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 |
| 點(diǎn)擊添加已選課程,必填項(xiàng)合法輸入,點(diǎn)擊保存 | 提示添加成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊添加已選課程,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改已選課程,必填項(xiàng)修改為空,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改已選課程,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊刪除已選課程,選擇已選課程刪除 | 提示刪除成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索已選課程,輸入存在的已選課程名 | 查找出已選課程 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索已選課程,輸入不存在的已選課程名 | 不顯示已選課程 | 與預(yù)期結(jié)果一致 |
使用阿里云PTS(Performance Testing Service)性能測(cè)試服務(wù)對(duì)線上系統(tǒng)進(jìn)行壓力測(cè)試。線上服務(wù)器環(huán)境為:1核心CPU,1G內(nèi)存,1Mbps公網(wǎng)帶寬,Centos7.0操作系統(tǒng)。
壓測(cè)過程中使用了2臺(tái)并發(fā)機(jī)器,每臺(tái)機(jī)器20個(gè)用戶并發(fā),對(duì)系統(tǒng)主頁(yè),登錄,數(shù)據(jù)查詢和數(shù)據(jù)維護(hù)等模塊進(jìn)行并發(fā)訪問,測(cè)試結(jié)果是有40個(gè)用戶并發(fā)時(shí),數(shù)據(jù)管理相關(guān)頁(yè)面的響應(yīng)時(shí)間甚至達(dá)到了7s,通過查看服務(wù)器出網(wǎng)流量發(fā)現(xiàn)已經(jīng)達(dá)到1381kb/s,可以看出服務(wù)器的帶寬已經(jīng)達(dá)到峰值,如果系統(tǒng)使用5Mbps的帶寬,系統(tǒng)的響應(yīng)時(shí)間和TPS將會(huì)大大增加。在整個(gè)測(cè)試的過程中,CPU的使用率占用僅8%,也提現(xiàn)出帶寬瓶頸對(duì)系統(tǒng)的影響非常嚴(yán)重。
隨著計(jì)算機(jī)互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,各行各業(yè)都已經(jīng)實(shí)現(xiàn)采用計(jì)算機(jī)相關(guān)技術(shù)對(duì)日益放大的數(shù)據(jù)進(jìn)行管理。該課題是為概念可視化程序設(shè)計(jì)學(xué)習(xí)為核心展開的。本研究針對(duì)概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)需求建模,數(shù)據(jù)建模及過程建模分析。給出系統(tǒng)應(yīng)用架構(gòu)并分析優(yōu)劣勢(shì),通過功能分解圖,系統(tǒng)組件圖描述功能需求。設(shè)計(jì)建立了數(shù)據(jù)庫(kù),給出系統(tǒng)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)的定義。通過類關(guān)系圖描述組件間的協(xié)作關(guān)系,給出各個(gè)類的定義方法。通過描述每一個(gè)類的字段,屬性及方法實(shí)現(xiàn)平臺(tái)的前后端代碼。最終給出系統(tǒng)集成整合方法,完成概念可視化程序設(shè)計(jì)學(xué)習(xí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。系統(tǒng)投入運(yùn)行時(shí),各功能均運(yùn)行正常。系統(tǒng)的每個(gè)界面的操作符合常規(guī)邏輯,對(duì)使用者來說操作簡(jiǎn)單,界面友好。整個(gè)系統(tǒng)的各個(gè)功能設(shè)計(jì)合理,體現(xiàn)了人性化。
但是由于自己在系統(tǒng)開發(fā)過程中對(duì)一些用到的相關(guān)知識(shí)和技術(shù)掌握不夠牢固,再加上自身開發(fā)經(jīng)驗(yàn)欠缺,因此系統(tǒng)在有些方面的功能還不夠完善,考慮的不夠全面,因此整個(gè)系統(tǒng)還有待日后逐步完善。
參考文獻(xiàn)
[1]徐偉東.例談以學(xué)習(xí)者為中心的程序設(shè)計(jì)教學(xué)策略[J].中國(guó)信息技術(shù)教育,2022(05):33-35.
[2]鎮(zhèn)鑫羽,景琴琴.Java語言程序設(shè)計(jì)的教學(xué)實(shí)踐[J].集成電路應(yīng)用,2022,39(02):256-257.
[3]劉奕.計(jì)算機(jī)程序設(shè)計(jì)的多應(yīng)用型開發(fā)分析[J].無線互聯(lián)科技,2021,18(24):78-79.
[4]韓冰,劉翠煥,黃振華,張波,陳明珠,張瀟.人工智能時(shí)代下“Java程序設(shè)計(jì)”課程教學(xué)改革[J].科技風(fēng),2021(33):98-100.
[5]劉麗,趙彥,徐威,高云,陸蔚,楊竹青.面向物聯(lián)網(wǎng)專業(yè)的程序設(shè)計(jì)類課程教學(xué)改革與探究[J].電子元器件與信息技術(shù),2021,5(11):229-230.
[6]劉勇.程序設(shè)計(jì)課程“線上+線下”混合式模式教學(xué)的改革與創(chuàng)新[J].現(xiàn)代職業(yè)教育,2021(48):150-151.
[7]王勛,馮凱琪.概念圖及其可視化對(duì)說明文閱讀理解及元理解監(jiān)測(cè)的影響[J].科技資訊,2021,19(32):162-165.
[8]王思瑞. 基于概念圖的高中物理可視化教學(xué)探索[C]//.2021年教育教學(xué)創(chuàng)新研究高峰論壇論文集.,2021:28-29.
[9]樊艷芬.概念圖在數(shù)據(jù)結(jié)構(gòu)可視化教學(xué)中的應(yīng)用研究[J].福建電腦,2021,37(01):30-33.
[10]陳麗華,張金良.基于概念圖的高中物理可視化教學(xué)初探——以“曲線運(yùn)動(dòng)”一章為例[J].教育教學(xué)論壇,2020(13):285-287.
[11]李帥帥. 基于概念圖的可視化教學(xué)能力建模與培養(yǎng)策略研究[D].華東師范大學(xué),2019.
[12]向芳玉,郝建江,顧文玲,黃冬明.基于概念圖的可視化教學(xué)整合研究——以地理概念為例[J].中國(guó)教育信息化,2018(16):46-50.
[13]左延柏.基于概念圖促進(jìn)學(xué)生思維可視化研究[J].中學(xué)生物學(xué),2018,31(11):15-17.
[14]李艷瓊. 概念圖可視化功能對(duì)提高EFL大學(xué)生議論文連貫性的效力探析[D].四川外國(guó)語大學(xué),2018.
[15]李良,高娜.基于概念圖的可視化教學(xué)設(shè)計(jì)分析[J].中國(guó)電力教育,2018(05):72-73+75.
[16]Kemal Emre ?zen,Kübra Erdo?an,Burhan Yarar,Gizem ?izmeci,Gonca Ay Keselik,Ferhan Elmal?,Mehmet Ali Malas. The practical examination types (spot test and slide test) of gross anatomy course in faculty of medicine: a simultaneous evaluation of the aspect of student success[J]. Surgical and Radiologic Anatomy,2021,43(4):
致謝
本次設(shè)計(jì)歷時(shí)3個(gè)月。在這個(gè)畢業(yè)設(shè)計(jì)中,它離不開指導(dǎo)教師的指導(dǎo),使事情基本順利。指導(dǎo)老師無論是在畢業(yè)設(shè)計(jì)歷經(jīng)中,還是在論文做完中都給了了我特別大的助益。另1個(gè)方面,教師認(rèn)真負(fù)責(zé)的工作姿態(tài),謹(jǐn)慎的教學(xué)精神厚重的理論水準(zhǔn)都使我獲益匪淺。他勤懇謹(jǐn)慎的教學(xué)育人學(xué)習(xí)姿態(tài)也給我留下了特別特別深的感覺。我從老師那里學(xué)到了很多東西。在理論和實(shí)踐中,我的技能得到了特別大的提高。在此,特向教師表示由衷的感激。
經(jīng)過對(duì)該畢業(yè)設(shè)計(jì)的全部研究和開發(fā),我的系統(tǒng)研發(fā)經(jīng)歷了從需求分析到實(shí)現(xiàn)詳細(xì)功能,再到最終測(cè)試和維護(hù)的特殊進(jìn)展。讓我對(duì)系統(tǒng)研發(fā)有了更深層次的認(rèn)識(shí)。如今我的動(dòng)手本領(lǐng)單獨(dú)處理疑惑的本領(lǐng)也獲取到了特別大的演練學(xué)習(xí)增多,這是這次畢業(yè)設(shè)計(jì)最好的收獲。
最后,在整個(gè)系統(tǒng)開發(fā)過程中,我周圍的同學(xué)和朋友給了我很多意見,所以我很快就確認(rèn)了系統(tǒng)的商業(yè)思想。在次,我由衷的向他們表示感激。
免費(fèi)領(lǐng)取本源代碼,請(qǐng)關(guān)注點(diǎn)贊+私信
總結(jié)
以上是生活随笔為你收集整理的基于SSM的概念可视化程序设计学习系统毕业设计源码021009的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多微博账号同时发微博的插件--fawav
- 下一篇: 【电商运营】试试这5种个性化营销方法,告