实践项目二:图书馆管理系统
一、项目概述
1.长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
2.本系统功能分为读者信息管理模块、图书信息管理模块、图书借阅管理模块、基础信息维护模块和用户管理模块。
3.读者信息管理:能够对读者的基本信息进行管理,包括新增读者,如学校新来一名教师,想要借书,就必须先添加读者信息;读者信息的修改,如学生转到别的专业,此时要修改学生的基本信息;删除读者的信息,比如某个学生中途退学了,可以将其信息删除。查询读者的信息,比如有同学拾到了一张借阅卡,卡上有学生的编号,通过此号来查询学生的联系电话,从而可以找到学生。
4.图书信息管理:能够对图书的基本信息进行管理,包括新增图书,学校每年会购进新书,此时需要将新书的信息录入系统中;图书信息的修改,如学生借书后将图书丢失,此时需要修改图书的总数量,使总数减1;删除图书,学校在购进新书的同时,每年会对过期的图书进行清理,不再提供借阅,此时就需要将这些图书的信息从系统中删除。查询图书的信息,比如要查看有哪些是Java相关的书籍或者指定ISBN号的图书等。
5.图书借阅信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、借阅时间等信息。
6.图书归还信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、归还时间、是否超期、罚金等信息。
系统用户信息管理:能够对系统用户的信息进行管理,包括增加新的系统操作用户,对当前系统用户的密码进行修改,以及删除某一用户。问题就是,我需要先把整个模块的文件创建分类好。创建好后。根据参考设计制作实。
javaSE学习结束后,会有一个项目二练习,提供了一个需求文档并给了一些参考设计,说实话我看完了整个信息阐述还是很懵,即使仔细看了额外给的参考设计还画了每个板块的结构图,但是一打开IDEA发现自己还是无从下手。后来就百度B站各种搜索图书管理系统想做个参考,合计着跟着别的博主慢慢敲呗,却发现不是IO版,是java+web+mysql对于小白的我,这哪儿会啊。于是乎我就决定从头开始自己逐一攻破。
实体类包(存放各种属性的类):
io包(需要存储各类写入内存数据的包):
service包(实现功能的行为方法等):
view包(菜单选择界面等):
工具类包(存放公共方法):
二、项目所遇到的问题及解决方案
问题一:IO流写文件数据方式的选择。
这个问题开始拿到手这个项目的时候我是去做的用户管理模块,当时想着用properties集合去做,将用户名作为文件名创建并存储,但是会出现一个问题就是如果有很多用户就会很占用空间。所以我选用了ArrayList集合去存储每个对象,再采用序列化的方法将存储了我所有对象的集合序列化到文件里面去,需要使用的时候,反序列化出来集合即可得到我的每一个对象。每个模块几乎都是增,删,改,查,做好了序列化操作,其他需要序列化的时候调用方法即可。这是我的两个方法:
public class Dao {/*** 加载磁盘中集合数据(反序列化)* @return 指定集合*/public static List<?> loadList(File filePath) {ObjectInputStream ois = null;List<?> list = null;try {ois = new ObjectInputStream(new FileInputStream(filePath));list = (List<?>) ois.readObject();} catch (IOException | ClassNotFoundException e) {LogUtil.save("反序列化文件失败");} finally {try {// modify 避免空指针异常 yangxianjiu 0602 startif(ois != null){ois.close();}// modify 避免空指针异常 yangxianjiu 0602 end} catch (IOException e) {e.printStackTrace();}}return list;}/*** 将集合中数据存入磁盘(序列化)* @param filePath 存储磁盘路径* @param list 集合数据*/public static void saveList(File filePath,List<?> list) {ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream(filePath));oos.writeObject(list);oos.flush();} catch (Exception e) {LogUtil.save("数据保存信息失败");} finally {try {// modify 避免空指针异常 yangxianjiu 0602 startif (oos == null) {oos.close();}// modify 避免空指针异常 yangxianjiu 0602 end} catch (IOException e) {e.printStackTrace();}}}}
问题二:用程序修改同一个对象后却不更新。
我在写好修改程序后,修改对象的值却发现序列化反序列化都没有问题,可数据还是没更新在集合中,百度一查发现在比较数据时出了问题。我在修改了原数据后被写入了内存中,当需要修改反序列化出来时他原本是同一个对象,可是反序列化出来的对象hashcode值却发生了改变,所以需要重写实体类中的equals和hashcode值。让他们保持一致。
@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Reader reader = (Reader) o;if (typeNumber != reader.typeNumber) return false;if (readerNumber != reader.readerNumber) return false;if (age != reader.age) return false;if (readerType != null ? !readerType.equals(reader.readerType) : reader.readerType != null) return false;if (name != null ? !name.equals(reader.name) : reader.name != null) return false;if (sex != null ? !sex.equals(reader.sex) : reader.sex != null) return false;if (phone != null ? !phone.equals(reader.phone) : reader.phone != null) return false;if (department != null ? !department.equals(reader.department) : reader.department != null) return false;return recordDate != null ? recordDate.equals(reader.recordDate) : reader.recordDate == null;}@Overridepublic int hashCode() {int result = typeNumber;result = 31 * result + (readerType != null ? readerType.hashCode() : 0);result = 31 * result + (int) (readerNumber ^ (readerNumber >>> 32));result = 31 * result + (name != null ? name.hashCode() : 0);result = 31 * result + (sex != null ? sex.hashCode() : 0);result = 31 * result + age;result = 31 * result + (phone != null ? phone.hashCode() : 0);result = 31 * result + (department != null ? department.hashCode() : 0);result = 31 * result + (recordDate != null ? recordDate.hashCode() : 0);return result;}
之前有记录在写的是遇到的问题,可恶的是居然忘了保存;经过8、9天的记忆混淆现在怎么都想不起所遇到的问题关键了。我一定要养成记录学习的好习惯。下次一定。
如果觉得《实践项目二:图书馆管理系统 总结》对你有帮助,请点赞、收藏,并留下你的观点哦!