【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计

news2025/4/7 16:37:53

作者主页: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;
    }
    //打印
    @Override
    public 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{
    @Override
    public 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{
    @Override
    public 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 {
    @Override
    public 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{
    @Override
    public 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{
    @Override
    public 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{
    @Override
    public 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 {
    @Override
    public 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);
        }

    }
}

效果展示 

图书管理系统的画图分析


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SLAM从入门到精通(ROS安装)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 ROS科研上面用的多&#xff0c;实际生产其实用的也不少。它本身还是很好的应用框架。当然&#xff0c;它对于很多初学的同学来说还是很友好的。学完…

管理类联考——数学——汇总篇——知识点突破——工程

⛲️ 工程问题是应用题中仅次于路程问题的一个常考点&#xff0c;既是重点&#xff0c;也是难点。其主要的基本关系式为&#xff1a; 工作时间 工作效率 工作量 工作时间工作效率工作量 工作时间工作效率工作量。 本专题主要学习复杂的工程问题&#xff0c;主要有以下三种方…

【动手学深度学习】--机器翻译与数据集

文章目录 机器翻译与数据集1.下载和预处理数据集2.词元化3.词表4.加载数据集5.训练模型 机器翻译与数据集 学习视频&#xff1a;机器翻译数据集【动手学深度学习v2】 官方笔记&#xff1a;机器翻译与数据集 机器翻译&#xff08;machine translation&#xff09;指的是 将序…

absolute和relative元素层级问题

布局层级问题 同一个父元素的两个子元素&#xff0c;一个是absolute布局&#xff0c;一个是relative布局&#xff0c;为啥relative元素在absolute元素的背景色之上&#xff1f; 实例&#xff1a; <div id"father">father<div id"c1">c1-absolu…

人工智能海洋中的塞壬之歌:大型语言模型LLM中的幻觉研究综述(一)

“ 大型语言模型LLM 如 ChatGPT 已经得到了广泛的应用&#xff0c;涵盖了诸多应用领域。但也存在生成内容与事实不符的幻觉问题。这种幻觉包括输入冲突、语境冲突以及与事实相冲突的情况&#xff0c;给实际需求和应用构建带来了挑战。一篇最新的论文《Sirens Song in the AI Oc…

科技革新自动驾驶:拓世AI智能助理携手跟您一起点亮未来之旅

科技改变生活&#xff0c;智能改变世界&#xff0c;近年来&#xff0c;随着科技的不断进步&#xff0c;政策和市场的赋能推动&#xff0c;自动驾驶已经成为当今社会最炙手可热的话题之一。从其中的技术发展趋势来看&#xff0c;我国自动驾驶模式正由单车智能向车路协同时代演进…

王道数据结构编程题 栈和队列

判断合法序列 题目描述 假设 I 和 O 分别表示入栈和出栈操作&#xff0c;栈的初态和终态均为空&#xff0c;入栈和出栈的操作序列可表示为仅由 I 和 O 组成的序列&#xff0c;可以操作的序列称为合法序列&#xff0c;否则称为非法序列。编写一个算法&#xff0c;判定所给的序…

《向量数据库》——都有哪些向量数据库,都有什么特点?

随着大数据和机器学习应用的崛起,对于存储和查询高维度向量数据的需求也逐渐增加。在这个背景下,向量数据库和传统的关系型数据库开始在不同的数据世界中崭露头角,它们分别以各自独特的方式解决了不同类型数据的存储和查询需求。本文将探讨向量数据库和关系型数据库之间的区…

第5章_瑞萨MCU零基础入门系列教程之GPIO输入输出

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

计算机网络原理 运输层

一&#xff0c;运输层协议概述 1&#xff0c;进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最底层。当网络边缘部分的两台主机使用网络核心部分的功能进行…

水表电表集中远程抄表系统分析

电表水表远程抄表系统石家庄光大远通电气有限公司主要经营自动抄表,远程抄表,集中抄表,新供应信息&#xff0c;是石家庄光大远通电气有限公司自动远程抄表系统集信号采集、网络通信于一体的高性能抄表装置&#xff0c;该系统以485通讯方式读取水表电表的数据,以MBUS通讯方式读取…

SwiftUI 内功加持:“曳光弹“实现自定义样式进度条(ProgressView)

概览 虽然 SwiftUI 已为我们内置了很多常用视图&#xff0c;不过有时我们还是需要根据实际来进一步美化显示或增加功能。 如上图所示&#xff0c;在本篇博文中我们将结合敏捷哲学中一个超级实用的开发技巧&#xff1a;曳光弹&#xff0c;来一步一个脚印循序渐进的实现 Progres…

应急响应-Windows挖矿实战

0x00 主机表现 windows主机cpu拉满&#xff0c;主机卡顿&#xff0c;初步判断为中了挖矿病毒 0x00 处置 通过cpu拉满状态&#xff0c;定位初步的进程文件&#xff0c; 通过进程得到的文件上传沙箱&#xff0c;结果显示为恶意文件&#xff0c; 定位到文件夹&#xff0c; 存…

力扣:92. 反转链表 II(Python3)

题目&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#…

秋招实习 算法刷题网站推荐

Home - CodeFun2000 优点&#xff1a; 收录了各大互联网公司最新最全的笔试题。平台贴合真实笔试环境&#xff0c;都是Acm模式&#xff0c;有利于准备秋招。网站的每题都有coder提供的题解&#xff0c;也有专门的博客对每种类型的题目进行分类&#xff0c;大大提高学习的效率。…

Nginx 配置错误导致漏洞

文章目录 Nginx 配置错误导致漏洞1. 环境启动2. CRLF注入漏洞2.1 漏洞描述2.2 漏洞原理2.3 漏洞利用2.4 修复建议 3. 目录穿越漏洞3.1 漏洞描述3.2 漏洞原理3.3 漏洞利用3.4 修复建议 4. add_header被覆盖4.1 漏洞描述4.2 漏洞原理4.3 漏洞利用4.4 修复建议 Nginx 配置错误导致…

矩阵论—线性子空间、生成子空间、核空间、零度、子空间的交与和、直和

线性子空间定义 如果&#xff0c;V1称为平凡子空间&#xff0c;否则称为非平凡子空间。 生成子空间 核空间、零度 解&#xff1a; rank(A)2; n(A)N-rank(A)3-21&#xff0c;这里N表示的是未知量的个数。 n(A)也可以理解为基础解系的个数&#xff0c;即基础解系中有几个向量…

基于TensorFlow 2.3.0 的手势识别系统设计

一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7TensorFlow 2.3.0 二、制作数据集&#xff0c;作者使用了10个类别的手势数集据 三、开始训练模型&#xff0c;作者使用自己开发的软件进行训练模型&#xff0c;方便快捷。软件介绍及下载地址&#xff1a; 手把手教你使用T…

基于SpringBoot+微信小程序的智慧医疗线上预约问诊小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 近年来&#xff0c;随…