Java——图书管理系统

简介: 该文档详细介绍了一个图书管理系统的设计与实现。系统包含普通用户和管理员两种角色,通过书架操作图书,如添加、查找、借阅、归还及删除图书等功能。文档展示了各个功能的具体代码实现,并使用继承和接口等方式优化了系统结构。通过多态技术实现了不同用户角色调用相应功能。整体设计清晰,逻辑严谨,便于理解和实现。

🍁1. 功能演示

用户分为普通用户和管理员,登录进系统之后可以对图书进行一系列操作,此时我们要明白,对图书的操作是通过书架来执行的,我们平常在图书馆上借书就是在书架上

🍁2. 类的创建

🍁2.3 创建图书类

来创建图书类,对图书的属性进行封装,并写上对应的get和set 方法

private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;
    public Book() {
    }
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    /······get set toString······/

🍁2.4 创建书架类

创建书架的类,书架上肯定不止一本书,所以这里选择数组来存储多个book对象,因为在一开始就有了一部分书,所以在创建书架的对象时,就要把图书的对象放进去

public class BookList {
    private Book[] books = new Book[10];//用到了组合
    private int usedSize = 0;//实际放的数量
    public BookList() {
        //创建对象之后就已经有了三本书
        books[0] = new Book("三国演义", "罗贯中", 20,"小说");
        books[1] = new Book("西游记", "吴承恩", 30,"小说");
        books[2] = new Book("红楼梦", "曹雪芹", 20,"小说");
        usedSize = 3;
    }
}

🍁2.5 创建用户类

接着创建用户,而用户又分为普通用户和管理员,就可以通过继承来实现这种关系,这两种用户的菜单也不相同,就可以抽取出来,在子类进行重写

public abstract class User {
    //不同包的子类可以访问
    protected String name;
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
}

来看menu方法的实现

之后就可以在Main类里面以多态的方式,根据不同的对象调取不同的菜单

public class Main {
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = sc.nextLine();
        System.out.println("请输入身份:1.管理员 2. 普通用户");
        int choice = sc.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();
    }
}

🍁3. 功能的实现

菜单里的操作可以通过接口来实现这个业务逻辑,

public interface IOPeration {
    void work(BookList bookList);
}

例如添加图书,直接去实现一个操作接口,具体的逻辑再在本类中进行重写

public class AddOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
    }
}

之后创建各种功能的接口

那么有了这些操作该怎么调用呢,无论时普通用户还是管理员,都是用户在操作,所以要在父类User中创建接口数组,再调用具体的方法实现操作

捋一下现在的逻辑

🍁4. 功能完善

下面是一个基本框架,包含了显示图书、查找图书、新增图书、借阅图书、归还图书和删除图书的功能。

🍁4.1 显示图书


  • 功能描述:展示当前系统中所有图书的列表,包括图书的书名、作者、价格,类型以及借阅状态(是否已借出)。


  • 实现要点:遍历图书数据集合,按一定格式(如表格)输出图书信息。

因为之前book是用数组存在BookList中的,所以只要遍历数组就可以了

BookList中要提供对应的get,set方法:

public int getUsedSize() {
        return usedSize;
    }
    public Book getBook(int pos) {
        return books[pos];
    }
    public void setBook(int pos, Book book) {
        this.books[pos] = book;
    }

显示图书:

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        for(int i= 0;i < currentSize;i++){
            System.out.println(bookList.getBook(i));//输出当前书架上的所有书籍信息
        }
    }
}

🍁4.2 查找图书


  • 功能描述:根据用户输入的关键字(书名)查找并显示匹配的图书信息。


  • 实现要点:遍历图书数据集合,匹配用户输入的关键字,返回匹配的图书列表。

明白了怎么遍历之后,查找图书就非常简单了

public class FindOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入查找的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

🍁4.3 新增图书


  • 功能描述:允许用户输入新的图书信息(书名,类型,价格等),并将其添加到系统中。


  • 实现要点:接收用户输入,验证输入的有效性,然后将新图书信息添加到图书数据集合中。

新增图书时需要注意及时的更新书架的信息,如果书架满了的话就需要提示书架已满,添加之后要记得更改currentSize

public class AddOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        if(currentSize == bookList.getBooks().length){
            System.out.println("书架已满,无法添加");
            return;
        }
        System.out.println("添加图书");
        System.out.println("请输入书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入价格:");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入类型:");
        String type = scanner.nextLine();
        Book book = new Book(name, author, price, type);
        //添加图书
        bookList.setBook(currentSize, book);
        bookList.setUsedSize(currentSize + 1);
        System.out.println("添加成功");
    }
}

🍁4.4 借阅图书


  • 功能描述:允许用户根据图书名字借阅图书,更新图书的借阅状态。


  • 实现要点:首先检查图书是否存在且当前未被借出,然后更新图书的借阅状态为已借出,并记录借阅信息(如借阅人、借阅时间)。

借阅图书首先需要在书架上找到这本书才能借阅,所以就需要对书架进行遍历,并查看书的状态,借阅之后也需要及时的更新书架信息,还有书籍的状态

public class BorrowOperation implements IOPeration{
    public void work(BookList bookList) {
        System.out.println("请输入借阅的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //判断是否借出
                if(book.isBorrowed()){
                    System.out.println("该图书已被借阅");
                    return;
                }
                //修改借阅状态
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

🍁4.5 归还图书


  • 功能描述:允许用户根据图书名称归还图书,更新图书的借阅状态。


  • 实现要点:检查图书是否已借出且归还的图书有效,然后更新图书的借阅状态为未借出,并记录归还信息(如归还时间)。

同理,归还图书时需要查看图书的状态,是否是已借出,归还之后也要及时修改图书的状态信息

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入归还的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //判断是否借出
                if (book.isBorrowed()) {
                    //修改借阅状态
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                }
            }
        }
        System.out.println("此书未被借出");
    }
}

🍁4.6 删除图书


  • 功能描述:允许用户根据图书ID删除图书,从系统中移除该图书信息。


  • 实现要点:检查图书是否存在,然后将其从图书数据集合中移除。注意,可能需要先检查图书是否已被借出,并提示用户处理借阅状态。

删除图书只需要把要删除的图书从书架上移除即可,由于是用顺序表存储的图书,所以当删除其中的一本书之后,这本书后面的图书都要往前移,并且如果查找不到删除的图书的信息,那么就需要给出提示

public class DeleteOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入删除的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int i = 0,pos = 0;
        int currentSize = bookList.getUsedSize();
        for(;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                pos = i;
                break;
            }
        }
        if(i == currentSize){
            System.out.println("没有找到该图书");
        }
        for(int j = pos;j < currentSize - 1;j++){
            Book book = bookList.getBook(j + 1);
            bookList.setBook(j,book);
        }
        bookList.setBook(currentSize - 1,null);
        //更新currentSize
        bookList.setUsedSize(currentSize - 1);
        System.out.println("删除成功");
    }
}


相关文章
|
3天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
29天前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19264 29
|
30天前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18803 20
|
29天前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17508 13
Apache Paimon V0.9最新进展
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18694 15
|
29天前
|
人工智能 自然语言处理 搜索推荐
评测:AI客服接入钉钉与微信的对比分析
【8月更文第22天】随着人工智能技术的发展,越来越多的企业开始尝试将AI客服集成到自己的业务流程中。本文将基于《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案,详细评测AI客服在钉钉和微信中的接入流程及实际应用效果,并结合个人体验分享一些心得。
9910 9
|
1月前
|
消息中间件 弹性计算 关系型数据库
函数计算驱动多媒体文件处理解决方案体验评测
从整体解读到部署体验,多方位带你了解如何利用函数计算驱动多媒体文件处理,告别资源瓶颈。
10441 13
|
23天前
|
存储 JSON Serverless
西游再现,函数计算一键部署 Flux 超写实文生图模型部署
参与体验活动生成西游人物图像,既有机会赢取好礼!本次实验在函数计算中内置了flux.1-dev-fp8大模型,通过函数计算+Serverless应用中心一键部署Flux模型,快速生成超写实图像。首次开通用户可领取免费试用额度,部署过程简单高效。完成部署后,您可以通过修改提示词生成各种风格的图像,体验Flux模型的强大绘图能力。
西游再现,函数计算一键部署 Flux 超写实文生图模型部署
|
1天前
|
Java 应用服务中间件 测试技术
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。 本文主要了解Maven基础知识及基础应用,旨在为之后的进一步学习奠定基础。 内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。 仅供参考。
127 80
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
|
1天前
|
缓存 前端开发 JavaScript
终极 Nginx 配置指南(全网最详细)
本文详细介绍了Nginx配置文件`nginx.conf`的基本结构及其优化方法。首先通过删除注释简化了原始配置,使其更易理解。接着,文章将`nginx.conf`分为全局块、events块和http块三部分进行详细解析,帮助读者更好地掌握其功能与配置。此外,还介绍了如何通过简单修改实现网站上线,并提供了Nginx的优化技巧,包括解决前端History模式下的404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离等。最后,附上了Nginx的基础命令,如安装、启动、重启和关闭等操作,方便读者实践应用。
129 77
终极 Nginx 配置指南(全网最详细)