(女朋友看了也会的)一个简单的控制台版本的图书管理系统

简单介绍

这是一个简易的,控制台版本的图书馆管理系统,支持了不同身份的登录,及不同身份对对书籍的相关操作。在使用Java语言方面主要展示了对象的创建使用,还有,多态,抽象类,抽象方法,接口,继承,顺序表等的使用,让你对Java的封装多态继承的三大特性有更加深刻的理解。

需求分析

1.简单的登陆(普通用户)
2. 普通用户支持的操作
a)查询书籍(给定书名查看书籍是否存在)
b)借书
c)还书
d)退出

3.管理员支持的操作
a)查询书籍
b)增加书籍
c)删除书籍
d)打印所有书籍列表
e)退出
在这里插入图片描述

代码实现

============================================

整体流程:
1,程序启动,登录系统并创建用户
2,循环调用 用户中的menu方法,提示用户输入选项
3,根据选项调用都doAction方法,执行到对应得Action中得 逻辑
4,根据Action中的work方法完成最后的操作

========================================
在Idea中创建的项目的包
在这里插入图片描述

==========================================
action包中的类(相关动作的类)


//首先定义一个IAction接口,内部实现一个work方法,用来对书籍进行操作,所有动作都实现这个接口即可
package java_04_16_library.action;

import java_04_16_library.book.BookList;

 public interface IAction {
    void work(BookList bookList);
}
// AddAction 新增图书的操作
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;


import java.util.Scanner;

public class AddAction implements IAction {
    @Override
    public void work(BookList bookList) {
        System.out.println("执行新增操作!");
        System.out.println("新增一本图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书籍的名字");
        String name = scanner.next();
        System.out.println("请输入作者");
        String author = scanner.next();
        System.out.println("请输入价格");
        int price = scanner.nextInt();
        System.out.println("请输入书的类型");
        String type = scanner.next();
        //借出状态默认为未借出
        Book book = new Book(name,author,price,type,false);
        //把这个对象尾插到BookList中
        int size = bookList.getSize();  //先获取到书籍顺序表的长度
        bookList.setBook(size, book);  //在size位插入图书
        bookList.setSize(size+1);  //执行完长度加一
        System.out.println("新增图书成功");
    }
}
//BorrowAction(借书操作)
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;

import java.util.Scanner;

public class BorrowAction implements IAction{
    @Override
    public void work(BookList bookList) {
        System.out.println("执行借书操作");
        System.out.println("请输入你要借的书籍的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        //先找到借的书,再把书的状态改为借出即可
        for (int i = 0; i < bookList.getSize() ; i++) {
            Book book = bookList.getBook(i); 
            if(book.getName().equals(name)){
                if (book.isBorrowed()){   //如果书已经借出,直接返回
                    continue;
                } else {
                    book.setBorrowed(true);
                    System.out.println("借书成功");
                    return;
                }
            }
        }
       //可能书籍不存在或者已经借出
        System.out.println("借书失败,没有匹配的书籍");
    }
}
//DelAction(删除书籍操作)
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;

import java.util.Scanner;

public class DelAction implements IAction{
    @Override
    public void work(BookList bookList) {
        System.out.println("执行删除操作");
        System.out.println("请输入要删除书籍的名字");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        //先找到书籍对应的位置
        int i = 0;
        for (; i < bookList.getSize() ; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){   //找到了直接退出
                break;
            }
        }
        //循环借书后
        if (i >= bookList.getSize()){
            System.out.println("删除失败,没有找到对应的书籍");
        }
        //循环结束后i的位置就是要删除书籍的位置
        //顺序表中,删除尾部元素最简单,size--即可,中间元素涉及到搬运
        //所以为了简便,我们将转换为尾删
        //只需要将末尾元素插到i位置,最后将末尾元素删除
        int size = bookList.getSize();
        bookList.setBook(i,bookList.getBook(size-1));
        bookList.setSize(size-1);
    }
}
//DisplayAction(打印书籍列表操作)
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;

public class DisplayAction implements IAction {
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i <bookList.getSize();  i++) {
            Book book = bookList.getBook(i);
            System.out.println(book);  //直接循环访问书籍顺序表输出书籍即可
        }
    }
}
//ExitAction(退出操作)
package java_04_16_library.action;

import java_04_16_library.book.BookList;

public class ExitAction implements IAction {
    @Override
    public void work(BookList bookList) {
        System.out.println("Good Bye"); 
        System.exit(0); //调用System.exit
    }
}
//FindAction(查找操作)
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;

import java.util.Scanner;

public class FindAction implements IAction {
    @Override
    public void work(BookList bookList) {
     //执行查找操作
    //根据名字来找到对应的书籍信息
        System.out.println("请输入要查找的书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        int i = 0;
        for ( ; i < bookList.getSize(); i++) { //遍历书籍顺序表,如果找到名字相同的书籍,就输出
            Book  book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
            }
        }
        //当循环借书没有找到,就输出不存在提醒
        if(i >= bookList.getSize()){
            System.out.println("对不起,您要查找的图书不存在");
        }
    }
}
//ReturnAction(还书操作)
package java_04_16_library.action;

import java_04_16_library.book.Book;
import java_04_16_library.book.BookList;

import java.util.Scanner;

public class ReturnAction implements IAction {
    @Override
    public void work(BookList bookList) {
        System.out.println("执行还书操作");
        System.out.println("请输入你要还的书的书的名字");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        for (int i = 0; i < bookList.getSize() ; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){  //先遍历书籍顺序表找到对应的图书
               if (book.isBorrowed()){  //
                   book.setBorrowed(false);  //将该图书的借出状态改为false表示未借出
                   System.out.println("还书成功");//并提示还书成功
                   return;
               }
            }
        }
        //如果循环结束表示还书失败,一种原因是没有相应图书(名字不匹配),
        // 第二种是图书没被借出,所以无法还书
        Syst=em.out.=println("还书失败");
    }
}

===========================================

book包中的类

//Book(图书类(关于图书的基本属性的定义及方法实现)
package java_04_16_library.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, boolean isBorrowed) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrowed = isBorrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }

    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;
    }
}
//BookList(书籍顺序表的类(将图书用链表来组织,方便操作)
package java_04_16_library.book;
//用来表示多本书
public class BookList {
    //相当于顺序表
    private Book[] books = new Book[100];
    //数组中的有效元素的个数
    private int size = 0 ;
    public BookList() {
        //先默认加几个数据进去,方便后面测试
        books[0] = new Book("三国演义","罗贯中",100,"古典名著",false);
        books[1] = new Book("西游记","吴承",120,"古典名著",false);
        books[2] = new Book("斗破苍穹","天蚕土豆",80,"玄幻小说",false);
        size = 3;
    }
    public Book getBook(int pos){  //获取书籍
        return  books[pos];
    }
    public void setBook(int pos , Book book ){  //插入书籍
        books[pos] = book;
    }
    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

===========================================
user包中的类

//写一个抽象的User父类,再去写他的子类(普通用户的类和管理员得类)
package java_04_16_library.user;

import java_04_16_library.action.IAction;
import java_04_16_library.book.BookList;

//User并不需要创建实例,真正需要创建的是NormalUser和Admin
abstract public  class User {
       protected String name;
       //当前用户都支持那些操作
       protected IAction[] actions;
       //打印一个命令行菜单
       //由于普通用户和管理员支持的操作不同,交互的菜单也就不同
       //就需要普通用户和管理员中各自实现各自的菜单
       abstract  public int menu();
       //还需要一个公共的每种用户都需要的方法
       public void  doAction(int choice, BookList bookList){
          //choice就是用户通过命令行菜单输入的选项
              //根据输入选项在数组中选择合适的对象来进行操作
              actions[choice].work(bookList);
       }
}
//Normaluser(普通用户的类)
package java_04_16_library.user;

import java_04_16_library.action.*;

import java.util.Scanner;

public class Normaluser extends User {

    public Normaluser(String name) {
        this.name = name;
        this.actions =  new IAction[]{
              new ExitAction(),
              new FindAction(),
              new BorrowAction(),
              new ReturnAction()
        };
     }
    @Override
    public int menu() {
        System.out.println("============================");
        //用户输入的选项和下标要匹配
        System.out.println("欢迎使用" + this.name + "该图书馆管理系统" );
        System.out.println("1:查找书籍");
        System.out.println("2:借书");
        System.out.println("3:还书");
        System.out.println("0:退出");
        System.out.println("============================");
        System.out.println("请输入你的选择");
        int choice = 0;
        Scanner scanner = new Scanner(System.in);
        choice = scanner.nextInt();
        return choice;
    }
}
//Admin(管理员的类)
package java_04_16_library.user;

import java_04_16_library.action.*;

import java.util.Scanner;


public class Admin extends User {
    public Admin(String name) {
        this.name = name;
        this.actions = new IAction[]{
                new ExitAction(),
                new FindAction(),
                new AddAction(),
                new DelAction(),
                new DisplayAction()
        };
    }
    @Override
    public int menu() {
        System.out.println("===============================");
        System.out.println("欢迎" + 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("===============================");
        System.out.println("请输入你的选择");
        int choice = 0;
        Scanner scanner = new Scanner(System.in);
        choice = scanner.nextInt();
        return choice;
    }
}

运行结果展示

1.登录界面
在这里插入图片描述
2.管理员登录在这里插入图片描述
3,管理员的一个操作
在这里插入图片描述4,普通用户登录

在这里插入图片描述
5,普通用户的一个操作
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值