Java实现命令行图书管理系统(附完整源码)
一、项目概述
本文将介绍如何使用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)
实现逻辑:
-
接收用户输入的书名
-
遍历书架匹配图书
-
输出查找结果
核心代码:
public class FindOperation implements IOperation {@Overridepublic 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)
功能菜单:
-
新增图书
-
删除图书
-
查找图书
-
显示所有图书
-
退出系统
界面截图:
代码片段:
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对应管理员}}
}
登录界面截图:
七、项目总结
技术亮点:
-
采用面向接口编程,操作解耦
-
使用继承实现多态用户系统
-
异常处理完善,避免程序崩溃
扩展方向:
-
添加数据库持久化存储
-
实现图书预约功能
-
增加借阅期限管理
完整源码获取: java_se_code: Mb's Library Management System
相关文章:

Java实现命令行图书管理系统(附完整源码)
一、项目概述 本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员和普通用户两种角色,提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则,代码结构清晰,适合Java初学者学习。 二、系统功能架构 graph T…...
使用Docker-NVIDIA-GPU开发配置:解决 Docker NVIDIA 运行时错误方法
问题描述 运行 Docker 命令时,系统提示 docker: Error response from daemon: unknown or invalid runtime name: nvidia,表明 Docker 无法识别 NVIDIA 运行时。这一错误通常出现在使用 --runtime=nvidia 和 --gpus 参数时,意味着 NVIDIA 容器运行时未正确安装或配置。NVID…...
如何更好的理解云计算和云原生?
本文介绍什么是云计算、什么是云原生、怎么理解云相关概念,如有问题,欢迎指正。 一、云计算 定义:云计算是通过互联网(即“云”)按需提供计算资源(如服务器、存储、数据库、网络、软件等)的服…...

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

唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!
在智能家居的浪潮中,门锁搭载显示屏已成为行业创新的焦点。据行业数据显示,2023年全球智能门锁出货量中,搭载显示屏的型号占比已突破40%,且年复合增长率达25%。而2024年国内智能门锁销量突破2200万套,预计2025年市场规…...
WPF的UI交互基石:数据绑定基础
数据绑定基础 1 Binding的Path属性2 ElementName绑定3 DataContext的作用4 绑定模式(Binding Mode)5 实用技巧集合1. 默认值处理2. 设计时数据3. 绑定验证4. 多级路径监控 6 常见错误排查 数据绑定是WPF的核心特性之一,它实现了界面ÿ…...

智能穿戴新标杆:SD NAND (贴片式SD卡)与 SOC 如何定义 AI 眼镜未来技术路径
目录 一、SD NAND:智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片:AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC:11>2的协同效应数据流水线的高效协同端侧…...
TCP/IP四层模型
TCP/IP四层模型 TCP/IP四层模型将网络通信分为四个层次: 1. 网络接口层:负责计算机与网络硬件间的数据传输,在物理网络上发送/接收数据帧(如以太网、Wi-Fi协议)。 2. 互联网层(网络层)&…...
深入浅出Nacos:微服务架构中的服务发现与配置管理利器
在当今的软件开发领域,随着微服务架构的普及,如何有效地进行服务治理和服务配置管理成为了开发者面临的重要挑战之一。阿里巴巴开源的 Nacos(Dynamic Naming and Configuration Service)应运而生,旨在帮助开发者更轻松地构建云原生应用。本文将详细介绍 Nacos 的核心功能、…...

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

yolo个人深入理解
卷积层的理解,通过云端服务器训练模型,模型构建的重要性,针对极低像素的处理,模型训练召回率提高技巧,卷积层2,4,8,16,32的小模型与大模型的理解 一.关于backbone,neck,head深入理解 1,backbone的主要组成部分是sppf和conv,这是backbone的核心,其中yolov5和yolov8…...
Go语言中的布尔类型详解
布尔类型是Go语言中最基本的数据类型之一,用于表示逻辑值。下面详细介绍Go语言中的布尔类型。 1. 基本概念 Go语言中的布尔类型用关键字bool表示,它只有两个预定义的常量值: true // 真 false // 假 2. 声明布尔变量 var b1 bool …...
三方接口设计注意事项
前言 随着业务系统间集成需求的增加,三方接口设计已成为现代软件架构中的关键环节。一个设计良好的三方接口不仅能够提供稳定可靠的服务,还能确保数据安全、提升系统性能并支持业务的持续发展。 一、设计原则 1. 统一接口原则 三方接口设计应遵循统一…...

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

互联网向左,区块链向右
2008年,中本聪首次提出了比特币的设想,这打开了去中心化的大门。 比特币白皮书清晰的描述了去中心化支付的解决方案,并分别从以下几个方面阐述了他的理念: 一、由转账双方点对点的通讯,而不通过中心化的第三方…...

Python6.1打卡(day33)
DAY 33 MLP神经网络的训练 知识点回顾: 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令(cmd中使用) 3.cuda的检查 4.简单神经网络的流程 1.数据预处理(归一化、转换成张量) 2.模型的定义 …...
金融全业务场景的系统分层与微服务域架构切分
构建一个支持金融全业务场景的会员账户体系,是一项复杂但极具战略价值的工程。为了支持跨国收付款、供应链金融、信用账户、票据、银行卡发卡等场景,需要采用清晰的分层架构和服务划分策略,确保系统具备可扩展性、合规性、安全性和高可用性。…...
POJO、DTO和VO:Java应用中的三种关键对象详解
在软件开发特别是Java开发中,常常会遇到POJO、DTO和VO这三类对象。它们在不同场景下扮演着重要角色,有助于优化代码结构、增强系统安全性和提升性能。本文将全面解析这三者的定义、区别及常见使用场景,帮助你更好地理解和应用。 1. POJO&…...

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset
I3D 论文 UCF-101(13000多个视频)和 HMDB-51(7000多个视频)数据集过小,提出了 Kinetics 数据集,并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM:使用2D CNN的好处是可以直接从 Ima…...
IDEA,Spring Boot,类路径
在 IDEA 中开发 Spring Boot 项目时,类路径 (classpath) 的正确配置至关重要,它直接影响项目的编译、运行和依赖管理。以下是关于此问题的关键知识点: IDEA 与 Spring Boot 类路径核心概念 类路径定义: 类路径是 JVM 用来搜索类文件 (.class…...

vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?
用vscode编译uVision 项目只需要安装一个Keil Assistant插件,即可用vscode开发“keil 项目”。极大提高开发速度! 1.安装Keil Assistant插件 安装插件成功之后,应该会让安装一个东西,点击安装即可 2.配置安装包路径 3.打开 uVi…...
Beta分布Dirichlet分布
目录 Beta分布Dirichlet分布Beta分布&Dirichlet分布从Dirichlet分布生成Beta样本Beta分布&Dirichlet分布应用 Beta分布 Beta分布是定义在区间 [ 0 , 1 ] [0, 1] [0,1]上的连续概率分布,通常用于模拟概率或比例的随机变量。Beta分布的概率密度函数ÿ…...

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

【Go-补充】Sync包
并发编程-Sync包 sync.WaitGroup 在代码中生硬的使用time.Sleep肯定是不合适的,Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法: 方法名功能(wg * WaitGroup) Add(delta int)计数器delta(wg *WaitGroup) Done()…...
云服务器是什么,和服务器有什么区别?
云服务器 vs 传统服务器:通俗对比 一句话总结: 云服务器是「租用」的虚拟服务器(像租房),传统服务器是「自购」的物理机器(像买房)。 1. 本质区别 对比项云服务器传统服务器物理形态虚拟的&am…...
【HTML-14】HTML 列表:从基础到高级的完整指南
列表是HTML中用于组织和展示信息的重要元素。无论是导航菜单、产品特性还是步骤说明,列表都能帮助我们以结构化的方式呈现内容。本文将全面介绍HTML中的列表类型、语法、最佳实践以及一些高级技巧。 1. HTML列表的三种类型 HTML提供了三种主要的列表类型ÿ…...

设备驱动与文件系统:01 I/O与显示器
操作系统设备驱动学习之旅——以显示器驱动为例 从这一节开始,我要学习操作系统的第四个部分,就是i o设备的驱动。今天要讲的是第26讲,内容围绕i o设备中的显示器展开,探究显示器是如何被驱动的,也就是操作系统怎样让…...
.NET 9正式发布,亮点是.NET Aspire和AI
.NET 9 正式发布:.NET Aspire 与 AI 引领新潮流 一、.NET 9 发布概览 Microsoft 正式发布了 .NET 9,这一版本堪称迄今为止最高效、最现代、最安全、最智能且性能最高的 .NET 版本。它凝聚了全球数千名开发人员一年的心血,带来了数千项性能、…...
vue+mitt的简便使用
突然注意到 onMounted 在一个组件中可以多次调用,这不得发挥一下: 把绑定/解绑的逻辑封装到同一个模块中不就简化了吗,只需要在组件中注册一下子再传递一个回调就完事了。简单的组件中甚至不用引入onMounted和onUnmounted cnpm i mitt /src/utils/emi…...
Java正则表达式完全指南
Java正则表达式完全指南 一、正则表达式基础概念1.1 什么是正则表达式1.2 Java中的正则表达式支持 二、正则表达式基本语法2.1 普通字符2.2 元字符2.3 预定义字符类 三、Java中正则表达式的基本用法3.1 编译正则表达式3.2 创建Matcher对象并执行匹配3.3 常用的Matcher方法 四、…...