这篇文章主要介绍JAVA图书管理系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
本系统功能分为读者信息管理模块、图书信息管理模块、图书借阅管理模块、基础信息维护模块和用户管理模块。
读者信息管理:能够对读者的基本信息进行管理,包括新增读者,如学校新来一名教师,想要借书,就必须先添加读者信息;读者信息的修改,如学生转到别的专业,此时要修改学生的基本信息;删除读者的信息,比如某个学生中途退学了,可以将其信息删除。查询读者的信息,比如有同学拾到了一张借阅卡,卡上有学生的编号,通过此号来查询学生的联系电话,从而可以找到学生。
图书信息管理:能够对图书的基本信息进行管理,包括新增图书,学校每年会购进新书,此时需要将新书的信息录入系统中;图书信息的修改,如学生借书后将图书丢失,此时需要修改图书的总数量,使总数减1;删除图书,学校在购进新书的同时,每年会对过期的图书进行清理,不再提供借阅,此时就需要将这些图书的信息从系统中删除。查询图书的信息,比如要查看有哪些是Java相关的书籍或者指定ISBN号的图书等。
图书借阅信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、借阅时间等信息。
图书归还信息管理:能够对图书的借阅信息进行记录,包括读者信息、图书信息、归还时间、是否超期、罚金等信息。
系统用户信息管理:能够对系统用户的信息进行管理,包括增加新的系统操作用户,对当前系统用户的密码进行修改,以及删除某一用户。
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)用户管理:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
让我们一起来看看项目的分析,该项目也是以增、删、改、查为基础,相信大家都不陌生。
与之前的项目一,团队调度有区别的就是:该项目的数据是通过IO流来保存的,这样的优势就是:
我们保存的数据不会因为重启项目时被清除掉,一直都会在文件里存在。对于数据的保存的角度来看,是个较好的选择。
通过需求:
我们可以将这些模块的实现划分为三个类包和一个数据包:(博主写得是):
三个包分别为:界面展示包(里面放的全是展示类);功能实现包(放的各个功能的实现类);
实体类包(放各个需要用到的实体类);数据包(存放各种用到的数据);
首先,我们进入到图书管理系统,进入的方式就是通过用户的账号和密码的输入匹配。
用户登录:
设计该功能时,我们选择将数据保存在文件中,也就是用IO流来做。
确定了IO流,这时,我们可以选择对应的实现方式,(1)Properties与IO流结合起来,设置值就是根据键获取值。(2)用序列化和反序列化来写。
这里,博主选择了用Properties来写。通过设置键值对,键代表账户,值代表密码。而且在文件中可以直接直观地读取数据。
其次就是用户数据的增删改查。
因为会用到IO流,在实现文件数据读写操作是需要抛出异常的。可以通过快捷键:
Alt+Enter来快速实现。
注意事项:
在存储和修改数据时我们都需要先将之前的数据读取到Properties集合中,然后再将新的数据写入
文件里。这样可以防止每次写数据的时候,不小心将之前想要保留的数据覆盖掉了。
还有一点就是:在用户登录成功,并执行删除用户数据的功能时,我们不能把当前的用户数据删掉。这里只需要加一个判断语句就可以了。
到这里,用户管理模块基本就完成了。
该模块下有,读者类别的设置,图书类别的设置,还有罚金的设置;
读者类别,就是当我们再添加读者时,可以将读者类别当做读者类的一个属性添加进去。
就比如说,我们当前添加的读者类型为学生,那么就在可以单独设置学生的可借阅图书的天数和图书的数量。
同理,图书类别的设置,就可以把图书进行分类。
罚金的设置:可以根据不同类型的读者,设置不同类型的罚金。
部分代码展示(读者类型的设置):
public class ReaderTypeServe { static String typeid,typename,limit,maxborrownum; //添加读者类型 public static void addReaderType() throws IOException, ClassNotFoundException { boolean flog=true; System.out.println(" ??? 欢迎来到读者类别添加界面 ??? "); //读取文件中的数据,存入集合。 TSUtility.readReaderType(); ArrayList<ReaderType> array=TSUtility.readerTypesArray; System.out.println(); /* if (array.size()==0){ System.out.println("没有检测到读者类型信息..."); }*/ while (true){ try { System.out.println("请添加读者唯一的的类型号:(正数)"); typeid=TSUtility.readKeyBoard(3,false); if (Integer.parseInt(typeid)>=0){ break; }else { System.out.println("格式不对,请检后输入:"); } }catch (NumberFormatException e){ System.out.println("请输入相应的整数..."); } } for (ReaderType reader : array) { if (typeid.equals(reader.getTypeid())) { System.out.println("该id已被使用,自动返回上一界面!"); flog=false; break; } } if (flog){ System.out.println("请输入读者类型名称:"); typename =TSUtility.readKeyBoard(4,false); for (ReaderType reader : array) { if (typename.equals(reader.getTypename())) { System.out.println("该类型已被使用,自动返回上一界面!"); flog=false; break; } } } if (flog){ while (true){ try { System.out.println("请设置可借阅天数:(正数,且不能超过100天)"); limit =TSUtility.readKeyBoard(2,false); if (Integer.parseInt(limit)>=0&&Integer.parseInt(typeid)<=100){ break; }else { System.out.println("未按规定格式,请检查后输入..."); } }catch (NumberFormatException e){ System.out.println("请输入相应的整数..."); } } while (true){ try { System.out.println("请设置可借阅数量:(正数,且不能超过30本)"); maxborrownum =TSUtility.readKeyBoard(4,false); if (Integer.parseInt(limit)>=0&&Integer.parseInt(typeid)<=30){ break; }else { System.out.println("未按规定格式,请检查后输入..."); } }catch (NumberFormatException e){ System.out.println("请输入相应的整数..."); } } //创建对象 ReaderType reader=new ReaderType(typeid,typename,limit,maxborrownum); TSUtility.writeReaderType(reader); System.out.println("添加成功!"); } } //删除读者类型 public static void deleteReaderType()throws IOException, ClassNotFoundException { System.out.println(); showAllReaderType(); ArrayList<ReaderType> array=TSUtility.readerTypesArray; if (array.size()!=0){ //读取文件中的数据,存入集合。读者 TSUtility.readReaderPath(); ArrayList<Reader> readerArray=TSUtility.readerArray; // System.out.println("请选择您想要删除读者类型的编号(回车跳过该选项..):"); String id =TSUtility.readString(10,"false"); if (!(id.equals("false"))){ for (int i=0;i<array.size();i++){ if (array.get(i).getTypeid().equals(id)){ int i1=0; for (Reader reader : readerArray){ i1++; if (reader.getReaderType().getTypename().equals(array.get(i).getTypename())){ System.out.println("该读者类型已经被使用,不能被删除!"); break; }else { if (i1==readerArray.size()){ TSUtility.readerTypesArray.remove(i); System.out.println("删除成功!"); break; } } } }else { if (i==array.size()){ System.out.println("编号不存在,请重新输入..."); } } } } //刷新 flush(); } } //修改读者类型 public static void modifyReaderType()throws IOException, ClassNotFoundException { TSUtility.readReaderType(); ArrayList<ReaderType> array=TSUtility.readerTypesArray; if (array.size()!=0){ System.out.println(); System.out.println(" ? 读者类型修改界面 ? "); showAllReaderType(); boolean flog=true; while (flog){ System.out.println("请选择您想要修改读者类型的编号(回车跳过...):"); String id =TSUtility.readString(5,"false"); if (!(id.equals("false"))){ //读取文件中的数据,存入集合。读者 TSUtility.readReaderPath(); ArrayList<Reader> readerArray=TSUtility.readerArray; // boolean flogs=true; for (int i=0;i<array.size();i++){ if (array.get(i).getTypeid().equals(id)){ String typeName = array.get(i).getTypename(); for (Reader reader : readerArray) { if (reader.getReaderType().getTypename().equals(typeName)) { System.out.println("该读者类型已经被使用,不能修改!"); flogs=false; /*flog=false;*/ break; } } if (flogs){ System.out.println(" ? 修改读者类型名称("+array.get(i).getTypename()+"):(回车跳过该选项..) "); String name=TSUtility.readString(10,array.get(i).getTypename()); TSUtility.readerTypesArray.get(i).setTypename(name); while (true){ System.out.println(" ? 修改读者可借阅天数(正数)("+array.get(i).getLimit()+"):(回车跳过该选项..) "); try { String limit=TSUtility.readString(5,array.get(i).getLimit()); if (Integer.parseInt(id)>=0){ TSUtility.readerTypesArray.get(i).setLimit(limit); break; }else { System.out.println("格式不对,请检后输入:"); } }catch (NumberFormatException e){ System.out.println("请输入相应的整数..."); } } while (true){ try { System.out.println(" ? 修改读者可借阅数量("+array.get(i).getMaxborrownum()+"):(回车跳过该选项..) "); String maxborrownum=TSUtility.readString(5,array.get(i).getMaxborrownum()); if (Integer.parseInt(id)>=0){ TSUtility.readerTypesArray.get(i).setMaxborrownum(maxborrownum); break; }else { System.out.println("格式不对,请检后输入:"); } }catch (NumberFormatException e){ System.out.println("请输入相应的整数..."); } } //刷新 flush(); System.out.println("修改成功!"); flog=false; break; }else { if (i==array.size()){ System.out.println("该编号不存在,请检查后输入..."); } } } } }else { flog=false; System.out.println("已取消修改..."); } } }else { System.out.println("还没有读者类型信息..."); } } //查询所有读者类型信息 public static void showAllReaderType() throws IOException, ClassNotFoundException { //展示读者信息 //读取文件中的数据,存入集合。 TSUtility.readReaderType(); ArrayList<ReaderType> array =TSUtility.readerTypesArray; if (array.size()!=0){ System.out.println("编号 "+" 类型名称 "+" 可借阅天数 "+" 可借阅数量 "); for (int i = 0; i <array.size() ; i++) { System.out.println(array.get(i).getTypeid()+"\t "+array.get(i).getTypename()+"\t\t"+array.get(i).getLimit()+"\t\t"+array.get(i).getMaxborrownum() ); } /*System.out.println("读者类型展示完成!");*/ System.out.println(); }else { System.out.println("目前还没有读者类型信息"); } } //将集合重新序列化到文件,实现相应功能后刷新的功能 public static void flush() throws IOException { //对象序列化 ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(TSUtility.pathRederType)); //序列化对象的方法 void writeObject(Object obj) oos.writeObject(TSUtility.readerTypesArray); //释放资源 oos.close(); } }
该模块主要注意的就是: 在某个类型被使用的时候,我们就不能让该类型被修改和删除!(添加一个判断语句,利用循环遍历实现。)
在罚金设置这里:因为我们需要根据不同的类型来设置罚金,所以,在这里我们用Properties通过键值对的形式,可以很好地将罚金设置出来。
在我们设置该模块时,我们先明确,我们需要通过类的对象来实现这些功能,所以,我们这里首选序列化来写。然后就是该模块的基本功能,增、删、改、查。
注意事项:
在实现序列化和反序列化时,我们序列化的类一定要实现Serializable接口,不然会抛出异常!
在数据存储方面:一旦我们需要添加、修改或者删除数据时,我们都需要刷新数据(也就是说,我们都需要先将数据从文件里读取出来,操作完成后,我们再将数据写入回文件)。
这里,我们可以先建立相应的集合,用于存储反序列化出来的对象,这样,我们就只需要对该集合进行相应的操作,然后序列化该存储对象的集合就可以了。
以上是“JAVA图书管理系统的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。