Java-图书登录系统的实现

news/2024/5/9 16:53:38/文章来源:https://blog.csdn.net/qq_43570634/article/details/132392541

实现效果
它将面对 管理员 和 普通用户 两种用户来提供服务,并且各自的服务并不相同。


实现思路
一般写项目,每个独立的功能都会写成一个类,而有关联的功能,都会将多个类存放在一个包中,此项目我们将用 3 个包来体现我们的效果

book包
Book类 —> 用来定义一本书
既然是图书系统,那么必然不可能仅仅只有一本书,我们还需要一个书架,来存储书籍 BookList 类
在这里插入图片描述

user包
因为我们有两种用户可以使用这个图书系统,而且每种用户都有自己的特性,所以也需要定义成类
有 User类(后面两个类的共同特征抽取出来的,User类可以是一个抽象类),adminUser类,normalUser类
在这里插入图片描述

opertion包
这个包底下就是我们的基本操作
查询图书,借阅图书,归还图书,退出系统,新增图书,删除图书,显示所有图书
这里我们增加一个操作接口,让所有功能来实现这个接口,从而完善各自的内容。
在这里插入图片描述

Main类
上面的类就已经实现了我们需要的功能了,Main类就是来整合这些操作功能的,在Main类中,我们需要根据登陆的账户类型不同,来显示不同的菜单供其使用图书系统.


book包的实现
创建book类用来存储书的各种信息,BookList类当做书架管理书籍.


book类
Book类中包含五个属性[书名,作者,书的描述,价格,是否被借出]。
一个构造方法(isBorrowed不用放到构造方法中,因为这个属性随着借入和归还一直变化,所以创建setter方法对他进行修改。
重写toString方法,这样打印出来才能看出来书籍信息

public class Book {private String name;private String author;private String describe;private double price;private boolean isBorrowed=false;public Book(String name, String author, String describe, double price) {this.name = name;this.author = author;this.describe = describe;this.price = price;}public String getName() {return name;}public String getAuthor() {return author;}public String getDescribe() {return describe;}public double getPrice() {return price;}public void setName(String name) {this.name = name;}public void setAuthor(String author) {this.author = author;}public void setDescribe(String describe) {this.describe = describe;}public void setPrice(double price) {this.price = price;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}public boolean isBorrowed() {return isBorrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", describe='" + describe + '\'' +", price=" + price +", isBorrowed=" + isBorrowed +'}';}
}

BookList类中设置了书的数组,用来存放书。
当前书的数量。
一些方法
获得书架上某个位置的书【getBooks】
修改架上某个位置的书【setBooks】
获取当前存储了书的数量【getUsedSized】
修改当前存储的书的数量【setUsedSized】

public class BookList {Book[] books=new Book[5];//这里最多可以放置5本书private int usedSized=3;//已存数的数量public BookList() {books[0]=new Book("红楼梦","曹","小说",11);books[0]=new Book("红楼","网","说",1111);books[0]=new Book("红","照","小",111111);}public void setBooks(int pos,Book book) {//设置某个位置的书,用于查找和删除图书this.books[pos]=book;}public void setUsedSized(int usedSized) {this.usedSized = usedSized;}public Book getBooks(int pos) {//获取某个位置的书,返回值为对象return this.books[pos];}public int getUsedSized() {return usedSized;}
}

user包
用户分为管理员和普通用户,我们抽象出管理员和普通用户的共同点创建User类,然后让管理员和普通用户继承User类,再去创建他们特有的属性或方法。

User类
每个用户都有自己的姓名;
每个用户都可以操作一些功能;
管理员和普通用户的菜单是不一样的,需要在不同类型的用户下重写,我们这里只提供抽象方法
由于普通用户和管理员权限不同,一些操作的结果会不同,这里我们提供动态绑定
在这里插入图片描述
在这里插入图片描述

public abstract  class User {protected String name;protected IOperation[] ioperations;//创建一个数组,这个数组里面存放可以进行操作的功能public User(String name) {this.name = name;}public abstract int menu();管理员和普通用户的菜单肯定是不一样的,所以让他们自己去重写方法。public void doOperation(int choice, BookList bookList){ioperations[choice].work(bookList);}
}

AdminUser类
这里我们需要继承user类,
自己创建构造函数,要用到user类中的name成员变量,并初始化一个数组,这个数组中的成员为当前用户权限下可以进行的操作,成员类型为对象。
重写menu函数;
在这里插入图片描述

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()};}@Overridepublic int menu() {System.out.println("hello"+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("请输入你的操作");Scanner sc=new Scanner(System.in);int choice=sc.nextInt();//choice用于选择操作类型return choice;}
}

NomalUser类
与上述 的AdminiUser类几乎是一样的道理

public class NormalUser extends User{public NormalUser(String name) {super(name);this.ioperations=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@Overridepublic int menu() {System.out.println("hello"+this.name+"欢迎来到图书系统");System.out.println("1 查找图书");System.out.println("2 借阅图书");System.out.println("3 归还图书");System.out.println("0 退出系统");System.out.println("请输入你的操作");Scanner sc=new Scanner(System.in);int choice=sc.nextInt();//choice用于选择操作类型return choice;}
}

main类
这里我们通过一个login方法提示用户输入姓名和身份类型,利用login方法的返回值返回身份类型,这里发生向上转型
在这里插入图片描述
在这里插入图片描述

public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner sc=new Scanner(System.in);String name= sc.nextLine();System.out.println("请输入你的身份:1 管理员   0 普通用户");int choice=sc.nextInt();if(choice==1){return new AdminUser(name);//向上转型}else{return new NormalUser(name);//向上转型}}public static void main(String[] args) {User user=login();//返回值方式向上转型,确定操作者的身份类型BookList bookList=new BookList();//new一个书库的对象while(true){//可以循环输入int choice=user.menu();//操作者可以输入要进行怎么样的操作user.doOperation(choice,bookList);//对书库进行功能操作}}
}

opertion包
IOperation接口
这里我们只提供一个抽象方法,用于对Booklist类的对象进行功能上的操作
在这里插入图片描述






至此,我们的框架已经搭建完毕,可以进行简单的试跑
在这里插入图片描述





下面我们补全对应的功能操作
AddOperation类
在这里插入图片描述

public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入书的名字");String name=sc.nextLine();System.out.println("请输入书的作者");String author=sc.nextLine();System.out.println("请输入书的类型");String describe=sc.nextLine();System.out.println("请输入书的价格");double price=sc.nextDouble();Book book =new Book(name,author,describe,price);//new一个新的book对象,并完成初始化int pos=bookList.getUsedSized();//获取booklist中的书总数,为增加新书获取位置bookList.setBooks(pos,book);//将新书放置在数组库中的最后一个位置bookList.setUsedSized(pos+1);//书的总数+1System.out.println("添加书籍成功");}
}

运行结果如下
在这里插入图片描述


FindOperation类
在这里插入图片描述

ublic class FindOperation implements IOperation{public void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要查找图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++)if (name.equals(bookList.getBooks(i).getName())) {System.out.println("查到了,该书的信息如下");System.out.println(bookList.getBooks(i));return;}System.out.println("找不到该书");}
}

BorrowOperation类

public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要借阅图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++) {if(name.equals(bookList.getBooks(i).getName())){//如果有,看它是否有被借出if(bookList.getBooks(i).isBorrowed()==false){System.out.println("借阅成功");bookList.getBooks(i).setBorrowed(true);return;}else{System.out.println("该书已被借出");return;}}}System.out.println("没有此书");}
}

运行结果如下
在这里插入图片描述


DelOperation类
在这里插入图片描述

public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要删除的书籍");String name=sc.nextLine();int index=-1;for (int i = 0; i < bookList.getUsedSized(); i++) {if(bookList.getBooks(i).getName().equals(name)){//查找有无该书index=i;break;}}if(index==-1){System.out.println("没有你要删除的图书");return;}//找到了,准备开始向前覆盖for (int i = index; i < bookList.getUsedSized()-1; i++) {Book book=bookList.getBooks(i+1);bookList.setBooks(i,book);}//覆盖之后,最后一个数组位置赋null,并设置书的数量-1bookList.setBooks((bookList.getUsedSized())-1,null);bookList.setUsedSized(bookList.getUsedSized()-1);System.out.println("删除成功");}
}

在这里插入图片描述


ExitOperation类

public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出成功");System.exit(0);}
}

在这里插入图片描述


ReturnOperation类
逻辑同借阅类的逻辑相似

public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner sc=new Scanner(System.in);System.out.println("请输入要归还图书的名字");String name=sc.nextLine();//遍历书架,去查找有无此书int currentSize=bookList.getUsedSized();for (int i = 0; i <currentSize; i++) {if(name.equals(bookList.getBooks(i).getName())){//如果有,看它是否有被借出if(bookList.getBooks(i).isBorrowed()==true){System.out.println("归还成功");bookList.getBooks(i).setBorrowed(false);return;}else{System.out.println("该书未被借出");return;}}}System.out.println("没有此书");}}

在这里插入图片描述


ShowOperation类
直接遍历即可

public class ShowOperation implements  IOperation{@Overridepublic void work(BookList bookList) {for (int i = 0; i < bookList.getUsedSized(); i++) {System.out.println(bookList.getBooks(i));}}
}

在这里插入图片描述


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

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

相关文章

链表之第三回

欢迎来到我的&#xff1a;世界 该文章收入栏目&#xff1a;链表 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言第一题&#xff1a;判断是否为环形链表第二题&#xff1a;找到两条链表的相交点第三题&#xff1a;返回…

P17~P18 电路定理 电路中难得的精彩到极致的电路理论

特勒根定理、互易定理、对偶定理比较难&#xff0c;非常重要&#xff0c;因为他们可以解决其他定理无法解决的问题。 1、特勒根定理1——个人感觉像能量守恒 特勒根定理与基尔霍夫定理齐名&#xff0c;与拓扑结构有关。都适用于任何线性非线性&#xff0c;时变的非时变的元件…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式&#xff1a; …

网站老域名跳转到新域名有哪些方法?内网穿透内网主机让外网访问

在网站服务器变更及本地主机搭建时&#xff0c;我们经常会遇到老域名地址跳转到新URL的配置&#xff0c;一些朋友还会面对无公网IP让外网访问的问题。今天我们来了解下网站老域名跳转到新域名有哪些方法&#xff0c;以及如何通过内网穿透实现内网主机让外网访问。 网站老域名跳…

Mac上传项目源代码到GitHub的修改更新

Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github&#xff0c;不得不说&#xff0c;真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先&#xff0c;在本地终端命令行打开至项目文件下第一步&#xff1a;查看当前的git仓库状态&#xff0c;可以使用git…

线上异常的处理

一、线上问题的排查 进程ID 简称为PID free -m 查看内存使用情况 iostat 查看磁盘读写活动情况 netstat 查看网络连接情况 df -h 查看磁盘空间使用情况 du -sh 查看文件大小情况 1.1、top 命令查看CPU占用情况 top -n num 查看CPU占用最高的num个进程top -Hp PID 或 top -H -p…

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…

【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟&#xff08;HummingBird&#xff09; 是 Go 语言实现的超轻量级物联网开发平台&#xff0c;包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写&#xff0c;占用内存极低&#xff0c; 单物理机可实现百设备的连接。 在数据存储上&…

就算没有那个所谓的“国产保护月”,好莱坞电影也打不过中国电影

据路透社、美国文娱杂志《Variety》网站等18日报道&#xff0c;中国大陆暑期档票房在17日就已经超过了2019年同期的178亿元人民币&#xff0c;提前14天锁定了“史上最强暑期档”。这一份傲人的成绩单中&#xff0c;西方好莱坞电影所起到的作用却“微乎其微”。 更令人尴尬的是…

AI项目二:基于mediapipe的虚拟绘画

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 随着人工智能时代的到来&#xff0c;许多技术得到了空前的发展&#xff0c;让人们更加认识到了线上虚拟技术的强大。 通过mediapipe识别手的关键点&#xff0c;检测中指&#xff0c;实现隔空画画的操作。 通…

【LeetCode-中等题】128. 最长连续序列

题目 题解一&#xff1a;HeshSet枚举 思路&#xff1a;先对数组进行set去重&#xff0c;核心就是&#xff0c;先找出临界值&#xff08;假设以最小临界为例&#xff0c;那么这个临界值自己就是最小值&#xff0c;&#xff09;&#xff0c;以临界值不断做加1操作&#xff0c;看…

Excel/PowerPoint条形图改变顺序

条形图是从下往上排的&#xff0c;很多时候不是我们想要的效果 解决方案 选择坐标轴&#xff0c;双击&#xff0c;按下图顺序点击 效果

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明&#xff1a;无效的语法是最常见的错误之一&#xff0c;通常是由于编写代码时违反了 Python 的语法规则。可能的原因&#xff1a; 忘记在 if、while、for 等语句后写冒号&#xff0c;或者…

跟着NC学作图 | 使用python绘制折线图

写在前面 今天分享一篇使用Python绘制折线图的教程&#xff0c;在我们前提的教程中&#xff0c;关于使用R语言绘制折线图的教程也很少&#xff0c;跟着PC学作图 | 小提琴图Tufte箱形图折线图的绘制教程也只有相关一部分。 Python自己也是一直在学习&#xff0c;那么也就顺带分…

Python编程基础-函数

函数定义与调用 将完成某一特定功能并经常使用的代码编写成函数&#xff0c;在需要使用时直接调用 def 函数名(函数参数): 函数体 return 表达式或者值 def printHello(): #打印hello字符串print (hello)def printNum(): #输出0--9数字for i in range(0,10):print (i)return…

vue3 setup语法糖导入mixin

像这样直接导入&#xff0c;然后通过defineOptions声明mixin 然后就可以在这个组件使用mixin里的数据和方法了

java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…

攻防世界-warmup

原题解题思路 只有一张图片&#xff0c;就查看源代码&#xff0c;有一个source.php。 查看source.php&#xff0c;白名单中还有一个hint.php。 hint.php告诉我们flag的位置ffffllllaaaagggg 但是直接跳转是没用的&#xff0c;构造payload。 http://61.147.171.105:55725/sourc…