Java——简单图书管理系统

前言:

  • 一、图书管理系统是什么样的?
  • 二、准备工作
    • 分析有哪些对象?
    • 画UML图
  • 三、实现三大模块
    • 用户模块
    • 书架模块
    • 管理操作模块
      • 管理员操作有这些
      • 普通用户操作有这些
  • 四、Test测试类
  • 五、拓展

哈喽,大家好,我是无敌小恐龙。
写一个图书管理系统,可以回顾以前所学习是知识:数据类型,变量,if ,for,数组,方法,类和对象,封装,继承,多态,抽象类和接口。把这些知识串起来,不仅可以加深我们对知识的理解,还可以初步理解做一个系统是什么流程,资源包也上传了哦。

一、图书管理系统是什么样的?

请看如下动图:
在这里插入图片描述
在这里插入图片描述

程序一运行:开始先输入名字,在输入身份是否为管理员还是普通用户,最终就是一些操作了。这就是要做的简单图书管理系统了,心理暗自说:还是蛮简单的嘛,嘿嘿嘿。重点是学Java面向对象的开发思想哟!!!对象与对象之间的联系。

二、准备工作

分析有哪些对象?

用户: 管理员 普通用户
书:Book 书架
一些操作: 操作的是书架

画UML图

三大模块:用户模块,书架模块,管理操作模块
在这里插入图片描述

三、实现三大模块

用户模块

用户分为管理员和普通用户,可以抽象出一个公共的类:User(abstract) 其子类有Admin,NormalUser。放入一个包User中。
User

package User;

import Book.Bookshelf;
import Operation.IOOperation;

public abstract class User {
	//用户名
    protected String name;
    //用户的管理操作
    protected IOOperation[] operations;

    public User(String name) {
        this.name = name;
    }
	
	//抽象的菜单方法,应为不同的用户有不同的实现菜单方式,返回值为int 返回 你要选择那个?
    public abstract int menu();
	//不同的用户,不是也有不同的操作吗?
	//注意:操作的是书架
	//答:采用了多态
    public void doOperation(int option,Bookshelf bookshelf) {
        operations[option].work(bookshelf);
    }


}

Admin

package User;

import Operation.*;
import java.util.Scanner;
public class Admin extends User{

    public Admin(String name) {
        super(name);
        //不同的用户操作不同,直接在用户初始化时,就决定了有那些操作了--->直接赋值
        this.operations = new IOOperation[]{
                new ExitSystemOperate(),
                new FindBookOperate(),
                new AddBookOperate(),
                new DeleteBookOperate(),
                new ShowBookOperate(),
        };
    }
	
	//重写自己的菜单方法
    @Override
    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 s = new Scanner(System.in);
        int option = s.nextInt();
        return option;

    }

}

NormalUser:

package User;

import Operation.*;
import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.operations = new IOOperation[]{
                new ExitSystemOperate(),
                new FindBookOperate(),
                new BorrowBookOperate(),
                new BackBookOperate()
        };
    }
    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 s = new Scanner(System.in);
        int option = s.nextInt();
        return option;

    }


}


书架模块

书类:

package Book;

public class Book {
    private String name; //书名
    private String author; //作者
    private double price; //价格
    private String type; //类型
    private Boolean isBorrow; //是否借出

	//isBorrow 不能出现在构造方法中,书的借出是要看有人借了才是借出状态,且全局变量初始就是false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrow = false;
    }

    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 double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Boolean getBorrow() {
        return isBorrow;
    }

    public void setBorrow(Boolean borrow) {
        isBorrow = borrow;
    }

	//重写toString方法,输出时更看得懂,更好看些,用来展示书本的功能!
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", "+(isBorrow==true?"已借出":"在馆")+
                '}';
    }
}

书架:

package Book;

public class Bookshelf {

	//书架采用数组的形式存储书本,整个系统的操作都在维系着这个书数组!!!
    private Book[] bookList = new Book[10];
    //书数组已经使用的空间
    private int usedSize;

	//我们在这里,对书架初始化时就先放入了三本书了,这就是为什么上述动图,一查看书就有三本书了。
    public Bookshelf() {
        this.bookList[0] = new Book("三国演义","罗贯中",9.9,"小说");
        this.bookList[1] = new Book("西游记","吴承恩",19.9,"小说");
        this.bookList[2] = new Book("红楼梦","曹雪芹",29.9,"小说");
        this.usedSize = 3;

    }

    public Book[] getBookList() {

        return bookList;
    }
	
	//书是一本本存入
    public void setBook(Book book) {

        this.bookList[this.usedSize] = book;
        this.usedSize++;

    }
	//取书的话,要看书的位置(下标)
    public Book getBook(int pos) {
        return this.bookList[pos];
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}

管理操作模块

这么多的操作,就要用到接口IOOperation了has a 有这种操作work(),对书架的操作,书架里有书的数组work(Bookshelf bookshelf)!!!
IOOperation

package Operation;

import Book.Bookshelf;

public interface IOOperation {
    void work(Bookshelf bookshelf);

}

管理员操作有这些

增加一本书

package Operation;
import Book.*;
import java.util.Scanner;

public class AddBookOperate implements IOOperation{

    @Override
    public void work(Bookshelf bookshelf) {
        Scanner s = new Scanner(System.in);

        System.out.println("新增图书........");
        System.out.println("请输入书名:");
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();
        //判断图书已满吗?
        if(bookshelf.getUsedSize()==bookshelf.getBookList().length) {
            System.out.println("馆里图书已满,不能新增图书!");
            return;
        }

        //判断书是否已经存在了
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println("图书管已存在"+"《"+name+"》"+",新增失败!");
                return;
            }
        }
        //不存在,即可新增!
        System.out.println("请输入输入作者:");
        String author = s.nextLine();
        System.out.println("请输入输入价格:");
        double price = s.nextDouble();
        System.out.println("请输入输入书的类型:");
        s.nextLine();
        String type = s.nextLine();
        Book book = new Book(name,author,price,type);
        bookshelf.setBook(book);

        bookshelf.setUsedSize(bookshelf.getUsedSize()+1);
        System.out.println("新增图书"+name+"成功!");


    }
}

删除一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class DeleteBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("删除图书........");
        System.out.println("请输入你要删除的图书:");
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();
        Boolean isBook = false;
        int pos = -1;
        //判断图书是否存在
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                isBook = true;
                pos = i;
            }
        }
        //不存在
        if(isBook==false) {
            System.out.println("删除图书失败。"+"馆里还没有这本 "+name+" 书");
        } else {
            //存在就删除这本我不想要的书

            //以下为从数组删除这本书的方法
            //如果为最后一本图书,特判,直接置为null
            if(pos==bookshelf.getUsedSize()-1) {
                books[pos] = null;
            }
            else{
                //不是最后一本,则按这种算法
                for (int i = pos; i < bookshelf.getUsedSize()-1; i++) {
                    if(name.equals(books[i].getName())) {
                        books[i] = books[i+1];
                    }
                }
            }
            //最后修改使用的大小
            bookshelf.setUsedSize(bookshelf.getUsedSize()-1);
        }

    }
}

展示所有的书

package Operation;

import Book.Book;
import Book.Bookshelf;

public class ShowBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("显示图书........");

        Book[] books = bookshelf.getBookList();
        //遍历打印
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            System.out.println(books[i]);
        }

    }
}

退出图书馆里系统

package Operation;

import Book.Bookshelf;

public class ExitSystemOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("退出图书系统........");
        System.exit(0);

    }
}

普通用户操作有这些

借一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class BorrowBookOperate implements IOOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("借阅图书........");

        Scanner s = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书:");
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();


        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName()) ) {
                if(books[i].getBorrow()==false) {
                    //如果馆里有这本书,且还没被借走!
                    System.out.println("借阅"+name+"成功!");
                    books[i].setBorrow(true);
                    return;
                }
                System.out.println("借阅失败。"+name+" 已被借出。");
                return;
            }
        }

        System.out.println("借阅失败。"+"馆里还没有这本 "+name+" 书");

    }
}

归还一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class BackBookOperate implements IOOperation{

    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("归还图书........");
        Scanner s = new Scanner(System.in);
        System.out.println("请输入你要归还的图书:");
        String name = s.nextLine();


        Book[] books = bookshelf.getBookList();
        //遍历书架,看是否有归还的这本书。总不能不是我们管的书,我还收下吧!!!
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println("归还"+name+"成功!");
                books[i].setBorrow(false);
                return;
            }
        }

        System.out.println("归还失败。"+"馆里还没有这本 "+name+" 书");
    }
}

查找一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class FindBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("查找图书........");
        Scanner s = new Scanner(System.in);
        System.out.println("请输入要查找的图书:");

        String name = s.nextLine();
        //遍历书架
        Book[] books = bookshelf.getBookList();
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println(books[i]);
                return;
            }


        }
        System.out.println("馆里还没有这本 "+name+" 书");


    }
}

退出图书馆里系统,和Admin一样的。

四、Test测试类

整个系统都在围绕书数组,所以要先new Bookshelf()。
在根据用户是什么身份,给其new 什么身份,再获取用户要进行那个操作,穿个给doOperation(option,bookshelf)。

import Book.*;
import User.*;

import java.util.Scanner;

public class Test {
    public static User log() {
        System.out.println("请输入你的姓名:");
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();
        System.out.println("请输入你的身份: 1:管理员   2:普通用户");
        int id = s.nextInt();
        System.out.println("欢迎"+name+"来到图书管理系统");
        if(id==1) {
            return new Admin(name);
        } else if(id==2) {
            return new NormalUser(name);
        } else {
            System.out.println("输入错误,请重新输入!");
            return null;
        }


    }
    public static void main(String[] args) {

        Bookshelf bookshelf = new Bookshelf();
        User user = log();

        while(true) {

            int option =  user.menu();
            user.doOperation(option,bookshelf);

        }

    }
}

五、拓展

怎么进行数据的保存,数据库。
功能拓展:书名,价格,作者名排序

感谢铁子能看到这里。希望有所收获,如果有哪些不对的地方还请大方指正
在这里插入图片描述

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

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

相关文章

C++输入输出与IO流

C 输入输出与I/O流 文章目录 C 输入输出与I/O流IO类型与基础特性概念与特性IO状态输出缓冲区 文件输入输出文件模式 string流IO处理中常用的函数及操作符综合练习与demo一、 创建文件并写入二、控制台输入数据并拆分存储三、读写电话簿 IO类型与基础特性 C11标准提供了几种IO处…

string经典题目(C++)

文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&am…

Spring @Transactional 事务注解

一、spring 事务注解 1、实现层(方法上加) import org.springframework.transaction.annotation.Transactional;Transactional(rollbackFor Exception.class)public JsonResult getRtransactional() {// 手动标记事务回滚TransactionAspectSupport.currentTransactionStatus…

# 梯影传媒T6投影仪刷机方法及一些刷机工具链接

梯影传媒T6投影仪刷机方法及一些刷机工具链接 文章目录 梯影传媒T6投影仪刷机方法及一些刷机工具链接1、安装驱动程序2、备份设备rom【boot、system】3、还原我要刷进设备的rom【system】4、打开开发者模式以便于安装apk5、root设备6、更多好链接&#xff1a; 梯影传媒T6使用的…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

预期值与实际值对比

编辑实际值和预期值变量 因为在单独的代码当中&#xff0c;我们先定义了变量str&#xff0c;所以在matcher时传入str参数&#xff0c;但当我们要把这串代码写在testrun当中&#xff0c;改下传入的参数&#xff0c;与excel表做连接 匹配的结果是excel表中的expect结果&#xf…

质量小议38 -- 60岁退休的由来

总是要有个标准&#xff0c;质量更是如些。 标准不是固定不变的&#xff0c;与时俱进。 关键词&#xff1a;当时的人均寿命&#xff1b;渐进式 60岁退休。 22大学毕业开始工作&#xff08;当然可能会更早&#xff09;&#xff0c;到60岁退休&#xff0c;要工作38年。 …

从零入手人工智能(2)——搭建开发环境

1.前言 作为一名单片机工程师&#xff0c;想要转型到人工智能开发领域的道路确实充满了挑战与未知。记得当我刚开始这段旅程时&#xff0c;心中充满了迷茫和困惑。面对全新的领域&#xff0c;我既不清楚如何入手&#xff0c;也不知道能用人工智能干什么。正是这些迷茫和困惑&a…

SpringBoot+Vue体育馆管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 学生管理员 功能截图

(四)React组件、useState

1. 组件 1.1 组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以相互嵌套&#xff0c;也可以复用多次。 组件化开发可以让开发者像搭积木一样构建一个完整的庞大应用 1.2 React组件 在React中&#xf…

java中集合List,Set,Queue,Map

Java SE中的集合框架是一组用于存储和操作对象的类和接口。它提供了丰富的数据结构&#xff0c;可以用于解决各种问题。Java SE中的集合框架包含以下主要类和接口&#xff1a; 一. Collection接口&#xff1a; 是集合框架的根接口&#xff0c;它定义了一些通用的集合操作方法…

kafka-生产者事务-数据传递语义事务介绍事务消息发送(SpringBoot整合Kafka)

文章目录 1、kafka数据传递语义2、kafka生产者事务3、事务消息发送3.1、application.yml配置3.2、创建生产者监听器3.3、创建生产者拦截器3.4、发送消息测试3.5、使用Java代码创建主题分区副本3.6、屏蔽 kafka debug 日志 logback.xml3.7、引入spring-kafka依赖3.8、控制台日志…

推荐云盘哪个好,各有各的优势

选择合适的云盘服务是确保数据安全、便捷分享和高效协作的关键。下面将从多个维度对目前主流的云盘服务进行详细的对比和分析&#xff1a; 速度性能 百度网盘青春版&#xff1a;根据测试&#xff0c;其上传和下载确实不限速&#xff0c;但主要定位是办公人群&#xff0c;适用于…

JavaScript基础(十二)

截取字符串 //对象名.toLowerCase();将字符串转为小写 var strLAOWANG; strstr.toLowerCase(); console.log(str); //对象名.toUpperCase();将字符串转为大写 var str1laowang str1str1.toUpperCase(); console.log(str1); 截取字符串 //方法1&#xff1a;对象名.substr(a,b); …

JS(JavaScript)的引用方式介绍与代码演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

android 抓取 logcat 日志的方法

1.找到这个路径 2.然后执行命令&#xff08;adb logcat -v time >.\\logcat.log&#xff09;&#xff0c;开始抓取日志 3.这个时候就可以去操作APP了&#xff0c;复现BUG了。 Ctrlc 结束日志抓取 adb logcat -c 清空旧日志

seerfar选品功能,OZON运营插件工具seerfar

在当今这个数字化、信息化的时代&#xff0c;电子商务的飞速发展使得越来越多的商家开始关注如何更高效地运营自己的在线店铺。其中&#xff0c;选品作为电商运营的重要一环&#xff0c;直接影响着店铺的流量、转化率和利润。在OZON这样的电商平台上&#xff0c;如何快速、准确…

7天搞定Python必背500单词

必备必记-你的Python就牛掰了 每天只背100个就足够了 老话说的好基础不扎实,地动山摇,在学习Python的时候前期基础很重要. 下面是大家常用遇到的Python基础单词,帮助你更好地掌握Python语言: 1.变量 在Python中用来存储数值,文本或其他信息的名称. 2. 函数 用于执行特定…

力扣2444.统计定界子数组的数目

力扣2444.统计定界子数组的数目 观察到不满足条件的数 可以作为天然的分割线 因此在枚举右端点的过程中 预处理minK&#xff0c;maxK和分割线上一次出现的下标 res min(min_i,max_i) - i0; 但是因为可能在到下个区段时 min_i和max_i尚未更新 导致结果为负数 所以要跟0再取一…

linux:如何硬盘分区扩容

文章目录 1. 前言2. 硬盘分区2.1 查看硬盘2.2 分区2.3 格式化 3. 硬盘分区扩容3.1 创建物理卷3.2 扩展到卷组&#xff08;volume group&#xff09;3.3 合并到待拓展分区3.4 使扩展生效 4 .参考 1. 前言 本文介绍如何将剩余的空间扩展到已有的硬盘分区中。 安装虚拟机的教程&…