冒着开除的风险,让我们解密图书管理之校长看完直夸好IO流下篇

helloworld_14431207
• 阅读 258

好买网(www.goodmai.com )IT技术交易平台

图书管理系统IO流版之下集

1.前言   鹏之徙于南冥也,水击三千里,抟扶摇而上者九万里,去以六月息者也。上一篇,我们冒着大不为,为大家分析了基本思想,对于继上一篇的学习,我们初步了解了学校图书馆管理系统的大概框架,相信大家对于这个项目也有了一定的想法,接下来跟进博主走进这背后的是与非吧,让我们来完善它,走进基层,看看校长凭什么夸你 ! 2.结构设计   相信大家在上一篇博客的最后,都有看见整个图书馆管理系统的模块展示吧,不了解的同学可自行翻阅上一篇博主的博客,至于博主为什么要那么设计呢?嗯,这是一个很清晰的问题,我们现在就来为大家解答,图书馆管理系统的艰辛之路! 设计思想   让我们一起来看看项目的分析,该项目也是以增、删、改、查为基础,相信大家都不陌生。与之前的项目一,团队调度有区别的就是:该项目的数据是通过IO流来保存的,这样的优势就是:我们保存的数据不会因为重启项目时被清除掉,一直都会在文件里存在。对于数据的保存的角度来看,是个较好的选择。为什么这样设计,而不是放在一个类里面,一个是为了方便展示,也是方便自己修改,提高可读性,所以采用这样一个架构,这也是养成一个好习惯的开始! 1.首先结合功能设计,设计6个实体类(存放在model类中)   图书实体:图书编号ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类型   图书类型:图书类型编号、图书类型名称   读者实体:读者编号、读者姓名、出生日期、性别、电话、所在院系、注册日期   读者类型:读者类型编号、读者类型名称、可借阅天数、可借阅数量   用户:用户编号、用户名、用户密码   借阅类型:读者编号、书籍编号、借阅日期、归还日期、罚金

2.然后根据操作设计,创建操作类(存放在dao类里)   图书信息操作:BookDao   图书类型操作:BookTypeDao   读者信息操作:ReaderDao   读者类型操作:ReaderTypeDao   用户管理操作:UserDao   借阅管理操作:BookBorrowDao

3.然后创建工具类util.ut,里面存放自定义的异常 BookException 和工具类 TSUtility和一些其他工具

4.接下来创建一个包存放我们进行读写的txt文件,以及相关的日志信息   5.最后创建我们的视图包view,里面存放了有关界面的类   图书操作界面类:BookView   读者操作界面类:ReaderView   用户操作界面类:UserView   主界面类:Menu

冒着开除的风险,让我们解密图书管理之校长看完直夸好IO流下篇

  之后创建运行代码就OK啦,整个项目的基本框架算是完成了,接下来就剩下具体一个一个板块来实现啦。

3.信息管理   根据前面需要的相关类,把类下的基本信息完善掉。

3.1用户信息管理   比如user里面就应该包含id,name,passwowrd,创建它的get,set方法   然后完成一个UserDao类,在里面把相关方法写进去   UserDao.:具体包括登录系统的时候,首先,我们进入到图书管理系统,进入的方式就是通过用户的账号和密码的输入匹配,判断账户密码是否有效;查询所有用户信息;添加用户;修改指定编号的用户的密码;删除指定编号的用户信息   在这里我创建了下面这些方法:

    public static Users check(String name, String password) throws IOException, ClassNotFoundException, InterruptedException {}
     //存入默认账号和密码(初始化)
    public static void initialization() throws IOException {}
     //查询所有信息
    public static List<Users> selectUser() throws IOException, ClassNotFoundException {}
     //添加用户信息
    public static int insertUser(String name, String password) throws IOException, ClassNotFoundException, BookException {}
     //修改用户信息
    public static int updateUserPWD(Integer id, String pwd) throws IOException, ClassNotFoundException, BookException, InterruptedException {}
     //删除用户信息
    public static int deleteUser(Integer id) throws IOException, ClassNotFoundException, BookException {}

接下来就是实现用户登录的 LoginView 类,去实现UserDao类的具体功能

    public static void loginFace() throws IOException, ClassNotFoundException, InterruptedException, BookException {}
    //登录界面存在账户密码
    public static void login1() throws IOException, ClassNotFoundException, EOFException, InterruptedException, BookException {}
     //用户管理界面
    public static void usersManagement() throws IOException, ClassNotFoundException, InterruptedException {}

特别注意   在这里设计该功能时,我们选择将数据保存在文件中,也就是用IO流来做。   确定了IO流,这时,我们可以选择对应的实现方式,(1)集合与IO流结合起来(2)用序列化和反序列化来写。   1.针对为了简化代码,对于读和写文件,我们可以采用方法的形式,下次就可以直接调用即可,避免了繁琐代码,这对于整个项目都可以采用的方法,   2.因为我们采用了对象序列化,就会使用Object对象,在这里就会产生一个新的情况,若文件内容为空,就会报 EOFException 异常,因此针对这个的解决办法就是:先用 try/catch 将该异常捕获并抛出,然后存入初始数据值,这样后面存入其他数据时就不会再报这个异常。   3.在实现序列化和反序列化时,我们序列化的类一定要实现Serializable接口,不然也会抛出异常!

3.2读者信息管理   读者首先需要的就是完善基本类,Reader包括读者编号、姓名、读者类别、性别、年龄、电话、所在部门、注册日期,然后创建构造方法,还有重写它的to String方法。 ReaderType类包括读者类型名称,可借阅天数,还有可借阅数量。   接下来就是ReaderDao:完成读者信息添加和读者信息查询与修改功能

    public static void printInfor(List<Reader> list){}
    //初始化
    public static void initialization() throws IOException, ClassNotFoundException {}
    //读者信息添加
    public static int insertReader(String id, List<ReaderType> list, String name, String age, String sex, String phone, String dept, String reg) throws BookException, IOException, ClassNotFoundException {}
    //查询读者信息
    public static List<Reader> selectReader() throws IOException, ClassNotFoundException {}

    public static List<Reader> selectReaderByName(String name) throws IOException, ClassNotFoundException, BookException {}

    public static List<Reader> selectReaderByType(String type) throws IOException, ClassNotFoundException, BookException {}

    public static List<Reader> selectReaderByDept(String dept) throws IOException, ClassNotFoundException, BookException {}
    //修改读者信息
    public static int updateReader(String id, String typename, String name, Integer age,String sex, String phone, String dept, String reg) throws IOException, ClassNotFoundException, BookException {}
    //删除读者信息
    public static int deleteReader(String id) throws IOException, ClassNotFoundException, BookException {}      

 然后是读者ReaderView类的设计,就是对读者信息的管理,实现界面化,连接上ReaderDao 里面包括了读者类型设置在这里我把罚金系统放在了这里。

设计思路:   (1)读者信息添加,根据输入的读者编号、姓名、类别、性别、年龄、电话、所在部门、注册日期,完成读者信息的录入。其中要求读者编号和姓名不能为空,读者编号长度为8。   (2)读者信息查询与修改,用户登录成功之后,可以查询全部读者信息,也可以分别根据读者编号、读者姓名、读者部门、读者类型查询读者信息。读者信息修改根据查询到的读者信息,可以修改各部分。   (3) 在这里如果文件没有内容,我们也需要先进行初始化的。

3.3图书信息管理   图书管理部分呢,其实它的设计和读者管理大致差不多,首先就是Book类,BookBorrow类,然后   BookDao:完成图书信息添加和图书信息查询与修改功能。

    public static void printInfor(List<Book> list){}
     //初始化
    public static void initialization() throws IOException, ClassNotFoundException {}
    //添加图书信息
    public static int insertBook(String ISBN, String bookname, String author, String publish, String publishdate, String  printtime, String price, BookType bt) throws IOException, ClassNotFoundException, BookException {}
    //查询所有图书信息
    public static List<Book> selectBook() throws IOException, ClassNotFoundException {}
    //根据其他信息查询图书信息
    public static List<Book> selectBookByISBN(String ISBN) throws IOException, ClassNotFoundException, BookException {}
public static List<Book> selectBookByName(String bookname) throws IOException, ClassNotFoundException, BookException {}
    public static List<Book> selectBookByType(String type) throws IOException, ClassNotFoundException, BookException {}
    public static List<Book> selectBookByAuthor(String author) throws IOException, ClassNotFoundException, BookException {}
    public static List<Book> selectBookByPublish(String Publish) throws IOException, ClassNotFoundException, BookException {}
    //修改图书信息
    public static int update(String ISBN, String bookname, String author, String publish, String publishdate, int printtime, double price, BookType bt) throws IOException, ClassNotFoundException, BookException {}
    //删除图书信息
    public static int delete(String ISBN) throws IOException, ClassNotFoundException, BookException {}

设计思路   (1)图书信息添加,根据录入的图书ISBN、类别、图书名称、作者、出版社、出版日期、印刷次数、单价完成图书信息添加。   (2)图书信息查询与修改,用户登录成功之后,可以浏览所有图书信息,也可以根据ISBN、图书名称、图书类别、作者、出版社检索特定图书的相关信息。图书信息修改根据查询到的读者信息,可以修改各部分。   BookBorrowDao包括图书借阅和图书归还功能

    public static void initialization() throws IOException, ParseException, BookException, ClassNotFoundException {}
    //查询指定编号读者的借书信息
    public static List<BorrowBook> selectBorrowByReaderId(String readerid) throws BookException, IOException, ClassNotFoundException {}
    //查看所有借阅信息
    public static void selectAllBorrow() throws IOException, ClassNotFoundException {}
    //图书借阅,(借阅者的编号,图书编号,借阅日期)
    public static int borrowBook(String readerid,String ISBN, String  borrowdate) throws IOException, ClassNotFoundException, BookException, ParseException {}
    //图书归还,(还书者的编号,图书编号,归还日期)
    public static int returnBook(String readerid,String ISBN,String returndate,List<BorrowBook> list) throws  IOException, ClassNotFoundException, ParseException, BookException {}

设计思路   (1)图书借阅,根据用户输入的读者编号,则显示出该读者的姓名、类别,及该读者的借阅情况。然后录入该读者的最新借阅的图书ISBN,显示出该图书的相关信息,确定借阅后,将该借阅信息录入(包括读者编号、图书ISBN,当前日期即借阅日期)。   (2)图书归还,图书归还功能,输入读者的编号,则显示出该读者名下已借阅的图书,选中要归还的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作,更新借阅信息表的归还日期为当前日期。

  然后BookView类就是对上面那个类进行结合实现界面的一个类,就不做展示啦。

4.基础信息维护   基础信息的维护这里就不作多的阐述,设计思想都是一致的,相比于信息管理,是较简单的。该模块下有,读者类别的设置,图书类别的设置,还有罚金的设置;读者类别,就是当我们再添加读者时,可以将读者类别当做读者类的一个属性添加进去。就比如说,我们当前添加的读者类型为学生,那么就在可以单独设置学生的可借阅图书的天数和图书的数量。同理,图书类别的设置,就可以把图书进行分类。罚金的设置:可以根据不同类型的读者,设置不同类型的罚金。

        public static void printInfor(List<ReaderType> list){}
        //初始化
        public static void initialization() throws IOException, ClassNotFoundException {}
        //查询全部读者类型信息
        public static List<ReaderType> selectReaderType() throws IOException, ClassNotFoundException {}
         //查询指定类型名的读者类型信息
        public static List<ReaderType> selectReaderType(String type) throws IOException, ClassNotFoundException, BookException {}
        //添加读者类型
        public static int insertReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}
        //修改读者类型
        public static int updateReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}
         //删除读者类型
        public static int deleteReaderType(Integer id) throws IOException, ClassNotFoundException, BookException {}

  该模块主要注意的就是: 在某个类型被使用的时候,我们就不能让该类型被修改和删除!(添加一个判断语句,利用循环遍历实现。)   在罚金设置这里:因为我们需要根据不同的类型来设置罚金,这里要注意的是,罚金的文件读写方式并不是用的对象序列化,所以,在这里我们用Properties通过键值对的形式,可以很好地将罚金设置出来。想要了解该类,可以参考博主之前的文件IO流Properties

冒着开除的风险,让我们解密图书管理之校长看完直夸好IO流下篇 4. 总结   该项目是我学Java以来自己制作的功能最为复杂,设计内容最丰富的项目,同时也是耗费我时间最久的项目,项目中还有很多地方的代码是可以继续优化的,而且还有很多可以增加用户体验的功能是可以再添加的。   整个项目的制作过程也是我查缺补漏的一个过程,将我之前学习的比较薄弱的部分给进行了增强,同时也将一些之前学的扎实的部分进行了加固。到此这篇关于Java实战之基于I/O流设计的图书馆管理系统的文章就介绍到这了。

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
2个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。 language JavaScript "name": "vuecliversion2", "version": "1.0.0", "desc
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Python进阶者 Python进阶者
1年前
有了它,全球网络摄像头一览无余
大家好,我是IT共享者,人称皮皮。 前言相信大家对于以前的网络摄像头泄露,各大宾馆开房视频频繁泄露,一定不会陌生了吧,当时,小编也在想,这些黑客是如何办到的了,本期小编就来为大家进行解密,揭开这层神秘的面纱。 一、网站获取 1.ZoomEy中文名叫钟馗之眼,是专门用来获取全球网络摄像头的网站解析库,界面很美而且简洁,如图:我们可以通过输入关键词来搜索相关联网
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
Karen110 Karen110
1年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:Thu Feb 02 2019 09:59:51 GMT+0800 (中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。 1\. 显示日期使用
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述 == 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
03.Android崩溃Crash库之ExceptionHandler分析
#### 目录总结 * 00.异常处理几个常用api * 01.UncaughtExceptionHandler * 02.Java线程处理异常分析 * 03.Android中线程处理异常分析 * 04.为何使用setDefaultUncaughtExceptionHandler ### 前沿 * 上一篇整体介绍了crash崩溃
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表: **时辰** **时间** **24时制** 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00 丑时 上午 01:00 - 上午 03:00 01:00 - 03 :00 寅时 上午 03:00 - 上午 0
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为