图书管理系统实现

图书管理系统实现

  • 图书管理系统作用
  • 图书管理系统绘图
  • 创建Book
  • 创建BookList
  • Operation包下代码
  • User包
    • AdminUser
    • NomalUser
  • Main方法
  • 整体代码(带有注释)
  • Opertaion包下的代码
    • IOpertaion(接口)
    • Add添加图书代码
    • Dele删除图书代码
    • Borrow借阅图书代码
    • Return归还图书代码
    • Find查找图书代码
    • Eixt退出系统代码
    • Show图书显示代码
  • User包下
    • User包代码(父类)
    • AdminUser管理用户代码(子类)
    • NomalUser普通用户代码(子类)
  • BookList包下代码
  • Main主方法中的代码
  • 代码运行结果

图书管理系统作用

图书管理系统的用来为实现用户更快的借取书籍和归还书籍。
管理者更方便的进行管理,录入书籍信息和查找书籍的信息。
没有图书管理系统我们会大大增加人力资源和资源的浪费,所以我们需要实现图书管理系统使用户有更好的体验,使管理者也更好的管理图书。

图书管理系统绘图

首先这里我们可以看到当我们输入用户名之后会出现两个选项,管理者/普通用户,当我们选择后出现的菜单是不同的,我们需要用到封装来将我们的代码更加有序简洁,方便后续管理和升级
在这里插入图片描述
这里是我们当前图书的所有的书籍,书籍名称,作者,书籍类型,书籍的价格和该书是否被借出。
在这里插入图片描述
当我们这样看完之后我们可以在写代码的时候可以把不同的类放在方不同的包下,方便我们能够理解和解决哪个包下出现了问题。

创建Book

这里是我们Book类中来创建书籍的属性,书的属性都是由private修饰的,我们需要用get和set来引用被private修饰的方法。

package Book;public class Book {private String name;private String anthor;private String type;private int price;private boolean isBorrowed;public Book(String name, String anthor, String type, int price) {this.name = name;this.anthor = anthor;this.type = type;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAnthor() {return anthor;}public void setAnthor(String anthor) {this.anthor = anthor;}public String getType() {return type;}public void setType(String type) {this.type = type;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", anthor='" + anthor + '\'' +", type='" + type + '\'' +", price=" + price +", isBorrowed=" + isBorrowed +'}';}
}

创建BookList

package BookList;
import Book.Book;
public class BookList {//这里的BookList来存放我们所有的书,定义一个数组来存放我们录入的书籍//我们定义一个变量来记录当下我们书籍共有多少本书。private Book[] books=new Book[10];private int currentSum;public BookList() {books[0]=new Book("三国演义","罗贯中","小说",80);books[1]=new Book("红楼梦","曹雪芹","小说",70);currentSum = 2;}public int getCurrentSum() {//  这里是我们返回书的当前个数return currentSum;}public void setCurrentSum(int currentSum) {//这里是我们当前放了几本书this.currentSum = currentSum;}public void setBooks(int pos,Book book){//这里是将一本书book放到books下标currentSum位置处books[pos]=book;}public Book getBooks(int pos){//获取books中的下标值中的一本书return books[pos];}
}

Operation包下代码

这里是我们的创建的操作包下的一些方法,这里我们可以定义一个接口,让这些类中实现这个接口
在这里插入图片描述

package Operation;
import BookList.BookList;
//这里是我们的IOperation的接口
public interface IOperation {void work(BookList bookList);//这里我们将我们需要操作的BookList作为参数传进去//这个是我们新增图书的操作方法(方法还没有写),其他的也是实现IOperation接口,这里不写到上面了
public class Add implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书");}
}

User包

User包下分为用户和管理员以及管理员,我们通过User这个父母来引用子类
这样我们就可以选择我们的身份信息

package User;
import BookList.BookList;
import Operation.IOperation;
import Book.Book;
public abstract class User {protected String name;//这里是我们的用户名IOperation[] iOperations;public User(String name) {this.name = name;}public abstract int menu();//这是我们的菜单,通过不同的选择进入到管理者菜单或者普通用户菜单public void DoOperation(int choice, BookList bookList){iOperations[choice].work(bookList);//来访问iOperation下标为choice中的方法}
}

AdminUser

package User;import Operation.*;import java.util.Scanner;public class AdminUser extends User{
//extends扩展User类public AdminUser(String name) {super(name);//定义的接口数组引用对象初始化管理员数组iOperations=new IOperation[]{new Exit(),new Add(),new Delete(),new Find(),new Show()};}@Overridepublic 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.print("请输入要选择的操作:>");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

NomalUser

package User;import Operation.*;import java.util.Scanner;public class NomalUser extends User{public NomalUser(String name) {super(name);iOperations=new IOperation[]{//定义的接口数组引用对象用来初始化用户数组new Exit(),new Borrow(),new Return(),new Find()};}@Overridepublic int menu() {System.out.println("****************普通用户******************");System.out.println("***********   1.借阅图书    **************");System.out.println("***********   2.归还图书    **************");System.out.println("***********   3.查找图书    **************");System.out.println("***********   0.退出系统    **************");System.out.print("请输入要选择的操作:>");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

Main方法

我们定义一个Login来实现我们代码最开始运行的功能,Main方法中来运行我们的代码,查看是否正常运行。

import BookList.BookList;
import User.AdminUser;
import User.NomalUser;
import User.User;
import java.util.Scanner;
public class Main {public static User Login(){System.out.print("请输入你的用户名:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.print("您是否为管理员? 1.是 0.不是,请选择:>");int choice=scanner.nextInt();if(choice==1){//是管理return new AdminUser(name);//直接new出一个实例将name放到该类方法中}else{//是用户return new NomalUser(name);}}public static void main(String[] args) {BookList bookList=new BookList();//实例化BookListUser user=Login();//返回的是哪一个类下的结果int choice =user.menu();//菜单的选择用choice来接收System.out.println("choice"+choice);user.DoOperation(choice,bookList);//访问我们doperation中下标choice的work方法}
}

整体代码(带有注释)

Opertaion包下的代码

IOpertaion(接口)

package Operation;
import BookList.BookList;
public interface IOperation {void work(BookList bookList);//这里我们将我们需要操作的BookList作为参数传进去
}

Add添加图书代码

package Operation;import Book.Book;
import BookList.BookList;import java.util.Scanner;public class Add implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("新增图书");System.out.print("请输入你想要增加的图书:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int currentSum= bookList.getCurrentSum();//我们当前目录下书的数量for(int i=0;i<currentSum;i++){Book book=bookList.getBooks(i);//或者目录下标为i的书给到book中if(book.getName().equals(name)){//如果book中的name和我们需要新增图书的name相同说明目录中有我们需要新增的书System.out.println("该目录下有我们需要新增的书籍,无法新增....");return;}}System.out.print("请输入书的作者:>");String author=scanner.nextLine();System.out.print("请输入书的类型:>");String type=scanner.nextLine();System.out.print("请输入书的价格:>");int price=scanner.nextInt();Book book=new Book(name,author,type,price);//实例化一本书bookList.setBooks(currentSum,book);//放书到目录中,参数是位置和书bookList.setCurrentSum(currentSum+1);//存放+1本书System.out.println("新增成功");}
}

Dele删除图书代码

package Operation;import BookList.BookList;import java.util.Scanner;
import Book.Book;
public class Delete implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.print("请输入要删除的图书名:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int pos=0;//记录我们要删除的位置int i=0;for(;i<bookList.getCurrentSum();i++){Book book=bookList.getBooks(i);if(book.getName().equals(name)){pos=i;break;}}if(i>=bookList.getCurrentSum()){//i超出我们目录长度说明没有找到System.out.println("未能找到您要删除的图书,请您重新检查");return;}//走到这里说明我们可以找到我们想要删除的书籍for(int j=pos;j<bookList.getCurrentSum()-1;j++){//因为我们需要用的j+1,长度减1避免数组越界Book book=bookList.getBooks(j+1);bookList.setBooks(j,book);}System.out.println("删除图书成功......!");bookList.setCurrentSum(bookList.getCurrentSum()-1);//图书删除后记得-1}
}

Borrow借阅图书代码

package Operation;import BookList.BookList;import java.util.Scanner;
import Book.Book;
public class Borrow implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");System.out.print("请输入您要借阅的图书:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();for(int i=0;i< bookList.getCurrentSum();i++){Book book=bookList.getBooks(i);if(book.getName().equals(name)){if(book.isBorrowed()){System.out.println("不好意思,这本书已经被借出!");return;}book.setBorrowed(true);System.out.println("借阅成功!");return;}}System.out.println("没有找到此类书籍");}
}

Return归还图书代码

package Operation;import BookList.BookList;import java.util.Scanner;
import Book.Book;
public class Return implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");System.out.print("请输入你要归还的图书名:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();for(int i=0;i<bookList.getCurrentSum();i++){Book book=bookList.getBooks(i);if(book.getName().equals(name)){if(book.isBorrowed()){book.setBorrowed(false);System.out.println("归还图书成功");return;}}}System.out.println("该目录没有您要归还的书籍");}
}

Find查找图书代码

package Operation;import BookList.BookList;
import Book.Book;import java.util.Scanner;public class Find implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书");System.out.print("请输入你想要查找的书名称:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();for(int i=0;i< bookList.getCurrentSum();i++){Book book=bookList.getBooks(i);if(book.getName().equals(name)){//名字相同说明书在当前目录下System.out.println(book);return;}}System.out.println("您要查找的书不再当前目录下,请重新确认.....");}
}

Eixt退出系统代码

package Operation;import BookList.BookList;public class Exit implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);//退出系统}
}

Show图书显示代码

package Operation;import BookList.BookList;public class Exit implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);//退出系统}
}

User包下

User包代码(父类)

package User;import BookList.BookList;
import Operation.IOperation;
import Book.Book;
public abstract class User {protected String name;//这里是我们的用户名IOperation[] iOperations;public User(String name) {this.name = name;}public abstract int menu();//这是我们的菜单,通过不同的选择进入到管理者菜单或者普通用户菜单public void DoOperation(int choice, BookList bookList){iOperations[choice].work(bookList);//来访问iOperation下标为choice中的方法}
}

AdminUser管理用户代码(子类)

package User;import Operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);iOperations=new IOperation[]{new Exit(),new Add(),new Delete(),new Find(),new Show()};}@Overridepublic 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.print("请输入要选择的操作:>");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

NomalUser普通用户代码(子类)

package User;import Operation.*;import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);iOperations=new IOperation[]{new Exit(),new Add(),new Delete(),new Find(),new Show()};}@Overridepublic 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.print("请输入要选择的操作:>");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}

BookList包下代码

package BookList;
import Book.Book;
public class BookList {//这里的BookList来存放我们所有的书,定义一个数组来存放我们录入的书籍//我们定义一个变量来记录当下我们书籍共有多少本书。private Book[] books=new Book[10];private int currentSum;public BookList() {books[0]=new Book("三国演义","罗贯中","小说",80);books[1]=new Book("红楼梦","曹雪芹","小说",70);currentSum = 2;}public int getCurrentSum() {//  这里是我们返回书的当前个数return currentSum;}public void setCurrentSum(int currentSum) {//这里是我们当前放了几本书this.currentSum = currentSum;}public void setBooks(int pos,Book book){//这里是将一本书book放到books下标currentSum位置处books[pos]=book;}public Book getBooks(int pos){//获取books中的下标值中的一本书return books[pos];}
}

#Book包下代码

package Book;public class Book {private String name;private String anthor;private String type;private int price;private boolean isBorrowed;public Book(String name, String anthor, String type, int price) {this.name = name;this.anthor = anthor;this.type = type;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAnthor() {return anthor;}public void setAnthor(String anthor) {this.anthor = anthor;}public String getType() {return type;}public void setType(String type) {this.type = type;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", anthor='" + anthor + '\'' +", type='" + type + '\'' +", price=" + price +", isBorrowed=" + isBorrowed +'}';}
}

Main主方法中的代码

import BookList.BookList;
import User.AdminUser;
import User.NomalUser;
import User.User;import java.util.Scanner;public class Main {public static User Login(){System.out.print("请输入你的用户名:>");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.print("您是否为管理员? 1.是 0.不是,请选择:>");int choice=scanner.nextInt();if(choice==1){//是管理return new AdminUser(name);//直接new出一个实例将name放到该类方法中}else{//是用户return new NomalUser(name);}}public static void main(String[] args) {BookList bookList=new BookList();//实例化BookListUser user=Login();//返回的是哪一个类目下的结果while(true) {int choice = user.menu();//菜单的选择用choice来接收
//            System.out.println("choice" + choice);user.DoOperation(choice, bookList);//访问我们doperation中下标choice的work方法}}
}

代码运行结果

在这里插入图片描述
在这里插入图片描述
有什么不足的地方希望大佬可以指导一下!!谢谢,希望后续可以升级图书管理系统!!

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

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

相关文章

PyTorch 池化层详解

在深度学习中&#xff0c;池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量&#xff0c;同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…

C++——多线程编程(从入门到放弃)

进程&#xff1a;运行中的程序 线程&#xff1a;进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo&#xff1a;两个函数test01()和test02()&#xff0c;实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…

vue3+element-plus icons图标选择组件封装

一、最终效果 二、参数配置 1、代码示例 <t-select-icon v-model"selectVlaue" />2、配置参数&#xff08;Attributes&#xff09;继承 el-input Attributes 参数说明类型默认值v-model绑定值string-prefixIcon输入框前缀iconstringSearchisShowSearch是否显…

从角速度向量的角度理解姿态角速度和机体角速度的转换公式

一、什么是姿态角速度 这是我从《多旋翼飞行器设计和控制》上截取的关于欧拉角的定义。无人机的姿态角速度即偏航角、俯仰角、滚转角的一次导数&#xff0c;分别是、、。 二、什么是机体角速度 这是我在网上随便找的图&#xff0c;展示了机体坐标系。这个坐标系与飞机固定连接&…

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试&#xff0c;并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…

6种常见位运算符+异或运算符的使用(加密、解密)

一、位运算符 位运算符进行的是整数与整数之间的运算 1、右移运算符&#xff1a;>> &#xff08;1&#xff09;相当于对整数除以2 &#xff08;2&#xff09;举例&#xff1a; int num 2; System.out.println(num >> 1); 2、左移运算符&#xff1a;<< …

定制智慧科技展厅方案:哪些细节是成功的秘诀?

随着数字科技浪潮的迅猛推进&#xff0c;智慧科技展厅跃升为科技成果展示与技术对话的前沿阵地。其策划与实施方案因而显得尤为关键。在此过程中&#xff0c;精雕细琢每一环节&#xff0c;确保创意与技术的无缝对接&#xff0c;成为不可或缺的要点。现在&#xff0c;让我们深入…

《程序猿之设计模式实战 · 适配器模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一&#xff1a;窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数&#xff1a;求和 min函数 &#xff1a;最小值 1.2. 排序函数 1.3. 跨行函数…

DeiT(ICML2021):Data-efficient image Transformer,基于新型蒸馏且数据高效的ViT!

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

14.第二阶段x86游戏实战2-C++语言开发环境搭建-VisualStudio2017

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

vue-入门速通

setup是最早的生命周期&#xff0c;在vue2里边的data域可以使用this调用setup里面的数据&#xff0c;但是在setup里边不能使用thisvue项目的可执行文件是index&#xff0c;另外运行前端需要npm run vue的三个模块内需要三个不同的结构&#xff0c;里边放置js代码&#xff0c;注…

2024/9/21 leetcode 21.合并两个有序链表 2.两数相加

目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task

论文汇总 当前的问题 图1:在VTAB-1k基准测试上&#xff0c;使用预训练的ViT-B/16模型&#xff0c;VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示&#xff0c;当给出大量提示时&#xff0c;VPT显示了性能的显著下降…

【MySQL 04】数据类型

目录 1.数据类型分类 2.数值类型 2.1 tinyint 类型 2.2 bit类型 2.3 float类型 2.4decimal 3.字符串类型 3.1 char类型 3.2 varchar类型 4.日期和时间类型 6. enum和set类型 6.1.enum和set类型简介&#xff1a; 6.2.enum和set的一般使用方法 6.3.用数字的方式…

如何用AI实现自动更新文章?(全自动更新网站)

AI的诞生确实给我们的生活和工作都带来了很大的改变&#xff0c;从我自身来讲&#xff0c;也渐渐习惯了遇到事情先问问AI&#xff0c;不管是翻译、专业性问题、PPT制作、总结写作这些&#xff0c;确实帮我迅速理清了思路&#xff0c;也可以有很多内容的借鉴。 作为一个业余爱好…

kismet和war driving具体准备(仅供无线安全学习)

war driving准备 一台笔记本 一个最好是双频的网卡&#xff0c;单频搜集信号少 我自己买的是http://e.tb.cn/h.grI4EmkDLOqQXHG?tkKZ5g3RVeH6f 如果经济条件允许可以去买大功率天线&#xff08;我买的车载的 大概40db这样子 范围广&#xff09; http://e.tb.cn/h.grCM0CQ6L…

Davinci 大数据可视化分析

Davinci 大数据可视化分析 一、Davinci 架构设计1.1 Davinci定义1.2 Davinci 应用场景 二、Davinci 安装部署2.1 部署规划2.2 前置环境准备2.3 Davinci部署2.3.1 物料准备2.3.2 安装配置 2.4 环境变量配置2.5 初始化数据库2.5.1 创建数据库及用户 2.5.2 建表2.6 初始化配置 三、…

7天速成前端 ------学习日志 (继苍穹外卖之后)

前端速成计划总结&#xff1a; 全26h课程&#xff0c;包含html&#xff0c;css&#xff0c;js&#xff0c;vue3&#xff0c;预计7天内学完。 起始日期&#xff1a;9.16 预计截止&#xff1a;9.22 每日更新&#xff0c;学完为止。 学前计划 课…