javase小项目--图书管理系统

news2024/12/26 23:16:47

前面我们已经学习到了javase的基本语法结构-继承,多态,接口,接下来就让我们大家一起来利用这些来手动实现一个小项目——简洁的图书管理系统

目录

1.思路

1.book类

1.book

2.booklist

2.user类

user

AdminUser

NormalUser

3.ioperation类

Ioperation(方法的统一接口)

AddOperation

BorrowOperation

DelOperation

ExitOperation

FindOperation

ReturnOperation

ShowOperation

总结


1.思路

如图所示

我们这个系统1.首先需要输入姓名,2.然后要通过不同用户的选择来展现不同的菜单,3.然后再根据菜单来进行增删改查,显示等

我们前面学习并了解了JAVA是一个面向对象的语言,那我们现在就可以粗略的将图书管理分为三个大体的类:书,用户,操作,于是我们可以在idea上先建设三个软件包,分别表示book,user,iopration然后单独创建一个Main函数

1.book类

 book类中我们可以再分为两类book以及booklist,book负责存放书籍的各种信息,booklist负责充当书架功能,将书籍的各种信息存放下来

1.book

package book;

public class Book {
    private String bookname;//书名
    private String autor;//作者
    private double price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否借出

    public Book(String name, String autor, double price, String type) {
        this.bookname = name;
        this.autor = autor;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return bookname;
    }

    public void setName(String name) {
        this.bookname = name;
    }

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

    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;
    }

    @Override
    public String toString() {
        return "BookList{" +
                "name='" + bookname + '\'' +
                ", autor='" + autor + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }

}

2.booklist

将book类组成一个数组存储起来,而且可以初始化书架,将书架上原始的书先存放进去

ackage book;

public class BookList {
    private Book[] books = new Book[10];
    private int  useSize;

    public BookList(){
        this.books[0] = new Book("西游记","吴承恩",19.9,"小说");
    }
}

初步解决好book类后我们就可以来处理用户类了

2.user类

首先我们发现当这个系统输入完名字后就会让我们选择用户还是管理员

由于不同的身份有相同的效果,且有些方法虽然名字相同但是实际上产生的效果并不相同

所以我们可以利用抽象类来让管理员类和用户类来进行继承操作

于是我们将user软件包分为三类

1.(父类)user

2.(管理员类) AdminUser

3.(用户类)NormalUser

然后我们就可以依据需求来写代码了

user

然后我们就可以根据管理员菜单和用户菜单来分别为其写代码了

AdminUser

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
    }
    //管理员界面
    public  int menu(){
        System.out.println("欢迎"+this.name+"来到图书系统");
        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("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }
}

NormalUser

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
    }

    @Override
    public int menu() {
        System.out.println("欢迎"+this.name+"来到图书系统");
        System.out.println("*******普通用户菜单*******");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }
}

 做完以上代码,让我先自己手动的写一个初始的Main来检查下,

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import user.fly;

import java.util.Scanner;

public class Main {
    public static User login(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名");
        String name = scanner.nextLine();
        System.out.println("请选择你的身份 1. 用户 0.管理员");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new AdminUser(name);
        }else if(choice == 0){
            return new NormalUser(name);
        } else{
            return new fly(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();//首先初始化出书架

        while(true){
            User user = login();//首先调用login
            int choice = user.menu();
            user.ioperation(choice,bookList);
        }
    }
}

 其中最难办的就是login函数,输入名字相信大家都会,关键是后面的Return值,首先我们的需求是  想要根据自己手动输入choice来选择对应的菜单 ,但是我们想要不同的菜单就需要调用AdminUser和NormalUser的方法,此时函数就会报错,然后我们就需要用到向上转型,将函数类型定义为User。

3.ioperation类

搞定名字输入有,以及管理员和用户的区别后,我们就可以进行不同用户对应的功能实现

首先我们由于都只需要实现一个功能,所以我们暂且用一个接口来实现,在这个接口上放要展开的功能

和前面相同我们同样需要根据输入的数字不同来实现不同的功能

因为我们看到了菜单

1.首先我们要在菜单显示部分输入数字,故菜单menu方法的类型为整型,

2.menu内的数据将放回到user上,故我们同样需要利用User来实现方法的调用,

3.我们要在管理员和用户两个类上采用不同的两种方法且方法比较多,故我们可以使用数组来存储方法,并且用数组的下标来负责两者的连接,

4.但是当我们在Main方法上使用时,需要调用User,user上面并不存在数组,故我们需要在user(父类)方法上写一个新的成员变量,ioperation类的数组来存储方法们(其实和前面选择管理员和用户一样,都用到了向上转型)

5.然后我们就可以在user(父类)这个抽象类上写调用操作方式 的方法了

user代码:

package user;

import book.BookList;
import ioperation.Ioperation;

import java.awt.*;

public abstract class User {//因为不知道是管理员还是用户,所以我们使用抽象类
    protected String name;//由于名字需要在界面传过来,实现包与包的的通用
    //所以使用protected
    protected Ioperation[] ioperations;//为操作定义一个数组方便进行方法的选择

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void ioperation(int choice, BookList bookList){
        ioperations[choice].work(bookList);
    }
}

AdminUser代码

package user;

import ioperation.*;

import java.util.Scanner;

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(),
        };
    }
    //管理员界面
    public  int menu(){
        System.out.println("欢迎"+this.name+"来到图书系统");
        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("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }
}

NormalUser代码

package user;

import ioperation.*;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println("欢迎"+this.name+"来到图书系统");
        System.out.println("*******普通用户菜单*******");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("**********************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();
        return choice;
    }
}

Ioperation(方法的统一接口)

写一个总体的父类,方便后面利用数组进行选择

package ioperation;

import book.BookList;

public interface Ioperation {
    public void work(BookList bookList);
}

AddOperation

package ioperation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements Ioperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增书籍........");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你想要添加的书籍名");
        String name = scanner.nextLine();


        int userSize = bookList.getUseSize();//getUserSize是获取书架上的size数据
        for (int i = 0; i < userSize; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("找到了查找的书籍,不能添加");
                return;
            }
        }

        System.out.println("请输入你想要添加的书籍作者");
        String autor = scanner.nextLine();

        System.out.println("请输入你想要添加的书籍类型");
        String type = scanner.nextLine();

        System.out.println("请输入你想要添加的书籍价格");
        double price = scanner.nextDouble();

        Book book = new Book(name,autor,price,type);
         bookList.setBooks(book,userSize);//setBooks
         bookList.setUseSize(userSize+1);
    }
}

BorrowOperation

package ioperation;

import book.BookList;

import java.util.Scanner;

public class BorrowOperation implements Ioperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("正在借阅图书......");
        System.out.println("请输入你想要借阅的书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int userSize = bookList.getUseSize();
        for (int i = 0; i < userSize; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                if(bookList.getBooks(i).isBorrowed()){
                    System.out.println("已经被其他人借出");
                    return;
                }
                bookList.getBooks(i).setBorrowed(true);
                System.out.println("成功借出");
            }

        }
    }
}

DelOperation

package ioperation;

import book.BookList;

import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;

public class DelOperation implements Ioperation {

    @Override
    public void work(BookList bookList) {
        System.out.println("正在删除书籍.......");
        System.out.println("请输入你想要删除的书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int userSize = bookList.getUseSize();
        int pos = -1;
        for (int i = 0; i < userSize; i++) {
            if(bookList.getBooks(i).getName().equals(name) == false){
                System.out.println("并无此书");
                return;
            }
            pos = i;
        }
        for (int j = 0,i = 0; j < userSize; j++) {
            if(j != pos){
                bookList.setBooks(bookList.getBooks(i),j);
                i++;
            }
        }
        bookList.setUseSize(userSize-1);
    }
}

ExitOperation

package ioperation;

import book.BookList;

public class ExitOperation implements Ioperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("正在退出系统......");
        System.exit(0);
    }
}

FindOperation

import java.awt.desktop.SystemEventListener;
import java.util.Scanner;

public class FindOperation implements Ioperation {

    @Override
    public void work(BookList bookList) {
        System.out.println("查找书籍.......");
        System.out.println("请输入你想要查找的书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int userSize = bookList.getUseSize();
        for (int i = 0; i < userSize; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("找到了查找的书籍");
            }
            else {
                System.out.println("没找到");
            }
        }
    }
}

ReturnOperation

package ioperation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements Ioperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("正在归还图书......");
        System.out.println("请输入你想要归还的书籍名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int userSize = bookList.getUseSize();

        for (int i = 0; i < userSize; i++) {

            if(bookList.getBooks(i).getName().equals(name)){
                if(bookList.getBooks(i).isBorrowed()){
                    bookList.getBooks(i).setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                }
                System.out.println("此书并未借出");
            }
            else {
                System.out.println("馆内并无这本书");
            }
        }
    }
}

ShowOperation

package ioperation;

import book.BookList;

public class ShowOperation implements Ioperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("正在展示书籍......");
        int usersize = bookList.getUseSize();
        for (int i = 0; i < usersize; i++) {
            System.out.println(bookList.getBooks(i));
        }
    }
}

操作方法类大家多半都会,其实最难得是框架思路

总结

我们这次只要利用java的基本知识来初步实现了图书管理系统

首先根据小窗口,Main函数来实现了输入名字,然后想要分管理员和用户,

我们实现了User软件包,利用user类用继承,将用户和管理员包含进去,然后再Main函数上调用user的菜单方法,由于管理员类和用户类菜单方法的重写,实现向上转型,成功实现了管理员菜单和用户菜单的分离,

分离过后希望实现输入相同数字实现不同功能

我们就格外创建了功能方法类的软件包,将方法统一使用ioperation,方便将8种方法封装在Ioperation中,在 user中创建一个Ioperation数组,放在管理员和用户类中,通过两个不同数组来实现相同数字下标,方法不同的结果

booklist中get和set方法也要记得改成数组形式

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

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

相关文章

如何使用Pytorch-Metric-Learning?

文章目录 如何使用Pytorch-Metric-Learning&#xff1f;1.Pytorch-Metric-Learning库9个模块的功能1.1 Sampler模块1.2 Miner模块1.3 Loss模块1.4 Reducer模块1.5 Distance模块1.6 Regularizer模块1.7 Trainer模块1.8 Tester模块1.9 Utils模块 2.如何使用PyTorch Metric Learni…

传统CV算法——基于harris检测算法实现角点检测

角点 角点是图像中的一个特征点&#xff0c;指的是两条边缘交叉的点&#xff0c;这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中&#xff0c;角点是重要的特征&#xff0c;因为它们通常是图像中信息丰富的区域&#xff0c;可以用于图像分析、对象识别、3D…

JavaScript 循环控制语句-break和continue

break循环 首先i0&#xff0c;判断i是否<5,满足条件&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i0&#xff0c;i的值加1&#xff0c;判断i是否<5&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i1&#xff0c;i的值加1&#xff0c…

【H2O2|全栈】关于HTML(6)HTML基础(五 · 完结篇)

HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类&#xff08;五&#xff09; 本文中的标签在什么位置中使用&#xff1f; 表单&#xff08;二&#xff09; 下拉选择菜单 文本域 案例 拓展标签 iframe框架 案例 预告和回顾 后话 前言 本系列博客介…

EasyExcel模板导出与公式计算(下)

目录 环境要求 功能预览 需求分析 导入依赖 制作模板 编写代码 格式优化 最终效果 总结 在上一篇 EasyExcel模板导出与公式计算&#xff08;上&#xff09;-CSDN博客 文章中我们知道了在若依中使用自带的Excel注解来实现表格数据的导出&#xff0c;并且通过重写相关接…

C++复习day07

一、继承 1.什么是继承&#xff1f;继承的意义是什么&#xff1f; 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c…

C++ STL 适配器

系列文章目录 模板特例化&#xff0c;偏特化&#xff0c;左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C STL 序列式容器(二) https://blog.csdn.net/surfaceyan/arti…

项目实战系列三: 家居购项目 第四部分

购物车 &#x1f333;购物车&#x1f346;显示购物车&#x1f346;更改商品数量&#x1f346;清空购物车&&删除商品 &#x1f333;生成订单 &#x1f333;购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量…

比较顺序3s1,3s2,4s1之间的关系

(A,B)---6*30*2---(0,1)(1,0) 分类A和B&#xff0c;让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值&#xff0c;3s1为 3s2为 4s1为 3s1&#xff0c;3s2&#xff0c;4s1这3个顺序之间是否有什么联系 &#xff0c; 因为4s1可以按照结构加法 变换成与4s1内在…

Linux相关概念和重要知识点(2)(用户、文件和目录、inode、权限)

1.root和普通用户 在Windows里面&#xff0c;管理员Administrator是所有用户里面权限最高的&#xff0c;很多文件都会提示请使用管理员打开等。但在整个Windows系统中&#xff0c;管理员的权限并不是最大的&#xff0c;System优先级更高&#xff0c;因此我们系统中的某些文件是…

谈谈ES搜索引擎

一 ES的定义 ES 它的全称是 Elasticsearch&#xff0c;是一个建立在全文搜索引擎库Lucene基础上的一个开源搜索和分析引擎。ES 它本身具备分布式存储&#xff0c;检索速度快的特性&#xff0c;所以我们经常用它来实现全文检索功能。目前在 Elastic 官网对 ES 的定义&#xff0c…

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x) {if (_finish _endofstorage){int n pos - _start;size_t newcapacity capacity() 0 ? 2 : capacity() * 2;reserve(newcapacity);pos _start n;//防止迭代器失效}int end _finish-1;while (end > pos){*(end 1…

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例&#xff0c;展示了进度管理中的复杂性和潜在的冲突&#xff1a; 案例一&#xff1a;近期&#xff0c;一个长期合作的客户因政策要求&#xff0c;急需我们为多家医…

SQL的增删改查CRUD练习知识点(day27)

1 学习目标 重点掌握插入单条记录的语法了解全表插入记录的语法重点掌握修改记录的语法重点掌握删除记录的语法重点掌握主键约束、外键约束了解检查约束、非空约束、唯一约束 2 数据类型 MySQL支持多种数据类型&#xff0c;大致可以分类三类&#xff1a;数值、日期和字符串。…

【JavaEE初阶】多线程(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程状态 线程安全 代码示例 解释 总结原因 解决方案-->加锁 t1和t2都加锁 且 同一个锁对象 t1和t2中只有一个加锁了 t1和t2都加锁,但锁对象不同 加锁 与线程等待…

我给孩子请了个AI老师,省掉了1999元的报名费

大家好&#xff0c;我是凡人。 最近老婆想给儿子在线报个书法班&#xff0c;要价1999元&#xff0c;本来是个好事情&#xff0c;但一向勤俭持家的我&#xff0c;怎能让她花这个冤枉钱&#xff0c;经过我三七二十一个小时的上网&#xff0c;还真让我找出一套利用AI学习的万能命…

图片无损放大编辑PhotoZoom Pro 9.0.4多版本软件2024年最新安装包下载含安装教程

PhotoZoom Pro 9.0.4是一款非常流行的图像放大软件&#xff0c;它可以让你将低分辨率的图像放大到高分辨率的尺寸&#xff0c;同时保持高质量的图像细节和清晰度。 PhotoZoom Pro 9.0.4采用了一种称为S-Spline技术的算法&#xff0c;这是一种能够保持图像细节的高级插值算法。…

Web3 详解

1. 使用 Web3 库 Web3 是一个 JavaScript 库&#xff0c;可用于通过 RPC 通信与以太坊节点通信。 Web3 的工作方式是&#xff0c;公开已通过 RPC 启用的方法&#xff0c;这允许开发利用 Web3 库的用户界面&#xff0c;以便与部署在区块链上的合约进行交互。 一旦 Geth JavaScri…

25届计算机专业选题推荐-基于python的线上拍卖会管理系统【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的线上拍卖会管理…

Window下编译OpenJDK17

本文详细介绍Window下如何编译OpenJDK17&#xff0c;包含源码路径&#xff0c;各工具下载地址&#xff0c;严格按照文章中的步骤来操作&#xff0c;你将获得一个由自己亲手编译出的jdk。 一、下载OpenJDK17源码 下载地址&#xff1a;GitHub - openjdk/jdk at jdk-1735 说明&a…