【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。(在IDEA中运行,启动类在src -> Main 中运行)

图书管理系统

设计一个简单的控制台输出的图书管理系统,我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个核心模块:书籍管理、用户管理、借阅与归还管理。以下是一个基础的设计方案:

设计内容

数据模型设计
  • Book 类:包含书的属性,如 name(书名)、author(作者)、price(价格)、type(类型)、borrowed(借出情况)等。
  • User 类:包含用户属性,如 name(姓名)、Books(已借书籍列表,可以是Book对象的集合)。
功能模块设计
  • 书籍管理

    • 添加书籍
    • 删除书籍
    • 显示书籍信息
    • 查询书籍(按书名查找)
  • 用户管理

    • 查找图书
    • 借阅图书
    • 归还图书

设计要求

用户交互友好性
  • 系统应提供清晰的菜单选项,方便用户进行操作。
  • 对于错误输入,系统应给出友好的提示信息,指导用户正确操作。
数据一致性与安全性
  • 保证数据的一致性,例如在借书时检查书籍是否可借。
  • 虽然是控制台应用,也应考虑简单安全措施,比如对用户密码进行基本的加密处理。
 系统扩展性
  • 设计时应考虑未来可能的功能扩展,如增加评论系统、推荐系统等,确保现有架构易于扩展。

在该项目中我们设计了两个菜单:

 用来各执行不同的操作。

项目操作步骤

1、建立包:

在该项目中我们建立三个包:1、book 2、operation 3、user 分别用来存放与书籍相关的类、与操作相关的类、与用户相关的类。

编写与书籍相关的类:

Book类的代码:

package book;import java.util.Objects;/*** Created with IntelliJ IDEA.* Description:图书* User: lenovo* Date: 2024-06-04* Time: 20:13*/
public class Book {private String name;//书名private String auther;//作者private int price;//价格private String type;//书的类型private boolean isBorrowed;//书是否被借出public Book(String name, String auther, int price, String type) {this.name = name;this.auther = auther;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuther() {return auther;}public void setAuther(String auther) {this.auther = auther;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"书名:'" + name + '\'' +", 作者:'" + auther + '\'' +", 价格:" + price +", 类型:'" + type + '\'' +((isBorrowed == true)?",借出情况:已借出":",借出情况:未借出")  +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Book book = (Book) o;return price == book.price && isBorrowed == book.isBorrowed && Objects.equals(name, book.name) && Objects.equals(auther, book.auther) && Objects.equals(type, book.type);}@Overridepublic int hashCode() {return Objects.hash(name, auther, price, type, isBorrowed);}
}

BookList类的代码:

package book;/*** Created with IntelliJ IDEA.* Description:书架* User: lenovo* Date: 2024-06-04* Time: 20:29*/
public class BookList {private Book[] booklist = new Book[10];//用来存放书private int usedSize;//计数器,用来记录当前书架有多少书public BookList() {booklist[0] = new Book("三国演义","罗贯中",71,"小说");booklist[1] = new Book("西游记","吴承恩",82,"小说");booklist[2] = new Book("红楼梦","曹雪芹",79,"小说");this.usedSize = 3;}public void setBooks(int pos, Book book){booklist[pos] = book;}public Book getBook(int pos){return booklist[pos];}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

编写与用户相关的类:

AdminUser 类的代码:

package user;import operation.*;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:19*/
public class AdminUser extends Users{public AdminUser(String name) {super(name);this.books = new IBooks[]{new ExitOperation(),new FindBooks(),new AddBooks(),new DelBooks(),new ShowBooks()};}@Overridepublic int menu() {System.out.println("=====================================");System.out.println("hallo! "+this.name+" 欢迎来到管理员菜单");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");System.out.println("请选择你要操作的序号:>");System.out.println("=====================================");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

Normaluser 类的编写:

package user;import operation.*;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:19*/
public class NormalUser extends Users{public NormalUser(String name) {super(name);this.books = new IBooks[]{new ExitOperation(),new FindBooks(),new BorrowBooks(),new ReturnBooks()};}@Overridepublic int menu() {System.out.println("========================================");System.out.println("hallo! "+this.name+" 欢迎来到普通用户菜单菜单");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("请选择你要操作的序号:>");System.out.println("=======================================");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

Users 类的代码:

package user;import book.BookList;
import operation.IBooks;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:13*/
public abstract class Users {protected String name;public IBooks[] books;public Users(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice,BookList booklist){books[choice].work(booklist);}
}

编写与操作相关的类:

AddBooks 类代码的编写:

package operation;
import book.Book;
import book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 21:54*/
public class AddBooks implements IBooks{@Overridepublic void work(BookList booklist){Scanner scanner = new Scanner(System.in);System.out.println("请输入书名");String name = scanner.nextLine();System.out.println("请输入作者");String auther = scanner.nextLine();System.out.println("请输入价格");int price = scanner.nextInt();scanner.nextLine();System.out.println("请输入书的类型");String type = scanner.nextLine();Book book = new Book(name,auther,price,type);int count = booklist.getUsedSize();for (int i = 0; i < count; i++) {Book book1 = booklist.getBook(i);if(book1.getName().equals(name)){System.out.println("已经存在这本书,不能在进行添加了");return;}}booklist.setBooks(count,book);booklist.setUsedSize(count+1);System.out.println("添加成功!");}
}

BorrowBooks 类的代码编写:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:09*/
public class BorrowBooks implements IBooks{@Overridepublic void work(BookList booklist) {int count = booklist.getUsedSize();if(count == 0){System.out.println("图书馆没有图书!");return;}Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的书籍的名字:>");String name = scanner.nextLine();int tmp = -1;for (int i = 0; i < count; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)){tmp = i;break;}}if(tmp == -1){System.out.println("图书馆没有该图书!");return;}Book book1 = booklist.getBook(tmp);if(book1.isBorrowed() == true){System.out.println("该书籍已经被借出!");return;}book1.setBorrowed(true);System.out.println("借阅成功!");return;}
}

DelBooks 类的代码编写:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:02*/
public class DelBooks implements IBooks{@Overridepublic void work(BookList booklist){int count = booklist.getUsedSize();if(count == 0){System.out.println("图书馆没有图书!");return;}Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书的名字:>");String name = scanner.nextLine();int tmp = -1;for (int i = 0; i < count; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)){tmp = i;break;}}if(tmp == -1){System.out.println("没有找到该图书,请重新选择!");return;}else{for (int i = tmp; i < count - 1; i++) {Book book1 = booklist.getBook(i+1);booklist.setBooks(i,book1);}}booklist.setUsedSize(count - 1);System.out.println("删除图书成功!");return;}
}

ExitOperation 类的代码编写:

package operation;import book.BookList;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:06*/
public class ExitOperation implements IBooks{@Overridepublic void work(BookList booklist) {int count = booklist.getUsedSize();for (int i = 0; i < count; i++) {booklist.setBooks(i,null);}booklist.setUsedSize(0);System.out.println("成功退出图书管理系统");System.exit(0);}
}

FindBooks 类的代码:

package operation;
import book.Book;
import book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 21:57*/
public class FindBooks implements IBooks{@Overridepublic void work(BookList booklist){Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的书名");String name = scanner.nextLine();int count = booklist.getUsedSize();for (int i = 0; i < count; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)){System.out.println(book);return;}}System.out.println("没有这本图书");}
}

IBooks 类的代码:

package operation;import book.BookList;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:00*/
public interface IBooks {void work(BookList booklist);
}

ReturnBooks 类的代码:

import book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:10*/
public class ReturnBooks implements IBooks{@Overridepublic void work(BookList booklist) {int count = booklist.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入要归还书籍的名字::");String name = scanner.nextLine();int tmp = -1;for (int i = 0; i < count; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)){tmp = i;break;}}if(tmp == -1){System.out.println("图书馆没有该图书");return;}Book book2 = booklist.getBook(tmp);book2.setBorrowed(false);System.out.println("图书归还成功!");}
}

ShowBooks 类的代码:

package operation;import book.Book;
import book.BookList;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 22:03*/
public class ShowBooks implements IBooks{@Overridepublic void work(BookList booklist) {int count = booklist.getUsedSize();if(count == 0){System.out.println("图书馆没有图书!");return;}for (int i = 0; i < count; i++) {Book book = booklist.getBook(i);System.out.println(book);}}
}

Main 类的代码:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.Users;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: lenovo* Date: 2024-06-04* Time: 20:08*/
public class Main {public static Users login(){System.out.println("请输入你的姓名:>");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("清选择你的身份:>  1-》管理员 0-》普通用户");int choice = scanner.nextInt();if(choice == 1){return new AdminUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {BookList booklist = new BookList();Users users = login();while(true){int choice = users.menu();users.doOperation(choice,booklist);}}
}

最后代码在Main类中启动。

运行结果如下图:

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

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

相关文章

STM32-CAN

一、CAN总线简介 1.1 CAN简介 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信 协议。异步半双工。 ISO11898&#xff1a;123kbps~1Mbps。 ISO11519&#xff1a;125kbps 特点&#xff1a; 多主控制没…

自动驾驶仿真:Carsim转向传动比设置

文章目录 一、转向传动比概念二、如何设置转向传动比1、C factor概念2、Steer Kinematics概念3、传动比计算公式 三、转向传动比验证 一、转向传动比概念 转向传动比&#xff08;Steering Ratio&#xff09;表示方向盘转动角度与车轮转动角度之间的关系。公式如下&#xff1a;…

数字化校园:打造未来教育新风尚

在21世纪的教育蓝图中&#xff0c;"数字化校园"正逐渐从愿景走向现实&#xff0c;它不仅是科技进步与教育创新深度融合的产物&#xff0c;更是重塑教育生态、引领未来学习风尚的关键力量。随着云计算、大数据、人工智能等前沿技术的蓬勃发展&#xff0c;传统的教育模…

【SpringBoot】SpringBoot:简化数据库操作与API开发

文章目录 引言SpringBoot概述数据库操作简化传统数据库操作的挑战使用Spring Data JPA示例&#xff1a;定义Repository接口实现服务层 使用MyBatis示例&#xff1a;配置MyBatis定义Mapper接口 API开发简化RESTful API概述创建RESTful API示例&#xff1a;定义控制器 高级特性与…

【Better Lighting V2】Blender商城10周年免费送插件灯光预设和图案轮库场景打光和模拟光透过图案水滴波纹效果

Blender商城10周年免费送插件&#xff1a;https://blendermarket.com/birthday Better Lighting V2 灯光预设和图案轮库 模拟各种环境下光线透过物体效果 各种预设快速调整 非常简单和快速打光调色 更多详细介绍&#xff1a;https://blendermarket.com/products/bette…

element-ui input输入框和多行文字输入框字体不一样

页面中未作样式修改&#xff0c;但是在项目中使用element-ui input输入框和多行文字输入框字体不一样&#xff0c;如下图所示&#xff1a; 这是因为字体不一致引起的&#xff0c;如果想要为Element UI的输入框设置特定的字体&#xff0c;你可以在你的样式表中添加以下CSS代码…

WWDC 2024 回顾:Apple Intelligence 的发布与解析

一年一度的苹果全球开发者大会&#xff08;WWDC&#xff09;如期而至&#xff0c;2024 年的 WWDC 再次成为科技界的焦点。本次发布会中&#xff0c;苹果正式推出了他们在 AI 领域的全新战略——Apple Intelligence。这一全新概念旨在为用户打造“强大、易用、全面、个性化、注重…

EFDC建模方法及在地表水环境评价、水源地划分、排污口论证

原文链接&#xff1a;EFDC建模方法及在地表水环境评价、水源地划分、排污口论证 近年&#xff0c;随着水环境问题的凸显&#xff0c;地表水水环境状况不仅是公众关注的焦点&#xff0c;也是环保、水务等部门兼管的重点&#xff0c;已成为项目审批、规划制定&#xff0c;甚至领…

LVS工作模式详解,NAT全方位剖析

请求到达&#xff1a; 当用户请求到达Director Server&#xff08;负载均衡服务器&#xff09;时&#xff0c;数据包会先到达内核空间的PREROUTING链。此时&#xff0c;数据包的源IP为CIP&#xff08;Client IP&#xff09;&#xff0c;目标IP为VIP&#xff08;Virtual IP&…

MySQL学习笔记-进阶篇-SQL优化

SQL优化 插入数据 insert优化 1&#xff09;批量插入 insert into tb_user values(1,Tom),(2,Cat),(3,Jerry); 2&#xff09;手动提交事务 mysql 默认是自动提交事务&#xff0c;这样会导致频繁的开启和提交事务&#xff0c;影响性能 start transaction insert into tb_us…

实拆一个风扇

fr:徐海涛(hunkxu)

Qwen2——阿里巴巴最新的多语言模型挑战 Llama 3 等 SOTA

引言 经过几个月的期待&#xff0c; 阿里巴巴 Qwen 团队终于发布了 Qwen2 – 他们强大的语言模型系列的下一代发展。 Qwen2 代表了一次重大飞跃&#xff0c;拥有尖端的进步&#xff0c;有可能将其定位为 Meta 著名的最佳替代品 骆驼3 模型。在本次技术深入探讨中&#xff0c;我…

神经网络学习2

张量&#xff08;Tensor&#xff09;是深度学习和科学计算中的基本数据结构&#xff0c;用于表示多维数组。张量可以看作是一个更广义的概念&#xff0c;涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说&#xff0c;张量的维度可以是以下几种形式&#xff1a; 标量&am…

LogicFlow 学习笔记——2. LogicFlow 基础 实例

LogicFlow 实例 创建实例 每一个流程设计界面&#xff0c;就是一个 LogicFlow 的实例。 <template><div id"container"></div><!-- 用于显示 LogicFlow 图表的容器 --> </template> <script>// 创建 LogicFlow 实例const lf …

Day03 链表概念与单向不循环链表的实现

目录 1、顺序表的优缺点 2、链式存储的线性表 3、单向不循环链表实现 1、顺序表的优缺点 顺序表的优点是: 由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。 顺序表的缺点是: 顺序表的数据在进行…

常用的JDK调优监控工具整理

JVM 调优首先要做的就是监控 JVM 的运行状态&#xff0c;这就需要用到各种官方和第三方的工具包了 一、 JDK 工具包 JDK 自带的 JVM 工具可以分为命令行工具和可视化工具 命令行工具 jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息j…

Spring Aop及事务管理

5 Spring AOP AOP概述 AOP&#xff1a;全称是 Aspect Oriented Programming 即&#xff1a;面向切面编程。简单的说它就是把我们程序重复的代码抽取出来&#xff0c;在需要执行的时候&#xff0c;使用动态代理的技术&#xff0c;在不修改源码的基础上&#xff0c;对我们的已有…

SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传

1 处理 JSON-ResponseBody 说明: 项目开发中&#xff0c;我们往往需要服务器返回的数据格式是按照 json 来返回的 下面通过一个案例来演示SpringMVC 是如何处理的 &#xff08;1&#xff09; 在web/WEB-INF/lib 目录下引入处理 json 需要的 jar 包&#xff0c;注意 spring5.x…

OpenCV练习(1)签名修复

1.目的 在学校的学习过程中&#xff0c;需要递交许多材料&#xff0c;且每份材料上都需要对应负责人签名&#xff0c;有时候找别人要签名&#xff0c;然后自己粘贴的话&#xff0c;会出现签名模糊&#xff0c;背景不是纯白透明。为此以word中的“颜色校正”功能为参照&#xf…

基于iBeacon蓝牙定位技术的反向寻车系统

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;大型停车场成为了人们日常生活中不可或缺的一部分。然而&#xff0c;在繁忙的停车场中快速找到自己的车辆&#xff0c;成为了许多车主的难题。为了解决这一问题&#xff0c;维小帮基于iBeacon蓝牙技术打造的反向寻车系统…