⛳️ 项目需求
为某图书馆开发一个迷你图书管理系统,实现图书的管理,包括如下功能:
(1)新增图书
(2)查看图书
(3)删除图书
(4)借出图书
(5)归还图书
(6)退出图书系统
⛳️ 覆盖知识
程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、集合、输入输出流等相关知识
⛳️ 开发思路
(1)明确需求
(2)编码顺序
1)、数据初始化
2)、循环完成各种图书管理操作
3)、菜单切换
(3)测试
⛳️ 开发步骤
❤️ 1、数据初始化
(1)设计一个包含图书信息的类:Book类
(2)设计一个图书信息操作的方法类:BookMethod类
(3)设计一个图书管理系统测试类:MyBookSystem类
(4)在MyBookSystem类中初始化对象数组和相关数据,然后添加到Book集合中,最后用序列化和反序列化知识,将集合写入IO流中。
// 初始化Book集合 List<Book> books=new ArrayList<Book>(); // 初始化数据并添加到集合 Book book1=new Book("罗马假日", 1, 1, 15); Book book2=new Book("白雪公主", 0, 0, 12); Book book3=new Book("葫芦兄弟", 0, 0, 30); books.add(book1); books.add(book2); books.add(book3); BookMethod.writeBook(books);
❤️ 2、BookMethod类中定义各种方法
定义方法实现向books.txt文件中写入信息 // 定义方法实现向books.txt文件中写入信息 public static void writeBook(List<Book> books) { ObjectOutputStream oosOrder = null; try { oosOrder = new ObjectOutputStream(new FileOutputStream("books.txt")); oosOrder.writeObject(books); } catch (FileNotFoundException e) { } catch (IOException e) { e.printStackTrace(); } finally { try { if (oosOrder != null) { oosOrder.close(); } } catch (IOException e) { e.printStackTrace(); } } } 定义方法实现从books.txt文件中读取信息 // 定义方法实现从books.txt文件中读取信息 @SuppressWarnings("resource") public static List<Book> readBook() { // 创建输入流 ObjectInputStream oisOrder = null; try { oisOrder = new ObjectInputStream(new FileInputStream("books.txt")); Object object = oisOrder.readObject(); @SuppressWarnings("unchecked") ArrayList<Book> al = (ArrayList<Book>) object; return al; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } 欢迎使用迷你图书管理器方法 新增图书方法 查看图书方法 删除图书方法 借出图书方法 归还图书方法 退出图书方法 例子: //欢迎使用迷你图书管理器方法 public static void useBookSystem() { // 输出欢迎菜单 System.out.println("欢迎使用迷你图书管理器"); System.out.println("-------------------------"); System.out.println("1.新增图书"); System.out.println("2.查看图书"); System.out.println("3.删除图书"); System.out.println("4.借出图书"); System.out.println("5.归还图书"); System.out.println("6.退出图书"); System.out.println("-------------------------"); }
⛳️ 代码展示
❤️ 1、Book类
package cn.bdqn.demo01; import java.io.Serializable; @SuppressWarnings("serial") public class Book implements Serializable { //定义属性 private String name; private int state; private int date; private int count; //添加无参构造 public Book() { super(); } //添加有参构造 public Book(String name, int state, int date, int count) { super(); this.name = name; this.state = state; this.date = date; this.count = count; } //添加get/set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getState() { return state; } public void setState(int state) { this.state = state; } public int getDate() { return date; } public void setDate(int date) { this.date = date; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
❤️ 2、BookMethod类
package cn.bdqn.demo01; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class BookMethod { // 定义一个静态的Scanner static Scanner inputsc = new Scanner(System.in); // static String bookName; // 欢迎使用迷你图书管理器方法 public static void useBookSystem() { // 输出欢迎菜单 System.out.println("欢迎使用迷你图书管理器"); System.out.println("-------------------------"); System.out.println("1.新增图书"); System.out.println("2.查看图书"); System.out.println("3.删除图书"); System.out.println("4.借出图书"); System.out.println("5.归还图书"); System.out.println("6.退出图书"); System.out.println("-------------------------"); } // 定义方法实现向books.txt文件中写入信息 public static void writeBook(List<Book> books) { ObjectOutputStream oosOrder = null; try { oosOrder = new ObjectOutputStream(new FileOutputStream("books.txt")); oosOrder.writeObject(books); } catch (FileNotFoundException e) { } catch (IOException e) { e.printStackTrace(); } finally { try { if (oosOrder != null) { oosOrder.close(); } } catch (IOException e) { e.printStackTrace(); } } } // 定义方法实现从books.txt文件中读取信息 @SuppressWarnings("resource") public static List<Book> readBook() { // 创建输入流 ObjectInputStream oisOrder = null; try { oisOrder = new ObjectInputStream(new FileInputStream("books.txt")); Object object = oisOrder.readObject(); @SuppressWarnings("unchecked") ArrayList<Book> al = (ArrayList<Book>) object; return al; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } //比较两个集合是否相等 // public static boolean compareByFor(List<Book> list,List list2){ // boolean flag = false; // if (list.size()==list2.size()){ // for (Book str :list){ // if (!list2.contains(str)){ // System.out.println(flag); // return false; // } // } // flag = true; // } // return flag; // } // 新增图书方法 public static void addBook() { List<Book> books=readBook(); System.out.println("-->新增图书\n"); System.out.println("请输入图书名称:"); String bookName = inputsc.next(); // System.out.println(bookName); Book book = new Book(bookName, 0, 0, 0); books.add(book); writeBook(books); System.out.println("新增《" + bookName + "》成功!"); System.out.println("*****************************************"); } // 查看图书方法 public static void lookBook() { List<Book> books=readBook(); System.out.println("-->查看图书\n"); System.out.println("序号\t状态\t名称\t借出日期\t借出次数"); for (int i = 0; i < books.size(); i++) { String BookState = (books.get(i).getState() == 0) ? "可借阅" : "已借出"; String dateStr = (books.get(i).getDate() == 0) ? "" : (books.get(i) .getDate() + "日"); System.out.println((i + 1) + "\t" + BookState + "\t" + books.get(i).getName() + "\t" + dateStr + "\t" + books.get(i).getCount() + "次"); } System.out.println("*****************************************"); } // 删除图书方法 public static void delBook() { List<Book> books=readBook(); System.out.println("-->删除图书\n"); System.out.println("请输入要删除图书的名称:"); String delete = inputsc.next(); boolean flag3 = false; int index = -1; // 记录要删除图书的位置 for (int i = 0; i < books.size(); i++) { // 删除的图书存在、状态处于可借阅状态 if (books.get(i).getName() != null && delete.equals(books.get(i).getName()) && books.get(i).getState() == 0) { flag3 = true; books.remove(i); writeBook(books); System.out.println("图书删除成功!"); break; } else if (books.get(i).getName() != null && delete.equals(books.get(i).getName()) && books.get(i).getState() == 1) { flag3 = true; System.out.println("该图书已被借出,目前无法删除!"); break; } } if (!flag3) { System.out.println("没有找到匹配信息!"); } System.out.println("*****************************************"); } // 借出图书方法 public static void lendBook() { List<Book> books=readBook(); System.out.println("-->借出图书\n"); System.out.print("请输入图书名称:"); String want = inputsc.next(); // 要借出的图书名称 if (books.size() == 0) { System.out.println("没有找到匹配信息!"); } else { for (int i = 0; i < books.size(); i++) { if (want.equals(books.get(i).getName()) && books.get(i).getState() == 0) { // 找到匹配可借 books.get(i).setState(1); // 将此图书置于借出状态 System.out.print("请输入借出日期:"); int inputscData = inputsc.nextInt(); books.get(i).setDate(inputscData); while (books.get(i).getDate() < 1 || books.get(i).getDate() > 31) { // 当输入借出的日期不满足1-31时 System.out.println("必须输入大于等于1且小于等于31的数字,请重新输入:"); inputscData = inputsc.nextInt(); books.get(i).setDate(inputscData); } System.out.println("借出《" + want + "》成功!"); books.get(i).setCount(books.get(i).getCount() + 1); writeBook(books); break; } else if (want.equals(books.get(i).getName()) && books.get(i).getState() == 1) { // 找到匹配已被借出 System.out.println("《" + want + "》已被借出!"); break; } } } System.out.println("*****************************************"); } // 归还图书方法 public static void returnBook() { List<Book> books=readBook(); System.out.println("-->归还图书\n"); int charge = 0; // 租金 System.out.print("请输入归还图书名称:"); String want = inputsc.next(); if (books.size() == 0) { System.out.println("没有找到匹配信息!"); } else { for (int i = 0; i < books.size(); i++) { if (want.equals(books.get(i).getName()) && books.get(i).getDate() == 1) {// 找到匹配 books.get(i).setDate(0); // 将借阅状态修改为可借阅 System.out.print("请输入归还日期:"); int redate = inputsc.nextInt(); while (redate < books.get(i).getDate() || redate > 31) { // 归还日期不能小于借出日期,也不能大于31 if (redate < books.get(i).getDate()) { System.out.println("归还日期不能小于借出日期,请重新输入:"); } else { System.out.println("一个月只有31天,请重新输入:"); } redate = inputsc.nextInt(); } charge = redate - books.get(i).getDate(); System.out.println("\n归还《" + want + "》成功!"); System.out.println("借出日期为:" + books.get(i).getDate() + "日"); System.out.println("归还日期为:" + redate + "日"); System.out.println("应付租金(元):" + charge); books.get(i).setDate(0); writeBook(books); break; } else if (want.equals(books.get(i).getName()) && books.get(i).getState() == 0) {// 找到匹配但没有借出 System.out.println("该图书没有被借出!无法进行归还操作。"); break; } } } System.out.println("*****************************************"); } }
❤️ 3、 MyBookSystem
package cn.bdqn.demo01; import java.util.*; /** * 图书管理系统类MyBookMgr * * @author Administrator * */ public class MyBookSystem { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 是否退出系统,false代表退出系统 boolean flag = true; // 初始化Book集合 List<Book> books=new ArrayList<Book>(); // 初始化数据并添加到集合 Book book1=new Book("罗马假日", 1, 1, 15); Book book2=new Book("白雪公主", 0, 0, 12); Book book3=new Book("葫芦兄弟", 0, 0, 30); books.add(book1); books.add(book2); books.add(book3); BookMethod.writeBook(books); int num = -1; // 循环操作 do { // 定义一个BookMethod操作类,将操作方法定义在BookMethod类中,然后调用 // 欢迎菜单方法 BookMethod.useBookSystem(); System.out.println("请选择:"); int choose = input.nextInt(); switch (choose) { case 1: // 新增图书 BookMethod.addBook(); break; case 2: // 查看图书 BookMethod.lookBook(); break; case 3: // 删除图书 BookMethod.delBook(); break; case 4: // 借出图书 BookMethod.lendBook(); break; case 5: // 归还图书 BookMethod.returnBook(); break; case 6: // 退出图书 flag = false; break; default: flag = false; break; } if (flag) { System.out.println("输入0返回:"); num = input.nextInt(); } else { break; } } while (num == 0); System.out.println("谢谢使用!"); input.close(); } }