目录
项目需求介绍
长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
项目结构图
项目功能概况介绍
读者信息管理:
读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。
图书信息管理:
图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。
图书借阅管理:
图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限制。
基础信息维护:
图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。
用户管理:
包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。
项目分析
在上述功能实现中,运用了IO流存储的方式,
由于IO流功能在使用中,一开始不可读取空文件,需要判断,在借阅图书,归还图书时,注意读者的可借阅天数更新。
代码上传样例
主页面菜单,根据主页面进入各个功能区
基本信息维护:
具体的增删改查(其他功能模块也是同理——一个原则:当你使用序列化,反序列化,判断文件是否为空时,把它们建立一个方法,调用时比较放):
//增
public static void bookCategoryIncrease() throws IOException, ClassNotFoundException {
if (judgedToBeEmpty()) {
//文件已经有图书类型,先序列化,再反序列化
//--------------------------------
//序列化
List<BookType> list = BookTypeDao.serialization();
System.out.println("输入你要添加的图书类型名称");
String readerTypeName = TSUtility.readKeyBoard(8, false);
list.add(new BookType(list.size() + 1, readerTypeName));
//反序列化
deserialization(list);
System.out.println("添加图书类型成功");
} else {
//文件为空直接反序列化
//------------------------
List<BookType> list = new ArrayList<>();
System.out.println("输入你要添加的图书类型名称");
String readerTypeName = TSUtility.readKeyBoard(8, false);
list.add(new BookType(list.size() + 1, readerTypeName));
//反序列化
deserialization(list);
System.out.println("添加图书类型成功");
}
}
//删
public static void bookCategoryDelete() throws IOException, ClassNotFoundException {
if (judgedToBeEmpty()) {
bookCategoryView();
System.out.println("输入你要删除的图书类型的编号");
List<BookType> list = serialization();
int i = TSUtility.readInt();
//1 2 3 4
//0 1 2 3
if (i >= 1 && i <= list.size() + 1) {
list.remove(i - 1);
deserialization(list);
System.out.println("删除成功");
} else {
System.out.println("输入有误");
}
} else {
System.out.println("暂无图书类型,请添加");
}
}
//改
public static void bookCategoryModification() throws IOException, ClassNotFoundException {
if (judgedToBeEmpty()) {
//目前拥有的图书类型
bookCategoryView();
System.out.println("输入你要修改的图书类型的编号");
List<BookType> list = serialization();
int i = TSUtility.readInt();
//1 2 3 4
//0 1 2 3
int index = 0;
if (i >= 1 && i <= list.size()) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getTypeId() == i) {
index = i - 1;
BookType r = new BookType();
r = list.get(index);
System.out.println("输入你要修改的图书类型" + r.getTypeName());
String readerTypeName = TSUtility.readString(8, r.getTypeName());
r.setTypeName(readerTypeName);
list.set(index, r);
deserialization(list);
System.out.println("修改成功");
}
}
} else {
System.out.println("输入有误");
}
} else {
System.out.println("暂无图书类型,请添加");
}
}
//查
public static void bookCategoryView() throws IOException, ClassNotFoundException {
if (judgedToBeEmpty()) {
System.out.println("-----------------------");
System.out.println("目前所拥有的图书类型");
List<BookType> list = serialization();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-----------------------");
} else {
System.out.println("暂无图书类型,请添加");
}
}
//序列化
public static List<BookType> serialization() throws IOException, ClassNotFoundException {
String txt = "bookType.txt";
List<BookType> list = new ArrayList<>();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(txt));
Object obj = ois.readObject();
list.addAll((ArrayList<BookType>) obj);
ois.close();
return list;
}
//反序列化
public static void deserialization(List list) throws IOException {
String txt = "bookType.txt";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(txt));
oos.writeObject(list);
oos.close();
}
//判断是否为空
public static boolean judgedToBeEmpty() throws IOException {
String txt = "bookType.txt";
FileInputStream fi = new FileInputStream(txt);
int read = fi.read();
Scanner sc = new Scanner(System.in);
if (fi.read() == -1) {
return false;
//无书籍类型
} else {
return true;
//有书籍类型
}
}
图书借阅重难点:
在图书归还功能时,注意罚金的设置,为了完善功能的延展性,建议各个读者的罚金不同,在罚金判断一个日期的方法,文中利用的是LocalDate的方法(也可利用Date,Calendar等方法)
总结
在本次项目实践中,充分的利用了IO流序列化,反序列化(文件的保存性),熟悉运用其IO流的特点,多次利用增删改查(这些功能中,需要注意索引与编号的对应,极易出现索引越界或者不对应等问题),多建立方法,调用方法,使的代码的可变性,简洁性增加。