【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计
作者主页:paper jie 的博客
本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。
本文录入于《JAVA》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。
其他专栏:《算法详解》《C语言》《javaSE》等
内容分享:本期将会使用javase来制作一个简易版本的图书管理系统
目录
设计需求
设计思路
设计的具体过程及源码展示
book包
Book类
Booklist类
user包
User类
AdminUser类
NormalUser类
operation包
IOoperation接口
Addoperation类
Deloperation类
Borrowoperation类
Exitoperation类
Findoperation类
Returnoperation类
Showoperation类
Main类
效果展示
图书管理系统的画图分析
设计需求
我们需要通过使用javase来实现一个简易版本的图书管理系统,它需要具备以下几个功能:
1 首先需要有两个模式,一个是管理员模式,一个是普通用户模式
2 需要具有 新增图书,删除图书,查找图书,显示图书,借阅图书,归还图书,退出系统这些功能
3.需要将上面的功能分成两部分,新增,删除,显示,查找,退出为管理员的权限,而查找,借阅,归还,退出为普通用户的权限
设计思路
1 我们首先需要将我们的用户分为两个部分,一个为管理员,一个为普通用户,在使用的时候根据不同的需求展现不同的界面和功能,这里我们可以通过继承,多态,向上转型给他们一个父类来实现
2 我们需要实现多个类来实现删除图书,查找图书,显示图书,借阅图书,归还图书,退出系统这些功能
3 我们通过创建一个接口,让功能类来实现这个接口,再用一个类型为创建的接口类型的数组来存放功能类的new出的对象,这样子就可以进行统一管理了
4 我们还需要创建书和书架类,将书的属性封装,书架类存放的就是书,会用一个书架类型的数组来存放
设计的具体过程及源码展示
为了让程序去复杂化,易修改这里将用三个包和一个主类来搭建这个框架会有book包,里面存放书类和书架类。operation包存放各个功能类和接口。user包中放着父类User类和普通用户类,管理员类,最后还有一个主类Main
book包
Book类
book类起到的作用就是将book类封装起来,后面容易放入书架中。 这里的构造方法,getandset方法以及toString方法可以通过编译器生成,速度很快的。在toString方法中我们需要改动一下编译器生成的,我们可以用三目操作符来确定是true还是false来打印是已借出还是未接出
package book;public class Book {private String name;private String author;private int price;private String type;//默认flose 未被借出private boolean isBorrowed;//get 和 set方法设置和返回成员变量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;}//打印@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", " + ((isBorrowed == true) ? "已经借出" : "未接出") +'}';}
}
Booklist类
这里也可以使用编译器生成需要的代码,这里要注意的是books数组,它是用来存放book书本的。在构造方法中要对它进行初始化,可以存放几本,已进放进去的书的内容。
package book;public class Booklist {//书架private Book[] books;//记录使用书的位置private int usedsize;private static final int DEFAULT_CAPACITY = 10;public Booklist() {//对书架初始化this.books = new Book[DEFAULT_CAPACITY];//放书this.books[0] = new Book("三国演义", "罗贯中", 10, "小说");this.books[1] = new Book("西游记", "吴承恩", 20, "小说");this.books[2] = new Book("红楼梦", "曹雪芹", 30, "小说");this.usedsize = 3;}public int getUsedsize() {return usedsize;}public void setUsedsize(int usedsize) {this.usedsize = usedsize;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {books[pos] = book;}public Book[] getBooks() {return books;}
}
user包
这个包里放的是一个父类和两个子类,企图通过继承和多态来实现管理员和普通用户的切换
User类
这里要注意的是IOoperation这个数组,它会在User类的子类中进行初始化,来存放需要功能类的对象。而dooperation方法则是通过IOoperations数组里的成员的work方法来实现需要的操作
package user;import book.Booklist;
import operation.IOoperation;public abstract class User {protected String name;protected IOoperation[] iOoperations;public User(String name) {this.name = name;}public abstract int menu();public void dooperation(int choise, Booklist booklist) {iOoperations[choise].work(booklist);}
}
AdminUser类
它和NormalUser都是User的子类,这里面的构造方法就对父类的成员进行了IOoperation初始化,且实现的菜单界面,menu方法的返回值就是你选择需要使用的功能
package user;import operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);this.iOoperations = new IOoperation[]{new Exitoperation(),new Addopertaion(),new Deloperation(), new Showoperation(),new Findoperation()};}public int menu() {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("************************************************************");System.out.println("请输入你的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}
NormalUser类
实现思路和AdminUser一样
package user;import operation.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name) {super(name);this.iOoperations = new IOoperation[]{new Exitoperation(),new Findoperation(),new Borrowoperation(), new Returnoperation()};}public int menu() {System.out.println("*************************** 普通用户 ****************************");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;}
}
operation包
这个包里需要实现需要的功能类和一个将他们都串起来的接口
IOoperation接口
所有的功能类都要实现这个接口,从而重写work方法,来统一使用work这个名字
package operation;import book.Booklist;public interface IOoperation {public void work(Booklist booklist);
}
Addoperation类
新增图书功能:
package operation;import book.Book;
import book.Booklist;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: sun杰* Date: 2023-08-25* Time: 10:43*/
public class Addopertaion implements IOoperation{@Overridepublic void work(Booklist booklist) {System.out.println("新增图书:");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 book = new Book(name, author, price, type);int pos = booklist.getUsedsize();for (int i = 0; i < pos; i++) {Book book1 = booklist.getBook(i);if(book1.getName().equals(name)) {System.out.println("已有这本书,不再存放");return;}}if(pos == booklist.getBooks().length) {System.out.println("书架满了");}else {booklist.setBook(pos, book);booklist.setUsedsize(pos + 1);}}
}
Deloperation类
删除图书功能:
import book.Booklist;import java.util.Scanner;public class Deloperation implements IOoperation{@Overridepublic void work(Booklist booklist) {System.out.println("删除图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int size = booklist.getUsedsize();for (int i = 0; i < size; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)) {int pos = i;int j = 0;for ( j = pos; j < size - 1; j++) {Book book1 = booklist.getBook(j+1);booklist.setBook(j, book1);}booklist.setBook(j, null);booklist.setUsedsize(size - 1);System.out.println("删除成功");return;}}System.out.println("不存在这本书");}
}
Borrowoperation类
借阅图书功能:
package operation;import book.Book;
import book.Booklist;import java.util.Scanner;public class Borrowoperation implements IOoperation {@Overridepublic void work(Booklist booklist) {System.out.println("借阅图书:");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书:");String name = scanner.nextLine();int size = booklist.getUsedsize();for (int i = 0; i < size; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)) {book.setBorrowed(true);System.out.println(book);System.out.println("借阅成功");return;}}System.out.println("该书不存在");}
}
Exitoperation类
退出系统功能:
package operation;import book.Booklist;public class Exitoperation implements IOoperation{@Overridepublic void work(Booklist booklist) {System.out.println("退出系统");System.exit(0);}
}
Findoperation类
查找图书功能:
package operation;import book.Book;
import book.Booklist;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;import javax.imageio.metadata.IIOMetadataController;
import java.util.Scanner;public class Findoperation implements IOoperation{@Overridepublic void work(Booklist booklist) {System.out.println("查找图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int size = booklist.getUsedsize();for (int i = 0; i < size; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)) {System.out.println("找到了,信息如下:");System.out.println(book);return;}}System.out.println("上述不存在");}
}
Returnoperation类
归还图书功能:
package operation;import book.Book;
import book.Booklist;import java.util.Scanner;public class Returnoperation implements IOoperation{@Overridepublic void work(Booklist booklist) {System.out.println("归还图书:");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要归还的图书:");String name = scanner.nextLine();int size = booklist.getUsedsize();for (int i = 0; i < size; i++) {Book book = booklist.getBook(i);if(book.getName().equals(name)) {book.setBorrowed(false);System.out.println(book);System.out.println("归还成功");return;}}System.out.println("该书不存在");}
}
Showoperation类
显示图书功能:
package operation;import book.Book;
import book.Booklist;public class Showoperation implements IOoperation {@Overridepublic void work(Booklist booklist) {System.out.println("显示图书:");int size = booklist.getUsedsize();for (int i = 0; i < size; i++) {Book book = booklist.getBook(i);System.out.println(book);}}
}
Main类
通过Main类来组织程序执行:
import book.Book;
import book.Booklist;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login() {System.out.println("请输入你的姓名:");Scanner scanner = new Scanner(System.in);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();//choice来决定调用哪个方法类user.dooperation(choice, booklist);}}
}
效果展示
图书管理系统的画图分析
相关文章:

【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计
作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...

区块链技术与应用 - 学习笔记3【比特币数据结构】
大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…...

Ubuntu下高效Vim的搭建(离线版)
软件界面 可以看到界面下方有一些常用提示信息:文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下,并执行tar -xvf Vim 即可。 …...

阿里云和腾讯云2核2G服务器价格和性能对比
2核2G云服务器可以选择阿里云服务器或腾讯云服务器,腾讯云轻量2核2G3M带宽服务器95元一年,阿里云轻量2核2G3M带宽优惠价108元一年,不只是轻量应用服务器,阿里云还可以选择ECS云服务器u1,腾讯云也可以选择CVM标准型S5云…...

PYTHON(一)——认识python、基础知识
一、为什么要学习python? Python 被认为是人工智能、机器学习的首选语言,可以说是全世界最流行通用范围最广的语言,几乎可以完成所有的任务,像设计游戏、建网站、造机器人甚至人工智能等都广泛使用Python。 二、输出(…...

Python 操作 Excel
之前看过一篇文章,说一个工作多年的老员工,处理数据时只会用复制粘贴到 Excel ,天天加班工作还完不成,后来公司就招了一个会 Python 的新人,结果分分钟就处理完成。所以工作中大家经常会使用 Excel 去处理以及展示数据…...

21.添加websocket模块
这里默认读者了解websocket协议,若是还不了解可以看下这篇文章wesocket协议。 websocket主要有三个步骤,1通过HTTP进行握手连接,2进行双向通信,3.协商断开连接 第一步的握手连接需要HTTP,所以还需要使用到上一节讲解…...

Linux UDP编程流程
文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下: socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOC…...

【opencv】多版本安装
安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV,在CMakeLists.txt文件中,直接指定opencv的版本就可以找到相应版本的OpenCV,为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…...

webpack打包常用配置项
webpack打包配置项 参考链接 文件结构:最基础版 先安装 npm i webpack webpack-cli --dev 运行命令:npx webpack 进行打包 1. 配置webpack.config.js文件: const path require(path); module.exports {mode: development, // 开发环境 …...

回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图&a…...
selenium_webdriver自动化测试指南
目录 1 引言 4 1.1 目的.. 4 1.2 背景.. 4 1.3 参考资料.. 4 2 安装并引用Selenium2. 5...

红米Note12Turbo解锁BL刷入PixelExperience原生ROM系统详细教程
红米Note12Turbo的兄弟是国外POCO F5 机型,并且该机性价比非常高,国内外销量也还可以,自然不缺第三方ROM适配。目前大家心心念念的原生PixelExperience已成功发布,并且相对来说,适配程度较高,已经达到日用的…...

NoSQL之Redis配置与优化(一)
关系数据库与非关系型数据库 : ●关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于…...

Boost搜索引擎
项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…...
侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)
早就有言,秋码记录 虽早已不是原来的面貌,但这终究是不防碍我们使用golang来搭建它。 而又为什么是使用golang呢?并非是其他编程语言呢?想必 时候回答【我为什么要学习 Go 语言(golang)】这个问题了 已经给出了答案! 当然,当初学习golang时,不单单是为了搭建一个博客应…...
LeetCode——贪心篇(二)
刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗…...
Linux find
1.find介绍 linux查找命令find是linux运维中很重要、很常用的命令之一,find用于根据指定条件的匹配参数来搜索和查找文件和目录列表,我们可以通过权限、用户、用户组、文件类型、日期、大小等条件来查找文件。 2.find语法 find语法 find [查找路径] …...
UE4实现断线重连功能
断线重连的整体逻辑是 设备离线后,根据需要决定是否保留pawn,还是设备重连后再重新生成一个,然后是断线重连时的验证方式,最后是playerstate重连后的属性保留 重载Playercontroller的PawnLeavingGame,这里是设备断线后࿰…...

nginx笔记
1. nginx 简介 nginx性能比apache强,体现 在io模型方面 76 Pv: UV : 不同浏览器是不同的UV GET 获取 POST 上传 HEAT 只看头 访问网站的流程 1.dns解析 2.cdn 3.tcp 4.web服务器 处理 建立连接 接收请求 处理请求 GET POST等 获取资源 构…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...