实践项目二:图书馆管理系统

一、项目概述

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 20220602 startif(ois != null){ois.close();}// modify 避免空指针异常 yangxianjiu 20220602 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 20220602 startif (oos == null) {oos.close();}// modify 避免空指针异常 yangxianjiu 20220602 end} catch (IOException e) {e.printStackTrace();}}}}

问题二:用程序修改同一个对象后却不更新。

我在写好修改程序后,修改对象的值却发现序列化反序列化都没有问题,可数据还是没更新在集合中,百度一查发现在比较数据时出了问题。我在修改了原数据后被写入了内存中,当需要修改反序列化出来时他原本是同一个对象,可是反序列化出来的对象hashcode值却发生了改变,所以需要重写实体类中的equals和hashcode值。让他们保持一致。

@Override
public 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;
}@Override
public 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天的记忆混淆现在怎么都想不起所遇到的问题关键了。我一定要养成记录学习的好习惯。下次一定。

实践项目二:图书馆管理系统 总结相关推荐

  1. 【C#项目】图书馆管理系统-WinForm+MySQL

    文章目录 前言 一.业务梳理与需求分析 1.功能描述 2.实现步骤 3.功能逻辑图 二.数据库设计 1.实体-关系(E-R图)概念模型设计 2.数据表设计 三.WinForm界面交互设计 1.界面交互 ...

  2. python实践项目(二)

    练习1:逗号代码 假定有下面这样的列表: spam = ['apples', 'bananas', 'tofu', 'cats'] 编写一个函数,它以一个列表值作为参数,返回一个字符串.该字符串包含所 ...

  3. 第16周实践项目二——学生成绩处理(2)

    问题及代码 #include <stdio.h> #define N 100 /*N表示最多允许的学生人数*/ struct Student {int num; //学号int c; // ...

  4. MySQL数据库期末项目 图书馆管理系统

    1 项目需求分析 1.1 项目名称 图书馆管理系统 1.2 项目功能 在以前大多部分图书馆都是由人工直接管理,其中每天的业务和操作流程非常繁琐复杂,纸质版的登记信息耗费了大量的人力物力.因此图书馆管理 ...

  5. 达内java2019项目_Java学员作品-达内图书馆管理系统

    一.项目介绍 图书馆管理系统要实现的是整个图书馆的集中管理.信息共享以及分散操作.这样才能使传统的图书馆管理向数字化.无纸化.智能化方面发展,从而更好地为图书馆工作人员以及读者服务.系统应该具有读者管 ...

  6. 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告

    湖北科技大学程序设计课程设计报告项目名称: 图书馆管理系统学生名称: 朱捷学生编号: 2014117241班级: 软工作者1411指导老师: 龚雄星日期: 2016.2.251项目描述设计图书管理系统 ...

  7. JavaSE必修项目——图书馆管理系统

    前言: 朋友们,经过了一段JavaSE知识的历练,终于来到了这个艰难的图书馆管理系统.对于刚学习的小白来说,是一次不错的项目体验,将理论和实践结合起来,会是一次巨大提升.接下来,就说说这个图书馆管理系 ...

  8. 图书馆管理系统项目思路

    在开始做这个项目之前,我们先不要急着去写它的代码,而是先把他的一个逻辑关系和思路理清楚 图表 1 从图表1可以看到整个图书馆管理系统分为四个模板,每个模板里面又有几个小部分(如果看不清可以把图片放大) ...

  9. c# winform 实践项目---人员管理系统

    根据讲师下发的实践项目需求,做了一个人员管理系统,其中用到知识颇多,思来想去决定发布上来,一是为自己以后的开发做一个参考,避免忘记.二是希望能得到互联网上各位大佬的评鉴. xx人员管理系统 xx人员管 ...

  10. python基础项目实践之: 学生通讯录管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

最新文章

  1. MyBatis一对多双向关联——MyBatis学习笔记之七
  2. 【Redis】缓存的三大问题及其解决方案
  3. 使Git与代理服务器一起使用-因“请求超时”而失败
  4. python运行的原理_Python运行机制(转)
  5. C++确定数字的奇偶校验的算法实现(附完整源码)
  6. 左值和左值引用、右值和右值引用
  7. 怎么退出自适应巡航_沃尔-ACC 自适应巡航控制系统
  8. OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子
  9. vs2008智能提示jQuery的设置注意事项
  10. java string 最大长度_我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?...
  11. 如何实现微信小程序API的Promise化
  12. Node.js及Express的下载、安装和配置教程
  13. 【运筹学】分支定界法 ( 分支定界法求整数规划示例 ) ★★
  14. Dell EMC Isilon命令行方式添加一个接口到pool
  15. 关于mis系统思维导图
  16. 嵌入式开发学习学习路线
  17. 共享单车物联网技术简析
  18. 如何在Windows下安装听云NodeJs探针
  19. Html 实现手风琴效果
  20. 【论文笔记】面向机载应用的多传感器图像融合技术综述

热门文章

  1. 什么是网络Bypass交换机?
  2. linux教程,linux视频教程,linux…
  3. 学会这些VRay渲染器HDRI照明技巧,轻松搞定3ds Max
  4. (超详细)Linux Shell 编程
  5. 使用SecureCRT下载服务器日志到本地windows
  6. c语言 万年历实验流程图,万年历算法(万年历算法流程图)
  7. java编写flash相册的制作软件,Flash电子相册制作工具(Amazing Flash Gallery Maker)
  8. Python金融数据挖掘 第11章 复习思考题2 (聚类)选取中华人民共和国第六次人口普查的各地区人口数以及男女比例进行K-Means聚类分析。
  9. 第 5-8 课:综合实战客户管理系统(⼆)
  10. 【NetBeans IDE 8.2链接MySQL数据库教程】