Java实现命令行图书管理系统(附完整源码)

news2025/7/22 16:35:30

一、项目概述

本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员普通用户两种角色,提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则,代码结构清晰,适合Java初学者学习。

二、系统功能架构

graph TD
    A[图书管理系统] --> B[图书管理]
    A --> C[用户管理]
    B --> D[添加图书]
    B --> E[删除图书]
    B --> F[查找图书]
    B --> G[显示图书]
    B --> H[借阅归还]
    C --> I[管理员]
    C --> J[普通用户] 

三、核心类设计 

1. 图书类(Book)

属性: 

  • 书名

  • 作者

  • 价格

  • 类型

  • 借阅状态

 代码实现

package book_management.book;
// 关于具体书本的类
public class Book {
    private String bookName; //书名
    private String author; //作者
    private Double price; //价格
    private String type; //类别
    private Boolean isBorrowed; //借阅状态,false是未借出,true是借出

    public Book(String bookName, String author, Double price, String type) {
        this.bookName = bookName;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrowed = false;
    }

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

    public void setType(String type) {
        this.type = type;
    }

    public void setBorrowed(Boolean borrowed) {
        isBorrowed = borrowed;
    }

    public String getBookName() {
        return bookName;
    }

    public String getAuthor() {
        return author;
    }

    public Double getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }

    public Boolean getBorrowed() {
        return isBorrowed;
    }
}

2. 书架类(BookList)

 使用ArrayList管理图书集合:

public class BookList {
    //存放所有具体的书本对象 - 动态数据
    private final List<Book> books = new ArrayList<>();
    // 保存当前所有书本的名称 - 动态数据
    private final List<String> bookNames = new ArrayList<>();

    public BookList() {
        //在类加载时,将静态变量初始化,相当于图书馆中默认的藏书
        //四大名著作为默认书籍添加到图书馆中
        addBook(new Book("三国演义", "罗贯中", 83.5, "小说"));
        addBook(new Book("水浒传", "施耐庵", 65.5, "小说"));
        addBook(new Book("西游记", "吴承恩", 55.5, "小说"));
        addBook(new Book("红楼梦", "曹雪芹", 66.6, "小说"));

    }
    public void addBook(Book book) {
        books.add(book);
        bookNames.add(book.getBookName());
    }

    // 获取书籍数量
    public int getSize() {
        return books.size();
    }

    // 获取指定书籍
    public Book getBook(int index) {
        if (index >= 0 && index < books.size()) {
            return books.get(index);
        }
        return null;
    }

    // 添加删除方法
    public void removeBook(int index) {
        if (index >= 0 && index < books.size()) {
            String bookName = books.get(index).getBookName();
            books.remove(index);
            bookNames.remove(bookName);
        }
    }

    // 添加查找方法
    public int findBookIndex(String bookName) {
        for (int i = 0; i < books.size(); i++) {
            if (books.get(i).getBookName().equals(bookName)) {
                return i;
            }
        }
        return -1;
    }
}

3. 操作接口(IOperation) 

public interface IOperation {
    void work(BookList bookList, Scanner scanner);
}

四、功能实现

1. 查找图书(FindOperation) 

实现逻辑

  1. 接收用户输入的书名

  2. 遍历书架匹配图书

  3. 输出查找结果

核心代码

public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList, Scanner scanner) {
        System.out.println("============ 查找书籍 ============");

        // 清除可能存在的换行符
        scanner.nextLine();

        System.out.println("请输入书名:");
        String name = scanner.nextLine(); // 等待用户输入

        boolean found = false;
        for (int i = 0; i < bookList.getSize(); i++) {
            if (bookList.getBook(i).getBookName().equals(name)) {
                Book book = bookList.getBook(i);
                System.out.printf("找到书籍: 《%s》 作者:%s 价格:%.2f 类型:%s%n",
                        book.getBookName(),
                        book.getAuthor(),
                        book.getPrice(),
                        book.getType());
                found = true;
                break;
            }
        }

        if (!found) {
            System.out.println("未找到书籍: " + name);
        }
        System.out.println("================================");
        System.out.println("按回车键返回菜单...");
        scanner.nextLine(); // 等待用户按回车
    }
}

2. 借阅图书(BorrowOperation)

sequenceDiagram
    用户->>系统: 输入借阅书名
    系统->>书架: 查找图书
    书架-->>系统: 返回图书对象
    系统->>图书: 标记为已借阅
    系统-->>用户: 显示借阅结果 

代码片段

if (book.getBorrowed()) {
    System.out.println("该图书已被借出");
} else {
    book.setBorrowed(true);
    System.out.println("借阅成功");
}

3. 归还图书(ReturnOperation) 

界面截图

 代码片段

public void work(BookList bookList, Scanner scanner) {
        System.out.println("============ 归还书籍 ============");

        // 清除输入缓冲区
        scanner.nextLine();

        System.out.println("请输入要归还的书名:");
        String name = scanner.nextLine();

        boolean found = false;
        for (int i = 0; i < bookList.getSize(); i++) {
            Book book = bookList.getBook(i);
            if (book.getBookName().equals(name)) {
                if (book.getBorrowed()) {
                    book.setBorrowed(false);
                    System.out.println("归还成功!感谢您归还《" + name + "》");
                } else {
                    System.out.println("《" + name + "》未被借出,无需归还");
                }
                found = true;
                break;
            }
        }

        if (!found) {
            System.out.println("未找到书籍: " + name);
        }

五、用户系统设计

1. 用户基类(User)

public abstract class User {
    protected String userName;
    // 不同用户对应的权限,就在IOperation数组中
    protected IOperation[] operations;
    protected Scanner scanner;

    public User(String userName, Scanner scanner) {
        this.userName = userName;
        this.scanner = scanner;
    }

    // 根据用户的输入返回具体的操作编号
    //只有具体子类才知道菜单的功能是啥,强制要求所有具体子类必须实现此方法
    public abstract int menu();

    public void doOperation(int choice, BookList bookList) {
        if (choice > 0 && choice <= operations.length) {
            operations[choice - 1].work(bookList, scanner);
        } else if (choice != -1) {
            System.out.println("无效的选择!");
        }
    }
}

 2. 管理员(AdminUser)

功能菜单

  1. 新增图书

  2. 删除图书

  3. 查找图书

  4. 显示所有图书

  5. 退出系统

界面截图: 

代码片段: 

 public int menu() {
        System.out.println("===================================");
        System.out.println("欢迎管理员" + super.userName + "登录MB的图书管理系统");
        System.out.println("1.增加书籍");
        System.out.println("2.删除书籍");
        System.out.println("3.修改书籍");
        System.out.println("4.查询书籍");
        System.out.println("5.查看书籍列表");
        System.out.println("-1.退出");
        System.out.println("请输入你的选择");
        try {
            int choice = scanner.nextInt();
            scanner.nextLine();
            System.out.println("===================================");
            return choice;
        }catch (InputMismatchException e) {
            System.out.println("输入无效,请输入数字!");
            scanner.nextLine();
            return -2;
        }
    }
}

 3. 普通用户(NormalUser)

菜单实现代码

 public int menu() {
        System.out.println("===================================");
        System.out.println("欢迎用户" + super.userName + "登录MB的图书管理系统");
        System.out.println("1.显示书籍列表");
        System.out.println("2.查询书籍");
        System.out.println("3.借阅书籍");
        System.out.println("4.归还书籍");
        System.out.println("-1.退出");
        System.out.println("请输入你的选择");
        int choice = scanner.nextInt();
        scanner.nextLine();
        System.out.println("===================================");
        return choice;
    }
}

 六、主函数逻辑

程序启动流程

public class Main {
    public static void main(String[] args) {
        Scanner mainScanner = new Scanner(System.in);
        BookList bookList = new BookList();
        User user = login(mainScanner,bookList);

        while (true) {
            int choice = user.menu();
            if (choice == -1) {
                System.out.println("Bye ~~");
                break;
            }
            user.doOperation(choice, bookList);
        }
        mainScanner.close();
    }

    private static User login(Scanner scanner, BookList bookList) {
        System.out.println("请输入您的姓名 : ");
        String userName = scanner.nextLine();

        System.out.println("请输入您的身份,1表示普通用户,0表示管理员");
        int who = scanner.nextInt();

        if (who == 1) {
            return new NormalUser(userName, scanner);  // 1对应普通用户
        } else {
            return new AdminUser(userName, scanner,bookList);   // 0对应管理员
        }
    }
}

登录界面截图: 

七、项目总结

技术亮点

  1. 采用面向接口编程,操作解耦

  2. 使用继承实现多态用户系统

  3. 异常处理完善,避免程序崩溃

扩展方向

  • 添加数据库持久化存储

  • 实现图书预约功能

  • 增加借阅期限管理

完整源码获取 java_se_code: Mb's Library Management System

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】顺序表和链表详解(上)

前言&#xff1a;上期我们介绍了算法的复杂度&#xff0c;知道的算法的重要性同时也了解到了评判一个算法的好与坏就去看他的复杂度(主要看时间复杂度)&#xff0c;这一期我们就从顺序表和链表开始讲起。 文章目录 一&#xff0c;顺序表1&#xff0c;线性表2&#xff0c;顺序表…

唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!

在智能家居的浪潮中&#xff0c;门锁搭载显示屏已成为行业创新的焦点。据行业数据显示&#xff0c;2023年全球智能门锁出货量中&#xff0c;搭载显示屏的型号占比已突破40%&#xff0c;且年复合增长率达25%。而2024年国内智能门锁销量突破2200万套&#xff0c;预计2025年市场规…

智能穿戴新标杆:SD NAND (贴片式SD卡)与 SOC 如何定义 AI 眼镜未来技术路径

目录 一、SD NAND&#xff1a;智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片&#xff1a;AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC&#xff1a;11&#xff1e;2的协同效应数据流水线的高效协同端侧…

node_modules包下载不下来

如果项目里面的package-lock.json有resolved &#xff0c;就指向了包的下载来源&#xff0c;如果这个网址挂了&#xff0c;那npm i 就会一直卡着。而且&#xff0c;在终端去修改 npm的镜像是没有用的 解决办法是:把项目里面的 lock文件 .npmrc都删了 然后重新下载就可以了

yolo个人深入理解

卷积层的理解,通过云端服务器训练模型,模型构建的重要性,针对极低像素的处理,模型训练召回率提高技巧,卷积层2,4,8,16,32的小模型与大模型的理解 一.关于backbone,neck,head深入理解 1,backbone的主要组成部分是sppf和conv,这是backbone的核心,其中yolov5和yolov8…

从0开始学vue:Element Plus详解

一、核心架构解析二、技术实现指南三、高级特性实现四、性能优化方案五、生态扩展方案六、调试与测试七、版本演进路线 Element Plus 是专为 Vue 3 设计的桌面端 UI 组件库&#xff0c;基于 Vue 3 的 Composition API 重构&#xff0c;在保持与 Element UI 兼容性的同时&#x…

互联网向左,区块链向右

2008年&#xff0c;中本聪首次提出了比特币的设想&#xff0c;这打开了去中心化的大门。 比特币白皮书清晰的描述了去中心化支付的解决方案&#xff0c;并分别从以下几个方面阐述了他的理念&#xff1a; 一、由转账双方点对点的通讯&#xff0c;而不通过中心化的第三方&#xf…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾&#xff1a; 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3.cuda的检查 4.简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 …

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101&#xff08;13000多个视频&#xff09;和 HMDB-51&#xff08;7000多个视频&#xff09;数据集过小&#xff0c;提出了 Kinetics 数据集&#xff0c;并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM&#xff1a;使用2D CNN的好处是可以直接从 Ima…

vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?

用vscode编译uVision 项目只需要安装一个Keil Assistant插件&#xff0c;即可用vscode开发“keil 项目”。极大提高开发速度&#xff01; 1.安装Keil Assistant插件 安装插件成功之后&#xff0c;应该会让安装一个东西&#xff0c;点击安装即可 2.配置安装包路径 3.打开 uVi…

AR测量工具:精准测量,多功能集成

在日常生活中&#xff0c;我们常常会遇到需要测量物体长度、距离或角度的情况。无论是装修房屋、制作家具&#xff0c;还是进行户外活动&#xff0c;一个精准的测量工具都能大大提高我们的工作效率。AR测量工具就是这样一款集多种功能于一体的实用测量软件&#xff0c;它利用增…

【Go-补充】Sync包

并发编程-Sync包 sync.WaitGroup 在代码中生硬的使用time.Sleep肯定是不合适的&#xff0c;Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法&#xff1a; 方法名功能(wg * WaitGroup) Add(delta int)计数器delta(wg *WaitGroup) Done()…

设备驱动与文件系统:01 I/O与显示器

操作系统设备驱动学习之旅——以显示器驱动为例 从这一节开始&#xff0c;我要学习操作系统的第四个部分&#xff0c;就是i o设备的驱动。今天要讲的是第26讲&#xff0c;内容围绕i o设备中的显示器展开&#xff0c;探究显示器是如何被驱动的&#xff0c;也就是操作系统怎样让…

智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?

随着新能源汽车的普及&#xff0c;智慧充电桩作为基础设施的重要组成部分&#xff0c;正逐步向数字化、智能化方向发展。环境监测与动态数据可视化技术的应用&#xff0c;为充电桩的高效管理和运维提供了全新解决方案。通过实时采集环境参数与运行数据&#xff0c;并结合可视化…

家政小程序开发,开启便捷生活新篇章

在快节奏的现代生活中&#xff0c;家务琐事常常让人分身乏术&#xff0c;如何高效解决家政服务需求成了众多家庭的难题。家政小程序开发&#xff0c;正是为解决这一痛点而生&#xff0c;它将为您带来前所未有的便捷生活体验。 想象一下&#xff0c;您只需打开手机上的家政小程…

李臻20242817_安全文件传输系统项目报告_第14周

安全文件传输系统项目报告&#xff08;第 14 周&#xff09; 1. 代码链接 Gitee 仓库地址&#xff1a;https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明&#xff1a; SecureFileTransfer/ ├── client/ # 客户端主目…

20250531MATLAB三维绘图

MATLAB三维绘图 三维曲线&#xff1a;plot3功能介绍代码实现过程plot3实现效果 三维曲面空间曲面作图命令&#xff1a;meshmeshgrid语法示例应用meshgrid实操训练 peakspeaks 的基本用法peaks数学表达式实操训练自定义网格大小使用自定义网格 meshMATLAB代码对齐快捷键Ctrli墨西…

深入理解C#异步编程:原理、实践与最佳方案

在现代软件开发中&#xff0c;应用程序的性能和响应能力至关重要。特别是在处理I/O密集型操作&#xff08;如网络请求、文件读写、数据库查询&#xff09;时&#xff0c;传统的同步编程方式会导致线程阻塞&#xff0c;降低程序的吞吐量。C# 的异步编程模型&#xff08;async/aw…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

Spring,SpringMVC,SpringBoot

1.Spring最核心包括aop和ioc概念 AOP 能够将将哪些于业务无关的&#xff0c;并且大量重复的业务逻辑进行封装起来&#xff0c;便于减少重复代码&#xff0c;降低模块之间的耦合度&#xff0c;给未来的系统更好的可用性和可维护性。 Spring中AOP是采用动态代理&#xff0c;JDK代…