Java实现简单的图书管理系统(讲解清晰,代码齐全,能正常运行)

article/2025/10/11 0:53:25

目录

实现的样子

大致思路

代码 (按照这个目录创建包)

首先是book包下,有两个类

book类

 bookList类

然后是operation包下,有7个类和1个接口

AddOperation类

BorrowOperation类

DelOperation类

DisplayOperation类

ExitOperation类

FindOperation类

ReturnOperation类

IOperation接口

最后是user包下,有3个类

 AdminUser类

NormalUser类

User类

 还有一个外边的Main类

Main类


实现的样子

首先让我们来看一下系统实现以后大致的样子


 如果说要做一个大致这样子的图书管理系统,那么我们要有大致的思路:

首先我们要创建三个包,user,operation,book

大致思路

  1. 要有书对吧,所以创建Book类存放每本书的基本信息
  2. 图书馆有很多书对吧,所以创建Books类存放好几本书,里面放了一个Book类型的数组和一个usedSize表示总共书的数目
  3. 有两种不同的人,管理员和用户,总共有7个功能,也就是要写7个功能类

  4. 然后我们发现,这7个功能类都要定义这么一个work方法,而且都是对BookList进行操作的,因此我们可以设置一个接口IOperation,让这些功能类实现这个接口

  5. 然后我们再看User这个包,这里面有两种用户,一个是管理员,一个是普通用户,注意到他们都有各自的菜单,同时他们都有姓名等一些公共的属性,所以这里我们可以定义一个User父类,让AdminUser和 NormalUser去继承这个类。

  6. 注意到这里的菜单不一样,可以分别再AdminUser和NormalUser里面都定义一个menu方法,但是这样不灵活,所以我们可以在User类里面定义一个空的menu方法,然后让另外两个类去实现,以后还可以方便进行多态(动态绑定),更加灵活,注意到menu是空的,所以可以设置成abstract方法,同时User类也要改为abstract类。
  7. 注意这里menu显示了以后要输入一个数字代表你要使用的功能,所以需要返回一个数字代表你所使用的功能,这里可以把menu方法定义为返回值为int型的方法
  8. 现在我们在最外面新建一个Main类,里面写main方法,在main方法之前我们写一个login方法,用来读入用户的名称以及他的用户类型,如果是管理员,返回一个AdminUser对象,如果是普通用户,返回一个NormalUser对象,这里注意把login()方法的返回值设置为User对象,然后再main方法中User user = login;然后user.menu();显示出菜单,这里就使用了多态,通过返回值让父类引用引用了子类的对象,同时父类的引用调用了子类重写过的同名方法。
  9. 最巧妙的一步,我们现在的user已经完成了动态绑定,相当于已经知道了他是管理员还是普通用户,接下来要做的就是根据choice的值来调用相应的操作类。

 现在你只有一个user,所以根据choice调用不同的操作这个方法自然也应该在user这个类中。首先在User内部定义一个成员变量,操作接口的数组,用于存放不同的操作类

然后在AdminUser和NormalUser按顺序初始化这些操作类,这里相当于IOperation接口发生了向上转型

 

 在User里面定义doOperation方法,根据choice调用不同操作类的work方法对booklist数组进行操作

10.由于选择功能使用一次以后,不能直接退出,需要再次显示菜单,所以我们将选择菜单和调用相应方法这两个语句写到死循环中

11.接下来就只需要写那几个功能类就可以了

12.ExitOperation,System.exit(0);即可

13.AddOperation,很简单,让用户输入图书相应的信息,然后新建一个book类,初始化放到bookList的usedSize位置即可,之后别忘了更新usedSize

14.FindOperationn,fori遍历即可,每一次遍历可以先定义一个book对象,然后比较该对象的名称与输入的名称是否一样,如果找到了,提示并打印,然后直接return;这样就不用设置flag了,如果走出了for循环还没有return,那么就说明没找到,提示没找到即可。

15.DisplayOperation,fori遍历即可

16.BorrowOperation,ReturnOperation,对相应isBorrowed变量进行相应操作即可


代码 (按照这个目录创建包)

代码亲测能正常运行,如果不想自己慢慢新建类的话,可以点击下面链接自取。不过其实新建类也挺快的,要注意不要把类的名字建错。有什么不会弄的都可以评论问我。

Library.rar-Java文档类资源-CSDN下载


首先是book包下,有两个类

book类

package Library.book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorowed;  //默认是flase,默认没有被借,所以可以不用初始化public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;//默认是flase,默认没有被借,所以可以不用初始化}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 isBorowed() {return isBorowed;}public void setBorowed(boolean borowed) {isBorowed = borowed;}@Overridepublic String toString() {return "book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorowed=" + isBorowed +'}';}
}

 bookList类

package Library.book;public class BookList {private Book[] books = new Book[10];private int usedSize = 0;public BookList(){books[0] = new Book("游戏人生","榎宫祐",12,"轻小说");books[1] = new Book("见面5秒开始战斗","肠才藏",20,"漫画");books[2] = new Book("碧蓝之海","井上竖二",25,"漫画");this.usedSize = 3;}public Book getBook(int pos) {  //取pos位置的那本书return this.books[pos];}public void setBook(int pos, Book book) {  //将pos位置的书置为bookthis.books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

然后是operation包下,有7个类和1个接口

AddOperation类

package Library.operation;import Library.book.Book;
import Library.book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/18* Time: 22:43* Description:新增图书*/
public class AddOperation implements IOperation {public void work(BookList bookList){Scanner scanner = new Scanner(System.in);System.out.println("新增图书");//只需要放到当前数组的usedSize位置System.out.println("请输入图书的名字:");String name = scanner.next();System.out.println("请输入图书的作者:");String author = scanner.next();System.out.println("请输入图书的价格:");int price = scanner.nextInt();System.out.println("请输入图书的类型:");String type = scanner.next();Book book = new Book(name,author,price,type);int curSize = bookList.getUsedSize();bookList.setBook(curSize,book);bookList.setUsedSize(curSize+1);System.out.println("图书添加成功!");}}

BorrowOperation类

package Library.operation;import Library.book.Book;
import Library.book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:02* Description: 借阅书籍*/
public class BorrowOperation implements IOperation {public void work(BookList bookList){System.out.println("借阅书籍");Scanner scanner = new Scanner(System.in);System.out.println("请输入需要借阅的图书名称:");String name = scanner.next();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){if (!book.isBorowed()){book.setBorowed(true);  //如果找到该书,且该书没有被借阅,那就借阅成功System.out.println("图书借阅成功!");}else {System.out.println("该图书已被借阅!");}return;}}System.out.println("该图书不存在!");  //走到这里说明这本书不存在}
}

DelOperation类

package Library.operation;import Library.book.Book;
import Library.book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:03* Description: 删除图书*/
public class DelOperation implements IOperation{public void work(BookList bookList){Scanner scanner = new Scanner(System.in);System.out.println("删除图书");System.out.println("请输入要删除的图书名称:");String name = scanner.next();int n = bookList.getUsedSize();for (int i = 0; i < n; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){for (int j = i; j < n-1; j++) {bookList.setBook(j,bookList.getBook(j+1));}bookList.setUsedSize(n-1);System.out.println("图书删除成功!");return;  //如果找到了并且删除成功,就return}}System.out.println("对不起,没有找到您需要删除的书!");  //如果没有for循环中没有return,那就是没有找到}
}

DisplayOperation类

package Library.operation;import Library.book.BookList;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:03* Description: 显示书籍*/
public class DisplayOperation implements IOperation {public void work(BookList bookList){System.out.println("显示书籍");for (int i = 0; i < bookList.getUsedSize(); i++) {System.out.println(bookList.getBook(i));}}
}

ExitOperation类

package Library.operation;import Library.book.BookList;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:04* Description: 退出系统*/
public class ExitOperation implements IOperation {public void work(BookList bookList){System.out.println("退出系统");System.exit(0);  //退出系统}
}

FindOperation类

package Library.operation;import Library.book.Book;
import Library.book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:04* Description: 查找图书*/
public class FindOperation implements IOperation{public void work(BookList bookList){Scanner scanner = new Scanner(System.in);System.out.println("查找图书");System.out.println("请输入图书的名称:");String name = scanner.next();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){System.out.println("找到该图书!");System.out.println(book);return;  //如果找到了,就直接return出去}}System.out.println("对不起,没有找到此书!");  //如果走到这一步,那么说明没有在for循环return出去,那就显示没找到}
}

ReturnOperation类

package Library.operation;import Library.book.Book;
import Library.book.BookList;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:04* Description: 归还图书*/
public class ReturnOperation implements IOperation{public void work(BookList bookList){System.out.println("归还图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入需要归还的图书名称:");String name = scanner.next();for (int i = 0; i < bookList.getUsedSize(); i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){if (book.isBorowed()){book.setBorowed(false);  //如果找到该书,且该书已被借阅,那就归还成功System.out.println("图书归还成功!");}else {System.out.println("该图书未被借阅!");}return;}}System.out.println("该图书不存在!");  //走到这里说明这本书不存在}
}

IOperation接口

package Library.operation;import Library.book.BookList;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:06* Description: No Description*/
public interface IOperation {void work(BookList bookList);
}

最后是user包下,有3个类

 AdminUser类

package Library.user;import Library.operation.*;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:19* Description: No Description*/
public class AdminUser extends User{public AdminUser(String name) {super(name);this.IOperations = new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new DisplayOperation()};}public int menu(){System.out.println("========================================");System.out.println("尊贵的管理员-"+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.print("请输入数字以使用相应的功能:");Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();return n;}}

NormalUser类

package Library.user;import Library.operation.*;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:19* Description: No Description*/
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("========================================");System.out.println("尊贵的用户-"+this.name+",欢迎使用本图书管理系统");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("========================================");System.out.print("请输入数字以使用相应的功能:");Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();return n;}}

User类

package Library.user;import Library.book.BookList;
import Library.operation.IOperation;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:18* Description: No Description*/
public abstract class User {protected String name;IOperation[] IOperations;public User(String name) {this.name = name;}public abstract int menu();public  void doOperations(int choice, BookList bookList){IOperations[choice].work(bookList);}
}

 还有一个外边的Main类

Main类

package Library;import Library.book.BookList;
import Library.user.AdminUser;
import Library.user.NormalUser;
import Library.user.User;import java.util.Scanner;/*** Created with IntelliJ IDEA.* User: 13498* Date: 2021/11/22* Time: 14:44* Description: No Description*/
public class Main {public static User login(){System.out.println("请输入您的姓名");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请输入您的身份:1 -> 管理员 0 -> 普通用户");int n = scanner.nextInt();if (n == 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();  //动态绑定调用menu方法,choice表示你的选择user.doOperations(choice,bookList);}}
}

OK,就这些了,代码能运行无bug,如果有什么地方出错了或者有什么不懂都可以评论问我。


http://chatgpt.dhexx.cn/article/qXRSIxDS.shtml

相关文章

Java课程设计—— 图书管理系统

1系统需求分析 1.1功能需求分析 本课题根据图书信息管理综合分析&#xff0c;便出于方便管理考虑&#xff0c;将图书信息管理系统的功能总结起来&#xff0c;共需要实现以下几个方面功能: 1.1.1管理图书信息 管理所有图书的基本信息&#xff0c;对图书信息的操作包括添加、…

用Java实现简易的图书管理系统(超详细)

目录 1.设计背景 2.设计思路 3.模块展示及代码演示 3.1 Book类的实现 3.2 BookList类的实现(书架) 3.3 异常类的实现(OperationException) 3.4 用户类的实现 3.5 操作接口的实现(定义规范) 3.6 操作类的具体实现 3.6.1 增加操作 3.6.2 查找操作 3.6.3 删除操作 3.6…

mysql 数组函数_mysql数组函数知识讲解

MySQL的数组函数有很多种&#xff0c;今天给大家介绍的就是mysql数组中的mysql_fetch_array()函数&#xff0c;mysql_fetch_array()函数的代码编写有什么特点呢&#xff1f; MySQL中有很多功能强大的函数&#xff0c;下面为您介绍的函数mysql_fetch_array()属于MySQL数组函数&a…

MySQL聚合函数

一、聚合函数介绍 1、聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 2、聚合函数类型 AVG() SUM() MAX() MIN() COUNT() 3、聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。 二、AVG和SUM函数 # AVG函数用于求一组数据的平均值&a…

MySql常用函数大全讲解

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数&#xff0c;可以简化用户的操作。例如&#xff0c;字符串连接函数可以很方便的将多个字符串连接在一起。在这一讲中…

MySql统计函数COUNT详解

MySql统计函数COUNT详解 1. COUNT()函数概述2. COUNT()参数说明3. COUNT()判断存在4. COUNT()阿里开发规范 1. COUNT()函数概述 COUNT() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为NULL数据&#xff0…

MYSQL窗口函数

文章目录 一、为何使用窗口函数二、什么是窗口函数三、窗口函数如何使用3.1 序号函数3.2 分布函数3.3 前后函数3.4 头尾函数3.5 其他函数3.6 聚类窗口函数 一、为何使用窗口函数 在日常工作中经常会遇到类似这样的需求&#xff1a; 怎么样得到各部门工资排名前N名的员工列表?…

MySQL常见函数

一、单行函数 1.1 字符函数 length(str)&#xff1a;统计字符串的字节数&#xff08;取决于编码方式&#xff0c;utf8汉字3字节&#xff0c;gbk汉字2字节&#xff09;concat(str1, str2)&#xff1a;拼接字符substr/substring(str, n1 [,n2])&#xff1a;切割字符&#xff0c…

MySQL常用函数大全(总结篇)

本篇文章讲解是是MySQL的函数方法&#xff0c;涵盖所有的MySQL常见的方法。下面是本篇文章的目录结构&#xff0c;可以根据自己需求点击右方目录查找&#xff1a; 一、数字函数二、字符串函数三、日期函数四、MySQL高级函数 &#xff08;一&#xff09;数字函数 1、ABS(x) 返…

MySQL常用函数大全(实例演示)

此博客主要包括如下类型函数&#xff1a; 一、数字函数 二、字符串函数 三、日期函数 四、MySQL高级函数 一、数字函数 1、ABS(x) 返回x的绝对值 SELECT ABS(-1); 结果&#xff1a; 2、AVG(expression) 返回一个表达式的平均值&#xff0c;expression 是一个字段 SELE…

MySql常用函数大全

MySql常用函数大全 MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数&#xff0c;可以简化用户的操作。例如&#xff0c;字符串连接函数可以很方便的将多个字符串连接…

MySQL函数大全

目录 &#xff08;一&#xff09;字符函数 ①length(str)函数 ②concat(str1,str2,...)函数 ③upper(str)、lower(str)函数 ④substr(str,start,len)函数 ⑤instr(str,要查找的子串)函数 ⑥trim(str)函数 ⑦lpad(str,len,填充字符)、rpad(str,len,填充字符)函数 ⑧rep…

MySQL函数(经典收藏)

MySQL函数&#xff08;经典收藏&#xff09; MySQL函数 MySQL数据库提供了很多函数包括&#xff1a; 数学函数&#xff1b;字符串函数&#xff1b;日期和时间函数&#xff1b;条件判断函数&#xff1b;系统信息函数&#xff1b;加密函数&#xff1b;格式化函数&#xff1b; …

MySql常用函数大全(详细)

一、数学函数 &#xff08;1&#xff09;ABS&#xff08;x&#xff09;返回绝对值&#xff1b;例&#xff1a; &#xff08;2&#xff09;PI&#xff08;&#xff09;返回圆周率的函数&#xff0c;默认值为小数后六位&#xff1b;例&#xff1a; &#xff08;3&#xff09;求函…

齐全且实用的MySQL函数使用大全

目录 一、MySQL函数介绍 二、MySQL函数分类 &#xff08;一&#xff09;单行函数 ①字符串函数 ②数学函数 ③日期函数 ④流程控制函数 ⑤系统信息函数 ⑥其他函数 &#xff08;二&#xff09;聚合函数 三、函数使用示例 &#xff08;一&#xff09;字符函数 ①le…

sql注入的小工具介绍

sql注入的小工具介绍 啊D注入工具&#xff1a; pangolin&#xff08;穿山甲&#xff09; 穿山甲&#xff1b;Pangolin&#xff08;中文译名为穿山甲&#xff09;一款帮助渗透测试人员进行Sql注入测试的安全工具&#xff0c;是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测…

sql注入检测工具 mysql_SQL注入测试

简介 SQL 注入是一种专门针对SQL语句的攻击方式。通过把SQL命令插入到web表单提交、输入域名或者页面请求的查询字符串中&#xff0c;利用现有的程序&#xff0c;来非法获取后台的数据库中的信息。在web的测试中涉及到的会比较多些。 注入原理 存在注入的原因是后台在编写程序时…

mysql注入扫描网站漏洞工具_网站安全检测,高手必备几款SQL注入工具

按照百度说法&#xff0c;SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 利用SQL注入&#xff0c;攻击者可远程利用SQL注入漏洞&#xff0c;窃取用户数据库数据&#xff0c;包括用户名、密码、登…

3-5SQL注入漏洞工具的使用

如果我们要去找出&#xff0c;一个网站中可能存在的所有漏洞&#xff0c;那对于我们而言是相当累的&#xff0c;有时候&#xff0c;我们只能借助于sql注入漏洞的工具&#xff0c;进行检测&#xff0c;检测的工具对我们相当重要&#xff0c;因为他能替代人工和提高效率 我们本篇…

sql注入检测工具 mysql_Java自动化SQL注入测试工具—jSQL Injection v0.5

jSQL是一款轻量级安全测试工具&#xff0c;可以检测SQL注入漏洞。它跨平台(Windows, Linux, Mac OS X, Solaris)、开源且免费。 更新记录 0.5SQL shell Uploader 0.4 Admin page checker and preview Brute forcer (md5 mysql...) Coder (encode decode base64 hex md5...) 0.3…