Bootstrap

【Java版】图书管理系统(超详解!!!)

前提:

会使用到的相关的知识:

1.数据类型;变量

2.if,for语句

3.数组

4.方法

5.类与对象

6.封装继承多态

7.抽象类和接口

目录

前提:

一、寻找相关对象

1.Book对象

1.Book进行定义:

2.get和set方法

3.构造方法

4.toString

2.BookList(书架)对象

1.BookList进行定义

2.构造方法:(可能需要初始化一些成员)

3.用户user

1.User定义

注:权限比较

2.构造方法

3.AdminUser(管理员对象)

1.AdminUser的定义

2.构造方法

4.NormalUser(普通用户)

1.NormalUser的定义以及构造方法的定义:

二、菜单

1.管理员菜单:

2.普通用户菜单:

3.登录(创建入口)

三、框架搭构(最重要)

四、对应操作

0.退出系统:

1.查找图书:

2.新增图书

3.借阅图书

4.显示图书(思路:遍历)

5.归还图书:

6.删除图书:

五、(所有)代码展示

book包:

Book类

BookList类

ioperations包

AddOperation类

BorrowOperation类

DelOperation类

ExitOperation类

FindOperation类

ReturnOperation类

ShowOperation类

IOPeration接口

user包

AdminUser类

NormalUser类

User类

Main类(程序的入口)

六、后续扩展:


一、寻找相关对象

Java是一个面向对象的程序语言,需要找到其中的对象

对象:

用户:管理员 ,普通用户

书:BOOK ,书架

操作:操作的是书架;显示图书,借书,还书,删除书,增加书,查找书

1.Book对象

分析:包是用来组建类的,所以将书相关的内容放在一个包的下面

书包括     name(名称);author(作者);price(价格);type(类型:小说,散文等);借书的状态(借出或未借出)

1.Book进行定义:

2.get和set方法

注:由于使用的是private来进行修饰的(封装起来了),所以需要对他提供get和set的方法,来进行创建相关的对象(此时是一个一个进行赋值)

其中不想把isBorrowed进行书写get和set方法

因为:boolean他是有一个默认值是false(而这个的含义就是未借出)

3.构造方法

上述是有需要进行单个函数的调用赋值会使用到

使用构造方法进行赋值会更加方便(在对整个书的定义的时候)

此时也是不需要对isBorrowed书写的,如果写了,则需要对每一次进行传值true或false

4.toString

这些书如果想要被打印出来,用字符串的形式,需要重新写String的方法用字符串的方式进行打印

其中关于是否借出的问题,需要使用三目运算符的方式进行相应的判断

最终打印出书的相关的值

2.BookList(书架)对象

这些书放到书架上,使用数组的方式进行书的组织

1.BookList进行定义

但是其中的最大的储存量是10,用不完最终的10个位置

所以需要用一个变量来标记现在使用了几个位置

2.构造方法:(可能需要初始化一些成员)

可以提前在这个书架上放三本书

只要程序运行起来,这个里面就一定是有这三本书

3.用户user

在用户里面会分为普通用户、管理员用户

所以需要重新定义一个包

其中我们是可以想到这个User这个对象是一定会被继承的,其中的名称管理的具体人,在后面都可能是会被用到的,所以定义的时候注意权限的使用

由于public的范围太大了——有些人没有权限了解到这个,所以不使用

private又太小了,不能进行继承

想在不同包下进行访问使用protected修饰合适

1.User定义

注:权限比较

2.构造方法

当子类继承我们父类的时候,对父类的成员进行初始化,需要使用到构造方法

注:当前的User不能是确定具体的一个类,因为到底是管理员还是普通用户我们是不清楚的

所以可以将User这个类设置成为抽象类

3.AdminUser(管理员对象)

1.AdminUser的定义

管理员是继承了用户对象的

此时发生了报错:1.父类当中又构造方法或有抽象方法,一定要调用这个方法

2.构造方法

4.NormalUser(普通用户)

1.NormalUser的定义以及构造方法的定义:


二、菜单

管理员的菜单和普通用户的菜单是不一样的

1.管理员菜单:

我们还需要输入相关操作:

所以接下来代码为:

2.普通用户菜单:

普通用户也是需要进行输入相关操作的

与上述代码一致

3.登录(创建入口)

创建一个类Main入口

可以把登录的相关内容专门写到一个方法当中

在此处是一个关于人员的输入情况

但是我们要解决一个问题:他是管理员需要给一个管理员的身份,普通用户需要给一个普通用户的身份

注:此时的返回值已经变成User对象

使用的是一个向上转型的操作

此时我们需要打印具体的人员的菜单了

此时发生了报错:

由于父类当中没有menu这个方法,所以需要进行有关多态的设计

此时就没有发行报错了

利用的是多态的思想


三、框架搭构(最重要

其中统一操作的是书架

可以新启一个包ioperations

但是有一个问题:还是没有办法区分管理员的操作和普通用户的操作

我们可以定义一个接口

然后将所有的操作都实现这个接口

又一问题怎样将对应的数字转化成对应的方法

所以我们需要得到输入的那个数字

将之前void无返回的值改为int类型返回choice这个数值

普通用户与管理用户上述的改法一样

要根据这个里面的返回值看调用哪个对象哪一个方法:

用一个choice进行接收

1.调用哪个对象:从其中的User user=login();这个已经知道要调用哪一个对象

2.调用哪个方法:确定当前对象已经包含了这些方法

调用User来使用哪个方法

此时这个数组没有进行初始化,因为它的大小也是没有办法确定的

而在下面这个里面将对应的人员的操作(是一个对象)放在了数组当中

在返回对应的人的时候,会调用它的构造方法,对构造方法进行了初始化,就知道了他的一个大小情况

在此时choice的值与下标可以进行结合就达到了使用具体的方法的问题

在Main入口当中需要用user来调用相关的方法

传递的是choice:选择的是哪一个操作

bookList:将书架(所有书籍传入)进行操作


四、对应操作

0.退出系统:

该方法比较简单,主要就是调用了一个方法,进行了系统的退出

1.查找图书:

查找图书之前;首先需要书写查找的图书的名称

遍历图书的时候,已知的是数组的大小

但是需要知道的是数组当中的有效值,所以要知道usedSize大小

需要将对应下标的书进行找到,并与输入的那本书进行比较

由于是String类型,所以使用equals进行比较

如果一致所以就会返回true执行下面的操作,将这本书进行打印

如果没有找到这本书,最终就会返回“没有这本书”;

2.新增图书

增加一个图书,就是需要一个图书对象

步骤

1.将所有的书的信息进行增加

要将他增加到书架上

2.放之前;需要进行判满操作

此时需要知道对应的数组的大小,所以就需要写一个方法,将这个大小的值获取出来

3.放到数组的最后一个位置

4.usedSize++;

注:在此时的情况的时候,会出现不能将类型正确输入进去

因为他的回车也是一个字符

所以最直接的办法就是将整个的类型与价格进行调换

3.借阅图书

1.输入借阅的书名

2.在找到之后判断这本书是否被借出,只有没有被借出的图书才可以被借出

3.进行查找,寻找这本书有没有

借书的含义就是相当于将isBorrowed改为true

则就是结束成功

4.显示图书(思路:遍历)

书架其实就是数组;放着若干本书

就是遍历数组就可以了(使用循环方式)

其中的存放的具体的数据是由usedSize决定的

但是由于usedSize是private修饰的,所以需要提供get和set方法给usedSize进行相关的赋值

已知Book[]该数组也是由private修饰的,所以需要使用到get和set的方法

但是此时我们需要得到的是某个下标位置上的数值,所以对于返回值需要进行相关的修改

最终得到以下的代码

得到对应的数组当中的元素,并以字符串的形式进行打印

将最终得到的书进行打印放在show的方法当中

其中的BookList是一个对象,里面有一个数组

5.归还图书:

与借阅图书类似,主要操作的对象都是isBorrowed这个问题:

6.删除图书:

最大的操作是覆盖

1.找到需要删除的数据

2.从后一个往前一个进行覆盖


五、(所有)代码展示

book包:

两个类:Book;BookList

Book类

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=" + ((isBorrowed==true)?"已借出":"未借出") +
                '}';
    }
}

BookList类

package book;

public class BookList {

    private Book[] books = new Book[10];
    private int usedSize;//有效的数据几个数【实际放的书的个数】

    public BookList(){
        books[0] =new Book("三国演义","罗贯中",10,"小说");
        books[1] =new Book("西游记","吴承恩",50,"小说");
        books[2] =new Book("红楼梦","曹雪芹",16,"小说");

        this.usedSize=3;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(int pos,Book book) {
        this.books[pos] = book;
    }

    public Book[] getBooks(){
        return books;
    }
}

ioperations包

七个类:AddOperation;BorrowOperation;DelOperation;ExitOperation;FindOperation;ReturnOperation;ShowOperation;

一个接口:IOPeration;

AddOperation类

package ioperations;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOPeration{
    @Override
    public void work(BookList bookList){
        System.out.println("增加图书…………");
        Scanner scanner = new Scanner(System.in);

        int currentSize = bookList.getUsedSize();
        if (currentSize == bookList.getBooks().length){

            System.out.println("书架满了,不能放了");
            return;
        }


        System.out.println("请输入书名:");
        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 newbook = new Book(name,author,price,type);

        //3.判断书架有没有这本书
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if (book.getName().equals(name)){
                System.out.println("有这本书不能插入");
                return;
            }
        }

        //4.插入这本书
        bookList.setBooks(currentSize,newbook);
        bookList.setUsedSize((currentSize+1));

        System.out.println("新增图书成功");

    }

}

BorrowOperation类

package ioperations;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你想要借的书名:");
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);

            if (book.getName().equals(name)) {
                if (book.isBorrowed()){
                    System.out.println("这本书已经被借出了");
                    return;
                }
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("没有找到要借阅的这本书!");
    }
}

DelOperation类

package ioperations;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOPeration{
    @Override
    public void work(BookList bookList){
        System.out.println("删除图书…………");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名:");
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();

        int pos = -1;
        int i = 0;
        //找到这本书
        for ( i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("");
                pos = i;
                break;
            }
        }
        if (i==currentSize){
            System.out.println("没有要找的书!");
            return;
        }
        //开始删除
        for (int j = pos; j < currentSize-1; j++) {
            Book book = bookList.getBooks(j+1);

            bookList.setBooks(j,book);
        }
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功!");
    }
}

ExitOperation类

package ioperations;

import book.BookList;

public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList){
        System.out.println("退出图书…………");
        System.exit(0);
    }
}

FindOperation类

package ioperations;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("找到这本书");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书");
    }


}

ReturnOperation类

package ioperations;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你想要还的书名:");
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);

            if (book.getName().equals(name)) {
                if (book.isBorrowed()) {
                    book.setBorrowed(false);
                    System.out.println("归还成功!");
                    return;
                }
            }
        }
        System.out.println("没有找到要归还的图书!");
    }
}

ShowOperation类

package ioperations;

import book.Book;
import book.BookList;

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList){
        System.out.println("显示图书…………");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

IOPeration接口

package ioperations;

import book.BookList;

public interface IOPeration {
    default void work(BookList bookList){
        System.out.println("图书操作…………");
    }


}

user包

三个类:AdminUser;NormalUser;User

AdminUser类

package user;

import ioperations.*;

import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
    }

    public int menu(){
        System.out.println("*******管理员菜单*******");
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");

        System.out.println("***********************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;

    }
}

NormalUser类

package user;

import ioperations.*;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }

    public int menu() {
        System.out.println("*******普通用户菜单*******");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");

        System.out.println("***********************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;
    }
}

User类

package user;

import book.BookList;
import ioperations.IOPeration;

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


    public User(String name){
        this.name = name;
    }

    public abstract int menu();

    public void doIoperation(int choice, BookList bookList){
        ioPerations[choice].work(bookList);
    }
}

Main类(程序的入口)

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

import java.util.Scanner;

public class Main {

    public static User login(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();

        System.out.println("请输入你的身份:1.管理员    2.普通用户");

        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();
            user.doIoperation(choice, bookList);
        }
        //IOPeration[] ioPerations={};
    }
}

六、后续扩展:

1.每次运行的程序,新增的图书,可能就没有了,想要存储,有一些几个思路:

a.换成文件存储到文件当中,磁盘上,涉及到文件读取

b.换成数据库,将数据存储到MySQL当中,存储在磁盘当中,每次运行程序读取数据库就可以了

2.还可以实现为WEB端的练习

a.加入网页

b.加入框架

3.功能上也可以进行扩展

书名排序

价格排序

作者名排序


总结:这一版是很完整的一部分,非常非常的详细,每一部分都是非常详细的,很适合对所有知识进行的整理总结和归纳。

;