JAVA图书管理系统(I/O流实现)
目錄
前言
一.項目需求
1.1 項目的具體功能:
二.項目設計
? ? ? ? ? ? ? 2.1登錄系統
? ? ? ? ? ? ? ? ?2.2用戶管理模塊
? ? ? ? ? ? ? ? ?2.3讀者管理模塊
? ? ? ? ? ? ? ? 2.4借閱管理
? ? ? ? ? ? ? ? 2.5基本信息維護
總結:
前言
? ? ? ??長期以來,人們使用傳統的人工方式管理圖書館的日常業務,其操作流程比較煩瑣。在借書時,讀者首先將要借的書和借閱證交給工作人員,然后工作人員將每本書的信息卡片和讀者的借閱證放在一個小格欄里,最后在借閱證和每本書貼的借閱條上填寫借閱信息。在還書時,讀者首先將要還的書交給工作人員,工作人員根據圖書信息找到相應的書卡和借閱證,并填好相應的還書信息。太過于繁瑣了!所以,我們需求設計一個圖書管理系統來方便學生的借書和圖書館管理書籍。
一.項目需求
????????
????????
1.1 項目的具體功能:
? ? ? ?
(1)讀者信息管理:包括讀者信息添加和讀者信息查詢與修改功能。用戶登錄成功之后,可以瀏覽所有讀者的信息,也可以檢索特定讀者的信息;同時,可以對讀者信息進行維護,包括增加、刪除及修改。具體信息包括讀者類型(讀者的類型決定著他可以借到書的最大數量和最大歸還天數)、讀者姓名、出生日期、性別、電話、所在院系、注冊日期等。(相關存儲數據可通過I/O流直接存在文件,可也直接在文件里讀的數據)
(2)圖書信息管理:包括圖書信息添加和圖書信息查詢與修改功能。用戶登錄成功之后,可以瀏覽所有圖書信息和檢索特定圖書的信息;也可以對圖書信息進行維護。包括添加圖書、刪除圖書以及修改圖書信息。具體信息包括:圖書ISBN、圖書名稱、作者、出版社、出版日期、印刷次數、單價、圖書類別等。(相關存儲數據可通過I/O流直接存在文件,可也直接在文件里讀的數據)
(3)圖書借閱管理:包括圖書借閱和圖書歸還功能。圖書借閱功能,先輸入讀者的編號,然后輸入要借閱的圖書的信息,記錄系統當前時間即借閱時間;圖書歸還功能,輸入讀者的編號,選擇其名下已借閱的圖書,判斷當前日期即歸還日期與借閱日期的差值是否超過了規定的期限,計算罰金,從而進行圖書的歸還操作。具體信息包括:借閱日期、歸還日期、罰金。由于要計算罰金,故需要知道該讀者的讀者類型,根據類型判斷其可借圖書天數、可借圖書數量等。(相關存儲數據可通過I/O流直接存在文件,可也直接在文件里讀的數據)
(4)基礎信息維護:包括圖書類別設置、讀者類別設置及罰金設置。圖書類別設置,可以對圖書的類別進行增加、刪除、修改和查詢;讀者類別設置可以對讀者的類別進行增加、刪除、修改和查詢;罰金設置,可以指定超期一天的罰金標準。(相關存儲數據可通過I/O流直接存在文件,可也直接在文件里讀的數據)
(5)用戶管理:包括修改密碼、用戶添加和刪除。修改密碼,是指當前用戶修改自己的密碼;用戶添加和刪除,是對新增和去除系統用戶時對用戶信息的維護。(相關存儲數據可通過I/O流直接存在文件,可也直接在文件里讀的數據)
二.項目設計
? ? ? ? ? ? ? 2.1登錄系統
? ? ? ? ? ? ? 博主首先完成的是登錄系統這個模塊,程序先從文件中讀取賬戶,讀取賬戶我用的是字符流去寫,將賬戶從文件中讀取出來,如果賬戶不存在就注冊。注冊賬戶其實就是將內容寫入到文件中。讀取賬戶:先把文件里的內容一行一行的到集合里,集合我選用的是ArrayList。然后遍歷集合通過分片拿到賬戶名,密碼同理。以下是博主寫的登錄代碼可以參考一下。
public static void Login() throws IOException, InterruptedException, ClassNotFoundException {while (true) {System.out.println("請先輸入你的登錄賬戶名稱:");userAccount = TSUtility.readKeyBoard(6, false);TSUtility.Reader(array,FilenameTeamp);for (int i = 0; i < array.size(); i++) {String account = array.get(i).split(",")[0].split("=")[1];num=i;if (userAccount.equals(account)) {System.out.println("請輸入你的密碼:");String LoginPassword = TSUtility.readKeyBoard(6, false);String password = array.get(i).split(",")[1].split("=")[1];if (LoginPassword.equals(password)) {String log=userAccount+"在"+TSUtility.regionsTime()+"登錄了圖書管理系統";TSUtility.Writer(log,FilenameTeamp1);//LibraryManageView.LibraryManage();} else {System.out.println("你輸入的密碼有誤,請重新輸入!!!");Login();}}else {flag=1;}}if (flag==1) {System.out.println("賬號不存在!!!");System.out.println("是否需要注冊(Y/N)");char c = TSUtility.readConfirmSelection();if (c == 'Y') {registAccount(userAccount);//注冊賬戶} else {Login();}}}}?此圖是存賬戶的文件:
? ? ? ? ? ? ? ? ?2.2用戶管理模塊
? ? ? ? ? ? ? ? 這個模塊因為跟密碼賬戶這些東西掛鉤所以我先選擇寫他。其實這個模塊還是比較簡單的無非就是改密碼,改密碼:通過文件到集合,在分片(上面有代碼),然后再set()方法修改,再把集合的內容寫進文件里,注冊賬戶也是一樣,其實就是文件到集合。集合到文件相互用起來就行了。附上關鍵代碼:修改密碼
if (newPassword.equals(newPasswordpro)){String account = array.get(getNum()).split(",")[0].split("=")[1];String newUser="account="+account+",password="+newPassword;array.set(num,newUser);TSUtility.Writer(array,FilenameTeamp);System.out.println("修改密碼成功!!!");? ? ? ? ? ? ? ? ?2.3讀者管理模塊
? ? ? ? ? ? ? ? 讀者管理模塊與圖書管理模塊非常相似,這里我就講一下讀者,圖書就自己去完成。讀者管理包括:增加讀者,修改讀者,查看讀者,刪除讀者。寫這段代碼,我主要用的是,把對象讀者放到集合里,然后把集合序列化。因為這樣拿讀者的屬性非常的方便。直接反序列化,遍歷集合就可以拿到。反序列化這里有一個點:如果文件為空反序列化會有異常,我的解決方法:字符流去讀那個文件,看是否為空。肯定也有簡單的方法自行百度。當然增添你的考慮賬戶名不能重名。
關鍵代碼:
System.out.println("請輸入讀者的姓名:");String Name = TSUtility.readKeyBoard(4, false);System.out.println("請輸入讀者的出生日期:");System.out.println("年:");String year = TSUtility.readKeyBoard(4, false);System.out.println("月:");String moth = TSUtility.readKeyBoard(2, false);System.out.println("日:");String day = TSUtility.readKeyBoard(2, false);System.out.println("請輸入讀者的性別(男/女):");char Sex = TSUtility.readMenuSelectionpro1();System.out.println("請輸入讀者的電話號碼:");int num = TSUtility.readInt();System.out.println("請輸入讀者的學院:");String Department = TSUtility.readKeyBoard(5, false);String regintime = TSUtility.regionsTime();ReaderInformation r1 = new ReaderInformation(ID, Name, new Date(year, moth, day), Sex, num, Department, true, regintime, new ReaderType("A", 2, 2));TSUtility.ObjectOutput(r1, ReaderList, FilenameTeamp);String log=Loginservice.userAccount+"在 "+TSUtility.regionsTime()+"添加了一個讀者:"+Name;TSUtility.Writer(log,FilenameTeamplog);System.out.println("添加成功!!!");? ? ? ? ? ? ? ? ?修改讀者:
? ? ? ? ? ? ? ? 將文件的內容讀到集合,遍歷拿到集合里的內容修改就行,最后別忘了把修改后的集合序列化存放到文件里去。
? ? ? ? ? ? ? ? 查看讀者:
? ? ? ? ? ? ? ? 查看是最簡單的。將文件的內容讀到集合,遍歷集合就行。
? ? ? ? ? ? ? ? 刪除讀者:
? ? ? ? ? ? ? ? 刪除要考慮的是,讀者是否存在,讀者是否借閱了圖書等,
? ? ? ? ? ? ? ? 2.4借閱管理
? ? ? ? ? ? ? ? 這個模塊是最核心的模塊,稍微復雜一些。借書你要考慮,圖書存在不,數量是否足夠,還有就是讀者他最多能借幾本書,圖書數量的變化,讀者的屬性變化等等。因為這個模塊牽涉到讀者和圖書兩個類,你用了他們哪些屬性,改了哪些東西,你都得把這些新內容重新寫入文件中去。歸還圖書:跟借閱一樣,注意屬性變化,及時更新文件內容。重點是你的判斷讀者是否逾期,再根據讀者的類別,借閱時間,計算罰金。借閱記錄很簡單,跟讀者查看方法一樣。
借閱的關鍵代碼:
boolean isnull = TSUtility.isnull(FilenameTeamp);boolean isnull1 = TSUtility.isnull(FilenameTeamp1);if (!isnull) {try {throw new Aexception("沒有讀者,請先添加");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}} else {ReaderInfomationservice.lookReaderInfomation();System.out.println("請輸入讀者的ID: ");String ID = TSUtility.readKeyBoard(5, false);ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp));Object o = ois.readObject();ReaderList = (ArrayList) o;boolean bb = true;for (int i = 0; i < ReaderList.size(); i++) {ReaderInformation r = (ReaderInformation) ReaderList.get(i);if (ID.equals(r.getID())) {bb = false;BookInformationservice.lookBook();System.out.println(ANSI_GREEN);System.out.println("===================================");System.out.println("類型 可借數量 可借天數 ");System.out.println(r.getType());System.out.println("===================================");System.out.println(ANSI_BLUE);if (r.getType().getMaxbook() == 0) {System.out.println("你借的書太多了,請及時歸還!!!");break;}if (!isnull1) {break;}System.out.println("請輸入你要借的圖書名稱: ");String bookname = TSUtility.readKeyBoard(10, false);ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object oo = ois1.readObject();BookList = (ArrayList) oo;boolean flag = true;for (int j = 0; j < BookList.size(); j++) {BookInformation b = (BookInformation) BookList.get(j);if (bookname.equals(b.getBookName())) {flag = false;if (b.getBookcount() <= 0) {try {throw new Aexception("圖書數量不足,請聯系管理員!!!");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}break;} else {b.setBookcount(b.getBookcount() - 1);r.setStatus(false);r.getType().setMaxbook(r.getType().getMaxbook() - 1);TSUtility.ObjectOutput(ReaderList, FilenameTeamp);TSUtility.ObjectOutput(BookList, FilenameTeamp1);boolean isnull2 = TSUtility.isnull(FilenameTeamp3);if (isnull2) {ObjectInputStream ooo = new ObjectInputStream(new FileInputStream(FilenameTeamp3));Object O = ooo.readObject();BorrowPeopleList = (ArrayList) O;}String time = TSUtility.regionsTime();String borrowpeople = r.getID() + " " + r.getName() + " " + time + " " + b.getBookName() + " " + b.getAnthor() + " " + b.getPress() + " " + b.getDate() + " " + b.getPrice();BorrowPeopleInformation bpi = new BorrowPeopleInformation(r.getID(), r.getName(), r.getPhoneNumber(), time, b.getBookName(), b.getAnthor(), b.getPress(), b.getPrice());TSUtility.ObjectOutput(bpi, BorrowPeopleList, FilenameTeamp3);BorrowList.add(borrowpeople);TSUtility.Writer1(BorrowList, FilenameTeamp2);String log = Loginservice.userAccount + "在 " + TSUtility.regionsTime() + "借出了圖書" + b.getBookName() + " 借書人:" + r.getName() + " ID:" + r.getID();TSUtility.Writer(log, FilenameTeamplog);System.out.println("借書成功!!!");break;}}}if (flag) {try {throw new Aexception("目前沒有這本圖書");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}}//圖書不存在break;}}if (bb) {try {throw new Aexception("沒有找到該讀者!!! ");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}}//讀者不存在ois.close();}歸還的代碼:
boolean isnull = TSUtility.isnull(FilenameTeamp3);if (isnull) {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp3));Object oo = ois.readObject();returnList = (ArrayList) oo;if (returnList.size() == 0) {System.out.println("沒有記錄!!!");} else {System.out.println("所有記錄");Lookbook();System.out.println("請輸入讀者ID:");String name = TSUtility.readKeyBoard(5, false);boolean flag = true;String BorrowTime = null;int price = 0;for (int i = 0; i < returnList.size(); i++) {BorrowPeopleInformation b = (BorrowPeopleInformation) returnList.get(i);if (name.equals(b.getID())) {flag = false;System.out.println("你借的書有:");System.out.println("=========================================");System.out.println("書名 作者 借書日期 ");for (int j = 0; j < returnList.size(); j++) {BorrowPeopleInformation b1 = (BorrowPeopleInformation) returnList.get(j);if (b.getID().equals(b1.getID())) {System.out.println(b1.getBorrowBookName() + " " + b1.getBorrowBookAnthor() + " " + b1.getBorrwTime());BorrowTime = b1.getBorrwTime();flag = false;}}System.out.println("請輸入要歸還的圖書名稱:");boolean flag1 = true;String Bookname = TSUtility.readKeyBoard(8, false);for (int j = 0; j < returnList.size(); j++) {BorrowPeopleInformation b2 = (BorrowPeopleInformation) returnList.get(j);if (Bookname.equals(b2.getBorrowBookName())) {ObjectInputStream oi = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object ob = oi.readObject();returnList1 = (ArrayList) ob;//歸還后圖書數量+1for (int k = 0; k < returnList1.size(); k++) {BookInformation bb = (BookInformation) returnList1.get(k);if (Bookname.equals(bb.getBookName())) {bb.setBookcount(bb.getBookcount() + 1);price = bb.getPrice();break;}}//歸還后讀者可借閱數量+1ObjectInputStream oio = new ObjectInputStream(new FileInputStream(FilenameTeamp));Object obo = oio.readObject();returnList2 = (ArrayList) obo;String Readerinfo = null;String typeName = null;int maxday = 0;for (int k = 0; k < returnList2.size(); k++) {ReaderInformation bbb = (ReaderInformation) returnList2.get(k);if (name.equals(bbb.getID())) {bbb.getType().setMaxbook(bbb.getType().getMaxbook() + 1);Readerinfo = "你的類型是" + bbb.getType().getTypeName() + "你最久只能借" + bbb.getType().getMaxday() + "天";typeName = bbb.getType().getTypeName();maxday = bbb.getType().getMaxday();break;}}String log = "ID為:" + name + "的讀者" + "在 " + TSUtility.regionsTime() + "歸還了圖書" + Bookname;TSUtility.Writer(log, FilenameTeamplog);//算錢================================================================System.out.println(ANSI_YELLOW);FileReader fir = new FileReader(FilenameTeampmony);MonyList.load(fir);String a = MonyList.getProperty(typeName);Long aa = Long.parseLong(a);fir.close();System.out.println("========================================================");System.out.println("注意:");System.out.println("如果逾期了: 罰金=逾期天數*類型罰金*圖書價格");System.out.println("========================================================");System.out.println(Readerinfo);String nowTime = TSUtility.regionsTime();long l = TSUtility.calculateTime(BorrowTime);System.out.println("圖書價格 借書時間 還書時間 借用時間(秒) ");System.out.println(" " + price + " " + BorrowTime + " " + nowTime + " " + l);if (l > maxday) {System.out.println("你逾期了!!!" + (l - maxday) + "秒");System.out.println("罰款:" + (l - maxday) * aa * price + "元");} else {System.out.println("你沒有逾期!!!!很好!!");}TSUtility.ObjectOutput(returnList1, FilenameTeamp1);TSUtility.ObjectOutput(returnList2, FilenameTeamp);returnList.remove(i);TSUtility.ObjectOutput(returnList, FilenameTeamp3);System.out.println("歸還成功");System.out.println(ANSI_CYAN);flag1 = false;break;}}if (flag1) {System.out.println("沒有借閱該圖書!!!");}break;}}if (flag) {System.out.println("沒有找到該讀者!!!");}}} else {System.out.println("沒有借書記錄!!!");}? ? ? ? ? ? ? ? 2.5基本信息維護
? ? ? ? ? ? ? ? 這個模塊涉及到讀者類別,圖書類別的添加,罰金的設置,如果沒有讀者類別,圖書類別,是無法添加讀者,圖書的。
添加讀者類別的關鍵代碼如下:
需要注意的是讀者類別變化帶來的其他模塊的變化,比如罰金設置,讀者添加等,都要考慮。
boolean isnull = TSUtility.isnull(FilenameTeamp1);System.out.println("請輸入你要添加的類別ID:");String TypeID = TSUtility.readKeyBoard(3, false);if (isnull) {System.out.println("當前類別有:");lookReaderType();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object o = ois.readObject();ReaderList3 = (ArrayList) o;}boolean b = true;for (int j = 0; j < ReaderList3.size(); j++) {ReaderType rd = (ReaderType) ReaderList2.get(j);if (TypeID.equals(rd.getID())) {System.out.println("該類別已經存在!!!");b = false;break;}}if (b) {System.out.println("請輸入你要添加的類別名稱:");String TypeName = TSUtility.readKeyBoard(5, false);System.out.println("請輸入" + TypeName + "類型最大借閱數量:");int TypeNumber = TSUtility.readInt();System.out.println("請輸入" + TypeName + "類型最大借閱天數:");int TypeTime = TSUtility.readInt();ReaderType r = new ReaderType(TypeID, TypeName, TypeNumber, TypeTime);TSUtility.ObjectOutput(r, ReaderList2, FilenameTeamp1);FileReader ff=new FileReader(FilenameTeamp2);pro.load(ff);pro.setProperty(TypeName,"0");FileWriter f=new FileWriter(FilenameTeamp2);pro.store(f,null);f.close();System.out.println("添加類別成功!!!");}?罰金設置:這個模塊我用的是Properties與IO流結合起來,設置值就是根據鍵獲取值
,到時候歸還圖書的時候計算借閱時間,在自定義罰金公式就行了。非常的方便。?罰金的計算在歸還圖書那里已經寫好了。
總結:
? ? ? ? 這個小項目多次用到文件的讀寫,所以可以吧文件讀寫寫成方法調用,注冊時間我用的是
public static String regionsTime(){ /* Calendar c=Calendar.getInstance();int year=c.get(Calendar.YEAR);int moth=c.get(Calendar.MONTH)+1;int day=c.get(Calendar.DATE);return year+"年"+moth+"月"+day+"日";*/Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat();String format = sdf.format(d);return format;}//當前時間如果文件更新了注意,及時通過寫入的方法去重新寫入。這篇博客主要講的是我的一些思路,沒有太多的具體代碼寫入。注意:寫之前多思考各個模塊之間的聯系,免得后面更改代碼,有些打腦殼。
總結
以上是生活随笔為你收集整理的JAVA图书管理系统(I/O流实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库的存储过程不用学吗,My
- 下一篇: C++Primer学习之一引用和指针