java——图书管理

Java——图书管理系统

书本,无时无刻的会在我们身边的某一个角落里出现,书是我们进步的阶梯,老话说得好,书中自有黄金屋,书中自有颜如玉,可见书中的奥秘如此深厚,当我们身边的书越来越多时,我们就需要对自己的图书进行管理,虽然该项目是针对管理员和普通用户的,也不要忘记整理自己的“图书馆”!

项目介绍

首先进入项目时会要求输入姓名,该项目分为两个角色,一个是管理员,一个是普通用户,管理员和用户的功能不同,所以在登录界面时,设置一个菜单栏选择管理员还是普通用户。选择的身份不同会影响接下来的操作。这里设置的书本的属性有:书名,作者,价格,种类,状态。因为书的不同,这里建立了一个书架BookList用于存放书本,这里的书本状态是由用户借出和归还时的不同,普通用户没有提供显示图书功能,但是如果需要,读者可自行加入,查找,删除,借阅和归还图书都是以书名作为输入来匹配数据的,如果书架中有,则进行处理,否则会进行相应提示。
项目例图:
管理员例图
普通用户例图

Main类方法

在主方法中,我们的功能是输入姓名和选择身份,所以这里开始需要输入姓名和身份,然后进行菜单跳转,具体代码如下:

import Book.BookList;
import User.*;
import java.util.Scanner;
public class Main {
    public static User Login(){
        System.out.println("请输入你的姓名");
        Scanner scanner =new Scanner(System.in);
        String name=scanner.next();
        System.out.println("请输入你的身份:1-》管理员 0-》普通用户");
        System.out.println("请输入你的身份:");
        int id=scanner.nextInt();
        if(id==1) {
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        //根据choice和user来确定功能和操作
        BookList bookList= new BookList();
        User user = Login();//用接收的不同身份去调用不同的功能
        int choice=1;
        while (true){
             choice= user.menu();
            user.doWork(choice,bookList);
        }
    }
}

用户类创建

管理员用户类和普通用户类,这里先创建一个父类存储姓名和其他共同属性,我们可以使用抽象类:

package User;
import Book.BookList;
import Operate.Operate;
public abstract class User {
    protected String name;//书名
    protected Operate[] operates;//书架功能
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    //打印菜单
    public abstract int menu();
    public void doWork(int choice, BookList bookList){
        //调用接口中
        this.operates[choice].work(bookList);
        //根据输入调用相应的函数,这里有一个接口方法,相当于operate是一个接口然后去调用对应下标的work方法
    }
}

然后使用管理员用户继承,这里用接口数组来存储功能,然后建立对应的菜单,普通用户也是这样对功能进行处理:

package User;
import Operate.*;
import java.util.Scanner;
public class AdminUser extends User{
    public AdminUser(String name){
        this.name=name;
        //将功能放在数组中,选择时只需要输入下标即可调用
        this.operates = new Operate[]{
                new ExitBook(),
                new BookFind(),
                new AddBook(),
                new DeleBook(),
                new ShowBook(),
        };
    }
    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("============================");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice=scanner.nextInt();
        return choice;
    }
}

普通用户对父类继承:

package User;
import Operate.*;
import java.util.Scanner;
public class NormalUser extends User{
    public NormalUser(String name){
        this.name=name;
        this.operates = new Operate[]{
                new ExitBook(),
                new BookFind(),
                new BrrowBook(),
                new ReturnBook(),
        };
    }
    @Override
    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("============================");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice=scanner.nextInt();
        return choice;
    }
}

图书类和书架

图书类主要是将图书属性综合为一个类,里面包含了,书名,作者,价格,种类,状态,对所有属性进行封装,创建了一个构造方法,使得更容易对书本进行初始化,具体代码如下:

public class Book {
    //图书属性
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean bror;
	//构造方法
    public Book(String name, String author, int price,String type, boolean bror) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type=type;
        this.bror = bror;
    }
    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public void setType(String type) {
        this.type = type;
    }
	//重写了tostring方法,打印图书时更贴合读者
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (bror?"  未被借出":"  已经借出")+
                '}';
    }

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

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

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

    public void setBror(boolean bror) {
        this.bror = bror;
    }

    public int getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }

    public boolean isBror() {
        return bror;
    }

    public Book(boolean bror){
        this.bror=bror;
    }
}

书架类是将多个图书放在一起,也就相当于图书数组,书架中默认放了4本书,其中定义了一个UserSize用于统计书架中书本的数量,具体代码如下:

public class BookList {
    private Book[] books =new Book[10];
    private int userSize;//记录当前book中书的数量
    public BookList(){
        books[0]=new Book("盗墓笔记","南派三叔",36,"小说",true);
        books[1]=new Book("放学后","东野圭吾",35,"小说",true);
        books[2]=new Book("沉默的大多数","王小波",42,"小说",true);
        books[3]=new Book("傲娇与偏见","简·奥斯汀",40,"小说",true);
        userSize=4;
        //因为初始化中放入了4本书,所以这里将userSize设置为4
    }
    public Book getBook(int pos){
        return books[pos];
    }

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

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

    public int getUserSize() {
        return userSize;
    }

    public void setUserSize(int userSize) {
        this.userSize = userSize;
    }
}

功能列表

功能类,将其放在一个包(Operate)中,在其中实现了一个接口,接口中定义一个方法,使得其他类都继承该接口并实现该方法,相当于都拥有了一个共同属性,具体代码如下:

//user中函数只需要调用其接口就可以使用接口对应的所有类
public interface Operate {
    void work(BookList bookList);//将书架传入每一个功能中
}

实现一个图书管理项目可以先将其两个身份分开,管理员和普通用户的功能列出:

管理员

1.查找图书

2.增加图书

3.显示图书

4.删除图书

5.退出系统

普通用户

1.查找图书

2.借阅图书

3.归还图书

4.退出系统

在以上可以将以上所有功能放在同一个包中,在这里取名为Operate,因为管理员和普通用户的查找功能一样,所以使用同一个类即可。

1.查找图书功能

查找图书,需要用户输入书名,然后去书架中一一对比,找到后将书本打印,否则提示“没有该书”,具体实现代码如下:

import Book.*;
import java.util.Scanner;
public class BookFind implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入书名:》");
        String name= scanner.next();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            Book book= bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("找到了");
                System.out.println(book);
                return;//查找结束
            }
        }
        System.out.println("没有该书");
    }
}
2.增加图书功能

增加图书,用户输入书本的属性后,userSize加一,也就是书架加一,一般该功能都是在书架尾部添加图书,具体代码如下:

import Book.*;
import java.util.Scanner;
public class AddBook implements Operate {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入书名:");
        String name=scanner.next();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            Book book= bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("已经存在这本书了!");
                return;
            }
        }
        System.out.println("请输入作者:");
        String Author=scanner.next();
        System.out.println("请输入价格:");
        int price=scanner.nextInt();
        System.out.println("请输入类型:");
        String type=scanner.next();
        System.out.println("请输入状态:");
        boolean bror=scanner.hasNext();
        Book book =new Book(name,Author,price,type,bror);
        bookList.setBooks(bookList.getUserSize(),book);
        bookList.setUserSize(bookList.getUserSize()+1);
        System.out.println("添加成功");
    }
}
3.显示图书

将书架所有的书进行打印,没有图书则提示,具体代码如下:

import Book.*;
import java.util.Scanner;
public class ShowBook implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        if(bookList.getUserSize()==0)
        {
            System.out.println("书架为空");
        }
        for (int i = 0; i < bookList.getUserSize(); i++) {
           Book book= bookList.getBooks(i);
            System.out.println(book);
        }
    }
}
4.删除图书

以书名进行搜索,如果符合条件,进行删除,删除方法是将后面的书本进行覆盖,然后userSize减一,删除失败会进行提示,具体代码如下:

import Book.*;
import java.util.Scanner;
public class DeleBook implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的书名:》");
        String dele = scanner.next();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            Book book = bookList.getBooks(i);
            if (dele.equals(book.getName())) {
                for (int j = i; j < bookList.getUserSize()-1; j++) {
                    Book tem= bookList.getBooks(j+1);
                    bookList.setBooks(j,tem);
                }
                System.out.println("删除成功");
                bookList.setUserSize(bookList.getUserSize()-1);
                return;
            }
        }
        System.out.println("删除失败");
    }
}
5.退出系统

用户选择0时,该方法会被调用,直接让系统将现在进行的程序停止,就算是死循环也会停止,在Main中,我们设置了死循环去让用户进行输入,具体代码如下:

import Book.BookList;
public class ExitBook implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        System.exit(0);
    }
}
6.借阅图书

这里需要用户输入借阅的书名,将图书状态变更。在初始化时,状态设置为false,意思是没有被借出,这时候普通用户就可以将其借出,将状态改为true即可,具体代码如下:

import Book.*;
import java.util.Scanner;
public class BrrowBook implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入你要借的书名:》");
        String name = scanner.next();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())&&book.isBror()==true) {
                bookList.getBook(i).setBror(false);
                System.out.println("借书成功");
                return;
            }
        }
        System.out.println("借书失败");
    }
}
7.归还图书

该功能和借阅图书相对应,一个是将状态改为true,而归还就是将其状态改为false,具体代码如下:

import Book.*;
import java.util.Scanner;
public class ReturnBook implements Operate{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入你归还的书名:》");
        String name = scanner.next();
        for (int i = 0; i < bookList.getUserSize(); i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())) {
                bookList.getBook(i).setBror(true);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("归还失败,系统没有该书");
    }
}
项目总结

r =new Scanner(System.in);
System.out.println(“请输入你归还的书名:》”);
String name = scanner.next();
for (int i = 0; i < bookList.getUserSize(); i++) {
Book book = bookList.getBooks(i);
if (name.equals(book.getName())) {
bookList.getBook(i).setBror(true);
System.out.println(“归还成功”);
return;
}
}
System.out.println(“归还失败,系统没有该书”);
}
}


#### 项目总结

图书管理系统,这个项目只有简单的功能,但可以锻炼到重写和重载,抽象类,接口等知识,对管理员和普通用户的不同功能进行编写时可以注意到许多内容都有相似性,该图书类中的一些属性方便了管理和普通用户的使用,状态的改变就是借书和还书,对方法的重写也使得阅读更加方便。希望这个图书项目能帮助你练习到Java程序编写能力,感谢观看。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值