• Java实现图书管理系统


    作者:~小明学编程 

    文章专栏:JavaSE基础

    格言:目之所及皆为回忆,心之所想皆为过往
    在这里插入图片描述

    今天给大家带来的是用Java实现的图书管理系统。

    目录

    需求

    图书类

    创建图书类

    创建书架

    Operation

    IOperation接口

    添加图书AddOperation

    借阅图书BorrowOperation

    删除图书DelOperation

    打印图书DisplayOperation

    退出系统ExitOperation

    查询书籍FindOperation

    归还书籍ReturnOperation

    user

    User

    NormalUser

    AdminUser

    Main

    演示


    需求

    1 、简单的登录
    2 、管理端
    查阅书籍
    增加书籍
    删除书籍
    打印书籍列表
    退出
    3 、用户端
    查询书籍
    借阅书籍
    归还书籍
    退出

    图书类

    首先我们创建一个book包,在包里面放一个Book类和一个BookList类。

    然后创建一个operation里面放的是我们的各种操作方法。

    接着是我们的user类,里面分别放我们的管理员的类和普通成员的类。

    最后就是我们的Main类,我们的程序从这里开始执行。

    创建图书类

    首先我们需要创建一个图书类,该类里面是我们的图书属性例如书名,作者名,价格等等。

    1. public class Book {
    2. //书名
    3. private String name;
    4. //作者名
    5. private String author;
    6. //价格
    7. private int price;
    8. //书的类型
    9. private String type;
    10. //是否借出
    11. private boolean isBorrowed;
    12. public Book(String name, String author, int price, String type) {
    13. this.name = name;
    14. this.author = author;
    15. this.price = price;
    16. this.type = type;
    17. }
    18. public String getName() {
    19. return name;
    20. }
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. public String getAuthor() {
    25. return author;
    26. }
    27. public void setAuthor(String author) {
    28. this.author = author;
    29. }
    30. public int getPrice() {
    31. return price;
    32. }
    33. public void setPrice(int price) {
    34. this.price = price;
    35. }
    36. public String getType() {
    37. return type;
    38. }
    39. public void setType(String type) {
    40. this.type = type;
    41. }
    42. public boolean isBorrowed() {
    43. return isBorrowed;
    44. }
    45. public void setBorrowed(boolean borrowed) {
    46. isBorrowed = borrowed;
    47. }
    48. @Override
    49. public String toString() {
    50. return "Book{" +
    51. "name='" + name + '\'' +
    52. ", author='" + author + '\'' +
    53. ", price=" + price +
    54. ", type='" + type + '\'' +
    55. ((isBorrowed==true)?",已借出":",未借出") +
    56. '}';
    57. }
    58. }

    定义好我们的基本变量之后,然后给出set和get方法,方便之后对数据的修改,最后重写一下我们的toString()方法,便于直接打印。

    创建书架

    创建好我们书的类之后就是该创建书架了,所谓书架就是存放我们的书的,这里我们可以在里面给一个数组,用于存放不同的书。

    然后就是给出我们书的数量,这里我们定义一个userSize用来记录我们图书的数量。

    1. public class BookList {
    2. private Book[] books = new Book[10];
    3. private int userSize;
    4. public BookList() {
    5. books[0] = new Book("三体","刘慈欣",80,"科幻");
    6. books[1] = new Book("平凡的世界","路遥",88,"文学");
    7. books[2] = new Book("明朝那些事儿","当年明月",180,"历史");
    8. this.userSize = 3;
    9. }
    10. public int getUserSize() {
    11. return userSize;
    12. }
    13. public void setUserSize(int userSize) {
    14. this.userSize = userSize;
    15. }
    16. //获取到pos位置的书
    17. public Book getPos(int pos) {
    18. return this.books[pos];
    19. }
    20. //设置pos位置下标的一本书
    21. public void setBooks(int pos,Book book) {
    22. this.books[pos] = book;
    23. }
    24. }

    然后就是set和get方法用于我们对userSize的调整,同时我们给出了调整我们书架里面书的方法。

    这里我们给了一个构造方法,用于给我们的书架初始化放上三本书(小编我最爱看的对我影响最大的三本书哈哈),并且指定了书的个数userSize的大小为3。

    Operation

    该包里面装着我们的所有的对bookList的操作,还有一个接口IOperation,

    IOperation接口

    1. public interface IOperation {
    2. void work(BookList bookList);
    3. }

    添加图书AddOperation

    1. public class AddOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. Scanner scanner = new Scanner(System.in);
    4. System.out.println("添加图书操作");
    5. System.out.println("请输入书名:");
    6. String name = scanner.nextLine();
    7. System.out.println("请输入作者:");
    8. String Author = scanner.nextLine();
    9. System.out.println("请输入类型:");
    10. String type = scanner.nextLine();
    11. System.out.println("请输入价格:");
    12. int price = scanner.nextInt();
    13. Book book = new Book(name,Author,price,type);
    14. bookList.setBooks(bookList.getUserSize(),book);
    15. bookList.setUserSize(bookList.getUserSize()+1);
    16. }
    17. }

    借阅图书BorrowOperation

    1. public class BorrowOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("借书操作");
    4. Scanner scanner = new Scanner(System.in);
    5. System.out.println("请输入想要借阅的书:");
    6. String name = scanner.nextLine();
    7. for (int i = 0; i < bookList.getUserSize(); i++) {
    8. if (name.equals(bookList.getPos(i).getName())==true) {
    9. if(bookList.getPos(i).isBorrowed()==true) {//判断一下该书是否已经被借阅了
    10. System.out.println("该书已经被借阅");
    11. } else {
    12. bookList.getPos(i).setBorrowed(true);
    13. System.out.println("借阅成功!");
    14. }
    15. return;
    16. }
    17. }
    18. System.out.println("您想要借阅的书不存在");
    19. }
    20. }

    删除图书DelOperation

    1. public class DelOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("删除图书操作");
    4. Scanner scanner = new Scanner(System.in);
    5. System.out.println("输入想要删除图书的名称:");
    6. String name = scanner.nextLine();
    7. //循环遍历所有图书
    8. for (int i = 0; i < bookList.getUserSize(); i++) {
    9. //找到书名后进行删除
    10. if (name.equals(bookList.getPos(i).getName())==true) {
    11. for (int j = i; j < bookList.getUserSize()-1; j++) {
    12. bookList.setBooks(j,bookList.getPos(j+1));
    13. }
    14. bookList.setBooks(bookList.getUserSize(), null);//防止内存泄漏
    15. bookList.setUserSize(bookList.getUserSize()-1);
    16. System.out.println("删除完毕!");
    17. return;
    18. }
    19. }
    20. System.out.println("您要删除的图书不存在");
    21. }
    22. }

    打印图书DisplayOperation

    1. public class DisplayOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("打印图书操作");
    4. for (int i = 0; i < bookList.getUserSize(); i++) {
    5. System.out.println(bookList.getPos(i));
    6. }
    7. }
    8. }

    退出系统ExitOperation

    1. public class ExitOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("退出操作");
    4. System.exit(0);
    5. }
    6. }

    查询书籍FindOperation

    1. public class FindOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("查询操作");
    4. Scanner scanner = new Scanner(System.in);
    5. System.out.println("请输入查找的书名:");
    6. String name = scanner.nextLine();
    7. for (int i = 0; i < bookList.getUserSize(); i++) {
    8. if (name.equals(bookList.getPos(i).getName())==true) {
    9. System.out.println("信息如下");
    10. System.out.println(bookList.getPos(i));
    11. return;
    12. }
    13. }
    14. System.out.println("没有找到该书!");
    15. }
    16. }

    归还书籍ReturnOperation

    1. public class ReturnOperation implements IOperation {
    2. public void work(BookList bookList) {
    3. System.out.println("返回操作");
    4. Scanner scanner = new Scanner(System.in);
    5. System.out.println("请输入想要归还的书:");
    6. String name = scanner.nextLine();
    7. for (int i = 0; i < bookList.getUserSize(); i++) {
    8. if (name.equals(bookList.getPos(i).getName())==true) {
    9. if(bookList.getPos(i).isBorrowed()==false) {//判断一下该书是否已经被借阅了
    10. System.out.println("该书已经归还");
    11. } else {
    12. bookList.getPos(i).setBorrowed(false);
    13. System.out.println("归还成功!");
    14. }
    15. return;
    16. }
    17. }
    18. System.out.println("您想要归还的书不存在");
    19. }
    20. }

    以上就是我们对BookList的操作部分。

    user

    我们的user这个部分是我们的分部管理,因为我们登录的时候会提醒我们是普通用户登录还是管理员登录,所以我们至少需要创建两个类,但是这两个类肯定会有很多相似的方法和成员,所以这个时候我们就再创建一个User的抽象类,然后让我们AdminUser管理员的类和我们的NormalUser普通类分别继承我们的User

    User

    1. public abstract class User {
    2. protected String name; //用户姓名
    3. protected IOperation[] iOperation; //定义接口类型的数组每个元素指向实现接口的对象
    4. public User(String name) {
    5. this.name = name;
    6. }
    7. //此时的menu为后续的动态绑定做准备
    8. public abstract int menu();
    9. public void doWork(int choice, BookList bookList) {
    10. iOperation[choice].work(bookList);
    11. }
    12. }

    这里我们的抽象类有name成员,还有IOperation类型的数组,这里也解释了为什么我们刚刚要创建接口,因为有了接口我们后面可以向接口里面放我们的操作方法,因为其它的类都实现了我们的接口并且重写了接口里面的work()方法。

    NormalUser

    1. public class NormalUser extends User{
    2. public NormalUser(String name) {
    3. super(name);
    4. this.iOperation = new IOperation[]{
    5. new ExitOperation(),
    6. new FindOperation(),
    7. new BorrowOperation(),
    8. new ReturnOperation(),
    9. };
    10. }
    11. public int menu() {
    12. System.out.println("********管理员菜单********");
    13. System.out.println(" 欢迎"+this.name+"进入菜单");
    14. System.out.println("1.查找图书");
    15. System.out.println("2.借阅图书");
    16. System.out.println("3.归还图书");
    17. System.out.println("0.退出系统");
    18. System.out.println("************************");
    19. Scanner scanner = new Scanner(System.in);
    20. int choice = scanner.nextInt();
    21. return choice;
    22. }
    23. }

    这里首先是我们的构造方向,先帮父类构造,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,同时选择我们需要的操作。

    AdminUser

    1. public class AdminUser extends User{
    2. public AdminUser(String name) {
    3. super(name);
    4. this.iOperation = new IOperation[]{
    5. new ExitOperation(),
    6. new FindOperation(),
    7. new AddOperation(),
    8. new DelOperation(),
    9. new DisplayOperation(),
    10. };
    11. }
    12. public int menu() {
    13. System.out.println("********管理员菜单********");
    14. System.out.println(" 欢迎"+this.name+"进入菜单");
    15. System.out.println("1.查找图书");
    16. System.out.println("2.新增图书");
    17. System.out.println("3.删除图书");
    18. System.out.println("4.显示图书");
    19. System.out.println("0.退出系统");
    20. System.out.println("************************");
    21. Scanner scanner = new Scanner(System.in);
    22. int choice = scanner.nextInt();
    23. return choice;
    24. }
    25. }

    管理员类就是菜单里面的方法和IOperation数组与前面有一点区别。

    Main

    1. public class Main {
    2. public static User login() {
    3. System.out.println("请输入你的姓名:");
    4. Scanner scanner = new Scanner(System.in);
    5. String name = scanner.nextLine();
    6. System.out.println("请输入你的身份:1->管理员 0->普通用户");
    7. int choice = scanner.nextInt();
    8. //根据选择直接返回我们的对象。
    9. if (choice==1) {
    10. return new AdminUser(name);
    11. } else {
    12. return new NormalUser(name);
    13. }
    14. }
    15. public static void main(String[] args) {
    16. BookList bookList = new BookList();
    17. //发生向上转型
    18. User user = login();
    19. //此时将发生动态绑定
    20. while (true) {
    21. int choice = user.menu();
    22. user.doWork(choice, bookList);
    23. }
    24. }
    25. }

    首先看我们的主函数,我么new了一个BookList也就是我们的书架,然后开始登录操作输入身份之后最后返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作了。

    首先就是打印我们的菜单,顺便返回我们的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到我们IOperation找到对应的操作最后完成指定的功能。

    演示

  • 相关阅读:
    企业如何正确使用低代码转型升级
    推荐一个基于Python开源的文档系统
    【问题排查】linux不重启应用释放被删磁盘空间的技术方案
    【高德】改变地图的背景色为自定义样式
    使用马尔可夫链构建文本生成器
    8-汇编-寄存器(CPU工作原理)03
    XXE外部实体注入
    搜索问答技术学习:基于知识图谱+基于搜索和机器阅读理解(MRC)
    CodeSite for .NET实时本地和远程应用程序日志记录
    【操作系统】7/35进程原语2
  • 原文地址:https://blog.csdn.net/m0_56911284/article/details/127177051