图书管理系统(java版)


前言:学习完java的基本语法过后,我们一起做一个比较综合和小项目,图书管理系统

项目介绍

图书管理系统,首先就是要明白不同登入系统的身份有相应不同的操作,比如说图书管理员就可以往书架中新添图书,删除图书等普通用户不能进行的操作,所以我们要针对不同用户写出相应的处理方法,理解这一点后,我们就要抽象出用户操作的目标,对此我们可将该项目所涉及到的类归结为3个包(书,书架),(用户),(操作方法),详情请看相应的代码,其中包含了详细的注释

1.图书馆入口主函数

import Book.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("欢迎来到大熊猫图书馆");
        System.out.println("请输入你的昵称");
        Scanner scanner=new Scanner(System.in) ;
        String name=scanner.nextLine();
        System.out.println("请输入您的登录身份   1.管理员    2.读者");
        int ID=scanner.nextInt();
        //当输入ID为1时,返回一个管理员对象
        if(ID==1){
            System.out.println("你已进入管理员界面");
            return new AdminUser(name,"管理员");
            //当输入ID为2时,返回一个读者对象
        }else if(ID==2){
            System.out.println("你已进入读者界面");
            return new NormalUser(name,"读者");
        }
        System.out.println("登陆失败"+"\n"+"亲亲,看清楚一点,下次请输入正确的选项哦");

        return null;
    }



    public static void main(String[] args) {
        //实例化一个书架对象
        bookList bookList=new bookList();
        //用一个父类的引用接受login方法返回的子类对象,便于调用父类方法时发生多态
        user user=login();
        while(true){
            //这里的user.menu指的是用父类(user)引用调用子类重写的抽象方法
            int choice=user.menu();
            //与上方法用法一样
            user.doWork(choice,bookList);
        }

    }
}

2.书包

因为书架类中会用到书的对象,所以我们将书类与书架类放在同一个包中

书类(Book)

package Book;
//对书类进行抽象
public class book {
    private String name;
    private String auther;
    private double price;
    private String bookStyle;
    private boolean isBorrowed;

    /**
     * 书类的一个带参数的构造方法(不含成员属性isBorrowed)
     * 因为isBorrowed是一个布尔类型的成员属性,就算构造方法未对其进行传参
     * 初始化,在类中也会默认初始化为false,又因为在添加一个书时,默认的借出状态
     * 也为未借出(false),正因为布尔类型属性这一特点,所以构造方法中不用对其传参
     * 初始化
     * @param name 书名
     * @param auther 作者
     * @param price 价格
     * @param bookStyle 类型
     */
    public book(String name, String auther, double price, String bookStyle) {
        this.name = name;
        this.auther = auther;
        this.price = price;
        this.bookStyle = bookStyle;
    }

    /**
     * 对ToString方法进行重写,方便对书类对象的属性信息打印
     * @return
     */
    @Override
    public String toString() {
        return "book{" +
                "name='" + name + '\'' +
                ", auther='" + auther + '\'' +
                ", price=" + price +
                ", bookStyle='" + bookStyle + '\'' +
                ", isBorrowed=" + (isBorrowed?"已借出":"未借出") +
                '}';
    }

    /**
     *返回当前书对象的书名(name)
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * 设置当前书对象的书名(name)
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 返回当前书对象的作者名字(auther)
     * @return
     */
    public String getAuther() {
        return auther;
    }

    /**
     * 设置当前书对象的作者名字(auther)
     * @param auther
     */
    public void setAuther(String auther) {
        this.auther = auther;
    }

    /**
     * 返回当前书对象的价格(price)
     * @return
     */
    public double getPrice() {
        return price;
    }

    /**
     * 设置当前书对象的价格(price)
     * @param price
     */
    public void setPrice(double price) {
        this.price = price;
    }

    /**
     * 返回当前书对象的类型(bookStyle)
     * @return
     */
    public String getBookStyle() {
        return bookStyle;
    }

    /**
     * 设置当前书对象的类型(bookStyle)
     * @param bookStyle
     */
    public void setBookStyle(String bookStyle) {
        this.bookStyle = bookStyle;
    }

    /**
     * 返回当前对象的借阅状态(isBorrowed)
     * @return
     */
    public boolean getIsBorrowed() {
        return isBorrowed;
    }

    /**
     * 设置当前对象的借阅状态(isBorrowed)
     * @param borrowed true或false
     */
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
}

书架类(BookList)

package Book;
//抽象出存放书籍的书架类bookList
public class bookList {
    //定义一个book类型的数组存放书籍
    private book[] books=new book[10];
    private int useMount;


    /**
     * 书架的无参构造方法,当实例化书架的对象时,书架会自动初始化放上三本书;
     */
    public bookList() {
        books[0]=new book ("西游记","罗贯中",90.5,"小说");
        books[1]=new book ("红楼梦","曹雪芹",86.5,"小说");
        books[2]=new book ("java深度解析","大聪明",55.5,"科学");
        this.useMount=3;
    }

    /**
     *
     * @return 获取当前书架已存在的书籍数目
     */
    public int getUseMount() {
        return useMount;
    }

    /**
     *
     * @param useMount 修改书架中书本数目
     */
    public void setUseMount(int useMount) {
        this.useMount = useMount;
    }

    /**
     *在book数组的pos下标元素里添加书的对象
     * @param pos 放入书架的下标
     * @param book 放入的书对象
     */
    public void setBooks(int pos,book book) {
        books[pos]=book;
        this.useMount++;
    }

    /**
     *返回book数组的pos下标元素里书的对象
     * @param pos 要获取书的下标
     * @param
     * @return
     */
    public book getBooks(int pos) {

        return books[pos];
    }
}

3.用户包

用户父类(User)

package User;
import Book.bookList;
import Operations.Ioperations;

public abstract class user {
    protected String name;
    protected Ioperations[] operations;
    public abstract int menu();
    public abstract void doWork(int choice, bookList bookList);
}

普通用户子类(NormalUser)

package User;


import Book.bookList;
import Operations.*;

import java.util.Scanner;

public class NormalUser extends user {
    public int menu(){
        System.out.println("hello "+"欢迎"+this.ID+": "+this.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);
        int choice=scanner.nextInt();
        return choice;
    }

    public NormalUser(String name,String ID) {
        this.ID=ID;
        this.name=name;
        //初始化从父类user中继承的operation数组
        //这一步起到了十分关键的作用,提供了不同用户身份的不同操作方法
        this.operations=new Ioperations[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()

        };
    }

    /**
     * 通过菜单中返回的选项,调用相对应下标的接口数组对象的work方法
     * @param choice 用户从菜单中选择的选项
     * @param bookList 要操作的书架对象
     */
    public void doWork(int choice, bookList bookList){
        this.operations[choice].work(bookList);
    }
}

管理员用户子类(AdminUser)

package User;

import Book.bookList;
import Operations.*;

import java.util.Scanner;

public class AdminUser extends user{
    //重写用户父类中的menu方法
    public int menu(){
        System.out.println("hello "+"欢迎"+this.ID+": "+this.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);
        int choice=scanner.nextInt();
        return choice;
    }


    public AdminUser(String name,String ID) {
        this.ID=ID;
        this.name=name;
        //初始化从父类user中继承的operation数组
        //这一步起到了十分关键的作用,提供了不同用户身份的不同操作方法
        this.operations=new Ioperations[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeletOperation(),
                new DisplayOperation()

        };
    }
    /**
     * 通过菜单中返回的选项,调用相对应下标的接口数组对象的work方法
     * @param choice 用户从菜单中选择的选项
     * @param bookList 要操作的书架对象
     */
    public void doWork(int choice, bookList bookList){
        this.operations[choice].work(bookList);
    }
}

4.操作方法包

操作方法公共接口(Ioperations)

package Operations;
import Book.bookList;

//定义一个操作接口(规范对书架对象的操作)
public interface Ioperations {
    //通过其他操作类对该抽象方法进行重写
    void work(bookList bookList);
}

新增图书类(AddOperation)

package Operations;
import Book.book;
import Book.bookList;
import java.util.Scanner;

//定义新增书籍操作这个类重写实现接口中的work抽象方法
public class AddOperation implements Ioperations{
    @Override
    public void work(bookList booklist) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入书名");
        String name=scanner.nextLine();
        System.out.println("请输入作者");
        String auther=scanner.nextLine();
        System.out.println("请输入价格");
        double price=scanner.nextDouble();
        System.out.println("请输入书籍的分类");
        String style=scanner.nextLine();
        book book=new book(name,auther,price,style);
        int pos=booklist.getUseMount();
        booklist.setBooks(pos,book);
        System.out.println("添加书籍成功");
    }
}

借阅图书类(BorrowOperation)

import Book.book;
import Book.bookList;
import java.util.Scanner;
//定义借阅书籍操作这个类重写实现接口中的work抽象方法
public class BorrowOperation implements Ioperations{
    @Override
    public void work(bookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要借阅书籍的名字");
        String name=scanner.nextLine();
        int i=0;
        //用遍历的方式查询书架中是否存在输入的书名
        for (;i <bookList.getUseMount(); i++) {
            //用bookList已写的方法获取下标为i的书对象
            book book=bookList.getBooks(i);
            if(book.getName().equals(name)&&book.getIsBorrowed()==false){
                bookList.getBooks(i).setBorrowed(true);
                System.out.println("当前图书状态"+book);
                System.out.println("借阅书籍成功");
                return;
            }else if(book.getName().equals(name)&&book.getIsBorrowed()==true)
                System.out.println("很抱歉,该书已被借出了,请选择其他书籍");
            return;
        }

        System.out.println("抱歉该书不存在");
    }
}

删除图书类(DeletOperation)

import Book.book;
import Book.bookList;

import java.util.Scanner;

public class DeletOperation implements Ioperations{
    @Override
    public void work(bookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要删除的书名");
        String name=scanner.nextLine();
        //用遍历的方式查询书架中是否存在输入的书名
        int i=0;
        int used=bookList.getUseMount();
        for (;i <used; i++) {
            //用bookList已写的方法获取下标为i的书对象
            book book=bookList.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("该书找到了");
                System.out.println(book);
                for (int j = i; j < bookList.getUseMount()-1; j++) {
                    bookList.setBooks(i,bookList.getBooks(i+1));
                }
                //将书架中的书籍数减少1
                bookList.setUseMount(used-1);
                System.out.println("删除书籍成功");

                return;
            }
        }

        System.out.println("抱歉该书不存在");
    }
}

展示图书类(DisplayOperation)

package Operations;

import Book.book;
import Book.bookList;
//定义展示书籍操作这个类重写实现接口中的work抽象方法
public class DisplayOperation implements Ioperations{
    @Override
    public void work(bookList bookList) {
        //获取当前书架中书的总数量
        int used=bookList.getUseMount();
        //遍历打印所有书籍
        System.out.println("所有书籍列表如下");
        for (int i=0; i <used ; i++) {
            book book=bookList.getBooks(i);
            System.out.println(book);
        }

    }
}

归还图书类(ReturnOperation)

package Operations;

import Book.book;
import Book.bookList;

import java.util.Scanner;
//定义归还书籍操作这个类重写实现接口中的work抽象方法
public class ReturnOperation implements Ioperations {
    @Override
    public void work(bookList bookList) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还书籍的名字");
        String name = scanner.nextLine();
        int i = 0;
        //用遍历的方式查询书架中是否存在输入的书名
        for (; i < bookList.getUseMount(); i++) {
            //用bookList已写的方法获取下标为i的书对象
            book book = bookList.getBooks(i);
            if (book.getName().equals(name)) {
                //将该书的借阅状态设置为false
                bookList.getBooks(i).setBorrowed(false);
                System.out.println("当前图书状态"+book);
                System.out.println("归还书籍成功");
                return;
            }
        }
    }
}

退出系统类(ExitOperation)

package Operations;
import Book.bookList;

//定义退出图书系统操作这个类重写实现接口中的work抽象方法
public class ExitOperation implements Ioperations{
    @Override
    public void work(bookList bookList) {
        //有可能  需要销毁,或者使用到 这个数组当中的所有的数据

        int used=bookList.getUseMount();
        for (int i = 0; i < used; i++) {
            bookList.setBooks(i,null);
        }
        System.out.println("已退出大熊猫图书系统!");
        System.exit(0);
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值