課程設(shè)計(jì)總結(jié)
1??? 概述
1.1? 項(xiàng)目開發(fā)背景
隨著信息技術(shù)的快速發(fā)展,數(shù)字化管理已經(jīng)成為各行各業(yè)提高效率和管理水平的重要手段。在圖書管理領(lǐng)域,數(shù)字化管理系統(tǒng)可以有效地提高管理效率,提供更好的用戶體驗(yàn)。本項(xiàng)目旨在開發(fā)一個(gè)基于Spring Boot的圖書數(shù)字化管理系統(tǒng),為管理員和讀者提供便捷的操作和管理功能。
- 自動(dòng)化管理需求:傳統(tǒng)的圖書管理往往涉及大量的人工操作,包括手動(dòng)記錄借還信息、圖書分類整理和查詢等。通過(guò)開發(fā)一個(gè)數(shù)字化管理系統(tǒng),可以實(shí)現(xiàn)自動(dòng)化的圖書管理,減少人力成本和提高工作效率。
- 提升用戶體驗(yàn):對(duì)于圖書館或圖書管理機(jī)構(gòu)而言,提供一個(gè)方便易用的系統(tǒng)可以提升用戶的體驗(yàn)和滿意度。數(shù)字化管理系統(tǒng)可以提供在線圖書查詢、預(yù)約借閱、自助借還等功能,方便用戶快速獲取所需圖書,并且減少繁瑣的手續(xù)。
- 數(shù)據(jù)統(tǒng)計(jì)和分析:數(shù)字化管理系統(tǒng)可以收集和存儲(chǔ)大量的圖書相關(guān)數(shù)據(jù),包括借還記錄、讀者偏好、圖書館資源利用情況等。通過(guò)對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分析,可以為圖書館管理者提供決策支持,例如優(yōu)化圖書采購(gòu)、調(diào)整借閱規(guī)則、推薦相關(guān)圖書等。
- 安全和保護(hù):數(shù)字化管理系統(tǒng)可以加強(qiáng)對(duì)圖書和圖書借閱信息的安全管理。通過(guò)權(quán)限控制和身份驗(yàn)證,確保只有授權(quán)人員可以進(jìn)行借閱操作,并保護(hù)讀者隱私和借閱記錄的安全。
通過(guò)這個(gè)基于Spring Boot的圖書數(shù)字化管理系統(tǒng),管理員和讀者可以在線完成相關(guān)操作和管理流程,提高了管理效率,提供了更好的用戶體驗(yàn)。同時(shí),系統(tǒng)還具備安全性高、易于擴(kuò)展和維護(hù)等特點(diǎn),為圖書管理提供了新的解決方案。
1.2? 開發(fā)工具
本項(xiàng)目采用Windows 10和IntelliJ IDEA進(jìn)行系統(tǒng)開發(fā)。
1.3? 采用的技術(shù)
本項(xiàng)目主要采用的技術(shù)有Java、MySQL、Maven、SpringBoot、Mybatis-Plus、MySQL、Vue3、ElementPlus等。
l Java:Java是一種廣泛使用的編程語(yǔ)言,它適用于各種領(lǐng)域,包括桌面應(yīng)用程序、移動(dòng)應(yīng)用程序、網(wǎng)絡(luò)應(yīng)用程序等。
l MySQL:MySQL是一種流行的開源關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),它使用SQL語(yǔ)言作為查詢語(yǔ)言,它被廣泛應(yīng)用于各種應(yīng)用程序中,如Java、Python等。
l Maven:Maven是一個(gè)用于管理Java項(xiàng)目的工具,它可以幫助構(gòu)建、打包和部署Java應(yīng)用程序,它還可以管理項(xiàng)目的依賴關(guān)系。
l SpringBoot:SpringBoot是一個(gè)用于快速構(gòu)建基于Spring框架的Java應(yīng)用程序的工具,它通過(guò)自動(dòng)配置和快速開發(fā)接口簡(jiǎn)化了Java開發(fā)。
l Mybatis-Plus:Mybatis-Plus是一個(gè)增強(qiáng)Mybatis的插件,它提供了更簡(jiǎn)單的API和更強(qiáng)大的功能,如全表操作、分頁(yè)查詢等,可以更方便地使用Mybatis進(jìn)行數(shù)據(jù)庫(kù)操作。
l Vue3:Vue3是Vue.js框架的最新版本,它提供了一個(gè)強(qiáng)大的API,用于構(gòu)建可復(fù)用的組件,并使用虛擬DOM來(lái)實(shí)現(xiàn)快速、高效的渲染。
l ElementPlus:ElementPlus是Element UI的升級(jí)版,它提供了更多主題和組件,可以快速構(gòu)建美觀的Web應(yīng)用程序界面。
1.4? 項(xiàng)目成員
項(xiàng)目成員如表 1?1 項(xiàng)目成員表 1?1所示。
表 1?1 項(xiàng)目成員
姓名 |
職位 |
負(fù)責(zé)范圍 |
項(xiàng)目經(jīng)理 |
負(fù)責(zé)設(shè)計(jì)系統(tǒng)架構(gòu),并整合資料 |
|
系統(tǒng)分析師 |
負(fù)責(zé)對(duì)系統(tǒng)的可行性進(jìn)行分析,并編寫實(shí)現(xiàn)與測(cè)試的內(nèi)容 |
|
設(shè)計(jì)師 |
負(fù)責(zé)對(duì)前端頁(yè)面的設(shè)計(jì),并編寫界面設(shè)計(jì)和數(shù)據(jù)庫(kù)設(shè)計(jì)的內(nèi)容 |
|
前端開發(fā) |
負(fù)責(zé)前端開發(fā),并編寫概述以及開發(fā)日志 |
|
后端開發(fā) |
負(fù)責(zé)后端開發(fā),并編寫接口設(shè)計(jì) |
|
測(cè)試工程師 |
負(fù)責(zé)測(cè)試系統(tǒng),并編寫實(shí)驗(yàn)總結(jié) |
|
運(yùn)維工程師 |
負(fù)責(zé)運(yùn)維系統(tǒng),并編寫系統(tǒng)分析的內(nèi)容 |
2??? 系統(tǒng)分析
2.1? 需求分析
基于Spring Boot框架的數(shù)字化圖書管理系統(tǒng)的需求分析包括賬號(hào)管理、圖書管理、借閱關(guān)系管理和操作臺(tái)統(tǒng)計(jì)信息顯示等功能模塊。系統(tǒng)需要提供普通用戶界面和管理員界面,普通用戶和管理員都能借閱圖書,管理員能夠管理用戶賬號(hào)。此外,系統(tǒng)應(yīng)具備統(tǒng)計(jì)功能,能夠?qū)崟r(shí)顯示網(wǎng)站訪問(wèn)次數(shù)、用戶數(shù)量、借閱數(shù)量和圖書總量等統(tǒng)計(jì)信息。通過(guò)SSM框架的技術(shù)實(shí)現(xiàn),系統(tǒng)能夠?qū)崿F(xiàn)用戶注冊(cè)、登錄、圖書錄入、借閱操作和管理功能,滿足用戶的數(shù)字化圖書管理需求。
2.1.1?????? 成本考慮
在開發(fā)數(shù)字化圖書管理系統(tǒng)的需求分析中,成本考慮是一個(gè)重要因素。團(tuán)隊(duì)規(guī)模為七人、時(shí)間限制為一周,資金不計(jì)。成本考慮包括人力成本、開發(fā)工具和環(huán)境成本、項(xiàng)目管理成本、硬件和基礎(chǔ)設(shè)施成本,以及培訓(xùn)和支持成本。在評(píng)估成本時(shí),需要綜合考慮團(tuán)隊(duì)投入工時(shí)、技能水平、開發(fā)工具和基礎(chǔ)設(shè)施需求,確保在給定時(shí)間內(nèi)能夠?qū)崿F(xiàn)核心功能,并根據(jù)實(shí)際情況進(jìn)行權(quán)衡和決策。
2.1.2?????? 技術(shù)考慮
在技術(shù)考慮中,前端采用Vue框架,后端使用Spring Boot框架,數(shù)據(jù)庫(kù)選擇MySQL。技術(shù)考慮包括前端開發(fā)、后端開發(fā)、數(shù)據(jù)庫(kù)選擇、數(shù)據(jù)交互與API設(shè)計(jì)以及安全性考慮。通過(guò)合理利用這些技術(shù),能夠?qū)崿F(xiàn)用戶界面的交互和數(shù)據(jù)展示,實(shí)現(xiàn)業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn),確保數(shù)據(jù)的安全性和有效性,以滿足系統(tǒng)的功能、性能和安全性要求。
2.1.3?????? 市場(chǎng)考慮
市場(chǎng)考慮在需求分析中是至關(guān)重要的,包括明確目標(biāo)用戶群體、競(jìng)爭(zhēng)分析、了解市場(chǎng)需求和趨勢(shì)、設(shè)計(jì)合適的商業(yè)模式,并關(guān)注用戶反饋和持續(xù)改進(jìn)。通過(guò)這些市場(chǎng)考慮,系統(tǒng)能夠滿足目標(biāo)用戶的需求,與競(jìng)爭(zhēng)對(duì)手保持競(jìng)爭(zhēng)力,并在商業(yè)上具備可行性和市場(chǎng)適應(yīng)性,以實(shí)現(xiàn)系統(tǒng)的成功和可持續(xù)發(fā)展。
2.1.4?????? 用戶考慮
用戶考慮中,需要深入了解目標(biāo)用戶的特征和需求,設(shè)計(jì)用戶友好的界面和良好的用戶體驗(yàn),鼓勵(lì)用戶參與和反饋,提供適當(dāng)?shù)呐嘤?xùn)和支持,以及確保用戶隱私和數(shù)據(jù)安全。通過(guò)這些用戶考慮,系統(tǒng)能夠滿足用戶的期望和需求,提供優(yōu)質(zhì)的用戶體驗(yàn),并建立用戶的信任和滿意度,以實(shí)現(xiàn)系統(tǒng)的成功和用戶的長(zhǎng)期使用。
2.2? 可行性分析
2.2.1?????? 經(jīng)濟(jì)可行性
可行性分析主要關(guān)注開發(fā)成本和維護(hù)成本。根據(jù)團(tuán)隊(duì)規(guī)模為七人、時(shí)間限制為一周的條件,需對(duì)人力成本進(jìn)行評(píng)估,確保在限定時(shí)間內(nèi)完成核心功能開發(fā)?;?/span>Spring Boot等開源框架的使用,可以減少開發(fā)成本,并且降低后續(xù)維護(hù)和升級(jí)的成本。進(jìn)一步的經(jīng)濟(jì)可行性分析需要綜合考慮系統(tǒng)的商業(yè)模式、收費(fèi)方式和潛在收入,以確保系統(tǒng)能夠獲得足夠的回報(bào)和盈利。
2.2.2?????? 技術(shù)可行性
前端使用Vue框架,后端采用Spring Boot框架,數(shù)據(jù)庫(kù)選擇MySQL,這些技術(shù)都是成熟且廣泛應(yīng)用的技術(shù)棧,具備穩(wěn)定性和可靠性。開發(fā)團(tuán)隊(duì)熟悉這些技術(shù),并且有相關(guān)經(jīng)驗(yàn)和技能,能夠有效地開發(fā)和維護(hù)系統(tǒng)。相關(guān)的開發(fā)工具、集成環(huán)境和數(shù)據(jù)庫(kù)管理工具等也易于獲得和配置,支持系統(tǒng)的開發(fā)和部署。
2.2.3?????? 操作可行性
系統(tǒng)的操作可行性指用戶使用系統(tǒng)的便利性和可操作性。通過(guò)使用Vue框架和用戶友好的界面設(shè)計(jì),能夠提供直觀易用的用戶界面,使用戶能夠方便地瀏覽圖書、借閱和管理賬號(hào)等。合理的界面交互和功能設(shè)計(jì),以及提供適當(dāng)?shù)挠脩襞嘤?xùn)和支持,可以幫助用戶快速上手并高效地使用系統(tǒng)。
2.3? 功能分析
功能分析包括:賬號(hào)管理,圖書管理和借閱管理,此外還有查看用戶數(shù)量,借閱數(shù)量,訪問(wèn)數(shù)量的顯示臺(tái)功能。賬號(hào)管理分為普通用戶賬戶管理和管理員賬戶管理;而管理員賬號(hào)可以管理普通用戶。圖書管理包括添加圖書,刪除圖書,查詢圖書和查詢圖書頁(yè)面。在查詢中,還包括單獨(dú)查詢和批量查詢。借閱管理包括普通用戶圖書借閱和管理員圖書借閱。用戶借閱圖書后,可以進(jìn)行歸還或者續(xù)借,管理員可以進(jìn)行節(jié)約編輯,調(diào)整時(shí)間。
3??? 系統(tǒng)設(shè)計(jì)
3.1? 功能概述
本系統(tǒng)分為管理員和讀者模塊。
管理員模塊:注冊(cè)、登錄、書籍管理、讀者管理、借閱管理、借閱狀態(tài)、修改個(gè)人信息、修改密碼
讀者模塊:注冊(cè)、登錄、查詢圖書信息、借閱和歸還圖書、查看個(gè)人借閱記錄、修改個(gè)人信息、修改密碼
系統(tǒng)結(jié)構(gòu)圖如圖 3?1所示。
圖 3?1 系統(tǒng)結(jié)構(gòu)圖
3.2? 界面設(shè)計(jì)
3.2.1?????? 注冊(cè)頁(yè)面
注冊(cè)頁(yè)面包括用戶名、密碼、確認(rèn)密碼、管理員/讀者選項(xiàng)、驗(yàn)證碼和注冊(cè)按鈕。用戶完成這些步驟后即可成功注冊(cè),系統(tǒng)也將保存用戶信息,提供后續(xù)操作的便利。具體頁(yè)面如所示。
圖 3?2 讀者注冊(cè)頁(yè)面
在選擇管理員選項(xiàng)時(shí),會(huì)多出一個(gè)管理員注冊(cè)碼,進(jìn)行再一次的驗(yàn)證,以確保安全。
圖 3?3 管理員注冊(cè)頁(yè)面
3.2.2?????? 登錄頁(yè)面
直接輸入賬號(hào)密碼和驗(yàn)證碼,如數(shù)據(jù)表中未找到該用戶為此用戶注冊(cè);如找到該用戶,判斷密碼是否正確,正確即能進(jìn)入用戶個(gè)人頁(yè)面。登錄頁(yè)面如圖 3?4所示。
圖 3?4 登錄頁(yè)面
3.2.3?????? 用戶展示板頁(yè)面
用戶展示頁(yè)面包括已借閱數(shù)量,總訪問(wèn)的次數(shù),圖書的數(shù)量,用戶數(shù)量以及統(tǒng)計(jì)圖的展示,使得用更加直觀的看到圖書管理的情況。用戶展示頁(yè)面如圖 3?5所示。
圖 3?5 用戶展示頁(yè)面
3.2.4?????? 用戶個(gè)人信息
(1)修改個(gè)人信息
修改個(gè)人信息可以變更用戶名,姓名,電話號(hào)碼,性別,地址最后進(jìn)行保存。修改個(gè)人信息頁(yè)面如圖 3?6所示。
圖 3?6 修改個(gè)人信息
(2)修改密碼
用戶需要達(dá)到密碼的安全性可以進(jìn)行密碼的修改,最后進(jìn)行提交新密碼。修改密碼頁(yè)面如圖 3?7所示。
圖 3?7 修改密碼頁(yè)面
3.2.5?????? 用戶圖書查詢
用戶可以進(jìn)行圖書的查詢,可以利用圖書編號(hào),圖書名稱以及作者進(jìn)行查詢。每次借閱最多5本書。用戶圖書查詢頁(yè)面如圖 3?8所示。
圖 3?8 用戶圖書查詢
(1)圖書編號(hào)查詢頁(yè)面如圖 3?9所示。
?
圖 3?9 圖書編號(hào)查詢
(2)作者查詢?nèi)鐖D 3?10所示。
圖 3?10 作者查詢
3.2.6?????? 用戶借閱信息
用戶可以進(jìn)行查看圖書是否歸還,可以利用圖書編號(hào),圖書名稱以及作者進(jìn)行查詢歸還狀態(tài)。用戶借閱信息頁(yè)面如圖 3?11所示。
圖 3?11 用戶借閱信息圖
(1)圖書編號(hào)查詢歸還狀態(tài)頁(yè)面如圖 3?12所示。
圖 3?12 圖書編號(hào)查詢歸還狀態(tài)圖
3.2.7?????? 用戶借閱信息
用戶可以看自己借書的狀態(tài),在歸還日期到了的時(shí)候,可以考慮是否續(xù)借。用戶借閱信息如圖 3?13所示。
圖 3?13 用戶借閱信息
3.2.8?????? 管理員展示板
管理員展示頁(yè)面包括已借閱數(shù)量,總訪問(wèn)的次數(shù),圖書的數(shù)量,用戶數(shù)量以及統(tǒng)計(jì)圖的展示,使得用更加直觀的看到圖書管理的情況。管理員展示板頁(yè)面如圖 3?14所示
圖 3?14 管理員展示板
3.2.9?????? 管理員個(gè)人信息
(1)修改個(gè)人信息
管理員可以修改個(gè)人信息可以變更用戶名,姓名,電話號(hào)碼,性別,地址最后進(jìn)行保存。修改個(gè)人信息頁(yè)面如圖 3?15所示。
圖 3?15 管理員個(gè)人信息圖
(2)修改密碼
管理員需要達(dá)到密碼的安全性可以進(jìn)行密碼的修改,最后進(jìn)行提交新密碼。修改密碼頁(yè)面如圖 3?16所示。
圖 3?16 修改密碼
3.2.10???? 讀者管理
管理員可以查看讀者的信息,可以對(duì)讀者的信息進(jìn)行修改,也可以刪除讀者的信息。讀者管理頁(yè)面如圖 3?17所示。
圖 3?17 讀者管理頁(yè)面
3.2.11???? 書籍管理
管理員可以查看書籍的信息,可以對(duì)書籍的信息進(jìn)行修改,也可以刪除書籍的信息。書籍管理頁(yè)面如圖 3?18所示。
???????
圖 3?18 書籍管理
3.2.12???? 借閱管理
管理員可以查看借閱信息,可以使用圖書編號(hào),圖書名稱,讀者編號(hào)進(jìn)行查閱。借閱管理頁(yè)面如圖 3?19所示
圖 3?19 借閱管理
圖書編號(hào)查詢?nèi)鐖D 3?20所示。
圖 3?20 圖書編號(hào)查詢
讀者編號(hào)查詢?nèi)鐖D 3?21所示。
圖 3?21 讀者編號(hào)查詢圖
3.2.13???? 借閱狀態(tài)
管理員可以查看書籍被那個(gè)讀者借閱了,可以查看那本書被借了,可以修改借閱信息,也可以刪除借閱信息。借閱狀態(tài)頁(yè)面如圖 3?22所示。
圖 3?22 借閱狀態(tài)
3.3? 接口設(shè)計(jì)
3.3.1?????? BookController
使用Spring Boot框架的RESTful接口控制器類,用于處理與圖書相關(guān)的操作。以下BookController每個(gè)方法的功能解釋,如表 3?1所示。
表 3?1 BookController的方法
方法 |
作用 |
Result<?> save(@RequestBody Book Book) |
保存一個(gè)Book對(duì)象到數(shù)據(jù)庫(kù),并返回保存后的結(jié)果。 |
Result<?> update(@RequestBody Book Book) |
更新一個(gè)Book對(duì)象到數(shù)據(jù)庫(kù),并返回更新后的結(jié)果。 |
Result<?> deleteBatch(@RequestBody List<Integer>?ids) |
根據(jù)id刪除一個(gè)Book對(duì)象,并返回刪除后的結(jié)果。 |
Result<?> delete(@PathVariable Long id) |
根據(jù)id刪除一個(gè)Book對(duì)象,并返回刪除后的結(jié)果。 |
3.3.2?????? BookWithUserController
使用Spring Boot框架的RESTful接口控制器類,用于處理與圖書和用戶相關(guān)的操作。以下是BookWithUserController的每個(gè)方法的功能解釋,如表 3?2所示。
表 3?2 BookWithUserController的方法
方法 |
作用 |
Result<?> insertNew(@RequestBody BookWithUser BookWithUser) |
新增一個(gè)BookWithUser對(duì)象到數(shù)據(jù)庫(kù),并返回新增后的結(jié)果。 |
Result<?> update(@RequestBody BookWithUser BookWithUser) |
更新一個(gè)BookWithUser對(duì)象到數(shù)據(jù)庫(kù),并返回更新后的結(jié)果。 |
Result<?> deleteRecord(@RequestBody BookWithUser BookWithUser) |
刪除一個(gè)BookWithUser對(duì)象到數(shù)據(jù)庫(kù),并返回刪除后的結(jié)果。 |
3.3.3?????? DashboardController
使用Spring Boot框架的RESTful接口控制器類,用于處理與儀表板相關(guān)的操作。儀表板頁(yè)面包括已借閱數(shù)量,總訪問(wèn)的次數(shù),圖書的數(shù)量,用戶數(shù)量以及統(tǒng)計(jì)圖的展示,使得用更加直觀的看到圖書管理的情況。
DashboardController類的主要作用是處理儀表盤頁(yè)面的GET請(qǐng)求,并通過(guò)調(diào)用其他Mapper類的方法來(lái)獲取相關(guān)統(tǒng)計(jì)信息,并將這些信息以鍵值對(duì)的形式存儲(chǔ)在Map對(duì)象中,最終返回給調(diào)用者以展示儀表盤頁(yè)面。
3.3.4?????? LendRecordController
使用Spring Boot框架的RESTful接口控制器類,用于處理與借閱記錄相關(guān)的操作。以下是LendRecordController的每個(gè)方法的功能解釋,如表 3?3所示。
表 3?3 LendRecordController的方法
方法 |
作用 |
Result<?> deleteRecord(@RequestBody LendRecord LendRecord) |
根據(jù)單個(gè)LendRecord對(duì)象進(jìn)行刪除操作,并返回刪除后的結(jié)果。 |
Result<?> deleteRecords(@RequestBody List<LendRecord>?LendRecords) |
根據(jù)多個(gè)LendRecord對(duì)象進(jìn)行批量刪除操作,并返回刪除后的結(jié)果。 |
Result<?> save(@RequestBody LendRecord LendRecord) |
保存單個(gè)LendRecord對(duì)象到數(shù)據(jù)庫(kù),并返回保存后的結(jié)果。 |
3.3.5?????? UserController
使用Spring Boot框架的RESTful接口控制器類,用于處理與用戶相關(guān)的操作。以下是UserController的每個(gè)方法的功能解釋,如表 3?4所示。
表 3?4 UserController的方法
方法 |
作用 |
Result<?> register(@RequestBody User user) |
注冊(cè)一個(gè)新用戶到數(shù)據(jù)庫(kù),并返回注冊(cè)后的結(jié)果。 |
Result<?> login(@RequestBody User user) |
驗(yàn)證用戶登錄,并返回登錄后的結(jié)果。 |
Result<?> save(@RequestBody User user) |
保存用戶信息到數(shù)據(jù)庫(kù),并返回保存后的結(jié)果。 |
Result<?> password(@RequestBody User user) |
修改用戶密碼,并返回修改后的結(jié)果。 |
Result<?> deleteBatch(@RequestBody List<Integer>?ids) |
批量刪除用戶,并返回刪除后的結(jié)果。 |
3.4? 數(shù)據(jù)庫(kù)設(shè)計(jì)
本系統(tǒng)的數(shù)據(jù)庫(kù)一共有4張數(shù)據(jù)表,分別是book,bookwithuser,lend_record和user表,表設(shè)計(jì),如圖 3?23到圖 3?26所示。
圖 3?23 book表設(shè)計(jì)
圖 3?24 bookwithuser表設(shè)計(jì)
圖 3?25 lend_record表設(shè)計(jì)
圖 3?26 user表設(shè)計(jì)
4??? 實(shí)現(xiàn)與測(cè)試
4.1? 關(guān)鍵技術(shù)實(shí)現(xiàn)(關(guān)鍵問(wèn)題或難點(diǎn)是如何實(shí)現(xiàn)的)
4.1.1?????? BookController
本模塊用于保存圖書實(shí)體,通過(guò)bookMapper id更新圖書,通過(guò)Batch id批量刪除,通過(guò)bookMapper id刪除圖書,查找頁(yè)面。
package com.example.demo.controller;
@RestController
@RequestMapping("/book")
public class BookController {
??? @Resource
??? BookMapper BookMapper;
??? @PostMapping
??? public Result<?> save(@RequestBody Book Book) {
??????? BookMapper.insert(Book);
??????? return Result.success();
??? }
??? @PutMapping
??? public Result<?> update(@RequestBody Book Book) {
??????? BookMapper.updateById(Book);
??????? return Result.success();
??? }
??? //??? 批量刪除
??? @PostMapping("/deleteBatch")
??? public Result<?> deleteBatch(@RequestBody List<Integer> ids) {
??????? BookMapper.deleteBatchIds(ids);
??????? return Result.success();
??? }
??? @DeleteMapping("/{id}")
??? public Result<?> delete(@PathVariable Long id) {
??????? BookMapper.deleteById(id);
??????? return Result.success();
??? }
??? @GetMapping
??? public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
????????????????????????????? @RequestParam(defaultValue = "10") Integer pageSize,
????????????????????????????? @RequestParam(defaultValue = "") String search1,
????????????????????????????? @RequestParam(defaultValue = "") String search2,
????????????????????????????? @RequestParam(defaultValue = "") String search3) {
??????? LambdaQueryWrapper<Book> wrappers = Wrappers.<Book>lambdaQuery();
??????? if (StringUtils.isNotBlank(search1)) {
??????????? wrappers.like(Book::getIsbn, search1);
??????? }
??????? if (StringUtils.isNotBlank(search2)) {
??????????? wrappers.like(Book::getName, search2);
??????? }
??????? if (StringUtils.isNotBlank(search3)) {
??????????? wrappers.like(Book::getAuthor, search3);
??????? }
??????? Page<Book> BookPage = BookMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
??????? return Result.success(BookPage);
??? }
}
???????4.1.2?????? BookWithUserController
本模塊用于,插入新的借閱關(guān)系實(shí)體,通過(guò)圖書名稱和借閱關(guān)系id更新借閱關(guān)系,通過(guò)圖書名稱和借閱關(guān)系id刪除一條或多條借閱關(guān)系記錄,查找頁(yè)面。具體代碼如下。
package com.example.demo.controller;
@RestController
@RequestMapping("/bookwithuser")
public class BookWithUserController {
??? @Resource
??? BookWithUserMapper BookWithUserMapper;
??? @PostMapping("/insertNew")
??? public Result<?> insertNew(@RequestBody BookWithUser BookWithUser) {
??????? BookWithUserMapper.insert(BookWithUser);
??????? return Result.success();
??? }
??? @PostMapping
??? public Result<?> update(@RequestBody BookWithUser BookWithUser) {
??????? UpdateWrapper<BookWithUser> updateWrapper = new UpdateWrapper<>();
??????? updateWrapper.eq("isbn", BookWithUser.getIsbn()).eq("id", BookWithUser.getId());
??????? BookWithUserMapper.update(BookWithUser, updateWrapper);
??????? return Result.success();
??? }
??? //刪除一條記錄
??? @PostMapping("/deleteRecord")
??? public Result<?> deleteRecord(@RequestBody BookWithUser BookWithUser) {
??????? Map<String, Object> map = new HashMap<>();
??????? map.put("isbn", BookWithUser.getIsbn());
??????? map.put("id", BookWithUser.getId());
??????? BookWithUserMapper.deleteByMap(map);
??????? return Result.success();
??? }
??? @PostMapping("/deleteRecords")
??? public Result<?> deleteRecords(@RequestBody List<BookWithUser> BookWithUsers) {
??????? int len = BookWithUsers.size();
??????? for (int i = 0; i < len; i++) {
??????????? BookWithUser curRecord = BookWithUsers.get(i);
??????????? Map<String, Object> map = new HashMap<>();
??????????? map.put("isbn", curRecord.getIsbn());
??????????? map.put("id", curRecord.getId());
??????????? BookWithUserMapper.deleteByMap(map);
??????? }
??????? return Result.success();
??? }
??? @GetMapping
??? public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
????????????????????????????? @RequestParam(defaultValue = "10") Integer pageSize,
????????????????????????????? @RequestParam(defaultValue = "") String search1,
????????????????????????????? @RequestParam(defaultValue = "") String search2,
????????????????????????????? @RequestParam(defaultValue = "") String search3) {
??????? LambdaQueryWrapper<BookWithUser> wrappers = Wrappers.<BookWithUser>lambdaQuery();
??????? if (StringUtils.isNotBlank(search1)) {
??????????? wrappers.like(BookWithUser::getIsbn, search1);
??????? }
??????? if (StringUtils.isNotBlank(search2)) {
??????????? wrappers.like(BookWithUser::getBookName, search2);
??????? }
??????? if (StringUtils.isNotBlank(search3)) {
??????????? wrappers.like(BookWithUser::getId, search3);
??????? }
??????? Page<BookWithUser> BookPage = BookWithUserMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
??????? return Result.success(BookPage);
??? }
?
}
4.1.3?????? DashboardController
本模塊用于使用顯示網(wǎng)站訪問(wèn)次數(shù),用戶數(shù)量,借閱記錄,圖書數(shù)量。具體代碼如下。
package com.example.demo.controller;
@RestController
@RequestMapping("/dashboard")
public class DashboardController {
??? @Resource
??? private UserMapper userMapper;
??? @Resource
??? private LendRecordMapper lendRecordMapper;
??? @Resource
??? private BookMapper bookMapper;
??? @GetMapping
??? public? Result<?> dashboardrecords(){
??????? int visitCount = LoginUser.getVisitCount();
??????? QueryWrapper<User> queryWrapper1=new QueryWrapper();
??????? int userCount = userMapper.selectCount(queryWrapper1);
??????? QueryWrapper<LendRecord> queryWrapper2=new QueryWrapper();
??????? int lendRecordCount = lendRecordMapper.selectCount(queryWrapper2);
??????? QueryWrapper<Book> queryWrapper3=new QueryWrapper();
??????? int bookCount = bookMapper.selectCount(queryWrapper3);
??????? Map<String, Object> map = new HashMap<>();//鍵值對(duì)形式
??????? map.put("visitCount", visitCount);//放置visitCount到map中
??????? map.put("userCount", userCount);
??????? map.put("lendRecordCount", lendRecordCount);
??????? map.put("bookCount", bookCount);
??????? return Result.success(map);
??? }
}
4.1.4?????? LendRecordController
本模塊用于根據(jù)圖書名稱刪除借閱記錄,刪除一條或多條借閱記錄,保存借閱記錄,查找頁(yè)面,修改借閱記錄。
package com.example.demo.controller;
@RestController
@RequestMapping("/LendRecord")
public class LendRecordController {
??? @Resource
??? LendRecordMapper LendRecordMapper;
??? @DeleteMapping("/{isbn}")
??? public Result<?> delete(@PathVariable String isbn) {
??????? Map<String, Object> map = new HashMap<>();
??????? map.put("isbn", isbn);
??????? LendRecordMapper.deleteByMap(map);
??????? return Result.success();
??? }
??? //刪除一條記錄
??? @PostMapping("/deleteRecord")
??? public Result<?> deleteRecord(@RequestBody LendRecord LendRecord) {
??????? Map<String, Object> map = new HashMap<>();
??????? map.put("isbn", LendRecord.getIsbn());
??????? map.put("borrownum", LendRecord.getBorrownum());
??????? LendRecordMapper.deleteByMap(map);
??????? return Result.success();
??? }
??? @PostMapping("/deleteRecords")
??? public Result<?> deleteRecords(@RequestBody List<LendRecord> LendRecords) {
??????? int len = LendRecords.size();
??????? for (int i = 0; i < len; i++) {
??????????? LendRecord curRecord = LendRecords.get(i);
??????????? Map<String, Object> map = new HashMap<>();
??????????? map.put("isbn", curRecord.getIsbn());
??????????? map.put("borrownum", curRecord.getBorrownum());
??????????? LendRecordMapper.deleteByMap(map);
??????? }
??????? return Result.success();
??? }
??? @PostMapping
??? public Result<?> save(@RequestBody LendRecord LendRecord) {
??????? LendRecordMapper.insert(LendRecord);
??????? return Result.success();
??? }
??? @GetMapping
??? public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
????????????????????????????? @RequestParam(defaultValue = "10") Integer pageSize,
????????????????????????????? @RequestParam(defaultValue = "") String search1,
????????????????????????????? @RequestParam(defaultValue = "") String search2,
????????????????????????????? @RequestParam(defaultValue = "") String search3) {
?????? ?LambdaQueryWrapper<LendRecord> wrappers = Wrappers.<LendRecord>lambdaQuery();
??????? if (StringUtils.isNotBlank(search1)) {
??????????? wrappers.like(LendRecord::getIsbn, search1);
??????? }
??????? if (StringUtils.isNotBlank(search2)) {
??????????? wrappers.like(LendRecord::getBookname, search2);
??????? }
??????? if (StringUtils.isNotBlank(search3)) {
??????????? wrappers.like(LendRecord::getReaderId, search3);
??????? }
??????? Page<LendRecord> LendRecordPage = LendRecordMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
??????? return Result.success(LendRecordPage);
??? }
??? @PutMapping("/{isbn}")
??? public Result<?> update(@PathVariable String isbn, @RequestBody LendRecord lendRecord) {
??????? UpdateWrapper<LendRecord> updateWrapper = new UpdateWrapper<>();
??????? updateWrapper.eq("isbn", isbn);
??????? LendRecord lendrecord = new LendRecord();
??????? lendrecord.setLendTime(lendRecord.getLendTime());
??????? lendrecord.setReturnTime(lendRecord.getReturnTime());
??????? lendrecord.setStatus(lendRecord.getStatus());
??????? LendRecordMapper.update(lendrecord, updateWrapper);
??????? return Result.success();
??? }
??? @PutMapping("/{lendTime}")
??? public Result<?> update2(@PathVariable Date lendTime, @RequestBody LendRecord lendRecord) {
??????? UpdateWrapper<LendRecord> updateWrapper = new UpdateWrapper<>();
??????? updateWrapper.eq("lendTime", lendTime);
??????? LendRecord lendrecord = new LendRecord();
??????? lendrecord.setReturnTime(lendRecord.getReturnTime());
??????? lendrecord.setStatus(lendRecord.getStatus());
??????? LendRecordMapper.update(lendrecord, updateWrapper);
??????? return Result.success();
??? }
}
??????? 4.1.5?????? UserController
本模塊用于用戶注冊(cè),用戶登錄,插入用戶信息,修改密碼,用戶ID修改密碼,批量刪除ID,通過(guò)昵稱查找書籍頁(yè)面。
具體實(shí)現(xiàn)代碼如下:
package com.example.demo.controller;
@RestController
@RequestMapping("/user")
public class UserController {
??? @Resource
??? UserMapper userMapper;
??? @PostMapping("/register")
??? public Result<?> register(@RequestBody User user) {
??????? User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()));
??????? if (res != null) {
??????????? return Result.error("-1", "用戶名已重復(fù)");
??????? }
??????? userMapper.insert(user);
??????? return Result.success();
??? }
??? @CrossOrigin
??? @PostMapping("/login")
??? public Result<?> login(@RequestBody User user) {
??????? User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword()));
??????? if (res == null) {
??????????? return Result.error("-1", "用戶名或密碼錯(cuò)誤");
??????? }
??????? String token = TokenUtils.genToken(res);
??????? res.setToken(token);
??????? LoginUser loginuser = new LoginUser();
??????? loginuser.addVisitCount();
??????? return Result.success(res);
??? }
??? @PostMapping
??? public Result<?> save(@RequestBody User user) {
??????? if (user.getPassword() == null) {
??????????? user.setPassword("abc123456");
??????? }
??????? userMapper.insert(user);
??????? return Result.success();
??? }
??? @PutMapping("/password")
??? public Result<?> update(@RequestParam Integer id,
??????????????????????????? @RequestParam String password2) {
??????? UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
??????? updateWrapper.eq("id", id);
??????? User user = new User();
??????? user.setPassword(password2);
??????? userMapper.update(user, updateWrapper);
??????? return Result.success();
??? }
??? @PutMapping
??? public Result<?> password(@RequestBody User user) {
??????? userMapper.updateById(user);
??????? return Result.success();
??? }
??? @PostMapping("/deleteBatch")
??? public Result<?> deleteBatch(@RequestBody List<Integer> ids) {
??????? userMapper.deleteBatchIds(ids);
??????? return Result.success();
??? }
??? @DeleteMapping("/{id}")
??? public Result<?> delete(@PathVariable Long id) {
??????? userMapper.deleteById(id);
??????? return Result.success();
??? }
??? @GetMapping
??? public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
????????????????????????????? @RequestParam(defaultValue = "10") Integer pageSize,
????????????????????????????? @RequestParam(defaultValue = "") String search) {
??????? LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
???? ???if (StringUtils.isNotBlank(search)) {
??????????? wrappers.like(User::getNickName, search);
??????? }
??????? wrappers.like(User::getRole, 2);
??????? Page<User> userPage = userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
??????? return Result.success(userPage);
??? }
??? @GetMapping("/usersearch")
??? public Result<?> findPage2(@RequestParam(defaultValue = "1") Integer pageNum,
?????????????????????????????? @RequestParam(defaultValue = "10") Integer pageSize,
?????????????????? ????????????@RequestParam(defaultValue = "") String search1,
?????????????????????????????? @RequestParam(defaultValue = "") String search2,
?????????????????????????????? @RequestParam(defaultValue = "") String search3,
?????????????????????????????? @RequestParam(defaultValue = "") String search4) {
??????? LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
??????? if (StringUtils.isNotBlank(search1)) {
??????????? wrappers.like(User::getId, search1);
??? ????}
??????? if (StringUtils.isNotBlank(search2)) {
??????????? wrappers.like(User::getNickName, search2);
??????? }
??????? if (StringUtils.isNotBlank(search3)) {
??????????? wrappers.like(User::getPhone, search3);
??????? }
??????? if (StringUtils.isNotBlank(search4)) {
??????????? wrappers.like(User::getAddress, search4);
??????? }
??????? wrappers.like(User::getRole, 2);
??????? Page<User> userPage = userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
??????? return Result.success(userPage);
??? }
}
5??? 開發(fā)日志
本團(tuán)隊(duì)開發(fā)日志如下。
2023年7月3日:
l 使用IDEA開發(fā)工具創(chuàng)建Spring Boot項(xiàng)目,配置項(xiàng)目的基本信息和依賴。
l 配置數(shù)據(jù)庫(kù)連接信息,包括MySQL的URL、用戶名和密碼。
l 設(shè)計(jì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
l 編寫數(shù)據(jù)庫(kù)初始化腳本,創(chuàng)建數(shù)據(jù)庫(kù)表并插入初始數(shù)據(jù)。
2023年7月4日:
l 引入MyBatis-Plus依賴,配置MyBatis-Plus的相關(guān)信息。
l 創(chuàng)建圖書管理、用戶管理等模塊的Service接口和實(shí)現(xiàn)類。
l 實(shí)現(xiàn)圖書管理模塊的增刪改查功能,包括圖書的添加、刪除、修改和查詢。
l 完成用戶管理模塊的相關(guān)功能,如用戶的注冊(cè)、登錄、權(quán)限管理等。
2023年7月5日:
l 開發(fā)圖書借閱管理模塊,包括借閱記錄的添加、查詢和歸還功能。
l 實(shí)現(xiàn)用戶權(quán)限管理功能,根據(jù)用戶角色限制不同操作的權(quán)限。
l 完善前端頁(yè)面的布局和樣式。
2023年7月6日:
l 添加搜索功能,根據(jù)關(guān)鍵字查詢圖書信息。
l 完善系統(tǒng)的異常處理和錯(cuò)誤提示,提高系統(tǒng)的健壯性和用戶體驗(yàn)。
l 進(jìn)行系統(tǒng)的測(cè)試和調(diào)試,修復(fù)存在的Bug和問(wèn)題。
2023年7月7日:
l 進(jìn)行項(xiàng)目的總結(jié)和評(píng)估,總結(jié)開發(fā)過(guò)程中的經(jīng)驗(yàn)和教訓(xùn)。
l 準(zhǔn)備項(xiàng)目的演示文稿和演示材料,用于項(xiàng)目的答辯。
l 進(jìn)行項(xiàng)目的答辯,展示系統(tǒng)的功能和設(shè)計(jì)思路,回答相關(guān)問(wèn)題。
6??? 設(shè)計(jì)總結(jié)
在這次實(shí)訓(xùn)課中,我們小組設(shè)計(jì)并成功開發(fā)了一個(gè)圖書數(shù)字化管理系統(tǒng)。這個(gè)系統(tǒng)的目標(biāo)是提供一個(gè)高效、便捷的圖書管理平臺(tái),使圖書館管理員能夠輕松管理圖書的借閱、歸還和庫(kù)存等操作。通過(guò)本次實(shí)訓(xùn)課的設(shè)計(jì)和實(shí)現(xiàn),我們小組實(shí)現(xiàn)了圖書的錄入、借閱、歸還和查詢等功能,并且系統(tǒng)設(shè)計(jì)合理、功能完善,用戶界面友好。同時(shí),我們對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)、編程技術(shù)和系統(tǒng)集成有了更深入的理解和實(shí)踐。
在這次實(shí)訓(xùn)課的經(jīng)歷中,我們小組的成員有了一些共同的感悟和收獲。
實(shí)踐是學(xué)習(xí)的關(guān)鍵。實(shí)訓(xùn)課為我們提供了一個(gè)實(shí)踐的機(jī)會(huì),讓我們能夠?qū)⒄n堂上學(xué)到的理論知識(shí)應(yīng)用到實(shí)際項(xiàng)目中。通過(guò)親身實(shí)踐,我們深刻理解了許多概念和原則,并學(xué)會(huì)了解決實(shí)際問(wèn)題的方法。
團(tuán)隊(duì)合作的重要性。在實(shí)訓(xùn)課中,我們小組的成員一起組成團(tuán)隊(duì),共同完成項(xiàng)目。團(tuán)隊(duì)合作是非常關(guān)鍵的,通過(guò)分工合作和協(xié)作交流,我們能夠高效地完成任務(wù)。我們學(xué)到了如何與他人合作,傾聽和尊重他人的意見,共同追求項(xiàng)目的成功。
面對(duì)挑戰(zhàn)要有耐心和毅力。在實(shí)訓(xùn)過(guò)程中,我們遇到了各種各樣的挑戰(zhàn),如技術(shù)難題、時(shí)間壓力等。但是,我們學(xué)會(huì)了保持耐心和毅力,積極尋找解決方案,不斷嘗試和學(xué)習(xí)。這讓我們明白到,在面對(duì)困難時(shí),堅(jiān)持不懈的努力是能夠克服障礙并取得進(jìn)步的關(guān)鍵。
要注重細(xì)節(jié)和質(zhì)量。在實(shí)訓(xùn)課中,我們意識(shí)到細(xì)節(jié)的重要性。一個(gè)小小的錯(cuò)誤或遺漏可能會(huì)導(dǎo)致系統(tǒng)的不穩(wěn)定或功能缺失。因此,我們學(xué)會(huì)了注重細(xì)節(jié),審慎檢查代碼和設(shè)計(jì),以確保系統(tǒng)的質(zhì)量和可靠性。
持續(xù)學(xué)習(xí)和自我提升。實(shí)訓(xùn)課只是學(xué)習(xí)的起點(diǎn),我們意識(shí)到在不斷發(fā)展的技術(shù)領(lǐng)域,學(xué)習(xí)是一個(gè)持續(xù)的過(guò)程。我們要時(shí)刻保持學(xué)習(xí)的心態(tài),跟上最新的技術(shù)和趨勢(shì),不斷提升自己的能力和知識(shí)水平。
規(guī)劃和時(shí)間管理。在實(shí)訓(xùn)課開始之前我們制定了詳細(xì)的項(xiàng)目計(jì)劃和時(shí)間表這有助于我們合理分配任務(wù)和時(shí)間,避免了項(xiàng)目進(jìn)度的拖延。我們學(xué)會(huì)了如何有效地規(guī)劃和管理我們的時(shí)間,以便在限定的時(shí)間內(nèi)完成任務(wù)。
溝通和協(xié)作能力。團(tuán)隊(duì)合作是實(shí)訓(xùn)課的關(guān)鍵要素。我們需要與團(tuán)隊(duì)成員密切合作共同制定方案討論問(wèn)題并解決挑戰(zhàn),通過(guò)與他人的溝通和協(xié)作,我們提高了我們的溝通能力和團(tuán)隊(duì)合作技巧。我們學(xué)會(huì)了傾聽他人的觀點(diǎn)尊重不同的意見并在團(tuán)隊(duì)中扮演積極的角色。
解決問(wèn)題的能力。在實(shí)訓(xùn)過(guò)程中我們遇到了許多技術(shù)和設(shè)計(jì)上的問(wèn)題,有時(shí)候我們需要獨(dú)立解決問(wèn)題,也有時(shí)候需要團(tuán)隊(duì)共同努力。我們學(xué)會(huì)了如何分析問(wèn)題,尋找解決方案并采取適當(dāng)?shù)男袆?dòng)來(lái)解決問(wèn)題,這讓我們對(duì)問(wèn)題解決的過(guò)程有了更深入的了解并增強(qiáng)了我們解決問(wèn)題的能力。
學(xué)習(xí)與實(shí)踐的結(jié)合。實(shí)訓(xùn)課提供了一個(gè)理論與實(shí)踐相結(jié)合的學(xué)習(xí)環(huán)境,通過(guò)將所學(xué)的理論知識(shí)應(yīng)用到實(shí)際項(xiàng)目中,我們深化了對(duì)課程內(nèi)容的理解,并掌握了實(shí)際應(yīng)用的技能這種學(xué)習(xí)方式,讓我們?cè)趯?shí)踐中不斷成長(zhǎng),并將知識(shí)轉(zhuǎn)化為實(shí)際能力。
自我反思和持續(xù)改進(jìn)。在實(shí)訓(xùn)課的過(guò)程中,我們不斷反思自己的表現(xiàn)和學(xué)習(xí)進(jìn)展,我們意識(shí)到自己的優(yōu)點(diǎn)和不足并積極采取措施改進(jìn)自己。通過(guò)持續(xù)的自我反思和改進(jìn),我們能夠不斷提升自己的技能和能力。
通過(guò)這次實(shí)訓(xùn)課我們小組不僅獲得了實(shí)際項(xiàng)目開發(fā)的經(jīng)驗(yàn),還培養(yǎng)了自我管理團(tuán)隊(duì)合作和問(wèn)題解決的能力。這些寶貴的經(jīng)驗(yàn)將對(duì)我們小組的成員未來(lái)的學(xué)習(xí)和職業(yè)發(fā)展產(chǎn)生長(zhǎng)遠(yuǎn)的影響,我們期待將這些經(jīng)驗(yàn)應(yīng)用于未來(lái)的項(xiàng)目和挑戰(zhàn)中,并不斷成長(zhǎng)和提升自己。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-558645.html
編碼不易,有償分享代碼和原文檔,有意私聊VX: liwoaa文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-558645.html
到了這里,關(guān)于JavaWeb——基于Spring Boot的圖書數(shù)字化管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!