【javaSE】 实现图书管理系统

目录

整体思路

Book包

Book类

BookList类

user包

User类

NormalUser类

AdminUser管理员类

testmain包

opera包

IOPeration接口

普通用户

ExitOperation类

FindOperation类

BrrowOperation类

ReturnOperation类

管理员

AddOperation类

 DelOperation类

ShowOperation类

总结


整体思路

首先我们先来看一下我们要达到的效果

我们得有登录的姓名,与身份的选择

【javaSE】 实现图书管理系统_第1张图片

选择不同的身份对应不同的功能

比如选择管理员

【javaSE】 实现图书管理系统_第2张图片

选择普通用户

【javaSE】 实现图书管理系统_第3张图片  

得有我们的图书

【javaSE】 实现图书管理系统_第4张图片 博主在这里实现图书管理系统分为四个包进行实现

【javaSE】 实现图书管理系统_第5张图片

不会创建包的小伙伴可以去下方链接了解一下

【javaSE】面向对象程序三大特性之封装_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/132001012?spm=1001.2014.3001.5501

book包里面实现书类和书架类

opera包里我们用接口实现我们所需要在图书管理系统里实现的功能

testmain包里是我们的主函数所在

user包里用继承来实现我们所需要的管理者与借阅者类

实现所有类如下

【javaSE】 实现图书管理系统_第6张图片

接下来我会就每个里面的类进行讲解

Book包

Book类

在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法

代码实现如下

package book;

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;
    }

    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;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isBorrowed?"  已借阅":"  未借阅")+
                '}';
    }
}

BookList类

这里我们需要实现的有可以存放很多Book的数组

可以与增加、删除等功能的对应方法

代码实现

package book;

public class BookList {
    //定义常量
    private static final int DEFAULT_SIZE = 20;
    //创建一个Book类型的数组,books里面存放的是多个book类型实例化的对象
    private Book[] books = new Book[DEFAULT_SIZE];
    //记录当前books数组当中 有多少本书?
    private int usedSize;
    public BookList() {
        books[0] = new Book("剑来","烽火戏诸侯",88,"修仙小说") ;
        books[1] = new Book("雪中悍刀行","烽火戏诸侯",66,"武侠小说");
        books[2] = new Book("流浪地球","刘慈欣",99,"科幻小说");
        books[3] = new Book("木苏里","某某",88,"爱情小说") ;
        books[4] = new Book("天官赐福","墨香铜臭",66,"爱情小说");
        books[5] = new Book("镇魂","priest",99,"爱情小说");
        //表示最初是三本
        this.usedSize = 6;
    }
    //读取这一本书
    public Book getBooK(int pos) {
        return this.books[pos];
    }
    //将该书写入该下标对应的位置,可以实现增加图书
    public void setBook(Book book) {
        this.books[usedSize] = book;
    }
    //后面会用于读取图书
    public int getUsedSize() {
        return usedSize;
    }
    //用于写入数组下标,与增加删除功能都有关系
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }


}

user包

User类

这里的User类是作为NormalUser类与AdminUser类的父类

有相应的属性name与构造方法

会提供一个数组,供子类进行使用

有一个抽象类实现菜单

有一个方法会对用户选择后的结果进行传达,然后调用相对应功能的方法

实现代码

package user;

import book.BookList;
import opera.IOPeration;

public abstract class User {
    protected String name;
    protected IOPeration[] ioPerations;

    public User(String name) {

        this.name = name;
    }
    //创建一个抽象类,实现菜单
    public abstract int menu();
    //通过对象的相应调用与所传参数实现操作者选择的功能
    public void doWork(int choice, BookList bookList) {
        this.ioPerations[choice].work(bookList);
    }
}

NormalUser类

普通用户类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现普通用户的功能

一个可以让用户选择的菜单,以及返回用户所做的选择

package user;

import opera.*;

import java.util.Scanner;
/**
 * @Author 12629
 * @Description:
 */
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        //对ioPerations数组进行初始化,里面放的是使用者所需要功能类的对象
        ioPerations = new IOPeration[] {
                //0.退出系统
                new ExitOperation(),
                //1.查找图书
                new FindOperation(),
                //2.借阅图书
                new BrrowOperation(),
                //3.归还图书
                new ReturnOperation()
        };
    }

    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到阳光图书馆");
        System.out.println("1.查找图书!");
        System.out.println("2.借阅图书!");
        System.out.println("3.归还图书!");
        System.out.println("0.退出系统!");
        System.out.println("****************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

AdminUser管理员类

管理员类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现管理员的功能

一个可以让管理员选择的菜单,以及返回管理员所做的选择

package user;

import opera.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        //对ioPerations数组进行初始化,里面放的是管理员所需要功能类的对象
        ioPerations = new IOPeration[] {
                //0.退出系统
                new ExitOperation(),
                //1、查找图书
                new FindOperation(),
                //2.新增图书
                new AddOperation(),
                //3.删除图书
                new DelOperation(),
                //4.显示图书
                new ShowOperation()
        };
    }

    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到阳光图书管");
        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;
    }

}

testmain包

这里需要实现的是

可以根据用户选择不同的身份以及选择身份后所要进行的功能,调用相应的对象实现

代码实现

package testmain;

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

/**
 * @Author 12629
 * @Description:
 */
public class Main {
    public static User login() {
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1-》管理员  0-》普通用户");
        int choice = scanner.nextInt();
        if(choice == 1) {
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        //返回来的值进行向上转型
        User user = login();
        while(true) {
            //此处是一个简单的多态实现
            int choice = user.menu();
            //根据 choice 和   user 来确定 我到底 调用哪个对象的哪个操作
            user.doWork(choice, bookList);
        }
    }
}

opera包

这个包利用接口来实现这些功能

IOPeration接口

会有一个work的抽象方法,参数类型为BookList的

代码实现

package opera;

import book.BookList;

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

普通用户

ExitOperation类

用于退出该系统

这里的实现很简单,使用System.exit(0);就好

import book.BookList;

public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {

        System.out.println("退出系统!");
        System.exit(0);
    }
}

FindOperation类

用于查找图书

根据书名对Books数组里面的每一Book类的名字进行比对

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation  implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        System.out.println("请输入要查找书的名字");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        for(int i = 0;i < currenSize;i++) {
            Book book = bookList.getBooK(i);
            if(book.getName().equals(input)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("查找书不存在");
    }

}

BrrowOperation类

实现借阅功能

根据书名进行遍历是否有该图书

判断该图书的状态

借阅后改变该图书的状态,改为已借阅

代码实现如下

import java.util.Scanner;

public class BrrowOperation implements IOPeration {
    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.getBooK(i);
            if(name.equals(book.getName())) {
                if(book.isBorrowed()) {
                    System.out.println("该书已经被借出! ");
                }else {
                    book.setBorrowed(true);
                    System.out.println("借阅图书成功!");
                }
                return;
            }
        }
        System.out.println("没有你要借阅的图书!");
    }

}

ReturnOperation类

归还图书

根据书名进行遍历是否有该图书

判断该图书的状态

归还后改变该图书的状态,改为未借阅

代码实现如下

package opera;

import book.Book;
import book.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.getBooK(i);
                if(name.equals(book.getName())) {
                    book.setBorrowed(true);
                    System.out.println("归还图书成功!");
                    return;
                }
            }
            System.out.println("没有你要归还的图书!");
        }
}

管理员

ExitOperation类与FindOperation类为两种身份共有的,这里就不再赘述

AddOperation类

添加书籍

根据书名遍历该书是否已经存在

添加该书的所有属性

对Books数组进行更新,添加;这里就用到了我们前面在BookList里书写的方法,如下图

【javaSE】 实现图书管理系统_第7张图片

代码实现如下

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOPeration{
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        System.out.println("新增图书!");
        System.out.println("请输入你要新增的图书的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for(int i = 0;i < currenSize;i++) {
            Book book = bookList.getBooK(i);
            if(book.getName().equals(name)){
                System.out.println("所添加书籍已存在");
                return;
            }
        }
        System.out.println("请输入你要新增的图书的作者:");
        String author  = scanner.nextLine();

        System.out.println("请输入你要新增的图书的价格:");
        int  price  = scanner.nextInt();

        scanner.nextLine();

        System.out.println("请输入你要新增的图书的类型:");
        String type  = scanner.nextLine();

        Book book = new Book(name,author,price,type);

        //1. 获取到当前可以存放书的位置
        int currentSize = bookList.getUsedSize();
        //2. 把书放入指定位置
        bookList.setBook(book);
        //3. 书的有效个数+1
        bookList.setUsedSize(currentSize+1);
        System.out.println("添加成功");
    }

}

 DelOperation类

删除书籍

根据书名遍历该书是否已经存在

寻找该书的数组下标,实现后面数组对前面的覆盖

现有图书数目减一,并将原来图书书目最后一位置为Null

代码实现

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOPeration{
    public void work(BookList bookList) {

        System.out.println("删除图书!");
        System.out.println("请输入你要删除的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //1. 遍历数组当中 是否有你要删除的书  有记录下标
        int index = -1;
        int currentSize = bookList.getUsedSize();;
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooK(i);
            if(name.equals(book.getName())) {
                index = i;
                break;
            }
        }
        //
        if(index == -1) {
            System.out.println("没有你要删除的书!");
            return;
        }

        for (int i = index; i < currentSize-1 ; i++) {
            //bookList[i] = bookList[i+1];
            Book book = bookList.getBooK(i+1);
            bookList.setBook(book);
        }
        //下标减一
        bookList.setUsedSize(currentSize-1);
        //每次删除 都要置空
        bookList.setBook(null);
        System.out.println("删除成功!");

    }
}

ShowOperation类

显示图书

遍历Books数组

使用重写的toString方法就好

代码实现

package opera;

import book.BookList;

import java.sql.SQLOutput;

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        for(int i = 0;i < currenSize;i++) {
            //我们重写了toString,所以这里会优先调用我们重写的toString方法
            System.out.println(bookList.getBooK(i));
        }
        System.out.println("显示完毕");
    }

}

总结

关于《 图书管理系统》就讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。想要完整包的小伙伴可以去到该博文的资源绑定进行下载,也可以私信博主

你可能感兴趣的:(javaSE,java,javascript,前端,开发语言,图书管理系统)