前言
長期以來,人們使用傳統的人工方式管理圖書館的日常業務,其操作流程比較煩瑣,在借書時,讀者首先將要借的書和借閱證交給作業人員,然后作業人員將每本書的資訊卡片和讀者的借閱證放在一個小格欄里,最后在借閱證和每本書貼的借閱條上填寫借閱資訊,在還書時,讀者首先將要還的書交給作業人員,作業人員根據圖書資訊找到相應的書卡和借閱證,并填好相應的還書資訊,太過于繁瑣了!所以,我們需求設計一個圖書管理系統來方便學生的借書和圖書館管理書籍,
(一)專案說明:
- 本系統功能分為讀者資訊管理模塊、圖書資訊管理模塊、圖書借閱管理模塊、基礎資訊維護模塊和用戶管理模塊,
- 讀者資訊管理:能夠對讀者的基本資訊進行管理,包括新增讀者,如學校新來一名教師,想要借書,就必須先添加讀者資訊;讀者資訊的修改,如學生轉到別的專業,此時要修改學生的基本資訊;洗掉讀者的資訊,比如某個學生中途退學了,可以將其資訊洗掉,查詢讀者的資訊,比如有同學拾到了一張借閱卡,卡上有學生的編號,通過此號來查詢學生的聯系電話,從而可以找到學生,
- 圖書資訊管理:能夠對圖書的基本資訊進行管理,包括新增圖書,學校每年會購進新書,此時需要將新書的資訊錄入系統中;圖書資訊的修改,如學生借書后將圖書丟失,此時需要修改圖書的總數量,使總數減1;洗掉圖書,學校在購進新書的同時,每年會對過期的圖書進行清理,不再提供借閱,此時就需要將這些圖書的資訊從系統中洗掉,查詢圖書的資訊,比如要查看有哪些是Java相關的書籍或者指定ISBN號的圖書等,
- 圖書借閱資訊管理:能夠對圖書的借閱資訊進行記錄,包括讀者資訊、圖書資訊、借閱時間等資訊,
- 圖書歸還資訊管理:能夠對圖書的借閱資訊進行記錄,包括讀者資訊、圖書資訊、歸還時間、是否超期、罰金等資訊,
- 系統用戶資訊管理:能夠對系統用戶的資訊進行管理,包括增加新的系統操作用戶,對當前系統用戶的密碼進行修改,以及洗掉某一用戶,

專案功能如下:
(1)讀者資訊管理:包括讀者資訊添加和讀者資訊查詢與修改功能,用戶登錄成功之后,可以瀏覽所有讀者的資訊,也可以檢索特定讀者的資訊;同時,可以對讀者資訊進行維護,包括增加、洗掉及修改,具體資訊包括讀者型別(讀者的型別決定著他可以借到書的最大數量和最大歸還天數)、讀者姓名、出生日期、性別、電話、所在院系、注冊日期等,(相關存盤資料可通過I/O流直接存在檔案,可也直接在檔案里讀的資料)
(2)圖書資訊管理:包括圖書資訊添加和圖書資訊查詢與修改功能,用戶登錄成功之后,可以瀏覽所有圖書資訊和檢索特定圖書的資訊;也可以對圖書資訊進行維護,包括添加圖書、洗掉圖書以及修改圖書資訊,具體資訊包括:圖書ISBN、圖書名稱、作者、出版社、出版日期、印刷次數、單價、圖書類別等,(相關存盤資料可通過I/O流直接存在檔案,可也直接在檔案里讀的資料)
(3)圖書借閱管理:包括圖書借閱和圖書歸還功能,圖書借閱功能,先輸入讀者的編號,然后輸入要借閱的圖書的資訊,記錄系統當前時間即借閱時間;圖書歸還功能,輸入讀者的編號,選擇其名下已借閱的圖書,判斷當前日期即歸還日期與借閱日期的差值是否超過了規定的期限,計算罰金,從而進行圖書的歸還操作,具體資訊包括:借閱日期、歸還日期、罰金,由于要計算罰金,故需要知道該讀者的讀者型別,根據型別判斷其可借圖書天數、可借圖書數量等,(相關存盤資料可通過I/O流直接存在檔案,可也直接在檔案里讀的資料)
(4)基礎資訊維護:包括圖書類別設定、讀者類別設定及罰金設定,圖書類別設定,可以對圖書的類別進行增加、洗掉、修改和查詢;讀者類別設定可以對讀者的類別進行增加、洗掉、修改和查詢;罰金設定,可以指定超期一天的罰金標準,(相關存盤資料可通過I/O流直接存在檔案,可也直接在檔案里讀的資料)
(5)用戶管理:包括修改密碼、用戶添加和洗掉,修改密碼,是指當前用戶修改自己的密碼;用戶添加和洗掉,是對新增和去除系統用戶時對用戶資訊的維護,(相關存盤資料可通過I/O流直接存在檔案,可也直接在檔案里讀的資料)
(二)專案分析:
讓我們一起來看看專案的分析,該專案也是以增、刪、改、查為基礎,相信大家都不陌生,
與之前的專案一,團隊調度有區別的就是:該專案的資料是通過IO流來保存的,這樣的優勢就是:
我們保存的資料不會因為重啟專案時被清除掉,一直都會在檔案里存在,對于資料的保存的角度來看,是個較好的選擇,
通過需求:
我們可以將這些模塊的實作劃分為三個類包和一個資料包:(博主寫得是):
三個包分別為:界面展示包(里面放的全是展示類);功能實作包(放的各個功能的實作類);
物體類包(放各個需要用到的物體類);資料包(存放各種用到的資料);


(—)用戶管理模塊
首先,我們進入到圖書管理系統,進入的方式就是通過用戶的賬號和密碼的輸入匹配,
用戶登錄:
設計該功能時,我們選擇將資料保存在檔案中,也就是用IO流來做,
確定了IO流,這時,我們可以選擇對應的實作方式,(1)Properties與IO流結合起來,設定值就是根據鍵獲取值,(2)用序列化和反序列化來寫,
這里,博主選擇了用Properties來寫,通過設定鍵值對,鍵代表賬戶,值代表密碼,而且在檔案中可以直接直觀地讀取資料,

其次就是用戶資料的增刪改查,

因為會用到IO流,在實作檔案資料讀寫操作是需要拋出例外的,可以通過快捷鍵:
Alt+Enter來快速實作,
注意事項:
在存盤和修改資料時我們都需要先將之前的資料讀取到Properties集合中,然后再將新的資料寫入
檔案里,這樣可以防止每次寫資料的時候,不小心將之前想要保留的資料覆寫掉了,

還有一點就是:在用戶登錄成功,并執行洗掉用戶資料的功能時,我們不能把當前的用戶資料刪掉,這里只需要加一個判斷陳述句就可以了,

到這里,用戶管理模塊基本就完成了,
(二)基本資訊維護模塊
該模塊下有,讀者類別的設定,圖書類別的設定,還有罰金的設定;
讀者類別,就是當我們再添加讀者時,可以將讀者類別當做讀者類的一個屬性添加進去,
就比如說,我們當前添加的讀者型別為學生,那么就在可以單獨設定學生的可借閱圖書的天數和圖書的數量,
同理,圖書類別的設定,就可以把圖書進行分類,
罰金的設定:可以根據不同型別的讀者,設定不同型別的罰金,

部分代碼展示(讀者型別的設定):
public class ReaderTypeServe {
static String typeid,typename,limit,maxborrownum;
//添加讀者型別
public static void addReaderType() throws IOException, ClassNotFoundException {
boolean flog=true;
System.out.println(" 🐕🐕🐕 歡迎來到讀者類別添加界面 🐕🐕🐕 ");
//讀取檔案中的資料,存入集合,
TSUtility.readReaderType();
ArrayList<ReaderType> array=TSUtility.readerTypesArray;
System.out.println();
/* if (array.size()==0){
System.out.println("沒有檢測到讀者型別資訊...");
}*/
while (true){
try {
System.out.println("請添加讀者唯一的的型別號:(正數)");
typeid=TSUtility.readKeyBoard(3,false);
if (Integer.parseInt(typeid)>=0){
break;
}else {
System.out.println("格式不對,請檢后輸入:");
}
}catch (NumberFormatException e){
System.out.println("請輸入相應的整數...");
}
}
for (ReaderType reader : array) {
if (typeid.equals(reader.getTypeid())) {
System.out.println("該id已被使用,自動回傳上一界面!");
flog=false;
break;
}
}
if (flog){
System.out.println("請輸入讀者型別名稱:");
typename =TSUtility.readKeyBoard(4,false);
for (ReaderType reader : array) {
if (typename.equals(reader.getTypename())) {
System.out.println("該型別已被使用,自動回傳上一界面!");
flog=false;
break;
}
}
}
if (flog){
while (true){
try {
System.out.println("請設定可借閱天數:(正數,且不能超過100天)");
limit =TSUtility.readKeyBoard(2,false);
if (Integer.parseInt(limit)>=0&&Integer.parseInt(typeid)<=100){
break;
}else {
System.out.println("未按規定格式,請檢查后輸入...");
}
}catch (NumberFormatException e){
System.out.println("請輸入相應的整數...");
}
}
while (true){
try {
System.out.println("請設定可借閱數量:(正數,且不能超過30本)");
maxborrownum =TSUtility.readKeyBoard(4,false);
if (Integer.parseInt(limit)>=0&&Integer.parseInt(typeid)<=30){
break;
}else {
System.out.println("未按規定格式,請檢查后輸入...");
}
}catch (NumberFormatException e){
System.out.println("請輸入相應的整數...");
}
}
//創建物件
ReaderType reader=new ReaderType(typeid,typename,limit,maxborrownum);
TSUtility.writeReaderType(reader);
System.out.println("添加成功!");
}
}
//洗掉讀者型別
public static void deleteReaderType()throws IOException, ClassNotFoundException {
System.out.println();
showAllReaderType();
ArrayList<ReaderType> array=TSUtility.readerTypesArray;
if (array.size()!=0){
//讀取檔案中的資料,存入集合,讀者
TSUtility.readReaderPath();
ArrayList<Reader> readerArray=TSUtility.readerArray;
//
System.out.println("請選擇您想要洗掉讀者型別的編號(回車跳過該選項..):");
String id =TSUtility.readString(10,"false");
if (!(id.equals("false"))){
for (int i=0;i<array.size();i++){
if (array.get(i).getTypeid().equals(id)){
int i1=0;
for (Reader reader : readerArray){
i1++;
if (reader.getReaderType().getTypename().equals(array.get(i).getTypename())){
System.out.println("該讀者型別已經被使用,不能被洗掉!");
break;
}else {
if (i1==readerArray.size()){
TSUtility.readerTypesArray.remove(i);
System.out.println("洗掉成功!");
break;
}
}
}
}else {
if (i==array.size()){
System.out.println("編號不存在,請重新輸入...");
}
}
}
}
//重繪
flush();
}
}
//修改讀者型別
public static void modifyReaderType()throws IOException, ClassNotFoundException {
TSUtility.readReaderType();
ArrayList<ReaderType> array=TSUtility.readerTypesArray;
if (array.size()!=0){
System.out.println();
System.out.println(" 🐱 讀者型別修改界面 🐱 ");
showAllReaderType();
boolean flog=true;
while (flog){
System.out.println("請選擇您想要修改讀者型別的編號(回車跳過...):");
String id =TSUtility.readString(5,"false");
if (!(id.equals("false"))){
//讀取檔案中的資料,存入集合,讀者
TSUtility.readReaderPath();
ArrayList<Reader> readerArray=TSUtility.readerArray;
//
boolean flogs=true;
for (int i=0;i<array.size();i++){
if (array.get(i).getTypeid().equals(id)){
String typeName = array.get(i).getTypename();
for (Reader reader : readerArray) {
if (reader.getReaderType().getTypename().equals(typeName)) {
System.out.println("該讀者型別已經被使用,不能修改!");
flogs=false;
/*flog=false;*/
break;
}
}
if (flogs){
System.out.println(" 🐕 修改讀者型別名稱("+array.get(i).getTypename()+"):(回車跳過該選項..) ");
String name=TSUtility.readString(10,array.get(i).getTypename());
TSUtility.readerTypesArray.get(i).setTypename(name);
while (true){
System.out.println(" 🐕 修改讀者可借閱天數(正數)("+array.get(i).getLimit()+"):(回車跳過該選項..) ");
try {
String limit=TSUtility.readString(5,array.get(i).getLimit());
if (Integer.parseInt(id)>=0){
TSUtility.readerTypesArray.get(i).setLimit(limit);
break;
}else {
System.out.println("格式不對,請檢后輸入:");
}
}catch (NumberFormatException e){
System.out.println("請輸入相應的整數...");
}
}
while (true){
try {
System.out.println(" 🐕 修改讀者可借閱數量("+array.get(i).getMaxborrownum()+"):(回車跳過該選項..) ");
String maxborrownum=TSUtility.readString(5,array.get(i).getMaxborrownum());
if (Integer.parseInt(id)>=0){
TSUtility.readerTypesArray.get(i).setMaxborrownum(maxborrownum);
break;
}else {
System.out.println("格式不對,請檢后輸入:");
}
}catch (NumberFormatException e){
System.out.println("請輸入相應的整數...");
}
}
//重繪
flush();
System.out.println("修改成功!");
flog=false;
break;
}else {
if (i==array.size()){
System.out.println("該編號不存在,請檢查后輸入...");
}
}
}
}
}else {
flog=false;
System.out.println("已取消修改...");
}
}
}else {
System.out.println("還沒有讀者型別資訊...");
}
}
//查詢所有讀者型別資訊
public static void showAllReaderType() throws IOException, ClassNotFoundException {
//展示讀者資訊
//讀取檔案中的資料,存入集合,
TSUtility.readReaderType();
ArrayList<ReaderType> array =TSUtility.readerTypesArray;
if (array.size()!=0){
System.out.println("編號 "+" 型別名稱 "+" 可借閱天數 "+" 可借閱數量 ");
for (int i = 0; i <array.size() ; i++) {
System.out.println(array.get(i).getTypeid()+"\t "+array.get(i).getTypename()+"\t\t"+array.get(i).getLimit()+"\t\t"+array.get(i).getMaxborrownum() );
}
/*System.out.println("讀者型別展示完成!");*/
System.out.println();
}else {
System.out.println("目前還沒有讀者型別資訊");
}
}
//將集合重新序列化到檔案,實作相應功能后重繪的功能
public static void flush() throws IOException {
//物件序列化
ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(TSUtility.pathRederType));
//序列化物件的方法 void writeObject(Object obj)
oos.writeObject(TSUtility.readerTypesArray);
//釋放資源
oos.close();
}
}
該模塊主要注意的就是: 在某個型別被使用的時候,我們就不能讓該型別被修改和洗掉!(添加一個判斷陳述句,利用回圈遍歷實作,)
在罰金設定這里:因為我們需要根據不同的型別來設定罰金,所以,在這里我們用Properties通過鍵值對的形式,可以很好地將罰金設定出來,
(三)讀者管理模塊
在我們設定該模塊時,我們先明確,我們需要通過類的物件來實作這些功能,所以,我們這里首選序列化來寫,然后就是該模塊的基本功能,增、刪、改、查,

注意事項:
在實作序列化和反序列化時,我們序列化的類一定要實作Serializable介面,不然會拋出例外!
![]()
在資料存盤方面:一旦我們需要添加、修改或者洗掉資料時,我們都需要重繪資料(也就是說,我們都需要先將資料從檔案里讀取出來,操作完成后,我們再將資料寫入回檔案),
這里,我們可以先建立相應的集合,用于存盤反序列化出來的物件,這樣,我們就只需要對該集合進行相應的操作,然后序列化該存盤物件的集合就可以了,

今天我們就先看到這里,完整的代碼,博主會通過鏈接放在后面,需要的童鞋提取下就可以了~
幫博主點個贊吧~ ~
鏈接:https://pan.baidu.com/s/10kV-aXCWYsrv-lZPMwzUcg
提取碼:oqge
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327976.html
標籤:java
