Bootstrap

java基础项目:图书管理系统(详解)

java基础学习后适合写的测试语法和代码熟练度的小项目(学校学java,总得练一练的)

架构 / 流程

架构

图书管理系统一共包含了以下部分:

  1. 实体类: 主要包括 图书类(Book)图书列表类(BookList) 。其中,Book 包含了书名、作者和价格等属性;而 BookList 则封装了一个数组,用于存储多个 Book 对象。
  2. 操作接口:主要包括图书管理系统中各种操作的接口 (IOperation) ,如查找图书、借出图书、归还图书等。这个接口定义了一个 work() 方法,来执行对应的操作。
  3. 操作实现类: 主要包括了上述操作接口的实现类,下文会进行列举。这些实现类都实现了 IOperation 接口,并重写了 work() 方法,以实现对应的图书管理操作。
  4. 用户类: 主要包括一个 抽象类 User 类(以及AdminUser, NormalUser) ,用于模拟用户在图书管理系统中进行的各种操作。该类包括了一个 iOperation 数组,用于存储不同的操作接口实现类。
  5. 程序入口类: 主要包括了一个 Main 类,作为整个程序的入口。该类主要包括一个菜单方法,用于显示可选的操作列表,并提供了一个样例的用户界面,让用户可以通过输入数字选择不同的操作。

流程

流程如下:

  1. 当用户启动图书管理系统时,系统显示一个菜单,让用户选择对应的操作。
  2. 用户输入对应的数字,选择要执行的操作。
  3. 系统根据用户输入的数字,调用相应的操作接口实现类的 work() 方法,执行对应的图书管理操作。
  4. 操作结束后,系统重新显示菜单,等待用户继续输入操作选项。
  5. 如果用户选择退出系统,程序结束执行。

具体内容

在这里插入图片描述
如图所示,我们在src下建立三个包,分别为

  1. 实体类books 存放图书类Book / 图书列表类BookList
  2. 操作类:
  • AddOperation: 新增图书
  • BorrowOperation:借阅图书
  • DelOperation:删除图书
  • DisplayOperation:显示图书
  • ExitOperation:退出系统
  • FindOperation:查找图书
  • IOperation:操作接口
  • ReturnOperation:归还图书
  1. 用户类:
  • AdminUser:管理员用户
  • NormalUser:普通用户
  • User:用户类
  1. 入口类:Main

代码实现

books

Book(图书类)

图书类没有复杂的函数实现,主要有以下内容

  1. 图书基本信息(成员变量)
  2. 构造函数
  3. getter && setter 相应的图书信息
  4. tostring函数用于返回输出图书信息

代码中有相应注释,不再过多赘述

package books;

public class Book {
    // 图书的信息
    private String name;    // 书名
    private String author;  // 作者
    private int price;  // 价格
    private String type;    // 类型
    private boolean IsBorrowed; // 是否被借阅

    // 构造函数
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        //IsBorrowed = isBorrowed;
    }

    // getter && setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return IsBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        IsBorrowed = borrowed;
    }

    // 调用时将返回图书信息(字符串形式)
    public String toString(){
        return "Book{"
                +"name="+getName()+", "
                +"author="+getAuthor()+", "
                +"price="+getPrice()+", "
                +"type="+getType()+", "
                +"isborrowed="+isBorrowed()
                +"}";
    }
}

BookList(图书列表类)

BookList包含一个Book类型的数组用于存放book图书一些操作函数

具体在代码中注释写道

package books;

public class BookList {
    public Book[] books = new Book[10]; // 图书类数组
    public int usedSize;//存储当前书的个数

    // 无参构造:初始化Booklist
    // 存三本书
    public BookList(){
        books[0] = new Book("三国演义","罗贯中",68,"小说");
        books[1] = new Book("水浒传","施耐庵",68,"小说");
        books[2] = new Book("西游记","吴承恩",67,"小说");

        this.usedSize = 3;
    }

    // 获取当前存储的书的个数
    public int getUsedSize() {
        return usedSize;
    }

    //有效书的数量
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    // 返回book类数组的相应下标
    // 用于通过位置查找图书
    public Book getPos(int pos){
        return books[pos];
    }

    // 特定位置设置图书对象
    public void setBooks(Book book,int pos){
        books[pos] = book;
    }
}

user

User(用户抽象类)

  1. User为一个抽象类,主要用于声明两种用户都会执行的操作
  2. 其中需要注意的内容有:
  • menu方法(打印菜单:不同类型用户的操作不一样,所以菜单不一样)
  • IOperation类数组,用于存放用户可以执行的全部操作,通过输入chioce执行队形的操作
package user;

import books.BookList;
import operations.IOperation;

public abstract class User {
    protected String name;  // 成员变量:姓名
    protected IOperation iOperation[]; // iOperation类数组 - 用于存放可执行的操作
    public User(String name){
        this.name = name;
    }   // 构造函数

    public abstract int menu(); // 菜单:管理员用户和普通用户的操作不同

    // 执行操作
    // iOperation在后文
    // iOperation[] 存放不同用户可以执行的操作
    // 通过输入chioce来执行相应的操作
    public void doOperation(int choice, BookList bookList){
        iOperation[choice].work(bookList);
    } 
}

AdminUser(管理员用户)

  1. AdminUser类:管理员用户,主要内容包括Iopetation类的数组,和一个对应的操作菜单
  2. 以下是IOperation数组中包含的操作:
  • 查询图书:FindOperation()
  • 添加图书:AddOperation()
  • 删除图书:DelOperation()
  • 显示图书:DisplayOperation()
  • 退出系统:ExitOperaion()
package user;

import operations.*;
import user.User;

import java.util.Scanner;

public class AdminUser extends User {   // 继承User类

    // 构造函数
    public AdminUser(String name) {
        super(name);

        // 对应管理员用户可执行的操作
        this.iOperation = new IOperation[]{
                new ExitOperaion(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }

    // 对应管理员用户的菜单
    public int menu(){
        System.out.println("****************************************");
        System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
        System.out.println("****************************************");
        System.out.println("请输入选择");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

NormalUser(普通用户)

  1. 普通用户类NormalUser内部和管理员用户并无差别
  2. 以下是普通用户IOperation数组中的操作
  • 查找图书:FindOperation()
  • 借阅图书:BorrowOperation()
  • 归还图书:ReturnOperation()
  • 显示图书:DisplayOperation()
  • 退出系统:ExitOperaion()
package user;

import operations.*;
import user.User;

import java.util.Scanner;

public class NormalUser extends User {

    public NormalUser(String name) {
        super(name);

        // 创建iOperation数组 存普通用户可执行的操作
        this.iOperation = new IOperation[]{
                new ExitOperaion(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
                new DisplayOperation()
        };
    }

    // 普通用户的对应的菜单
    public int menu(){
        System.out.println("****************************************");
        System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
        System.out.println("****************************************");
        System.out.println("请输入选择");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

Main类

  1. Main类主要包含Login方法,即实现用户登陆操作
  2. 主要步骤如下:
  • 创建一个空的 BookList 对象(bookList)用于存放图书信息。
  • 调用 Login 方法来进行用户登录操作,获取一个 User 对象(user)。这个 User 对象代表着当前登录的用户,可以执行特定的操作以管理图书列表。
  • 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
import books.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {
    // Login()方法 - 用户登陆
    public static User Login() {
        System.out.println("请输入您的姓名:");
        Scanner scanner = new Scanner(System.in);
        String Username = scanner.nextLine();
        while (true) {
            System.out.println("请输入您的身份:> 管理员(1)/普通用户(2)");
            int choice = scanner.nextInt();
            if (choice == 1) {
                return new AdminUser(Username);
            } else if (choice == 2) {
                return new NormalUser(Username);
            }else{
                System.out.println("输入错误,请重新输入");
            }
        }
    }

public static void main(String[] args) {
    BookList bookList = new BookList(); // 创建一个Booklist类对象,存放图书信息

    //登陆
    User user = Login(); // 执行Login()方法,登陆
    // 执行选项
    // 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
    while(true){
        int choice = user.menu();
        user.doOperation(choice,bookList);
        }
    }
}

operations

IOperation(操作接口)

  • 接口(IOperation) ,该接口包含了一个名为 work 的方法,这个方法接受一个 BookList 对象作为参数
  • 接口中定义的 work 方法 接受一个 BookList 对象作为参数。这个参数是一个封装了多个图书对象的列表对象,在执行具体操作时,我们可以通过该列表对象来访问和修改列表中的图书信息。
package operations;

import books.BookList;

public interface IOperation {
    void work(BookList bookList);
}

ExitOperation(退出系统)

重写IOperation的work方法进行功能实现,实现比较简单,直接使用System.exit(0)退出即可

这里主要讲一下是程序是怎样读取操作到退出的(运行过程):

操作运行过程

具体过程如图所示:
在这里插入图片描述

以下为ExitOperation的实现

package operations;

import books.BookList;

public class ExitOperaion implements IOperation{
    @Override
    public void work(BookList bookList){
    System.exit(0);//退出系统操作
    }
}

AddOperation(新增图书)

  1. 从控制台获取用户输入的图书的名称、作者、类型和价格等信息,然后根据这些信息创建一个新的 Book 对象。
  2. 将这个新创建的 Book 对象存储在当前可用的位置(即 bookList.usedSize 所代表的位置),并将 bookList.usedSize 的值加 1,表示图书列表中有效的书的数量已经增加了一个
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList){
    	// 添加图书
        System.out.println("添加图书");

		// 添加图书信息
        //先输入nextLine后输入nextInt
        //不然需要在nextInt后读取回车
        System.out.println("请输入要添加的图书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        System.out.println("请输入要添加的图书作者");
        String author = scanner.nextLine();

        System.out.println("请输入要添加的图书类型");
        String type = scanner.nextLine();

        System.out.println("请输入要添加的图书价格");
        int price = scanner.nextInt();


        Book book = new Book(name,author,price,type);
        //获取当前存放书的位置
        int currentSize= bookList.usedSize;
        //把书存放在指定位置(下标即对应位置)
        bookList.setBooks(book,currentSize);
        //将书的有效个数+1
        bookList.setUsedSize(currentSize+1);
    }
}

DelOperation(删除图书)

  1. 首先输入要删除的图书,然后遍历此时的bookList数组,查找是否有这本书
  2. 如果有再执行删除操作,没有打印提示信息
  3. 删除操作:将待删除的书后面的书向前移动1位
  4. 执行删除操作后 将booklist最后一位置空
package operations;

import books.Book;
import books.BookList;
import sun.font.FontRunIterator;

import java.util.Scanner;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("删除图书");
        System.out.println("请输入要删除的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        int index = -1;//是否存在该图书的标志

        // 遍历bookList查找是否存在要删除的图书
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                index = i;  // 找到该书就改变index的值,退出循环
                break;
            }
        }
        
        // 此时判断是否进行删除操作
        if(index == -1){
            System.out.println("要删除的图书不存在");
        }else{
            // 执行删除操作,讲此时index后的所有元素前移1位即可
            for (int i = index; i < currentSize-1; i++) {
                //把i+1下标的书放到i下标
                Book book = bookList.getPos(i+1);
                bookList.setBooks(book,i);
            }
            //每次删除后进行置空
            bookList.setBooks(null,currentSize-1);
            bookList.setUsedSize(currentSize-1);
            System.out.println(name+"已被删除");
        }
    }
}

DisplayOperation(显示图书)

  • 遍历打印数组元素book即可
package operations;

import books.Book;
import books.BookList;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("显示图书");
        System.out.println("****************************************");

        // 遍历数组打印book即可(book是一个返回图书信息的)
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            System.out.println(book);
        }
    }
}

BorrowOperation(借阅图书)

  • 和前面的操作大同小异,通过遍历数组,通过name.equals(book.getName())比较输入的name是否和数组中书名有相同的,最后更新借阅状态
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");

        System.out.println("请输入要借阅的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        // 遍历booklist 读取所有图书信息
        int flag = 0; // 最后判断是否借阅成功
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);

            if (name.equals(book.getName())) {
                if (book.isBorrowed()) {
                    flag = 1;
                    System.out.println("该书已经被借出");
                } else {
                    book.setBorrowed(true);
                    System.out.println("图书借阅成功");
                    flag = 1;
                    break;
                }
            }
        }
        if(flag == 0){
            System.out.println("要借阅的图书不存在");
        }
    }
}

ReturnOperation(归还图书)

  • 和借阅图书一样的操作,如果归还成功后进行book.setBorrowed(false) 即将该书的借阅状态设为未被借阅(isBorrwed = false)
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");

        System.out.println("请输入要归还的图书名");

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                book.setBorrowed(false);
                System.out.println("图书归还成功");
                break;
            }
        }
        System.out.println("要归还的图书不存在");
    }
}

FindOperation(查找图书)

  1. 遍历数组对比输入的name和书名是否相同,如果找到了就打印图书信息
package operations;

import books.Book;
import books.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList){
        System.out.println("查找图书");
        System.out.println("请输入要查找的图书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        // 遍历数组 查找书籍
        int CurentSize = bookList.getUsedSize();//数组此时的书的数量
        for (int i = 0; i < CurentSize; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                System.out.println("找到了这本书!\n"+book);   // 输出提示并打印图书信息
                return;
            }
        }
        System.out.println("这本书不存在");
    }
}

完整代码

java项目图书管理系统

;