最适合Java初学者练手的项目【JavaSE项目-图书管理系统】
圖書館管理小項(xiàng)目的主要目的是讓學(xué)完JavaSE的同學(xué)對(duì)之前掌握的知識(shí)做一些運(yùn)用,該項(xiàng)目應(yīng)用的知識(shí)點(diǎn)包括下面內(nèi)容:
通過學(xué)習(xí)本項(xiàng)目,可以鞏固JavaSE的知識(shí),對(duì)于后續(xù)的學(xué)習(xí)來說可以起到很好的銜接。
視頻觀看效果更佳,點(diǎn)擊以下鏈接👇
圖書管理系統(tǒng)JavaSE項(xiàng)目實(shí)戰(zhàn)訓(xùn)練-適合學(xué)完Java零基礎(chǔ)同學(xué)鞏固
資料、源碼下載:
Java圖書管理系統(tǒng)|Java項(xiàng)目實(shí)戰(zhàn)視頻教程全套免費(fèi)下載 - 動(dòng)力節(jié)點(diǎn) (bjpowernode.com)
1.2?環(huán)境搭建
1.2.1?基本信息
- 開發(fā)工具:IDEA
- JDK版本:8
- 項(xiàng)目編碼:GBK
1.2.2?使用技術(shù)
除了javase相關(guān)知識(shí)點(diǎn)外,該項(xiàng)目還使用了一些第三方的技術(shù),包括:
- Jfoenix:提供了更加美觀的UI控件
- Dashboardfx:將一些美觀的UI控件組合起來使用,構(gòu)建出了一個(gè)儀表盤
1.2.3?項(xiàng)目導(dǎo)入
因?yàn)閷?shí)際應(yīng)用中對(duì)javafx的使用很少,所以這部分的內(nèi)容就不帶著寫了,了解即可。界面大部分代碼已經(jīng)寫好,只需要將nodelibrary.zip文件解壓導(dǎo)入到項(xiàng)目中即可。
1.2.4?關(guān)聯(lián)第三方j(luò)ar包
由于項(xiàng)目中使用了一些第三方的技術(shù),所以需要將這些技術(shù)相關(guān)的jar包導(dǎo)入到項(xiàng)目來使用。
實(shí)際應(yīng)用的時(shí)候,我們會(huì)使用很多第三方技術(shù),這些第三方技術(shù)的開發(fā)者會(huì)將代碼打成jar包以供使用。
?
1.3?代碼解析
1.3.1?代碼概覽
- bean:存放實(shí)體類的包
- global:存放了一些全局使用的類
- media.img:存放一些圖片
- module:存放界面相關(guān)的類
- service:存放服務(wù)相關(guān)類
- theme:存放美化界面相關(guān)的文件
- App:主類
1.3.2?登錄功能
在項(xiàng)目啟動(dòng)時(shí),會(huì)加載所有界面對(duì)應(yīng)的fxml文件,然后將這些對(duì)象放入到map中,此map由ViewManager類進(jìn)行管理。
用戶登錄后,會(huì)根據(jù)輸入的用戶名從properties文件中查找數(shù)據(jù),如果查詢出來的數(shù)據(jù)跟用戶輸入的用戶名和密碼匹配的話,則登錄成功,跳轉(zhuǎn)至main頁面中。
1.3.3?fxml文件
每個(gè)界面都對(duì)應(yīng)了一個(gè)fxml文件,fxml文件中的內(nèi)容可以控制界面的展示效果。該文件中的標(biāo)簽都是成對(duì)出現(xiàn)的,比如:
<StackPane></StackPane>
有部分標(biāo)簽可以寫成下面形式:
<button />
一個(gè)標(biāo)簽中可以包含其他標(biāo)簽,例如:
<StackPane><padding></padding> </StackPane>但是絕對(duì)不能出現(xiàn)下面這種形式(你中有我,我中有你):
<StackPane><padding> </StackPane> </padding>上面寫法會(huì)有問題。
1.3.3.1?綁定控制器
每個(gè)fxml文件都有一個(gè)對(duì)應(yīng)的java文件相關(guān)聯(lián),這樣的java文件叫做控制器,我們可以通過fxml文件中的最外層標(biāo)簽里面的fx:controller標(biāo)簽進(jìn)行綁定:
fx:controller="com.bjpowernode.module.login.Login"1.3.3.2?事件
用戶在操作界面的時(shí)候會(huì)產(chǎn)生一些行為,比如點(diǎn)擊一個(gè)按鈕,這就是一個(gè)點(diǎn)擊時(shí)間,我們可以通過button標(biāo)簽中的onAction屬性與控制器對(duì)應(yīng)的方法進(jìn)行綁定:
@FXML private TextField username;1.3.3.3?輸入框
<TextField /> :我們可以在輸入框中看到自己輸入的內(nèi)容
<PasswordField />:我們不能在輸入框中看到自己輸入的內(nèi)容
通過輸入框中的fx:id與控制器中的屬性進(jìn)行管理,例如:
fxml文件的標(biāo)簽:
| <TextField fx:id="username" /> |
控制器文件的屬性:
| @FXML private TextField username; |
?
1.4?分層的思想
實(shí)際開發(fā)中會(huì)編寫大量的代碼,不同的代碼解決的問題不一樣,因此我們最好將這些代碼進(jìn)行分層存放,主要還是劃分職責(zé),這樣有利于后期的擴(kuò)展。
分工前:
分工后:
代碼分層:
- controller(請(qǐng)求處理層):負(fù)責(zé)與界面數(shù)據(jù)進(jìn)行交互處理
- service(業(yè)務(wù)邏輯層):負(fù)責(zé)業(yè)務(wù)邏輯相關(guān)處理
- DAO(數(shù)據(jù)持久層):負(fù)責(zé)數(shù)據(jù)持久化操作,DAO的全稱是Data Access Object
1.5?用戶相關(guān)功能
1.5.1?用戶數(shù)據(jù)初始化
1.5.1.1?功能概述
創(chuàng)建若干User對(duì)象放入到List中,通過對(duì)象輸出流將List對(duì)象寫出到硬盤的User.txt文件中,從而達(dá)到持久化的操作。
1.5.1.2?Serializable接口
通過IO流將List對(duì)象數(shù)據(jù)持久化到硬盤的文件中,List中存放的數(shù)據(jù)是User類型,所以要讓User類實(shí)現(xiàn)Serializable接口。倘若我們要對(duì)某個(gè)類的對(duì)象進(jìn)行IO操作時(shí),別忘了讓這個(gè)類實(shí)現(xiàn)Serializable接口。
1.5.1.3?常量類
對(duì)于一些不會(huì)發(fā)生頻繁修改的數(shù)據(jù),我們通常會(huì)將其定義為常量,存放常量的類叫做常量類。這么做的好處是對(duì)這些數(shù)據(jù)進(jìn)行同一管理,將來一旦發(fā)生改變,代碼改動(dòng)較小。
1.5.2?查詢用戶
1.5.2.1?功能概述
通過對(duì)象輸入流將硬盤中User.txt文件里面的List對(duì)象讀取到內(nèi)存中,將該對(duì)象傳到FXML中,從而展示出數(shù)據(jù)。
1.5.2.2?serialVersionUID
在User類實(shí)現(xiàn)Serializable接口后,最好添加serialVersionUID,這樣做的好處就是在User對(duì)象已經(jīng)被存儲(chǔ)到硬盤文件之后,我們?cè)傩薷腢ser類屬性時(shí)不會(huì)發(fā)生異常。便于對(duì)User對(duì)象版本的控制。
1.5.2.3?代碼分層的使用
- controller: UserViewCtrl
- service:接口UserService,實(shí)現(xiàn)類UserServiceImpl
- dao:接口UserDao,實(shí)現(xiàn)類UserDaoImpl
這里通過接口的使用可以提高代碼的可插拔性,提高了程序的可維護(hù)性。
1.5.3?添加用戶
1.5.3.1?功能概述
在添加界面輸入用戶信息之后,點(diǎn)擊提交按鈕,會(huì)將用戶對(duì)象傳到service層,service層再調(diào)用DAO,在DAO中使用對(duì)象輸入流將用戶集合數(shù)據(jù)讀到內(nèi)存中,將新增的user對(duì)象存入集合里面,之后使用對(duì)象輸出流將用戶集合數(shù)據(jù)寫出到硬盤文件中。
1.5.3.2?編號(hào)自增長
在創(chuàng)建類似User這樣的類時(shí),我們通常會(huì)在里面添加一個(gè)id編號(hào)屬性,目的是作為該對(duì)象的唯一標(biāo)識(shí),便于查詢,修改,刪除操作。為了保證id編號(hào)不重復(fù),這里通過程序控制id編號(hào)自動(dòng)增長,在多線程環(huán)境下需要注意線程安全的問題。
1.5.4?修改用戶
1.5.4.1?功能概述
點(diǎn)擊修改按鈕之后需要將當(dāng)前選中的修改數(shù)據(jù)顯示到修改界面中,修改界面里面要存儲(chǔ)數(shù)據(jù)的編號(hào)id,這些數(shù)據(jù)傳到DAO層之后,通過id在用戶集合中找到相應(yīng)的用戶對(duì)象,從而進(jìn)行修改操作。這里的修改界面跟添加界面使用的是同一個(gè)fxml
1.5.5?刪除用戶
1.5.5.1?功能概述
點(diǎn)擊刪除按鈕之后將當(dāng)前選中數(shù)據(jù)的id編號(hào)傳到service層,service層將id傳到DAO層,然后根據(jù)id從用戶集合中找到對(duì)應(yīng)的用戶對(duì)象,將其從集合移除即可。需要注意的是用戶類User中要重寫hashcode和equals方法。
1.5.5.2?異常的拋出
我們?cè)贒AO層中使用了try catch對(duì)異常進(jìn)行了捕獲,倘若DAO層出現(xiàn)了異常,其上層的service和controller中是不知道的,這里最好在DAO層的catch里面再拋出異常,目的是通知上層這里有異常,上層代碼獲取到異常之后再進(jìn)行后續(xù)的處理。
1.5.6?凍結(jié)用戶
1.5.6.1?功能概述
點(diǎn)擊凍結(jié)按鈕之后,將當(dāng)前選中的id編號(hào)傳到DAO,然后再根據(jù)id從用戶集合中找到對(duì)應(yīng)用戶對(duì)象,將該對(duì)象中的狀態(tài)修改為凍結(jié)即可。
?
1.6?圖書相關(guān)功能
1.6.1?圖書數(shù)據(jù)初始化
1.6.1.1?功能概述
創(chuàng)建若干Book對(duì)象,將對(duì)象放入到List中,把List對(duì)象利用對(duì)象輸出流寫出到硬盤的文件中,總體功能與用戶數(shù)據(jù)初始化操作類似。
1.6.1.2?泛型通配符
圖書數(shù)據(jù)初始化和用戶數(shù)據(jù)初始化類似,所以將兩個(gè)方法進(jìn)行重構(gòu),重構(gòu)之后合并為一個(gè)方法。方法中添加兩個(gè)形參,分別是String path(存放的路徑)和List<?> list(存放的數(shù)據(jù))。這里由于list中的泛型是不同的,所以不能在形參中填寫具體的類型,這里我們使用了泛型通配符來解決該問題。
1.6.2?查詢圖書
1.6.2.1?功能概述
將硬盤文件中的圖書數(shù)據(jù)查詢并展示到頁面中,整體跟之前的用戶查詢類似,只是多了條件查詢,在點(diǎn)擊查詢按鈕時(shí),需要將輸入的圖書名稱和isbn傳入到DAO中。需要注意的是如果圖書名稱和isbn同時(shí)輸入的話,在查詢代碼中先根據(jù)圖書名稱查詢出圖書數(shù)據(jù)bookList,之后在bookList的基礎(chǔ)上再根據(jù)isbn進(jìn)行條件查詢。
1.6.3?添加圖書
1.6.3.1?功能概述
將輸入的圖書數(shù)據(jù)放到Book對(duì)象中,之后將該Book對(duì)象利用對(duì)象輸出流寫出到硬盤文件中,需要手動(dòng)設(shè)置一下id編號(hào)的自增操作。與用戶添加類似
1.6.4?刪除圖書
1.6.4.1?功能概述
根據(jù)輸入的圖書編號(hào),從圖書數(shù)據(jù)中找到與之對(duì)應(yīng)的圖書對(duì)象,然后在圖書集合對(duì)象中將該圖書對(duì)象刪除。
1.6.5?修改圖書
1.6.5.1?功能概述
將修改之后的圖書數(shù)據(jù)持久化到硬盤文件中,功能與修改用戶類似。
1.6.5.2?反射的使用
修改操作中需要將輸入的數(shù)據(jù)一一對(duì)應(yīng)的放入到查詢出的圖書對(duì)象中,需要調(diào)用很多set和get方法,倘若屬性過多的話,代碼就顯得繁瑣了,為了解決該問題,我們編寫了一個(gè)工具類,里面利用反射來獲取類中的全部屬性,之后再進(jìn)行賦值操作。注意工具類中要排除不希望賦值的屬性,例如:serialVersionUID。
代碼:
/*** 對(duì)象屬性值的拷貝* @param origin* @param dest*/ public static void populate(Object origin, Object dest) {try {//使用反射解決這個(gè)問題//判斷兩個(gè)對(duì)象是否是同一類型if (origin.getClass() != dest.getClass()) {throw new RuntimeException("兩個(gè)對(duì)象必須得是同一類型");}Class<?> clazz = origin.getClass();//獲取origin中的屬性Field[] fields = clazz.getDeclaredFields();for (Field f : fields) {//排除serialVersionUIDif ("serialVersionUID".equals(f.getName())) {continue;}//打破封裝f.setAccessible(true);//從dest對(duì)象中找到對(duì)應(yīng)的屬性值,然后賦值到origin相應(yīng)的屬性中f.set(origin,f.get(dest));}} catch (IllegalAccessException e) {e.printStackTrace();} }1.7?圖書統(tǒng)計(jì)
1.7.1?功能概述
根據(jù)controller中的代碼得出要想展示出圖表內(nèi)容,需要兩個(gè)數(shù)據(jù),分別是圖書類型和該圖書類型對(duì)應(yīng)的書籍?dāng)?shù)量,至于圖書展示的操作交給界面處理就行,因此我們要做的事就是從硬盤文件中圖書書籍里面統(tǒng)計(jì)出不同類型書籍的數(shù)量分別有多少。
1.7.2?方法返回值
方法的返回值寫什么要根據(jù)需求來定,因此在編寫方法之前要搞明白當(dāng)前的需求是要做什么,倘若在需求沒有搞明白的前提下來編寫代碼,肯定會(huì)遇到很多問題。通過圖書統(tǒng)計(jì)功能的編寫我們要學(xué)會(huì)分析現(xiàn)有代碼,根據(jù)代碼得出所需要的數(shù)據(jù),然后再自己操作獲取這些數(shù)據(jù)即可,剩余數(shù)據(jù)展示的操作交給界面來處理即可。
?
1.8?借閱相關(guān)功能
1.8.1?借閱數(shù)據(jù)初始化
1.8.1.1?功能概述
利用之前編寫的InitDataUtil工具類將借閱數(shù)據(jù)進(jìn)行初始化。
1.8.1.2?UUID
由于可能會(huì)產(chǎn)生很多借閱數(shù)據(jù),所以編號(hào)不能再用int類型自動(dòng)增長了,這里將Lend類中的編號(hào)類型改成了String。這類的編號(hào)不要讓用戶來輸入,我們使用UUID來生成。UUID的生成跟網(wǎng)卡MAC地址、時(shí)間戳、隨機(jī)或偽隨機(jī)數(shù)、時(shí)序等元素有關(guān),可以保證唯一性。UUID的長度是36,去除里面的-之后長度是32。
1.8.2?借閱數(shù)據(jù)查詢
1.8.2.1?功能概述
當(dāng)用戶借閱了某本書之后會(huì)生成一條數(shù)據(jù),我們需要在借閱管理中將該數(shù)據(jù)查詢出來,查詢的時(shí)候需要注意Lend對(duì)象中包含了Book和User對(duì)象,對(duì)于這類對(duì)象的查詢我們可以通過多次get方法將其查出。
1.8.3?借閱書籍
1.8.3.1?功能概述
通過點(diǎn)擊圖書管理中的借閱按鈕生成一條借閱數(shù)據(jù),在點(diǎn)擊借閱按鈕之后,需要查詢出可以借書的用戶,每位用戶只能借閱1本書,這里查詢出的用戶列表必須都是可以借書的用戶。這部分操作的界面較多,注意界面之間的數(shù)據(jù)傳遞。
1.8.3.2?User類的修改
為了能夠方便的查詢出哪些用書手中已經(jīng)借書了,我們可以在User類中添加一個(gè)boolean屬性isLend,該屬性的作用是標(biāo)識(shí)當(dāng)前用戶手中是否有書。但是修改User類之后會(huì)發(fā)現(xiàn)代碼很多地方有編譯報(bào)錯(cuò),通過這個(gè)改動(dòng)發(fā)現(xiàn)類似這種User的類最好在開始的時(shí)候定義好,否則后期修改會(huì)導(dǎo)致改動(dòng)較大。
1.8.3.3?Service層的使用
Controller主要的作用是處理跟界面相關(guān)的操作,DAO層主要的作用是處理跟數(shù)據(jù)持久化方面的操作,遇到一些比較復(fù)雜的操作時(shí),我們需要在service層編寫業(yè)務(wù)邏輯代碼,在service中可以調(diào)用多個(gè)不同得DAO。這樣可以將代碼分層處理,便于后期的擴(kuò)展升級(jí)。
1.8.4?還書功能
1.8.4.1?功能概述
用戶看完書籍之后需要進(jìn)行歸還,默認(rèn)最長借閱周期是30天,倘若超出的話,超出1天扣1元,30元封頂。如果在還書的時(shí)候,用戶的余額已為負(fù)數(shù),則表示欠費(fèi)了,需要改用戶先還清欠款才能進(jìn)行還書的操作。
1.8.5?逾期扣款
計(jì)算超出歸還日期的用戶所需支付的金額,然后進(jìn)行扣款操作,這里個(gè)功能需要每天執(zhí)行,我們可以使用定時(shí)任務(wù)解決,但是考慮到該項(xiàng)目用戶不會(huì)每天運(yùn)行,所以單獨(dú)寫個(gè)方法,當(dāng)啟動(dòng)軟件的時(shí)候進(jìn)行同一計(jì)算然后再扣款。
1.8.6?充值
1.8.6.1?功能概述
用戶欠費(fèi)后需要充值并且充值之后的余額要大于0才能進(jìn)行還書操作,我們需要精確計(jì)算出用戶的余額,因此使用的類型是BigDecimal。
本視頻專為零基礎(chǔ)學(xué)員傾情打造,共分為29個(gè)章節(jié),可在線觀看,可下載學(xué)習(xí),源碼、課件均已配齊
總結(jié)
以上是生活随笔為你收集整理的最适合Java初学者练手的项目【JavaSE项目-图书管理系统】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度家电行业报告摘录
- 下一篇: Java初学者项目考核–小说管理系统