前言
长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
一.项目需求
1.1 项目的具体功能:
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)用户管理:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
二.项目设计
2.1登录系统
博主首先完成的是登录系统这个模块,程序先从文件中读取账户,读取账户我用的是字符流去写,将账户从文件中读取出来,如果账户不存在就注册。注册账户其实就是将内容写入到文件中。读取账户:先把文件里的内容一行一行的到集合里,集合我选用的是ArrayList。然后遍历集合通过分片拿到账户名,密码同理。以下是博主写的登录代码可以参考一下。
此图是存账户的文件:
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读者管理模块
读者管理模块与图书管理模块非常相似,这里我就讲一下读者,图书就自己去完成。读者管理包括:增加读者,修改读者,查看读者,删除读者。写这段代码,我主要用的是,把对象读者放到集合里,然后把集合序列化。因为这样拿读者的属性非常的方便。直接反序列化,遍历集合就可以拿到。反序列化这里有一个点:如果文件为空反序列化会有异常,我的解决方法:字符流去读那个文件,看是否为空。肯定也有简单的方法自行百度。当然增添你的考虑账户名不能重名。
关键代码:
修改读者:
将文件的内容读到集合,遍历拿到集合里的内容修改就行,最后别忘了把修改后的集合序列化存放到文件里去。
查看读者:
查看是最简单的。将文件的内容读到集合,遍历集合就行。
删除读者:
删除要考虑的是,读者是否存在,读者是否借阅了图书等,
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;
//归还后图书数量+1
for (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;
}
}
//归还后读者可借阅数量+1
ObjectInputStream 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("没有借书记录!!!");