JavaSE-图书信息管理系统

目录

前置知识点

项目部署说明

项目运行截图

项目结构展示

项目编写构思

book包

Book类

Booklist类

ioperations包

IOPeration接口

AddOperation类

BorrowOperation类

DelOperation类

FindOperation类

ReturnOperation类

ShowOperation类

ExitOperation类

user包

User类

AdminUser类

NormalUser类

Main类

源码获取


前置知识点

        学习了Java的基础语法、类和对象、继承和多态以及抽象类和接口等后,我们就可以借此完成一个基础的图书信息管理系统来巩固知识。

项目部署说明

1.Java版本为17

2.开发环境:IntelliJ IDEA 2022.1.4


项目运行截图

运行程序,输入姓名并选择身份权限,我们得到了管理员权限的菜单 


 

系统内置了三本图书,图书信息以Book{书名,作者,价格,类型,借出状态}的形式展示。


 

 

 我们新增一本名为水浒传的图书并查看到它被成功加入书架。

其余的的删除图书以及普通用户权限的借阅图书和归还图书功能这里不做展示。

项目结构展示

项目结构分为三个包和一个主程序类,book包中为书和书架,ioperations包中为各种管理操作实现,user包中为用户权限,Main类作为主程序运行。

项目编写构思

首先创建出本项目使用到的三个包以及主程序类,这四个文件属于并列关系。

book包

Book类

在这个类中,我们需要给图书添加成员变量name,author,price,type和isBorrowed来描述图书。

public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;//书名,作者,价格,类型以及借出状态public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//构造方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}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;}//使用getter and setter确保项目封装性@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed==true)?"已借出":" 未借出")+//", isBorrowed=" + isBorrowed +'}';}//重写toString方法方便打印图书信息
}

Booklist类

这个类用于存放图书信息

public class BookList {private Book[] books = new Book[10];//创建一个Book类型的数组存放图书信息private int usedSize;//实际放书个数public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public BookList(){this.books[0] = new Book("三国演义","罗贯中",10,"小说");this.books[1] = new Book("西游记","吴承恩",59,"小说");this.books[2] = new Book("红楼梦","曹雪芹",16,"小说");//书架初始存放三本图书this.usedSize = 3;//此时实际存量为三本}public Book getBook(int pos) {return books[pos];}public void setBook(int pos,Book book){this.books[pos]=book;}public void setBooks(int pos,Book book) {this.books[pos] = book;}public Book[] getBooks(){return books;}
}

ioperations包

IOPeration接口

这个接口提供一个work方法供所有操作方法重写

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

AddOperation类

这个类用于新增图书操作

public class AddOperation implements IOPeration{public void work(BookList bookList){System.out.println("新增图书......");//1.判满int currentSize=bookList.getUsedSize();if(currentSize==bookList.getBooks().length){System.out.println("书架满了 不能放了......");return;}//2.构建对象Scanner scanner=new Scanner(System.in);System.out.println("请输入书名:");String name=scanner.nextLine();System.out.println("请输入作者:");String author=scanner.nextLine();System.out.println("请输入书的类型:");String type=scanner.nextLine();System.out.println("请输入价格:");int price = scanner.nextInt();Book newBook=new Book(name,author,price,type);//3.判断书架有没有这本书for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)){System.out.println("有这本书,不能插入......");return;}}//4.插入这本书bookList.setBooks(currentSize,newBook);bookList.setUsedSize(currentSize+1);System.out.println("新增图书成功!!!");}
}

BorrowOperation类

这个类用于借阅图书操作

public class BorrowOperation implements IOPeration{public void work(BookList bookList){System.out.println("借阅图书......");Scanner scanner = new Scanner(System.in);System.out.printf("请输入你借阅的书名:");String name=scanner.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()==true){System.out.println("这本书已经被借出了");return;}book.setBorrowed(true);System.out.println("借阅成功!!!");return;}}System.out.println("没有你要借阅的这本书......");}
}

DelOperation类

这个类用于删除图书操作

public class DelOperation implements IOPeration{public void work(BookList bookList){System.out.println("删除图书......");Scanner scanner = new Scanner(System.in);System.out.print("请输入你要删除的书名:");String name=scanner.nextLine();int currentSize=bookList.getUsedSize();int pos=-1;int i=0;//找到这本书for (; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)){pos=i;break;}if(i==currentSize){System.out.println("没有你要删除的书!!!");return;}}for (int j = pos; j < currentSize-1; j++) {Book book=bookList.getBook(j+1);bookList.setBooks(j,book);}bookList.setBook(currentSize-1,null);bookList.setUsedSize(currentSize-1);System.out.println("删除成功!!!");}
}

FindOperation类

这个类用于查找图书操作

public class FindOperation implements IOPeration{public void work(BookList bookList){System.out.println("查找图书......");Scanner scanner = new Scanner(System.in);System.out.printf("请输入你的书名:");String name=scanner.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("找到了这本书:");System.out.println(book);return;}}System.out.println("没有你要找的这本书......");}}

ReturnOperation类

这个类用于归还图书操作

public class ReturnOperation implements IOPeration{public void work(BookList bookList){System.out.println("归还图书......");Scanner scanner = new Scanner(System.in);System.out.printf("请输入你归还的书名:");String name=scanner.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()==true){book.setBorrowed(false);System.out.println("归还成功");return;}}}System.out.println("没有你要归还的图书!!!");}
}

ShowOperation类

这个类用于展示全部图书操作

public class ShowOperation implements IOPeration{public void work(BookList bookList){System.out.println("显示图书......");int currentSize=bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}

ExitOperation类

这个类用于退出系统操作

public class ExitOperation implements IOPeration{public void work(BookList bookList){System.out.println("退出系统......");System.exit(0);}
}

以上这些操作都实现IOPeration接口并重写work方法

user包

User类

作为管理员权限AdminUser类和普通用户权限NormalUser类的父类

public abstract class User {protected String name;protected IOPeration[] ioPerations;public User(String name){this.name=name;}public abstract int menu();public void doIoperation(int choice, BookList bookList){ioPerations[choice].work(bookList);}
}

AdminUser类

这个类实现管理员操作权限

public class AdminUser extends User{public AdminUser(String name){super(name);this.ioPerations=new IOPeration[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation(),};}public int menu(){System.out.println("欢迎"+this.name+"来到图书管理系统");System.out.println("******管理员菜单******");System.out.println("1.查找图书");System.out.println("2.新增图书");System.out.println("3.删除图书");System.out.println("4.显示图书");System.out.println("0.退出系统");System.out.println("*********************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}}

NormalUser类

这个类实现普通用户权限

public class NormalUser extends User{public NormalUser(String name){super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu(){System.out.println("欢迎"+this.name+"来到图书管理系统");System.out.println("******普通用户菜单******");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("*********************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}
}

Main类

public class Main {public static User login(){Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请输入你的身份:1:管理员  2:普通用户");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();User user = login();while (true) {int choice = user.menu();//根据这个返回值决定调用哪个方法user.doIoperation(choice, bookList);}}}

main函数实例化Booklist,使用login函数获取登录用户姓名和权限,然后在死循环中不断读取指令并执行操作。

源码获取

项目源码

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

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

相关文章

网络 IP 地址总结

网络IP地址总结 一、IPv4地址核心分类与特殊网段 IPv4地址是32位二进制数&#xff08;通常表示为4组0-255的十进制数&#xff0c;即“点分十进制”&#xff09;&#xff0c;总地址空间约43亿个。根据用途可分为公有地址&#xff08;公网使用&#xff0c;全球唯一&#xff09;和…

【C++进阶】第7课—红黑树

文章目录1. 认识红黑树1.1 红黑树的规则1.2 红黑树如何确保最长路径不超过最短路径的2倍呢?1.3 红黑树的效率2. 实现红黑树2.1 红黑树的结构2.2 红黑树的插入2.2.1 第一种情况:插入节点的父节点和其uncle节点都为红色&#xff0c;且uncle节点存在2.2.2 第2种情况:插入节点cur和…

解决 SQL 错误 [1055]:深入理解 only_full_group_by 模式下的查询规范

在日常的 SQL 开发中&#xff0c;你是否遇到过这样的报错&#xff1a;SQL 错误 [1055] [42000]: Expression #N of SELECT list is not in GROUP BY clause and contains nonaggregated column...&#xff1f;尤其是在 MySQL 5.7 及以上版本中&#xff0c;这个错误更为常见。本…

Keepalived 原理及配置(高可用)

一、Keepalived 原理keepalived 基于 VRRP&#xff08;虚拟路由冗余协议&#xff09;实现高可用。核心原理是通过竞选机制在多台服务器&#xff08;主 / 备节点&#xff09;中选举出一台主节点承担服务&#xff0c;同时备节点持续监控主节点状态&#xff1a;主节点正常时&#…

从代码混乱到井然有序:飞算JavaAI的智能治理之道

文章目录一、前言二、飞算JavaAI平台三、飞算JavaAI安装流程3.1 Idea安装配置3.2 官网注册登入四、飞算JavaAI独特魅力:合并项目场景4.1 ERP老项目精准翻新&#xff1a;保留核心逻辑的智能改造方案4.2 智能合并&#xff1a;重构ERP系统的代码迷宫4.3 ERP接口智能导航&#xff1…

iOS打开开发者模式

启用开发者模式的方法在iOS设备上启用开发者模式通常需要连接Xcode或通过设置手动开启&#xff0c;以下是具体步骤&#xff1a;通过Xcode启用将iOS设备通过USB线连接到Mac电脑。打开Xcode&#xff08;需提前安装&#xff09;。在Xcode的菜单栏中选择 Window > Devices and S…

leetcode101.对称二叉树树(递归练习题)

文章目录一、 题目描述二、 核心思路&#xff1a;判断左右子树是否互为镜像三、 递归的终止条件 (Base Cases)四、 代码实现与深度解析五、 关键点与复杂度分析六、 总结与对比 (LC100 vs LC101)LeetCode 101. 对称二叉树 - 力扣【难度&#xff1a;简单&#xff1b;通过率&…

【国内电子数据取证厂商龙信科技】谁是躲在“向日葵”后的

一、前言大家可能每天都在使用在远控软件&#xff0c;我们在享受远控软件带来的便利同时&#xff0c;犯罪者也在使用远控软件进行违法犯罪活动&#xff0c;以达到隐藏自己的目的。市面上常用的远控软件有“向日葵”、“TeamViewer”。二、案件背景在一次电信诈骗案件支援中&…

SAP-PP-MRPLIST

MRP(物料需求计划)分析功能,主要包含以下要点: 程序通过选择工厂和物料/销售订单范围作为输入条件,支持两种展示方式:ALV表格和树形结构 核心功能包括: 物料主数据查询(MAKT/MARA表) 销售订单数据查询(VBAP表) BOM展开(CS_BOM_EXPL_MAT_V2函数) MRP数据获取(MA…

MIT线性代数01_方程组的几何解释

Linear Algebra Lecture #1 W. Gilbert Strangn linear equations, n unknowns row picturecol pictureMatrix form {2x−y0−x2y3 \left\{\begin{matrix} 2x - y 0 \\ -x 2y 3 \end{matrix}\right. {2x−y0−x2y3​ 1 Row Picture2 Column PictureWhat are all combination…

FreeRTOS-中断管理

学习内容中断概念中断是计算机系统中一种重要的事件驱动机制&#xff0c;用于在特定条件下打断正在执行的程序&#xff0c;并跳转到预定义的中断处理程序中执行特定的操作。当发生中断时&#xff0c;处理器会立即中止当前正在执行的指令&#xff0c;保存当前的执行状态&#xf…

图像梯度处理与边缘检测

在图像处理的世界里&#xff0c;我们常常需要从复杂的像素矩阵中提取有意义的信息 —— 比如一张照片中物体的轮廓、医学影像中病灶的边界、自动驾驶视野里的道路边缘。这些 “边界” 或 “轮廓” 在专业术语中被称为 “边缘”&#xff0c;而捕捉边缘的核心技术&#xff0c;离不…

GPU服务器与PC 集群(PC农场):科技算力双子星

在数字经济高速发展的今天&#xff0c;算力已成为驱动科技创新与产业变革的核心引擎。GPU服务器凭借其强大的并行计算能力&#xff0c;在图形渲染、人工智能训练等领域展现出不可替代的优势&#xff1b;而PC集群则通过分布式架构&#xff0c;以高性价比和灵活扩展特性&#xff…

秋招Day19 - 分布式 - 分布式锁

单体时代&#xff0c;可以直接用本地锁来实现对竞争资源的加锁&#xff0c;分布式环境下就要用到分布式锁了有哪些分布式锁的实现方案&#xff1f;MySQL分布式锁、Zookeeper分布式锁、Redis分布式锁MySQL分布式锁如何实现&#xff1f;创建一张锁表&#xff0c;对字段定义唯一性…

AIStarter平台亮点解析:从ComfyUI项目上架到一键运行的完整指南

大家好&#xff01;今天分享一个AIStarter平台的深度体验&#xff0c;带你了解如何通过这个平台轻松上架和运行AI项目&#xff01;视频中&#xff0c;博主在凌晨分享了AIStarter的强大功能&#xff0c;重点展示了ComfyUI 4.0和5.0整合包的上架过程&#xff0c;以及如何简化AI项…

电脑录屏软件推荐:如何使用oCam录制游戏、教程视频

在工作、学习或游戏过程中&#xff0c;我们经常需要录制电脑屏幕&#xff0c;比如制作教程视频、记录游戏操作、分享软件使用过程等。oCam 是一款功能强大且操作简单的屏幕录制工具&#xff0c;支持 Windows 系统&#xff0c;深受用户喜爱。今天简鹿办公就来手把手教你如何使用…

安装cuml报错

安装命令 &#xff08;注意cuda的版本&#xff09; pip install --no-cache-dir --extra-index-urlhttps://pypi.nvidia.com cuml-cu11 报错&#xff1a; 找了很多网上的教程 1.版本问题 没解决 pip install --upgrade pip pip install --upgrade setuptools 2.参考下面博…

【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题

解决Vue 中 v-show 导致组件 ECharts 样式异常问题 问题概述 在使用 Vue 的 v-show 指令实现 <PageOne/>、<PageTwo/>、<PageThree/> 三个视图的定时切换时&#xff0c;<PageTwo/> 显示时出现了异常&#xff0c;具体表现为 ECharts 图表渲染图表尺寸异…

旅游管理虚拟仿真实训室:重构实践教学新生态

在旅游产业数字化转型与教育信息化深度融合的背景下&#xff0c;旅游管理虚拟仿真实训室成为连接理论教学与行业实践的关键纽带。它通过沉浸式技术还原旅游场景&#xff0c;解决传统实训中资源受限、风险较高、时空局限等问题&#xff0c;为旅游管理专业人才培养提供全新路径。…

【在线五子棋对战】十、对战玩家匹配管理模块

文章目录前言Ⅰ. 匹配队列实现Ⅱ. 匹配队列管理类实现完整代码前言 五子棋对战的玩家匹配是根据自己的天梯分数进行匹配的&#xff0c;而服务器中将玩家天梯分数分为三个档次&#xff1a; 青铜&#xff1a;天梯分数小于 2000 分白银&#xff1a;天梯分数介于 2000~3000 分之间…