【Java】图书借阅系统

17 篇文章 0 订阅

目录

一、系统介绍

1、书籍类包:Books

2、用户类包:Users

3、操作类包:Operations

二、书籍类包 Books

1、Book类

2、BookShelf类

三、用户类包 Users

1、抽象用户类 User

 2、普通用户类 CommonUser

3、管理员类Administrator

四、主函数

五、操作类包 Operations

1、operation接口

2、ExitSystem 退出系统类

3、SearchBook 查找图书类

4、LendBook 借阅图书类

 5、ReturnBook 归还图书类

6、QueryBook 查询图书类

 7、AddBook 增加图书类

 8、DeleteBook 删除图书类


一、系统介绍

在学完Java基本语法后,我们来实现一个简单的图书借阅系统。

首先对系统进行需求分析,我们将要实现的类分为以下三个种类。每一个种类定义一个包。

1、书籍类包:Books

我们定义下面两个类,分别对单一的图书和整个图书书架进行管理

  • Book
  • BookShelf

2、用户类包:Users

系统中的角色有三类,分别为

  • 抽象用户类:User
  • 普通用户:CommonUser
  • 管理员用户:Administrator

这两类用户所能使用的系统功能是不同的 

3、操作类包:Operations

其中普通用户所实现的功能操作如下:

  • 查找图书
  • 借阅图书
  • 归还图书
  • 退出系统 

管理员用户所实现的功能操作如下:

  • 查询图书
  • 增加图书
  • 删除图书
  • 退出系统 

定义好包和类别后的目录状态应如下:

 

二、书籍类包 Books

在对系统进行完需求分析后,我们开始着手写每一个类。第一个类,我们可以先定义书籍类

1、Book类

这个类用于对单本书的信息进行操作。对于单本书籍的基本信息,我们可以定义以下几种:

name(书名),author(作者),price(),flag(借阅状态)

(1)其中前三种都是书籍常见的信息,而最后一种借阅状态flag将用于书籍的借阅归还操作。false表示“未借阅”,true表示“已经借阅”。

在构造方法中,我们使falg默认状态为false,即“未借阅”。

Books类完整代码如下:

package Books;

public class Book {
    private String name;
    private String author;
    private int price;
    private boolean flag;

    public Book(){
    }
    public Book(String name,String author,int price) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.flag = false;
    }

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

    public String getName() {
        return 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 boolean getFlag(){
        return this.flag;
    }

    public void setFlag(boolean status){
        this.flag = status;
    }

    @Override
    public String toString() {
        return "Book{" +
                    "书名:" + name +
                    ", 作者:" + author +
                    ", 价格:" + price +
                    ", 借阅状态:" + (flag?"已借出":"未借出") +
                    '}';
    }
}

(2)在上述代码里,我们不仅对定义的几个成员变量分别写出了set和get方法,值得注意的是,我们还重新定义了toString()方法,方便书籍的打印。

(重写某个类的toString方法,在其他代码中调用System.out.println(类名)方法时,打印出的不再是类的地址,而是我们在toString()方法中重写的内容)

并且打印借阅状态时,我们用了三目运算符来表明借阅状态,让打印效果直观。

2、BookShelf类

 这个类主要用于存放多本图书。我们定义了两个成员变量,分别为:

usedSize(已存放书籍数量),books[5](书籍数组)

(1)usedSize表明当前书架存放了多少本书,类型为int

(2)books[]数组用Book类类型的数组表示当前书架所存放的所有书,这里5代表了书架能存放的最多书籍数量

完整代码如下: 

package Books;

public class BookShelf {
    public Book[] books = new Book[5];
    int usedSize;

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

    public int getUsedSize() {
        return usedSize;
    }
}

三、用户类包 Users

1、抽象用户类 User

User类用作普通用户类和管理员用户类的父类,定义了成员变量name作为用户名字,抽象方法menu来打印菜单,抽象方法operation来进行用户操作

其中operation()方法是传入的形参为书架bookShelf,用户做出的选择choice。本方法是用来连通Users包、Operations包、Books包三个包里的类的桥梁。

在main方法定义好的Bookshelf通过用户operation()方法的调用,传入不用的操作方法中

完整代码如下:

package Users;

import Books.BookShelf;
import Operations.Operation;

public abstract class User {
    String name;

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

    public abstract void menu();

    public abstract void operations(BookShelf bookShelf,int choice);
}

 2、普通用户类 CommonUser

CommonUser是普通用户类,该类的功能菜单有:

查找图书(查找单本图书)、借阅图书、归还图书和退出系统

(1)menu()方法用于打印功能 菜单

(2)该类定一个一个operations数组,用以存放属于普通用户类的功能类。当用户输入某项选择时,重写的operations方法则运行该项对应类中的方法。

完整代码如下: 

package Users;

import Books.BookShelf;
import Operations.*;

public class CommonUser extends User{
    public Operation[] operations = new Operation[]{new SearchBook(), new LendBook(),new ReturnBook(),new ExitSystem()};
    public CommonUser(){
    }
    public CommonUser(String name){
        super(name);
        this.name = name;
    }

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

    public String getName(){
        return this.name;
    }
    @Override
    public void menu() {
        System.out.println("--------普通用户菜单--------");
        System.out.println("--------1、查找图书---------");
        System.out.println("--------2、借阅图书---------");
        System.out.println("--------3、归还图书---------");
        System.out.println("--------4、退出系统---------");
    }

    @Override
    public void operations(BookShelf bookShelf,int choice) {
        operations[choice - 1].work(bookShelf);
    }
}

3、管理员类Administrator

 管理员类原理与普通用户类相同,这里不再赘述

代码如下:

package Users;

import Books.BookShelf;
import Operations.*;

public class Administrator extends User{
    public Operation[] operations = new Operation[]{new QueryBook(), new AddBook(),new DeleteBook(),new ExitSystem()};

    public Administrator(){
        super();
    }
    public Administrator(String name){
        super(name);
        this.name = name;
    }

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

    public String getName(){
        return this.name;
    }
    @Override
    public void menu() {
        System.out.println("---------管理员菜单---------");
        System.out.println("--------1、查询图书---------");
        System.out.println("--------2、增加图书---------");
        System.out.println("--------3、删除图书---------");
        System.out.println("--------4、退出系统---------");
    }

    @Override
    public void operations(BookShelf bookShelf, int choice) {
        operations[choice - 1].work(bookShelf);
    }
}

四、主函数

在写好书籍类、用户类和操作类主要框架后,我们先先实现主函数,最后再对操作类包进行补充。

(1)在主函数中,我们实现一个BookShelf类,并对BookShelf中的books[ ]数组进行初始化

(2)随后我们在Main类中,书写了一个login()方法,来进行用户登录。

用户输入姓名name和身份选项后,我们根据用户所输入的身份选项,分别返回创建的CommonUser类对象或Administrator对象,用向上转型实现了登录技术,以便之后使用多态进行菜单打印和操作实现。

(3)在进行用户登录后,写一个while循环来反复进行打印和功能实现

代码如下: 

import Books.Book;
import Books.BookShelf;
import Users.Administrator;
import Users.CommonUser;
import Users.User;

import java.util.Scanner;

public class Main {
    public static User login(){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = input.nextLine();
        System.out.println("--------请选择身份:》------");
        System.out.println("--------1、普通用户--------");
        System.out.println("--------2、管理员----------");
        int choice = input.nextInt();
        if(choice == 1){
            return new CommonUser(name);
        }else {
            return new Administrator(name);
        }
    }

    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf();
        bookShelf.books[0] = new Book("《呼啸山庄》","艾米莉·勃朗特",20);
        bookShelf.books[1] = new Book("《红楼梦》","曹雪芹",56);
        bookShelf.books[2] = new Book("《长安之春》","石田千之助",25);
        bookShelf.setUsedSize(3);

        User user = login();
        while (true){
            user.menu();

            Scanner scanner = new Scanner(System.in);
            int choice = scanner.nextInt();
            user.operations(bookShelf,choice);
        }

    }
}

五、操作类包 Operations

下面就来到功能最复杂、代码量最多的操作类包。包里的每一个类都对接口Operation中的work()方法进行了重写。

我们将对这里面的类进行一一讲解。

1、operation接口

由于所有的操作类都要实现操作方法,因此我们定义一个接口operation由各个操作类来继承。

操作类中有抽象方法work(),需要继承的类都对这个方法进行重写。

package Operations;

import Books.BookShelf;

public interface Operation {
    void work(BookShelf bookShelf);
}

2、ExitSystem 退出系统类

该类是所有操作类中书写最简单的一个类,并且是普通用户和管理员用户都会调用的类。

直接调用系统的exit()方法,传入参数为0即可

package Operations;

import Books.BookShelf;

public class ExitSystem implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        System.exit(0);
    }
}

3、SearchBook 查找图书类

该类属于普通用户功能类,提供给普通用户用以查找单本书籍的信息。

既然是查找单本图书信息,那么我们用一个for循环将输入书名与已有书名进行匹配即可:

当找到匹配的书名后,我们对该书信息进行打印,并且用return结束循环;若没有找到该书,循环结束后会自动打印“未能找到该书”

package Operations;

import Books.BookShelf;

import java.util.Scanner;

public class SearchBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要查找的书籍名字:");
        String bookname = input.nextLine();
        for (int i = 0; i < bookShelf.getUsedSize(); i++) {
            if(bookname.equals(bookShelf.books[i].getName())){
                    System.out.println(bookShelf.books[i]);
                    return;
            }
        }
        System.out.println("未能找到该书");
    }
}

该功能运行截图如下

4、LendBook 借阅图书类

该类属于普通用户类的功能类,用以给普通用户借阅图书。

(1)在该类重写的work方法中,我们先根据书名对要借阅的书籍进行查找

(2)找到该书后,检查该书的flag状态,若为false则表明该书尚未借出,我们打印“借阅成功”,并将该书的借阅标志flag置为true,表明这本书现在已借出

(3)若找到该书后flag标志为false则表示该书原来已借出,不能再次进行借阅,我们输出“该书已借出,借阅失败!”

(4)若没有找到该书,循环结束后自动打印“未找到该书”

package Operations;

import Books.BookShelf;

import java.util.Scanner;

public class LendBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要借阅的书籍名字:");
        String bookname = input.nextLine();
        for (int i = 0; i < bookShelf.getUsedSize(); i++) {
            if(bookname.equals(bookShelf.books[i].getName())){
                if(bookShelf.books[i].getFlag() == false){
                    bookShelf.books[i].setFlag(true);
                    System.out.println("借阅成功!");
                    return;
                }else {
                    System.out.println("该书已借出,借阅失败");
                    return;
                }
            }
        }
        System.out.println("未找到该书");
    }
}

该类调用结果如图:

 

 5、ReturnBook 归还图书类

归还图书类同样属于普通用户类的功能类,用以给普通用户归还图书,与LendBook配套使用。

该类原理与LendBook类原理相同,不再赘述

package Operations;

import Books.BookShelf;

import java.util.Scanner;

public class ReturnBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要归还的书籍名字:");
        String bookname = input.nextLine();
        for (int i = 0; i < bookShelf.books.length; i++) {
            if(bookname.equals(bookShelf.books[i].getName())){
                bookShelf.books[i].setFlag(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("未能找到该书");
    }
}

实现结果如下

6、QueryBook 查询图书类

该类属于管理员用户的功能类,用以查询全部图书信息。

实现原理便是一一打印所有图书的信息。由于我们前面重写了toString()方法,因此我们打印的结果可以显示我们想要的效果

package Operations;

import Books.BookShelf;

public class QueryBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        for (int i = 0; i < bookShelf.getUsedSize(); i++) {
            System.out.println(bookShelf.books[i]);
        }
    }
}

 结果如下

 7、AddBook 增加图书类

该类也属于管理员用户的功能类。注意的是,在创建新的book对象前,要判断BookShelf是否已经放满,如果usedSize大小与books[]长度相等,那么不再进行存放

package Operations;

import Books.Book;
import Books.BookShelf;

import java.util.Scanner;

public class AddBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        int usedSize = bookShelf.getUsedSize();
        Scanner input = new Scanner(System.in);
        if(usedSize < bookShelf.books.length){
            bookShelf.books[usedSize] = new Book();
            System.out.println("请输入书名:");
            String name = input.nextLine();
            bookShelf.books[usedSize].setName(name);
            System.out.println("请输入作者:");
            String author = input.nextLine();
            bookShelf.books[usedSize].setAuthor(author);
            System.out.println("请输入价格:");
            int price = input.nextInt();
            bookShelf.books[usedSize].setPrice(price);
            bookShelf.setUsedSize(usedSize + 1);
            bookShelf.books[usedSize].setFlag(false);
        }else {
            System.out.println("书架满了");
        }
    }
}

 8、DeleteBook 删除图书类

删除图书类也是属于管理员用户的功能类。

实现删除图书可以用到线性表的知识,让一个线性表中的数据依次前移,从而覆盖要删除的数据。

原理如图:

注意:线性表最后一个数据不进行覆盖,而是直接置为null。因此,下面代码的for循环中,下标i最大到usedSize-2,而不是usedSize-1

package Operations;

import Books.BookShelf;

import java.util.Scanner;

public class DeleteBook implements Operation{
    @Override
    public void work(BookShelf bookShelf) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要删除的书籍名字:");
        String bookname = input.nextLine();
        int num = 0;
        int i = 0;
        int uesdSize = bookShelf.getUsedSize();
        for (; i < uesdSize; i++) {
            if(bookname.equals(bookShelf.books[i].getName())){
                num = i;
                break;
            }
        }
        if (i == bookShelf.getUsedSize()){
            System.out.println("没有找到要删除的书");
        }
        for (i = num; i < uesdSize-1; i++) {
            bookShelf.books[i] = bookShelf.books[i+1];
        }
        bookShelf.books[uesdSize-1] = null;
        bookShelf.setUsedSize(uesdSize-1);
        //使书架中已有的书籍数量减一
    }
}

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
图书借阅管理系统是一个非常常见的应用系统,它主要用于对图书馆内的图书进行管理,并支持用户借阅、还书、预定等操作。下面我将为你介绍基于Java实现的图书借阅管理系统的设计与实现。 1. 系统需求分析 在设计图书借阅管理系统之前,首先需要对系统进行需求分析,明确系统所需要实现的功能和特点。根据图书馆的实际需求,我们可以列出以下系统功能模块: - 图书管理:包括图书分类、图书信息录入、图书查询、图书借阅图书归还等操作。 - 用户管理:包括用户注册、用户登录、用户信息修改等操作。 - 借阅管理:包括借阅记录的查询、借阅时间的管理、借阅数量的限制等操作。 - 系统管理:包括系统管理员的账号管理、系统日志管理等操作。 2. 系统设计 在需求分析之后,我们可以开始进行系统设计,包括数据库设计、系统架构设计、模块设计等。下面是系统设计的主要内容: - 数据库设计:系统需要使用数据库来存储图书信息、用户信息、借阅信息等数据。可以使用MySQL等关系型数据库进行设计。 - 系统架构设计:系统采用B/S架构,前端使用HTML、CSS、JavaScript等技术实现,后端使用Java语言编写。 - 模块设计:根据需求分析的结果,可以将系统划分为多个模块,包括图书管理模块、用户管理模块、借阅管理模块、系统管理模块等。 3. 系统实现 在系统设计完成之后,可以开始进行系统实现。下面是系统实现的主要步骤: - 前端实现:使用HTML、CSS、JavaScript等技术实现系统的前端界面,包括登录页面、注册页面、图书管理页面、用户管理页面、借阅管理页面等。 - 后端实现:使用Java编写系统的后端代码,包括数据库连接、数据操作、业务逻辑处理等。 - 数据库实现:根据数据库设计的结果,使用MySQL等关系型数据库来存储系统的数据。 4. 系统测试 在系统实现之后,需要进行系统测试,确保系统能够正常运行,并满足需求分析中列出的各项功能模块的要求。系统测试主要包括单元测试、集成测试、系统测试等。 5. 系统维护 在系统测试通过之后,可以正式发布系统,并对系统进行维护和更新。系统维护包括对系统漏洞的修复、功能的升级、性能的优化等。 以上就是基于Java实现的图书借阅管理系统的设计与实现的基本流程。在实际开发中,需要结合具体的需求和技术实现进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙河板混

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值