springboot+乡村图书管理系统 毕业设计-附源码191505
基于java的鄉(xiāng)村圖書(shū)館管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
摘?要
信息化社會(huì)內(nèi)需要與之針對(duì)性的信息獲取途徑,但是途徑的擴(kuò)展基本上為人們所努力的方向,由于站在的角度存在偏差,人們經(jīng)常能夠獲得不同類型信息,這也是技術(shù)最為難以攻克的課題。針對(duì)鄉(xiāng)村圖書(shū)館管理等問(wèn)題,對(duì)圖書(shū)館管理進(jìn)行研究分析,然后開(kāi)發(fā)設(shè)計(jì)出圖書(shū)館管理系統(tǒng)以解決問(wèn)題。
圖書(shū)館管理系統(tǒng)主要功能模塊包括資源庫(kù)收藏、書(shū)籍分類、圖書(shū)借閱、圖書(shū)歸還預(yù)約,采取面對(duì)對(duì)象的開(kāi)發(fā)模式進(jìn)行軟件的開(kāi)發(fā)和硬體的架設(shè),能很好的滿足實(shí)際使用的需求,完善了對(duì)應(yīng)的軟體架設(shè)以及程序編碼的工作,采取Mysql作為后臺(tái)數(shù)據(jù)的主要存儲(chǔ)單元,使用Java語(yǔ)言,采用基于 MVVM模式的SSM技術(shù)進(jìn)行開(kāi)發(fā),數(shù)據(jù)方面主要采用的是微軟的MySQL關(guān)系型數(shù)據(jù)庫(kù)來(lái)作為數(shù)據(jù)存儲(chǔ)媒介,配合前臺(tái)HTML+CSS 技術(shù)完成系統(tǒng)的開(kāi)發(fā)。本次報(bào)告,首先分析了研究的背景、作用、意義,為研究工作的合理性打下了基礎(chǔ)。針對(duì)圖書(shū)館服務(wù)系統(tǒng)的各項(xiàng)需求以及技術(shù)問(wèn)題進(jìn)行分析,證明了系統(tǒng)的必要性和技術(shù)可行性,然后對(duì)設(shè)計(jì)系統(tǒng)需要使用的技術(shù)軟件以及設(shè)計(jì)思想做了基本的介紹,最后來(lái)實(shí)現(xiàn)圖書(shū)館服務(wù)系統(tǒng)和部署運(yùn)行使用它。
關(guān)鍵詞:圖書(shū)館管理;Java技術(shù);Mysql數(shù)據(jù)庫(kù)
Design and Implementation of Library Service System
Abstract
In the information society, there is a need for targeted information access, but the expansion of access is basically the direction of people's efforts. Due to the deviation of the perspective, people can often obtain different types of information, which is also the most difficult subject for technology to overcome. Aiming at the problems of library service, this paper studies and analyzes the library service, and then develops and designs the library service system to solve the problems.
The main functional modules of the library service system include resource library collection, book borrowing, picture review, library seat reservation, Library Navigation and message feedback. The object-oriented development mode is adopted for software development and hardware erection, which can well meet the needs of practical use, and improve the corresponding software erection and program coding, MySQL is used as the main storage unit of background data, Java language is used, SSM technology based on MVVM?mode is used for development, and MyEclipse 2017 CI 10 compiler is used. In terms of data, Microsoft's MySQL relational database is mainly used as the data storage medium, and the system development is completed with the foreground HTML + CSS technology. This report first analyzes the background, function and significance of the research, which lays a foundation for the rationality of the research work. This paper analyzes the various requirements and technical problems of the library service system, proves the necessity and technical feasibility of the system, then makes a basic introduction to the technical software and design ideas needed to design the system, and finally realizes the operation and use of the library service system and departments.
Key words:Library service; Java technology; The Mysql database
目 ?錄
第1章 緒論
1.1?研究背景與意義
1.2?開(kāi)發(fā)現(xiàn)狀
1.3?研究方法
第2章 相關(guān)技術(shù)介紹
2.1J2EE技術(shù)
2.2 MVVM模式
2.3 Mysql數(shù)據(jù)庫(kù)
2.4 B/S結(jié)構(gòu)
2.5 SSM框架
第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?數(shù)據(jù)庫(kù)訪問(wèn)層的實(shí)現(xiàn)
5.2?注冊(cè)模塊的實(shí)現(xiàn)
5.3?登錄模塊的實(shí)現(xiàn)
5.4?用戶資料修改模塊的實(shí)現(xiàn)
5.5?資源庫(kù)數(shù)據(jù)管理模塊的實(shí)現(xiàn)
5.6?圖書(shū)借閱模塊的實(shí)現(xiàn)
5.7?圖書(shū)管理模塊的實(shí)現(xiàn)
5.8?圖書(shū)歸還模塊的實(shí)現(xiàn)
第6章 系統(tǒng)測(cè)試 29
6.1?測(cè)試目的 29
6.2?功能測(cè)試 30
6.3?性能測(cè)試 31
第7章 總結(jié)與展望 32
參考文獻(xiàn) 33
致謝 34
隨著人們知識(shí)層次的提高,圖書(shū)館成為日常生活中不可缺少的一部分。圖書(shū)館管理應(yīng)運(yùn)而生下,書(shū)籍就漸漸地成為人們獲取并增長(zhǎng)知識(shí)的主要途徑,而圖書(shū)館就自然而然地在人們的生活中占據(jù)了一定的位置,圖書(shū)館的存書(shū)量和業(yè)務(wù)量大,僅僅靠傳統(tǒng)的管理是不可行的。如何科學(xué)地管理圖書(shū)館不但關(guān)系到讀者求知的方便程度,也關(guān)系到圖書(shū)館的發(fā)展,因此,開(kāi)發(fā)一套完善的圖書(shū)館管理系統(tǒng)就必不可少了,一線城市大型圖書(shū)館運(yùn)用完善的圖書(shū)管理系統(tǒng),更好的輔助圖書(shū)館的日常管理,鄉(xiāng)鎮(zhèn),鄉(xiāng)村由于較為落后,很多方面的不完善,有些甚至沒(méi)有開(kāi)發(fā),研究鄉(xiāng)村圖書(shū)館管理系統(tǒng)如何設(shè)計(jì)以及實(shí)現(xiàn)是更有助于普通圖書(shū)館日常管理以及更好幫助提高鄉(xiāng)村人們的知識(shí)水平的提高。
所謂的管理信息系統(tǒng)是介于信息論,經(jīng)濟(jì)管理理論,統(tǒng)計(jì)學(xué)與運(yùn)籌學(xué)及計(jì)算機(jī)科學(xué)之間的一門邊緣性,綜合性,系統(tǒng)性的交叉科學(xué),它是隨著管理科學(xué),信息技術(shù),計(jì)算機(jī)技術(shù)等的發(fā)展而產(chǎn)生和發(fā)展起來(lái)的。
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,計(jì)算機(jī)在企業(yè)管理中應(yīng)用的普及,利用計(jì)算機(jī)實(shí)現(xiàn)圖書(shū)信息的管理勢(shì)在必行。目前一些小型的或者是鄉(xiāng)鎮(zhèn)、農(nóng)村圖書(shū)管理的借閱工作部分大多數(shù)還是手工管理,工作效率很低,并且不能及時(shí)了解圖書(shū)的種類和讀者們比較需求的圖書(shū)等,不能更好的適應(yīng)當(dāng)前讀者的借閱要求。手工管理還存在這許多弊端,由于不可避免的人為因素,造成數(shù)據(jù)的遺漏、誤報(bào)。計(jì)算機(jī)信息化管理有著儲(chǔ)存量大,速度快等許多優(yōu)點(diǎn),提供給我們的處理信息及時(shí)快捷,因此我們利用計(jì)算機(jī)提供給我們的信息對(duì)讀者的借閱過(guò)程形成一整套動(dòng)態(tài)的管理能夠極大地提高圖書(shū)管理管理的效率,這也是圖書(shū)管理的科學(xué)化、正規(guī)化管理,與世界、城市接軌的重要條件。
隨著信息技術(shù)在管理上越來(lái)越深入而廣泛的應(yīng)用,管理信息系統(tǒng)的實(shí)施在技術(shù)上已逐步成熟。管理信息系統(tǒng)是一個(gè)不斷發(fā)展的新型學(xué)科,圖書(shū)館要生存要發(fā)展,要高效率地日常圖書(shū)館管理工作等做到位,就必須加強(qiáng)設(shè)計(jì)一套適應(yīng)自己館內(nèi)情況的日常事務(wù)管理系統(tǒng),即加強(qiáng)對(duì)圖書(shū)館內(nèi)方方面面的有效管理。
管理信息系統(tǒng)就是我們常說(shuō)的MIS (Management Information System),在強(qiáng)調(diào)管理,強(qiáng)調(diào)信息的現(xiàn)代社會(huì)中它變得越來(lái)越普及。MIS是一門新的學(xué)科,它跨越了若干個(gè)領(lǐng)域,比如管理科學(xué)、系統(tǒng)科學(xué),運(yùn)籌學(xué)、統(tǒng)計(jì)學(xué)以及計(jì)算機(jī)科學(xué)。在這些學(xué)科的基礎(chǔ)上,形成信息收集和加工的方法,從而形成一個(gè)縱橫交織的系統(tǒng)。管理信息系統(tǒng)是現(xiàn)代信息管理工作不可缺少的一部分,是適應(yīng)現(xiàn)代高圖書(shū)信息管理尺度的要求、推動(dòng)信息管理走向科學(xué)化、規(guī)范化的必要條件。
當(dāng)前網(wǎng)上圖書(shū)館系統(tǒng)中,主流的國(guó)內(nèi)產(chǎn)品主要有匯文軟件產(chǎn)品、ADLIB2.0、金盤軟件產(chǎn)品等,主流的國(guó)外產(chǎn)品主要以ExLibris的Aleph500為代表。近年來(lái),隨著Web2.0的發(fā)展和Library2.0研究的深入,給網(wǎng)上圖書(shū)館系統(tǒng)帶來(lái)了新的理念和思路,網(wǎng)上圖書(shū)館系統(tǒng)很好的融合了Library2.0的理念和Web2.0的技術(shù)。當(dāng)前網(wǎng)上圖書(shū)館系統(tǒng)普遍存在的問(wèn)題有:①圖書(shū)館資源與服務(wù)的相對(duì)隔離與孤立;②不能全面集成圖書(shū)館的業(yè)務(wù)和管理工作;③信息孤島現(xiàn)象日益嚴(yán)重;④難以體現(xiàn)圖書(shū)館的管理思路。網(wǎng)上圖書(shū)館系統(tǒng)的發(fā)展趨勢(shì):①融合圖書(shū)館的管理理念;②數(shù)據(jù)驅(qū)動(dòng)管理;③開(kāi)放合作的理念;④云計(jì)算;⑤整合服務(wù)評(píng)價(jià)體系。
首先,通過(guò)引擎搜索或者查閱相關(guān)文獻(xiàn)資料,了解了本系統(tǒng)開(kāi)發(fā)的背景以及設(shè)計(jì)系統(tǒng)的意義所在,收集用戶需求信息。其次,在開(kāi)發(fā)工具上,最終確定選用JAVA平臺(tái)來(lái)設(shè)計(jì)開(kāi)發(fā)本系統(tǒng),Mysql作為設(shè)計(jì)數(shù)據(jù)庫(kù)的工具。即利用JAVA語(yǔ)言實(shí)現(xiàn)用戶界面,并同數(shù)據(jù)庫(kù)連接起來(lái)實(shí)現(xiàn)完整的通信功能。之后,設(shè)計(jì)出系統(tǒng)大致的功能模塊。主要從方便系統(tǒng)用戶和系統(tǒng)管理員的角度進(jìn)行分析,明確該系統(tǒng)應(yīng)該具有的功能。最終是測(cè)試系統(tǒng),通過(guò)用例測(cè)試發(fā)現(xiàn)存在的問(wèn)題并找到解決的方案。利用現(xiàn)有的開(kāi)發(fā)平臺(tái),結(jié)合自己所學(xué)的知識(shí),在老師的指導(dǎo)幫助下來(lái)完成該設(shè)計(jì),確保系統(tǒng)的可用性、實(shí)用性。
人可以掌握多門外語(yǔ),而一個(gè)計(jì)算機(jī)科學(xué)家精通的大多是編程語(yǔ)言,它不是人類的自然語(yǔ)言,比如C語(yǔ)言、Java、Perl等等。由于不同的公司開(kāi)發(fā)出的“中間件”不夠規(guī)范,所以Sun公司推出J2EE,用這個(gè)標(biāo)準(zhǔn)來(lái)解決弊病。它提供了良好的機(jī)制,讓每個(gè)層次允許與之相對(duì)的服務(wù)器、組件運(yùn)行,使得系統(tǒng)的搭建穩(wěn)定可用、開(kāi)發(fā)高效、維護(hù)方便。
MVVM模式是常用的開(kāi)發(fā)模式,主要是在代碼實(shí)現(xiàn)上將其分為M層、V層和C層。
視圖(View)代表用戶交互界面,一個(gè) Web 應(yīng)用就可能有很多的界面,在 MVVM?模式中,視圖僅僅處理的只有數(shù)據(jù)采集、處理,還有用戶的請(qǐng)求, 并不包括業(yè)務(wù)流程的處理,業(yè)務(wù)流程由模型(Model)來(lái)處理。
模型(Model)就是業(yè)務(wù)流程/狀態(tài)的處理及業(yè)務(wù)規(guī)則的制定。模型處理業(yè)務(wù)流程的過(guò)程其它層是無(wú)法看見(jiàn)了的,它就像黑箱子,在接受視圖請(qǐng)求的數(shù)據(jù)之后,然后返回最終的處理結(jié)果。MVVM?最主要的核心就是業(yè)務(wù)模型的設(shè)計(jì),一個(gè)典型的應(yīng)用例子就是目前流行的 EJB 模型,它從應(yīng)用技術(shù)實(shí)現(xiàn)的角度對(duì)模型做了進(jìn)一步的劃分,以便充分利用現(xiàn)有的組件,但是它不能作為應(yīng)用設(shè)計(jì)模型的框架。
控制器(Controller)可以理解為接收用戶的請(qǐng)求,然后視圖和模型匹配在一起,一起再完成用戶請(qǐng)求。它有非常明顯的作用在劃分控制層上,可以很清晰地告訴你,它就是一個(gè)分發(fā)器,選擇什么樣的模型、視圖,可以完成用戶的什么樣的請(qǐng)求。控制層不做所有的數(shù)據(jù)處理,比如說(shuō):用戶點(diǎn)擊一個(gè)連接,控制層接受到請(qǐng)求之后,并不處理業(yè)務(wù)信息,它只是向模型傳遞用戶的信息,同時(shí)告訴模型做什么,然后選擇符合需求的視圖返回給用戶。
科技的進(jìn)步,給日常帶來(lái)許多便利:教室的投影器用到了虛擬成像技術(shù),數(shù)碼相機(jī)用到了光電檢測(cè)技術(shù),比如超市貨物進(jìn)出庫(kù)的記錄需要一個(gè)信息倉(cāng)庫(kù)。這個(gè)信息倉(cāng)庫(kù)就是數(shù)據(jù)庫(kù),而這次的醫(yī)院人事管理系統(tǒng)也需要這項(xiàng)技術(shù)的支持。
用MySQL這個(gè)軟件,是因?yàn)樗芙邮芏鄠€(gè)使用者訪問(wèn),而且里面存在Archive等。它會(huì)先把數(shù)據(jù)進(jìn)行分類,然后分別保存在表里,這樣的特別操作就會(huì)提高數(shù)據(jù)管理系統(tǒng)自身的速度,讓數(shù)據(jù)庫(kù)能被靈活運(yùn)用。MySQL的代碼是公開(kāi)的,而且允許別人二次編譯升級(jí)。這個(gè)特點(diǎn)能夠降低使用者的成本,再搭配合適的軟件后形成一個(gè)良好的網(wǎng)站系統(tǒng)。雖然它有缺點(diǎn),但是綜合各方面來(lái)說(shuō),它是使用者的主流運(yùn)用的對(duì)象。
B/S(Browser/Server)比前身架構(gòu)更為省事的架構(gòu)。它借助Web server完成數(shù)據(jù)的傳遞交流。只需要下載瀏覽器作為客戶端,那么工作就達(dá)到“瘦身”效果, 不需要考慮不停裝軟件的問(wèn)題。
SSM即SpringMVVM+Spring+Mybatis,這三個(gè)框架有各自最獨(dú)有的優(yōu)勢(shì),那么將它們組合在一起能夠碰撞出很強(qiáng)的火花。設(shè)計(jì)者在不需消耗大量功夫,能做出Web應(yīng)用程序,而且這個(gè)程序還具有層次清晰、升級(jí)更新操作不影響正常使用的、允許多次使用的特點(diǎn)。這個(gè)復(fù)合框架形成一個(gè)有著結(jié)構(gòu)完整、功能強(qiáng)大和結(jié)構(gòu)良好的體系:SpringMVVM使各板塊分離,Spring使開(kāi)發(fā)更靈活方便,使用Mybatis讓開(kāi)發(fā)者直接對(duì)對(duì)象進(jìn)行操縱,各層次分工明細(xì),并實(shí)現(xiàn)各個(gè)層次間的解耦,讓代碼更加的靈活精簡(jiǎn)。這個(gè)框架使程序員能夠規(guī)避在開(kāi)發(fā)時(shí)期避免個(gè)別錯(cuò)誤導(dǎo)致整體被破壞,也能在后期應(yīng)對(duì)客戶對(duì)產(chǎn)品提出的新需求。
本次設(shè)計(jì)基于B/S 模式下,運(yùn)用Java、JSP技術(shù)采用的是MySQL數(shù)據(jù)庫(kù)和Myeclipse實(shí)現(xiàn),總體的可行性共分為以下三個(gè)方面。
所謂的技術(shù)可行性就是在限定時(shí)間,前期擬定的功能能否被滿足。在開(kāi)發(fā)設(shè)計(jì)上是否會(huì)遇上解決不了的問(wèn)題。做完的項(xiàng)目能否被很好地應(yīng)用,如果存在缺點(diǎn)在后期的維護(hù)上是否存在很大的難度。在對(duì)這個(gè)系統(tǒng)評(píng)估后,認(rèn)定已存在的技術(shù)能達(dá)成目標(biāo)。用JSP技術(shù)來(lái)實(shí)現(xiàn)動(dòng)態(tài)的頁(yè)面,嵌入低依賴性的設(shè)計(jì)模式,靈活的數(shù)據(jù)庫(kù),配合穩(wěn)定的服務(wù)器,整個(gè)系統(tǒng)的運(yùn)行效率大大提升。由此可見(jiàn),在技術(shù)層面達(dá)成目標(biāo)不是非非之想。
在項(xiàng)目上使用的工具大部分都是是當(dāng)下流行開(kāi)源免費(fèi)的,所以在開(kāi)發(fā)前期,開(kāi)發(fā)時(shí)用于項(xiàng)目的經(jīng)費(fèi)將會(huì)大大降低,不會(huì)讓開(kāi)發(fā)該軟件在項(xiàng)目啟動(dòng)期受到經(jīng)費(fèi)的影響,所以經(jīng)濟(jì)上還是可行的。盡量用最少的花費(fèi)去滿足用戶的需求。省下經(jīng)費(fèi)用于人工費(fèi),以及設(shè)備費(fèi)用。將在無(wú)紙化,高效率的道路上越走越遠(yuǎn)。
本系統(tǒng)實(shí)現(xiàn)功能的操作很簡(jiǎn)單,普通電腦的常見(jiàn)配置就可以運(yùn)行本軟件,并且只要粗通電腦使用的基本常識(shí)就可以流暢的使用本軟件。電腦具備連接互聯(lián)網(wǎng)的能力,并且可以正常訪問(wèn)系統(tǒng),并不需要操作者有什么高超的能力,只需了解業(yè)務(wù)流程,并且按照專業(yè)知識(shí)進(jìn)行正確操作即可,所以醫(yī)院人事管理系統(tǒng)具備操作可行性。
在系統(tǒng)開(kāi)發(fā)設(shè)計(jì)前,應(yīng)該對(duì)功能做初步設(shè)想,清楚這個(gè)管理系統(tǒng)有什么板塊,每個(gè)板塊有什么功能,整體的設(shè)計(jì)是否滿足使用者的需求,接著對(duì)所開(kāi)發(fā)的系統(tǒng)功能進(jìn)行的詳細(xì)分析總結(jié),從而設(shè)計(jì)出完整的系統(tǒng)并將其實(shí)現(xiàn)。用戶和開(kāi)發(fā)人員的交流分析,使其達(dá)到最佳理解程度,使系統(tǒng)功能達(dá)到最佳。
系統(tǒng)用戶示例圖如下所示。
?
圖3-1 系統(tǒng)用戶示例圖
圖書(shū)管理員用例圖如下所示。
?
圖3-1 圖書(shū)管理員用例圖
前臺(tái)用戶可分為未注冊(cè)用戶需求和已注冊(cè)用戶需求。
未注冊(cè)用戶的功能如下:
注冊(cè)賬號(hào):用戶填寫個(gè)人信息,密碼設(shè)置。
個(gè)人信息修改:用戶可以修改自己的頭像、具體信息等。
圖書(shū)搜索:用戶可以根據(jù)自己需要搜索相關(guān)書(shū)籍,并選中某個(gè)書(shū)籍查看詳情搜索找到圖書(shū)后進(jìn)行詳情查詢。
圖書(shū)借閱:查看圖書(shū)剩余量以及借閱情況,有多余的書(shū)籍可在圖書(shū)信息中進(jìn)行借閱。
圖書(shū)歸還:借閱完后的圖書(shū)歸還。
圖書(shū)預(yù)留:當(dāng)書(shū)籍已經(jīng)借光,可以進(jìn)行預(yù)留功能,當(dāng)書(shū)籍被還,用戶會(huì)收到通知。
已注冊(cè)用戶的功能如下:
管理員功能如下:
修改密碼:管理員可以隨時(shí)修改自己進(jìn)入系統(tǒng)的登錄密碼,以保證系統(tǒng)的安全性。
對(duì)借閱單信息進(jìn)行處理:辦理借閱單審核等。
用戶管理:管理員管理用戶基礎(chǔ)信息包括修改查看用戶信息,管理員還可注冊(cè)用戶。
圖書(shū)信息管理:對(duì)圖書(shū)信息進(jìn)行維護(hù),添加、刪除、修改信息。
書(shū)籍類別管理:主要實(shí)現(xiàn)書(shū)籍類別的動(dòng)態(tài)管理。
智能推薦功能:根據(jù)用戶的點(diǎn)擊量來(lái)做一個(gè)簡(jiǎn)單的智能推薦,根據(jù)點(diǎn)擊量來(lái)排序圖書(shū)的順序,推薦熱門書(shū)籍。
首先主要考慮的是系統(tǒng)功能軟件,在具體設(shè)計(jì)的環(huán)節(jié)上,是不是能夠較好的滿足各類用戶的基本功能需求,如果不能較好的滿足用戶需求,那么這個(gè)系統(tǒng)的存在是沒(méi)有價(jià)值的。軟件系統(tǒng)的非功能性求分析,從7個(gè)方面展開(kāi),一個(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ū)館服務(wù)系統(tǒng)存在的性能、安全、擴(kuò)展、完整度等7個(gè)方面性能綜合比對(duì)分析后發(fā)現(xiàn),需要相應(yīng)的非功能性需求分析。
安全性對(duì)每一個(gè)系統(tǒng)來(lái)說(shuō)都是非常重要的。安全性很好的系統(tǒng)可以保護(hù)企業(yè)的信息和用戶的信息不被竊取。提高系統(tǒng)的安全性不僅是對(duì)用戶的負(fù)責(zé),更是對(duì)企業(yè)的負(fù)責(zé)。尤其針對(duì)于圖書(shū)館服務(wù)系統(tǒng)來(lái)說(shuō),必須要有很好的安全性來(lái)保障整個(gè)系統(tǒng)。
系統(tǒng)具有對(duì)使用者有權(quán)限控制,針對(duì)角色的不通限制使用者的權(quán)限,以此來(lái)確保系統(tǒng)的安全性。
數(shù)據(jù)庫(kù)中的數(shù)據(jù)是從外界輸入的,當(dāng)數(shù)據(jù)的輸入時(shí),由于種種原因,輸入的數(shù)據(jù)會(huì)無(wú)效,或者是臟數(shù)據(jù)。因此,怎樣保證輸入的數(shù)據(jù)符合規(guī)定,成為了數(shù)據(jù)庫(kù)系統(tǒng),尤其是多用戶的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)首要關(guān)注的問(wè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ù)來(lái)判斷后,跳轉(zhuǎn)到對(duì)應(yīng)的功能界面。在系統(tǒng)的內(nèi)部用戶就可以對(duì)數(shù)據(jù)進(jìn)行操作,數(shù)據(jù)庫(kù)中心就可以接收到系統(tǒng)傳輸?shù)挠行?shù)據(jù)流來(lái)對(duì)數(shù)據(jù)sql語(yǔ)句進(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ù)連接主要通過(guò)數(shù)據(jù)庫(kù),既分別對(duì)數(shù)據(jù)庫(kù)做不同的操作。
本圖書(shū)館服務(wù)系統(tǒng)的架構(gòu)設(shè)計(jì)主要分為可以3層,主要有Web層,業(yè)務(wù)層,Model層。其中web層還包括View層和Controller層,Model層包括元數(shù)據(jù)擴(kuò)展層和數(shù)據(jù)訪問(wèn)層。
系統(tǒng)架構(gòu)如下圖所示。
?
圖4-1 系統(tǒng)架構(gòu)
圖書(shū)館服務(wù)系統(tǒng)總體分為前臺(tái)用戶模塊和后臺(tái)管理員模塊。
兩個(gè)模塊表現(xiàn)上是分別獨(dú)立存在,但是訪問(wèn)的數(shù)據(jù)庫(kù)是一樣的。每一個(gè)模塊的功能都是根據(jù)先前完成的需求分析,并查閱相關(guān)資料后整理制作的。
綜上所述,系統(tǒng)功能結(jié)構(gòu)圖如下圖所示。
?
圖4-2 系統(tǒng)功能結(jié)構(gòu)圖
登錄模塊:登錄模塊是進(jìn)入系統(tǒng)的入口,所有用戶必須登錄后才能訪問(wèn)系統(tǒng)。登錄需要輸入用戶名和密碼,如果多次嘗試登錄需要輸入驗(yàn)證碼。登錄時(shí)需要選擇用戶的角色,是一般用戶還是管理員登錄等。登錄成功后,會(huì)通過(guò)數(shù)據(jù)庫(kù)獲取用戶的權(quán)限,并跳轉(zhuǎn)至用戶的主頁(yè)面。
留言版模塊:留言板促進(jìn)用戶之間的交流,發(fā)表個(gè)人意見(jiàn)、建議、看法等,在留言板可以查看已有的留言記錄,發(fā)布新留言,可以展示個(gè)人動(dòng)態(tài)頭像,個(gè)人匿名昵稱等。
評(píng)價(jià)模塊:評(píng)價(jià)模塊促進(jìn)用戶對(duì)圖書(shū)進(jìn)行點(diǎn)評(píng),查看某個(gè)圖書(shū)已存在的評(píng)價(jià),發(fā)表評(píng)價(jià)可以達(dá)到真實(shí)描述圖書(shū)的效果。
資源庫(kù)數(shù)據(jù)模塊:可分為資源庫(kù)數(shù)據(jù)瀏覽、資源庫(kù)數(shù)據(jù)檢索、資源庫(kù)數(shù)據(jù)維護(hù)三個(gè)模塊,管理員對(duì)資源庫(kù)數(shù)據(jù)有維護(hù)的權(quán)限,發(fā)布新的資源庫(kù)數(shù)據(jù)、更新已有的資源庫(kù)數(shù)據(jù)等。
圖書(shū)管理模塊:圖書(shū)管理分為圖書(shū)添加、修改和圖書(shū)借閱。圖書(shū)信息由管理員進(jìn)行修改、添加、刪除操作;圖書(shū)借閱由普通用戶來(lái)執(zhí)行。
圖書(shū)館管理系統(tǒng)模塊:圖書(shū)館管理分為圖書(shū)信息添加、修改和圖書(shū)館數(shù)據(jù)借閱預(yù)約。圖書(shū)館具體信息由管理員進(jìn)行修改、添加、刪除操作;圖書(shū)館書(shū)籍借閱預(yù)約由普通用戶來(lái)執(zhí)行。
從前面可以分析到數(shù)據(jù)庫(kù)中最重要的是圖書(shū)信息,用戶信息,借閱信息,同時(shí)存在圖書(shū)歸還信息和預(yù)約信息。分析可以得到如下數(shù)據(jù)描述:
平臺(tái)用戶:用于記錄用戶的各種信息,包括用戶名、密碼、頭像、姓名、性別、年齡、聯(lián)系手機(jī)、郵箱等數(shù)據(jù)項(xiàng)。
管理員:記錄管理員的登錄信息。包括用戶名,密碼,權(quán)限等數(shù)據(jù)項(xiàng)。
圖書(shū):存放給圖書(shū)的內(nèi)容,包括圖書(shū)編號(hào)、圖書(shū)名稱、圖書(shū)類別、作者、封面、可借閱數(shù)量等數(shù)據(jù)項(xiàng)。
圖書(shū)借閱:存儲(chǔ)用戶的圖書(shū)借閱信息。包括圖書(shū)借閱的圖書(shū)編號(hào)、圖書(shū)名稱、圖書(shū)類別、可借閱數(shù)量、借閱數(shù)量、預(yù)計(jì)歸還時(shí)間、用戶名、是否審核等數(shù)據(jù)項(xiàng)。
圖書(shū)歸還:存儲(chǔ)用戶的圖書(shū)歸還信息。包括圖書(shū)歸還的圖書(shū)編號(hào)、圖書(shū)名稱、圖書(shū)類別、歸還時(shí)間。
資源庫(kù)數(shù)據(jù):存儲(chǔ)平臺(tái)內(nèi)的資源庫(kù)數(shù)據(jù)內(nèi)容。包括資源名稱、資源類型、圖片、文檔、視頻等數(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ū)館管理系統(tǒng)所擁有的數(shù)據(jù)表有以下:書(shū)籍分類,圖書(shū)信息表,圖書(shū)預(yù)約表,圖書(shū)借閱表,圖書(shū)歸還表。
由于數(shù)據(jù)表較多,只展示系統(tǒng)主要數(shù)據(jù)表,如下表所示。
type表:
????????????????????
| 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| int | 11 | 是 | 是 | 商品分類ID |
| smallint | 5 | 是 | 否 | 上級(jí)分類ID |
| varchar | 255 | 否 | 否 | 商品名稱 |
| varchar | 255 | 否 | 否 | 描述 |
| varchar | 255 | 否 | 否 | 圖標(biāo) |
| varchar | 255 | 否 | 否 | 來(lái)源表 |
| varchar | 255 | 否 | 否 | 來(lái)源字段 |
| timestamp | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| timestamp | 0 | 是 | 否 | 更新時(shí)間 |
????????
book_management表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| book_management_id | int | 11 | 是 | 是 | 書(shū)籍管理ID |
| book_number | varchar | 64 | 是 | 否 | 書(shū)籍編號(hào) |
| author | varchar | 64 | 否 | 否 | 作者 |
| title | varchar | 64 | 否 | 否 | 書(shū)名 |
| category | varchar | 64 | 否 | 否 | 類別 |
| launch_date | date | 0 | 否 | 否 | 上架日期 |
| price | int | 11 | 否 | 否 | 價(jià)格 |
| stock | int | 11 | 否 | 否 | 庫(kù)存 |
| display_diagram | varchar | 255 | 否 | 否 | 展示圖 |
| details | longtext | 0 | 否 | 否 | 詳情 |
| hits | int | 11 | 是 | 否 | 點(diǎn)擊數(shù) |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| seat | varchar | 64 | 是 | 否 | 座位號(hào) |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
reserve表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| reserve_id | int | 11 | 是 | 是 | 預(yù)留ID |
| title | varchar | 64 | 否 | 否 | 書(shū)名 |
| number_of_applications | varchar | 64 | 否 | 否 | 申請(qǐng)數(shù)量 |
| category | varchar | 64 | 否 | 否 | 類別 |
| applicant | int | 11 | 否 | 否 | 申請(qǐng)人 |
| author | varchar | 64 | 否 | 否 | 作者 |
| application_time | date | 0 | 否 | 否 | 申請(qǐng)時(shí)間 |
| contact_information | varchar | 64 | 否 | 否 | 電話號(hào)碼 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| examine_reply | varchar | 255 | 否 | 否 | 審核回復(fù) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
lend表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| lend_id | int | 11 | 是 | 是 | 出借ID |
| author | varchar | 64 | 否 | 否 | 作者 |
| book_number | varchar | 64 | 否 | 否 | 書(shū)籍編號(hào) |
| title | varchar | 64 | 否 | 否 | 書(shū)名 |
| contact_number | varchar | 64 | 否 | 否 | 聯(lián)系電話 |
| price | varchar | 64 | 否 | 否 | 價(jià)格 |
| borrowing_number | int | 11 | 否 | 否 | 借閱數(shù) |
| student_number | int | 11 | 否 | 否 | 借書(shū)人 |
| total_price | varchar | 64 | 否 | 否 | 總價(jià) |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
book_return表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| book_return_id | int | 11 | 是 | 是 | 圖書(shū)歸還ID |
| title | varchar | 64 | 否 | 否 | 書(shū)名 |
| book_number | varchar | 64 | 否 | 否 | 書(shū)籍編號(hào) |
| author | varchar | 64 | 否 | 否 | 作者 |
| book_returning_person | int | 11 | 否 | 否 | 還書(shū)人 |
| borrowing_number | varchar | 64 | 否 | 否 | 借閱數(shù) |
| time | date | 0 | 否 | 否 | 時(shí)間 |
| examine_state | varchar | 16 | 是 | 否 | 審核狀態(tài) |
| recommend | int | 11 | 是 | 否 | 智能推薦 |
| create_time | datetime | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
slides表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| slides_id | int | 10 | 是 | 是 | 輪播圖ID |
| title | varchar | 64 | 否 | 否 | 標(biāo)題 |
| content | varchar | 255 | 否 | 否 | 內(nèi)容 |
| url | varchar | 255 | 否 | 否 | 鏈接 |
| img | varchar | 255 | 否 | 否 | 輪播圖 |
| hits | int | 10 | 是 | 否 | 點(diǎn)擊量 |
| create_time | timestamp | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
notice表:
| 名稱 | 類型 | 長(zhǎng)度 | 不是null | 主鍵 | 注釋 |
| notice_id | mediumint | 8 | 是 | 是 | 公告id |
| title | varchar | 125 | 是 | 否 | 標(biāo)題 |
| content | longtext | 0 | 否 | 否 | 正文 |
| create_time | timestamp | 0 | 是 | 否 | 創(chuàng)建時(shí)間 |
| update_time | timestamp | 0 | 是 | 否 | 更新時(shí)間 |
?
從B/S架構(gòu)的原理可知,圖書(shū)館管理系統(tǒng)的各大模塊的實(shí)現(xiàn)均需要對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行操作,具體包括查詢數(shù)據(jù)、寫入數(shù)據(jù)、更新數(shù)據(jù)和刪除數(shù)據(jù),因此,在開(kāi)發(fā)各功能模塊前,連接數(shù)據(jù)庫(kù)文件在Resources?文件夾下的application.yml文件。
該文件的代碼如下:
server:
??port: 5000
??servlet:
????context-path: /api
spring:
??datasource:
????url: jdbc:mysql://127.0.0.1:3306/CS725260_20211101091736?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
????username: root
????password: root
????driver-class-name: com.mysql.cj.jdbc.Driver
??jackson:
????property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
????default-property-inclusion: ALWAYS
????time-zone: GMT+8
????date-format: yyyy-MM-dd HH:mm:ss
??servlet:
????multipart:
??????max-file-size: 100MB
??????max-request-size: 100MB
用戶在填寫數(shù)據(jù)的時(shí)候必須與注冊(cè)頁(yè)面上的驗(yàn)證相匹配否則會(huì)注冊(cè)失敗,注冊(cè)頁(yè)面的表單驗(yàn)證是通過(guò)JavaScript進(jì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)證通過(guò)的時(shí)候你點(diǎn)擊注冊(cè),表單會(huì)將你輸入的值通過(guò)name值傳遞給后臺(tái)并保存到數(shù)據(jù)庫(kù)中。
用戶注冊(cè)流程圖如下圖所示。
?
圖5-1用戶注冊(cè)流程圖
用戶注冊(cè)界面如下圖所示。
?
圖5-2用戶注冊(cè)界面
用戶注冊(cè)的關(guān)鍵代碼為:
/**
?????* 登錄
?????* @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);
主要由兩部分組成,登錄前的登錄界面以及登錄后的用戶功能界面。登錄界面,要求用戶輸入用戶名和密碼,當(dāng)用戶名和密碼其中一個(gè)輸入為空時(shí),給出提示“用戶名,密碼不能為空”。獲取用戶名和密碼后到數(shù)據(jù)庫(kù)中查找,如果用戶名存在,以及對(duì)應(yīng)的密碼正確,則登錄成功,否則登錄失敗。登錄失敗后給出提示,并把焦點(diǎn)停在文本框中。登錄成功后將該次會(huì)話的全局變量username設(shè)置為用戶名。登錄成功后進(jìn)入會(huì)員的功能模塊,主要有會(huì)員基本信息修改,已經(jīng)發(fā)布圖書(shū)信息管理,發(fā)布信息,和退出功能。退出功能是清除全局變量username的值,并跳回到首頁(yè)。
登錄流程圖如下圖所示。
?
圖5-3登錄流程圖
用戶登錄界面如下圖所示。
?
圖5-4用戶登錄界面
用戶登錄的關(guān)鍵代碼如下:
?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("已通過(guò)")){
????????????????return error(30000,"該用戶審核未通過(guò)");
????????????}
????????}
????????//查詢用戶狀態(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)存在了,否則通過(guò)Id來(lái)查詢用戶,并將用戶的信息修改為表單提交的數(shù)據(jù)。
如果資源庫(kù)數(shù)據(jù)的信息需要修改,管理員可以通過(guò)查詢資源庫(kù)數(shù)據(jù)的基本信息來(lái)查詢資源庫(kù)數(shù)據(jù),查詢資源庫(kù)數(shù)據(jù)是通過(guò)ajax技術(shù)來(lái)進(jìn)行查詢的,需要傳遞資源庫(kù)數(shù)據(jù)的標(biāo)題、編號(hào)等參數(shù)然后在返回到該頁(yè)面中,可以選中要修改或刪除的那條信息,如果選中了超過(guò)一條數(shù)據(jù),頁(yè)面會(huì)挑一個(gè)窗口提醒只能選擇一條數(shù),如果沒(méi)有選中數(shù)據(jù)會(huì)挑一個(gè)窗口題型必須選擇一條數(shù)據(jù)。當(dāng)選擇確認(rèn)修改的時(shí)候,后臺(tái)會(huì)根據(jù)傳過(guò)來(lái)的id到數(shù)據(jù)庫(kù)查詢,并將結(jié)果返回到修改頁(yè)面中,可以在修改頁(yè)面中修改剛剛選中的信息當(dāng)點(diǎn)擊確認(rèn)的時(shí)候from表單會(huì)將修改的數(shù)據(jù)提交到后臺(tái)并保存到數(shù)據(jù)庫(kù)中,就是說(shuō)如果提交的數(shù)據(jù)數(shù)據(jù)庫(kù)中存在就修改,否則就保存。
資源庫(kù)數(shù)據(jù)管理界面如下圖所示。
?
圖5-5資源庫(kù)數(shù)據(jù)管理界面
資源庫(kù)數(shù)據(jù)發(fā)布的關(guān)鍵代碼如下:
?@RequestMapping(value = {"/count_group", "/count"})
????public Map<String, Object> count(HttpServletRequest request) {
????????Query count = service.count(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
圖書(shū)借閱功能需要考慮高并發(fā),防止出現(xiàn)圖書(shū)重復(fù)借閱、圖書(shū)狀態(tài)顯示出錯(cuò)等情況,特對(duì)圖書(shū)這一共享數(shù)據(jù)增加鎖機(jī)制。在樂(lè)觀鎖、悲觀鎖以及線程鎖中,綜合考慮性能效率和錯(cuò)誤的可接受性選擇了樂(lè)觀鎖機(jī)制。樂(lè)觀鎖的實(shí)現(xiàn)方式是使用版本標(biāo)識(shí)來(lái)確定讀到的數(shù)據(jù)與提交時(shí)的數(shù)據(jù)是否一致,提交后修改版本標(biāo)識(shí),不一致時(shí)可以采取丟棄和再次嘗試的策略。在數(shù)據(jù)庫(kù)圖書(shū)表(對(duì)應(yīng)圖書(shū)實(shí)體)設(shè)計(jì)中增加了version字段,每次數(shù)據(jù)提交時(shí)(更改圖書(shū)狀態(tài))會(huì)判斷version是否匹配,若不匹配停止本次提交,若匹配則提交成功并增加version的值。
圖書(shū)借閱功能整體流程:用戶瀏覽圖書(shū)信息時(shí),同時(shí)會(huì)顯示圖書(shū)的狀態(tài),系統(tǒng)會(huì)在其顯示詳細(xì)信息的頁(yè)面時(shí)便會(huì)判斷圖書(shū)的狀態(tài),若圖書(shū)狀態(tài)為可借閱,則會(huì)顯示借閱的鏈接按鈕。在用戶點(diǎn)擊借閱按鈕時(shí),會(huì)先通過(guò)攔截器判斷用戶是否登錄,若未登錄,會(huì)跳轉(zhuǎn)至登錄頁(yè)面,提示用戶先登錄,若為登錄用戶就會(huì)跳轉(zhuǎn)至填寫借閱信息的頁(yè)面,填寫好借閱信息之后,點(diǎn)擊提交按鈕,借閱成功之后返回提示信息,告知用戶借閱成功。
圖書(shū)借閱流程圖如下圖所示。
?
圖5-6圖書(shū)借閱流程圖
圖書(shū)借閱界面如下圖所示。
?
圖5-7圖書(shū)借閱管理界面
圖書(shū)借閱關(guān)鍵代碼為:
?@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);
}
此頁(yè)面的關(guān)鍵是編寫圖書(shū)信息,包括圖書(shū)編號(hào),名稱,詳情等。單擊提交按鈕以完成信息的添加。如果未寫入完整的圖書(shū)信息,例如,如果未寫入圖書(shū)編號(hào),系統(tǒng)將給出相應(yīng)的錯(cuò)誤提示,并且無(wú)法成功輸入。數(shù)據(jù)以概念的形式以onsubmit =“return checkForm()”的形式寫入以進(jìn)行檢查,checkForm()函數(shù)是一種用于寫入數(shù)據(jù)的不同類型的校對(duì)方法,是不是為空也是經(jīng)過(guò)form表單中的οnsubmit=”return checkForm()來(lái)檢查。
管理員點(diǎn)擊左側(cè)菜單“圖書(shū)信息管理”,頁(yè)面跳轉(zhuǎn)到圖書(shū)信息管理外觀,調(diào)用后臺(tái)圖書(shū)查詢所有圖書(shū)信息。并將信息密封到數(shù)據(jù)集合List,綁定到請(qǐng)求對(duì)象,然后頁(yè)面跳轉(zhuǎn)到相應(yīng)的php頁(yè)面,顯示出圖書(shū)信息,單擊刪除按鈕完成圖書(shū)信息的刪除。
圖書(shū)管理流程圖如下圖所示。
?
圖5-8圖書(shū)管理流程圖
圖書(shū)管理如下圖所示。
?
圖5-9圖書(shū)管理界面
圖書(shū)發(fā)布的關(guān)鍵代碼如下:
??@RequestMapping("/get_obj")
????public Map<String, Object> obj(HttpServletRequest request) {
????????Query select = service.select(service.readQuery(request), service.readConfig(request));
????????List resultList = select.getResultList();
????????if (resultList.size() > 0) {
????????????JSONObject jsonObject = new JSONObject();
????????????jsonObject.put("obj",resultList.get(0));
????????????return success(jsonObject);
????????} else {
????????????return success(null);
????????}
}
?public Query select(Map<String,String> query,Map<String,String> config){
????????StringBuffer sql = new StringBuffer("select ");
????????sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
????????sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
????????if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
????????????sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
????????}
????????if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
????????????sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
????????}
????????if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
????????????int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
????????????int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
????????????sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
????????}
????????log.info("[{}] - 查詢操作,sql: {}",table,sql);
????????return runEntitySql(sql.toString());
????}
根據(jù)需求,需要對(duì)圖書(shū)歸還進(jìn)行添加、刪除或修改詳情信息。刪除或修改圖書(shū)歸還時(shí),系統(tǒng)根據(jù)圖書(shū)歸還的狀態(tài)判定為可刪除狀態(tài)下,才會(huì)給出刪除和修改鏈接,點(diǎn)擊刪除鏈接按鈕時(shí),請(qǐng)求到達(dá)后臺(tái),還會(huì)先查詢圖書(shū)歸還狀態(tài)再次做出判定能否刪除。點(diǎn)擊修改鏈接按鈕時(shí),會(huì)跳轉(zhuǎn)到修改信息的頁(yè)面,重新填寫好數(shù)據(jù)后,數(shù)據(jù)提交到后臺(tái)會(huì)對(duì)數(shù)據(jù)庫(kù)中相應(yīng)的記錄做出修改。
添加圖書(shū)歸還時(shí),會(huì)給出數(shù)據(jù)填寫的頁(yè)面,該頁(yè)面根據(jù)填寫好的圖書(shū)歸還編號(hào)同樣會(huì)事先發(fā)送Ajax請(qǐng)求查詢編號(hào)是否已存在,數(shù)據(jù)填寫好之后提交到后臺(tái),會(huì)調(diào)用相關(guān)服務(wù)在數(shù)據(jù)庫(kù)中插入記錄。
圖書(shū)歸還管理流程圖如下圖所示。
?
圖5-11圖書(shū)歸還管理流程圖
圖書(shū)歸還添加頁(yè)面設(shè)計(jì)效果如下圖所示。
?
圖5-12圖書(shū)歸還管理界面
圖書(shū)歸還發(fā)布的關(guān)鍵代碼如下:
?@RequestMapping(value = {"/sum_group", "/sum"})
????public Map<String, Object> sum(HttpServletRequest request) {
????????Query count = service.sum(service.readQuery(request), service.readConfig(request));
????????return success(count.getResultList());
}
??
6.1測(cè)試目的
對(duì)任何系統(tǒng)而言,測(cè)試都是必不可少的環(huán)節(jié),測(cè)試可以發(fā)現(xiàn)系統(tǒng)存在的很多問(wèn)題,所有的軟件上線之前,都應(yīng)該進(jìn)行充足的測(cè)試之后才能保證上線后不會(huì)Bug頻發(fā),或者是功能不滿足需求等問(wèn)題的發(fā)生。下面分別從單元測(cè)試,功能測(cè)試和用例測(cè)試來(lái)對(duì)系統(tǒng)進(jìn)行測(cè)試以保證系統(tǒng)的穩(wěn)定性和可靠性。
6.2功能測(cè)試
下表是圖書(shū)管理功能的測(cè)試用例,檢測(cè)了圖書(shū)管理中對(duì)圖書(shū)信息的增加,刪除,修改,查詢操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶登錄系統(tǒng)。
表6-1 圖書(shū)管理的測(cè)試用例
| 功能描述 | 用于圖書(shū)管理 | |
| 測(cè)試目的 | 檢測(cè)圖書(shū)管理時(shí)的各種操作的運(yùn)行情況 | |
| 測(cè)試數(shù)據(jù)以及操作 | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 |
| 點(diǎn)擊添加圖書(shū),必填項(xiàng)合法輸入,點(diǎn)擊保存 | 提示添加成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊添加圖書(shū),必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改圖書(shū),必填項(xiàng)修改為空,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改圖書(shū),必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊刪除圖書(shū),選擇圖書(shū)刪除 | 提示刪除成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索圖書(shū),輸入存在的圖書(shū)名 | 查找出圖書(shū) | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索圖書(shū),輸入不存在的圖書(shū)名 | 不顯示圖書(shū) | 與預(yù)期結(jié)果一致 |
下表是圖書(shū)歸還管理功能的測(cè)試用例,檢測(cè)了圖書(shū)歸還管理中對(duì)圖書(shū)歸還信息的增加,刪除,修改,查詢操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶登錄系統(tǒng)。
表6-2 圖書(shū)歸還管理的測(cè)試用例
| 功能描述 | 用于圖書(shū)歸還管理 | |
| 測(cè)試目的 | 檢測(cè)圖書(shū)歸還管理時(shí)的各種操作的運(yùn)行情況 | |
| 測(cè)試數(shù)據(jù)以及操作 | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 |
| 點(diǎn)擊添加圖書(shū)歸還,必填項(xiàng)合法輸入,點(diǎn)擊保存 | 提示添加成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊添加圖書(shū)歸還,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改圖書(shū)歸還,必填項(xiàng)修改為空,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊修改圖書(shū)歸還,必填項(xiàng)輸入不合法,點(diǎn)擊保存 | 提示必填項(xiàng)不能為空 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊刪除圖書(shū)歸還,選擇圖書(shū)歸還刪除 | 提示刪除成功 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索圖書(shū)歸還,輸入存在的圖書(shū)歸還名 | 查找出圖書(shū)歸還 | 與預(yù)期結(jié)果一致 |
| 點(diǎn)擊搜索圖書(shū)歸還,輸入不存在的圖書(shū)歸還名 | 不顯示圖書(shū)歸還 | 與預(yù)期結(jié)果一致 |
下表是借閱管理功能的測(cè)試用例,檢測(cè)了借閱管理中借閱單的操作是否成功運(yùn)行。觀察系統(tǒng)的響應(yīng)情況,得出該功能也達(dá)到了設(shè)計(jì)目標(biāo),系統(tǒng)運(yùn)行正確。
前置條件;用戶登錄系統(tǒng)。
表6-3 借閱管理的測(cè)試用例
| 功能描述 | 用于借閱管理 | |
| 測(cè)試目的 | 檢測(cè)借閱管理時(shí)各種操作的情況 | |
| 測(cè)試數(shù)據(jù)以及操作 | 預(yù)期結(jié)果 | 實(shí)際結(jié)果 |
| 未選擇圖書(shū),點(diǎn)擊提交 | 提示請(qǐng)選擇圖書(shū) | 與預(yù)期結(jié)果一致 |
| 未輸入數(shù)量,點(diǎn)擊提交 | 提示請(qǐng)輸入數(shù)量 | 與預(yù)期結(jié)果一致 |
| 未選擇時(shí)間,點(diǎn)擊提交 | 提示請(qǐng)選擇時(shí)間 | 與預(yù)期結(jié)果一致 |
6.3性能測(cè)試
使用阿里云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è)過(guò)程中使用了2臺(tái)并發(fā)機(jī)器,每臺(tái)機(jī)器20個(gè)用戶并發(fā),對(duì)系統(tǒng)主頁(yè),登錄,數(shù)據(jù)查詢和數(shù)據(jù)維護(hù)等模塊進(jìn)行并發(fā)訪問(wèn),測(cè)試結(jié)果是有40個(gè)用戶并發(fā)時(shí),數(shù)據(jù)管理相關(guān)頁(yè)面的響應(yīng)時(shí)間甚至達(dá)到了7s,通過(guò)查看服務(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è)試的過(guò)程中,CPU的使用率占用僅8%,也提現(xiàn)出帶寬瓶頸對(duì)系統(tǒng)的影響非常嚴(yán)重。
總結(jié)與展望
隨著計(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ū)館服務(wù)系統(tǒng)為核心展開(kāi)的,主要是為了實(shí)現(xiàn)圖書(shū)館服務(wù)信息化管理和用戶在線預(yù)約圖書(shū)歸還的需求。
圖書(shū)館服務(wù)系統(tǒng)的開(kāi)發(fā)是以Java編程語(yǔ)言作為基礎(chǔ),在系統(tǒng)平臺(tái)上完成編碼工作,系統(tǒng)整體為B/S架構(gòu),數(shù)據(jù)庫(kù)系統(tǒng)使用Mysql。文中詳細(xì)分析了圖書(shū)館服務(wù)系統(tǒng)的研究背景、研究目的和意義、開(kāi)發(fā)工具和相關(guān)技術(shù)以及系統(tǒng)需求、系統(tǒng)詳細(xì)設(shè)計(jì)和系統(tǒng)測(cè)試等等一系列內(nèi)容。系統(tǒng)實(shí)現(xiàn)了圖書(shū)館服務(wù)系統(tǒng)所需的一些基本功能,并通過(guò)測(cè)試對(duì)這些實(shí)現(xiàn)的功能進(jìn)行了完善,進(jìn)而提高了系統(tǒng)整體的實(shí)用性。
系統(tǒng)投入運(yùn)行時(shí),各功能均運(yùn)行正常。系統(tǒng)的每個(gè)界面的操作符合常規(guī)邏輯,對(duì)使用者來(lái)說(shuō)操作簡(jiǎn)單,界面友好。整個(gè)系統(tǒng)的各個(gè)功能設(shè)計(jì)合理,體現(xiàn)了人性化。
但是由于自己在系統(tǒng)開(kāi)發(fā)過(guò)程中對(duì)一些用到的相關(guān)知識(shí)和技術(shù)掌握不夠牢固,再加上自身開(kāi)發(fā)經(jīng)驗(yàn)欠缺,因此系統(tǒng)在有些方面的功能還不夠完善,考慮的不夠全面,因此整個(gè)系統(tǒng)還有待日后逐步完善。
參考文獻(xiàn)
- [1]林妍,毛夢(mèng)雅,丁鄒倩,劉愛(ài)華.基于GPS定位的圖書(shū)館座位管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2021,17(27):5-7.
- [2]李文佳,劉嘉靈,夏儀,陳雪.基于微小程序的智能圖書(shū)館管理系統(tǒng)設(shè)計(jì)[J].數(shù)字通信世界,2021(09):86-87+89.
- [3]徐田.面向知識(shí)服務(wù)的圖書(shū)館管理信息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)與軟件工程,2021(17):188-189.
- [4]顧懿德.基于.NET的基層圖書(shū)館使用預(yù)約管理系統(tǒng)設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2021,17(21):73-75.
- [5]陸亞紅,李靖,施曉華.新技術(shù)環(huán)境下圖書(shū)館智能館藏管理系統(tǒng)設(shè)計(jì)與構(gòu)建[J].圖書(shū)館雜志,2021,40(09):48-53.
- [6]Ostler Karalyn R,Norlander Bree,Weber Nicholas. Using Open Data to Inform Public Library Branch Services[J]. Public Library Quarterly,2021,40(4):
- [7]吾熱亞提·玉素甫.“互聯(lián)網(wǎng)+”背景下智能圖書(shū)館管理系統(tǒng)的設(shè)計(jì)[J].無(wú)線互聯(lián)科技,2021,18(11):50-51.
- [8]Wang Chunyu,Sha Zhengyu,Jia Lin. Research on Digital Resource System Construction of Smart Library Based on Computer Network and Artificial Intelligence[J]. Journal of Physics: Conference Series,2021,1952(4):
- [9]陳美娜,丁憲成.基于大數(shù)據(jù)的圖書(shū)數(shù)字信息資源管理系統(tǒng)設(shè)計(jì)[J].信息與電腦(理論版),2021,33(10):70-72.
- [10]李琳.數(shù)字化圖書(shū)館管理系統(tǒng)設(shè)計(jì)[J].中國(guó)新技術(shù)新產(chǎn)品,2021(08):30-32.
- [11]李鵬,張海燕.基于Java技術(shù)的圖書(shū)館預(yù)約座位管理系統(tǒng)的設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2021,17(08):71-73.
- [12]王玉慶.基于Java的圖書(shū)查詢系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].信息與電腦(理論版),2021,33(02):138-140.
- [13]毛瑞欣,王平,張國(guó)艷,徐婧,趙文恒.基于JAVA的校圖書(shū)館管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息與電腦(理論版),2020,32(23):95-97.
- [14]趙越超,胡杰.基于Java的圖書(shū)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2020,10(08):52-55+58.
- [15]唐靜,史紅娟.下一代圖書(shū)館管理系統(tǒng)新探——以用戶需求為導(dǎo)向的類基礎(chǔ)設(shè)施服務(wù)平臺(tái)構(gòu)想[J].圖書(shū)情報(bào)研究,2020,13(02):101-105.
致謝
本次設(shè)計(jì)歷時(shí)3個(gè)月。在這個(gè)畢業(yè)設(shè)計(jì)中,它離不開(kāi)指導(dǎo)教師的指導(dǎo),使事情基本順利。指導(dǎo)老師無(wú)論是在畢業(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)也給我留下了特別特別深的感覺(jué)。我從老師那里學(xué)到了很多東西。在理論和實(shí)踐中,我的技能得到了特別大的提高。在此,特向教師表示由衷的感激。
經(jīng)過(guò)對(duì)該畢業(yè)設(shè)計(jì)的全部研究和開(kāi)發(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)開(kāi)發(fā)過(guò)程中,我周圍的同學(xué)和朋友給了我很多意見(jiàn),所以我很快就確認(rèn)了系統(tǒng)的商業(yè)思想。再次,我由衷的向他們表示感激。
點(diǎn)贊+收藏+關(guān)注 ?→ ?私信領(lǐng)取本源代碼、數(shù)據(jù)庫(kù)
總結(jié)
以上是生活随笔為你收集整理的springboot+乡村图书管理系统 毕业设计-附源码191505的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 稀土掘金 2022 开发者大会观后总结
- 下一篇: RIGOL示波器编程使用