引言
各位小伙伴大家好,今天跟大家分享一个小项目,基于文本界面实现图书管理系统(基于IO流实现),这个项目集成了java几乎基础的知识,值得一练,下面我将跟大家一起回顾与分享一下在该项目的心得与注意的点。
目录
一、项目概述
- 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
- 本系统功能分为读者信息管理模块、图书信息管理模块、图书借阅管理模块、基础信息维护模块和用户管理模块。
- 读者信息管理:能够对读者的基本信息进行管理,包括新增读者,如学校新来一名教师,想要借书,就必须先添加读者信息;读者信息的修改,如学生转到别的专业,此时要修改学生的基本信息;删除读者的信息,比如某个学生中途退学了,可以将其信息删除。查询读者的信息,比如有同学拾到了一张借阅卡,卡上有学生的编号,通过此号来查询学生的联系电话,从而可以找到学生。
- 图书信息管理:能够对图书的基本信息进行管理,包括新增图书,学校每年会购进新书,此时需要将新书的信息录入系统中;图书信息的修改,如学生借书后将图书丢失,此时需要修改图书的总数量,使总数减1;删除图书,学校在购进新书的同时,每年会对过期的图书进行清理,不再提供借阅,此时就需要将这些图书的信息从系统中删除。查询图书的信息,比如要查看有哪些是Java相关的书籍或者指定ISBN号的图书等。
- 图书借阅信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、借阅时间等信息。
- 图书归还信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、归还时间、是否超期、罚金等信息。
系统用户信息管理:能够对系统用户的信息进行管理,包括增加新的系统操作用户,对当前系统用户的密码进行修改,以及删除某一用户。
以及项目模块图:
项目类设计参考:
User模块是用来存放IO流创建的文件的。
二、项目所遇到的问题及解决方案
问题一:IO流写文件数据方式的选择。
这个问题开始拿到手这个项目的时候我是去做的用户管理模块,当时想着用properties集合去做,但是会出现一个问题就是我其他的数据不太好去匹配,所以我选用了ArrayList集合去存储每个对象,再采用序列化的方法将存储了我所有对象的集合序列化到文件里面去,需要使用的时候,反序列化出来集合即可得到我的每一个对象。因此,我推荐使用序列化操作,可以省去很多不必要的步骤,因为每个模块几乎都是增,删,改,查,做好了序列化操作,其他需要序列化的时候调用方法即可。
我这里是将序列化与反序列化做成一个方法,
private static File file = new File("E:\\java练习\\project2librarymanagementsystem\\src\\managesystem\\User\\ReaderType.txt");
/**
* 序列化
*/
public static void serializable(ArrayList<ReaderType> typeArrayList) {
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(typeArrayList);
oos.flush();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 反序列化
*/
public static ArrayList<ReaderType> turnSerializable() {
ArrayList<ReaderType> typeArrayList = new ArrayList<ReaderType>();
try {
if (!file.exists()) {
file.createNewFile();
}
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
//强转集合
typeArrayList = (ArrayList<ReaderType>) ois.readObject();
ois.close();
} catch (Exception e) {
System.out.println("文件首次创建成功");;
}
return typeArrayList;
}
将文件路径作为一个静态成员变量,方便调用,该序列化方法仅供参考,可自行设计,思路是这样。
问题二:各类,模块之间的联动。
比如说,我的读者类型类和读者实体类是分开的,但是我读者实体类应该要有读者类型类的成员变量,在修改或者是添加新的读者时,直接可以将读者类型定义好的数据添加到读者当中,类似这样:
我们通过选择类型,就直接可以添加相应的读者类型,当然,做这一步你一定要做到类写好了,进行测试的时候去做。罚金和图书类型等以此类推。
问题三:一定要注意各个小细节的提示信息
例如用户在使用某个功能他能看到什么,他不知道你写的什么,你的所有代码均是为客户服务,因此你的功能应该让别人看懂,让别人会使用。
问题四:基础信息维护要与我们的操作类分开。
例如图书的增删改查,我们就采用1就行了,如果我们要修改图书类型等等信息,我们就要进入5菜单,在选择2操作进行增删改查。这里的每一个功能都尽量写一个方法,即方便找bug,也方便重复使用等等。读者和罚金依次类推。
问题五:借阅问题。
借阅问题是本项目最难的一部分,你需要考虑的问题大致有以下几点:
1.借阅的限制条件,读者的限制阅读天数,限制借阅数量,以及每本书限制借阅的数量。
借阅天数和借阅数量即根据每个读者类型限制的条件去匹配即可,那么每本书的限制借阅数量就应该是全图书馆的借阅数量去匹配,尤其注意这两个限制条件不要搞混。
限制条件如何去做呢,我们相出了一种办法,通过给借阅类给一个状态变量,去控制,如果借了书没还,状态即为false(就是去数有几个false去匹配条件,这样做的好处就是避免了写入文件导致的数据错乱问题),那么我们根据读者ID就可以匹配到该读者有多少本书未还,限制他的借阅数量,根据图书的ISBN码就可以去匹配该图书在馆内有多少本数未还,限制馆内该图书的借阅。也就是书借光了,不能再借了。
当我们还完书之后,状态就应该改成true,因为true我们不去匹配他。还书的时间和罚金匹配也是如此,罚金规则可以自行设置,主要有三点,罚金的规则是根据你还书的时间减去你借书的时间去得出来的,至于发多少,罚金类是有设置的,可以设置其他 规则,这个就看你自己;再者就是如果该读者借书超过自己能借的书,那就不能借了,必须还了才可以借;另外,图书的借阅数量也是如此,借完可以提示已无书可借。
归还之后一定记得改状态为true。
三、项目代码
这里放一个演示视频,演示只是走一遍大概流程,细节在代码中去体现,代码放在下方,欢迎大家下载体验,以及发现问题互相交流,谢谢。
视频演示:
基于文本界面的图书管理系统(IO版)
代码:
链接:https://pan.baidu.com/s/1uwWSF7oidDQ3zBrIVrIbtg
提取码:sfra
文章最后,一起阅读一下名人名句:打打鸡血,一起加油。
只有经历过地狱般的磨砺,才能练就创造天堂的力量;只有流过血的手指,才能弹出世间的绝响。——泰戈尔