当前位置: 首页 > news >正文

【Java学习】实现图书管理系统

  所属专栏: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{@Overridepublic 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{@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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{@Overridepublic 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 {@Overridepublic 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);//更新currentSizebookList.setUsedSize(currentSize - 1);System.out.println("删除成功");}
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索DevExpress WinForms:.NET世界中的UI库之星
  • 【JAVA入门】Day22 - 包装类
  • 无字母数字绕过正则表达式
  • 企业内耗的解决策略:打造活力四溢的文化社区
  • Python 加载 TensorFlow 模型
  • 如何复现Github上的项目以及conda的常用操作指令
  • python opencv实时视频输入
  • 数据可视化之旅,从数据洞察到图表呈现,可视化的产品设计
  • 【面试最常考算法】哈希表专题
  • 《AI办公类工具PPT系列之二——iSlide AI》
  • PHP-FPM未授权访问漏洞
  • 【整理】后端接口设计和优化相关思路汇总
  • 【C++】单例模式的解析与应用
  • Centos7离线安装Sumo全过程(xerces-c、Cmake、gymnasium等)
  • Windows自动化3️⃣WindowsPC拽起时长问题解决方案
  • 【Leetcode】101. 对称二叉树
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Electron入门介绍
  • Fundebug计费标准解释:事件数是如何定义的?
  • k8s如何管理Pod
  • KMP算法及优化
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • maven工程打包jar以及java jar命令的classpath使用
  • MYSQL 的 IF 函数
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 分布式事物理论与实践
  • 工作手记之html2canvas使用概述
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 解析 Webpack中import、require、按需加载的执行过程
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Android开发者必备:推荐一款助力开发的开源APP
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #Linux(权限管理)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #数据结构 笔记三
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)(3.5) 遥测无线电区域条例
  • (31)对象的克隆
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (独孤九剑)--文件系统
  • (南京观海微电子)——COF介绍
  • (南京观海微电子)——示波器使用介绍
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET 8.0 中有哪些新的变化?
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 依赖注入和配置系统
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?