JavaSE项目练习:图书管理系统

news2024/11/25 16:52:45

1.简介

通过前面知识:类,抽象类,封装,继承,多态,接口的学习,这篇文章将会通过对学习的知识点的整合运用,写一个小项目——图书管理系统,来帮助大家更好的掌握前面学习的知识点。

2.设计需求

  1. 根据用户信息进行登录(选择身份)

  2. 管理员身份

  • 查找图书
  • 新增图书
  • 删除图书
  • 显示图书
  • 退出系统
  1. 普通用户身份
  • 查找图书
  • 借阅图书
  • 归还图书
  • 退出系统

3.相关类的设计

根据设计需求,我们分析所需要的类.

  1. 首先是图书类 -> 先创建 package book包 -> 创建 Book 类, 表示一本书,创建 BookList 类, 用来保存 N 本书.

  2. 接着是操作类 ->先创建 package operation包 -> 根据功能创建操作类

     							AddOperation  -> 新增图书
     							BrowOperation -> 借阅图书
     							DelOperation -> 删除图书
     							ExitOperation -> 退出系统
     							FindOperation	-> 查找图书							
     							ReturnOperation -> 归还图书
     							ShowOperation -> 显示图书
    

根据操作类来设计一个接口IOPeration

  1. 然后创建用户类 -> 先创建 package user包 -> 创建 User 类, 这是一个抽象类,创建普通用户类, 是 User 的子类创建管理员用户类。

  2. 最后创建测试类Main 来测试下代码的基本框架是否存在问题。

4.图书类

1.Book类

package book;

/**
 * Created with IntelliJ IDEA.
 * Description:书籍信息
 * User: 28144
 * Date: 2022-11-27
 * Time: 18:59
 */
public class Book {
    private String name;//名字
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

    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 double 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 ? "  已近被借出" : "  未被借出")
                + '}';
    }
}

2. BookList类

package book;

/**
 * Created with IntelliJ IDEA.
 * Description:书架
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:06
 */
public class BookList {
    private Book[] books = new Book[10];

    private int usedSize;//来记录当前books数组当中有多少本书

    public BookList() {
        books[0] = new Book("三国演义","罗贯中",89,"小说");
        books[1] = new Book("西游记","吴承恩",59,"小说");
        books[2] = new Book("红楼梦","曹雪芹",189,"小说");
        this.usedSize = 3;
    }

    public Book getBook(int pos) {
        return this.books[pos];
    }

    public void setBook(Book book) {
        this.books[usedSize] = book;
    }

    public void setBook(int pos,Book book) {
        this.books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

5.操作类

操作的接口:

package opera;

import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:16
 */
public interface IOPeration {
    void work(BookList bookList);
}

1.新增图书

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:18
 */
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();
        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 currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)) {
                System.out.println("这本书已经存在,不能再放入!");
                return;
            }
        }
        bookList.setBook(book);
        //修改usedSize
        bookList.setUsedSize(currentSize + 1);

    }
}

在这里插入图片描述

2.借阅图书

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:25
 */
public class BrowOperation 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 currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name) && !book.isBorrowed()) {
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("借阅失败!");

    }
}

在这里插入图片描述

3.删除图书

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:21
 */
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 currentSize = bookList.getUsedSize();
        int index = -1;
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)) {
                index = i;
                break;
            }
        }
        //挪动数据
        for (int j = index; j < currentSize - 1; j++) {
            Book book = bookList.getBook(j + 1);
            bookList.setBook(j,book);
        }
        //修改Size
        bookList.setUsedSize(currentSize - 1);
        //因为删除的是对象,所以把最后一个置为null
        bookList.setBook(currentSize - 1,null);
        System.out.println("删除成功!");
    }
}

在这里插入图片描述

4.查找图书

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:20
 */
public class FindOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        System.out.println("请输入你要查找的图书的名字:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)) {
                System.out.println("找到了这本书");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书!");
    }
}

在这里插入图片描述

在这里插入图片描述

5.归还图书

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:25
 */
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 currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name) && book.isBorrowed()) {
                book.setBorrowed(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("归还失败!");
    }
}

在这里插入图片描述

6.显示图书

package opera;

import book.Book;
import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:22
 */
public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("打印所有图书!");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}

在这里插入图片描述

7.退出系统

package opera;

import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:24
 */
public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}

在这里插入图片描述

6.用户类

1.User类

创建 User类, 这是一个抽象类

package user;

import book.BookList;
import opera.IOPeration;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:12
 */
public abstract class User {
    protected String name;

    protected IOPeration[] ioPerations;

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

    public abstract int menu();

    public void dowork(int choice, BookList bookList) {
        this.ioPerations[choice].work(bookList);
    }
}

2.普通用户类

创建普通用户类, 是 User 的子类.

package user;

import opera.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:14
 */
public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[] {
            new ExitOperation(),
            new FindOperation(),
            new BrowOperation(),
            new ReturnOperation(),
        };
    }

    public int menu() {
        System.out.println("********************************");
        System.out.println("hello " + name + " 欢迎来到图书小练习");
        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;
    }
}

在这里插入图片描述

3.管理员类

创建管理员用户类.

package user;

import opera.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:13
 */
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("********************************");
        System.out.println("hello " + 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.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

在这里插入图片描述

7.测试类

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

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28144
 * Date: 2022-11-27
 * Time: 19:32
 */
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 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来确定调用那个对象的那个操作。
            user.dowork(choice, bookList);
        }
    }
}

在这里插入图片描述

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

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

相关文章

物联网企业争抢「两轮车换电」赛道

两轮电动车正在攻占中国的大街小巷。 甚至无需过多的数据佐证&#xff0c;大家都可以清晰的感受到&#xff0c;“小电驴”正在加速“驰骋”。售价在千余元至万元不等的两轮电动车不仅是居民解决中距离通勤的“好帮手”&#xff0c;更是外卖员、快递员风里来雨里去的“好战友”。…

RabbitMQ镜像队列机制

镜像queue有master节点和slave节点。master和slave是针对⼀个queue而⾔的&#xff0c;⽽不是⼀个node作为所有queue的master&#xff0c;其它node作为slave。⼀个queue第⼀次创建的node为它的master节点&#xff0c;其它node为slave节点。⽆论客户端的请求打到master还是slave最…

JavaEE Bean作用域与生命周期

Bean的作用域 作用域是用来限制程序中变量的可用范围&#xff0c;Bean的作用域是Bean在Spring整个框架中的行为模式。 默认情况下&#xff0c;Spring应用上下文所有的bean都是以单例的形式创建的&#xff0c;不管给定的一个bean被注入到其他bean 多少次&#xff0c;每次所注入的…

Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例

Spring 异步Async注解用法 Spring Async注解用法总结 Spring Async基本用法示例 一、概述 在日常开发的工作中&#xff0c;经常会使用异步进行开发。Spring 提供一个简单的注解 Async &#xff0c;即可实现异步的开发&#xff0c;无需创建线程池&#xff0c;简单明了。 本文将整…

盘点 GitHub 上的神级指南

盘点 GitHub 上那些神级指南&#xff01;本次盘点都是 GitHub 上标星 10K 的开源指南。都是由中国的开发者开源&#xff0c;除了技术、教程类的指南&#xff0c;还有一些花里胡哨的东西。本期推荐开源项目目录&#xff1a;1. 计算机自学指南2. 大数据入门指南3. 程序员延寿指南…

[附源码]计算机毕业设计springboot企业人事管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MASA Framework 事件总线 - 跨进程事件总线

概述 跨进程事件总线允许发布和订阅跨服务传输的消息, 服务的发布与订阅不在同一个进程中 在Masa Framework中, 跨进程总线事件提供了一个可以被开箱即用的程序 IntegrationEvents: 提供了发件箱模式 IntegrationEvents.Dapr: 借助Dapr实现了消息的发布EventLogs.EFCore: 基…

企业想要做好数据分析,可以试试瓴羊Quick BI

企业的数字化发展已经成为了一个发展的方向&#xff0c;可是各个企业如何才可以实现数字化发展确实成为了难题。从很多企业的内部发展中来讲&#xff0c;每一个部分的数据化的分析都已经成为了行业的难点&#xff0c;如何做好这些分析工作确实是很关键的内容。 而在具体数字化…

艾美捷细胞低密度脂肪酸(LDL)摄取试剂盒的功能应用

胆固醇是一种重要的细胞成分&#xff0c;维持胆固醇稳态对正常生理功能至关重要。血浆胆固醇水平升高与各种病理状况有关&#xff0c;最明显的是冠心病&#xff0c;高胆固醇水平导致动脉泡沫细胞形成和斑块堆积&#xff0c;可能导致心脏病发作或中风。细胞胆固醇代谢和血浆胆固…

教育在线学习系统,教育培训都能用,支持多个终端

随着居家隔离不断反复&#xff0c;在线教育也成为了居家学习的必备工具之一。常用的方式就是在线教育培训。教育在线学习系统为教育行业的发展提供了有效工具&#xff0c;推动着教育行业逐步转型到线上线下的教育模式。学生在家通过手机就能随时随地学习&#xff0c;非常的方便…

基于矩阵分解模型的协同过滤理论概述(涉及到SVD,SVD++,TimeSVD++)

前言 本篇文章是对博客&#xff1a;从item-base到svd再到rbm&#xff0c;多种Collaborative Filtering(协同过滤算法)从原理到实现的补全&#xff0c;感谢该作者的分享 本文补全的内容为&#xff1a; SVD中 yjy_jyj​的实际含义理解&#xff0c;以及对应的梯度下降公式TimeS…

[附源码]JAVA毕业设计高校校园社交网络(系统+LW)

[附源码]JAVA毕业设计高校校园社交网络&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

高通导航器软件开发包使用指南(15)

高通导航器软件开发包使用指南&#xff08;15&#xff09;9 基本参数调整9.1关键调谐参数9.2调整过程9.2.1传感器方向9.2.2电子速度控制器&#xff08;ESC&#xff09;9.2.3螺旋桨和电机特性9.2.4指定车辆总质量的参数9.2.5最小和最大推力命令9.2.6推进器配置9.2.7姿态控制增益…

魔兽世界服务端源码各个重要文件详细情况说明开服一条龙

魔兽服务端开服源文件各文件翻译 很多文件在服务器中我们知道是跟什么有关&#xff0c;但就是不知道其作用是什么。就算我们知道在这些地方中的文件都是有着不小的作用。但是由于不知道各个文件代表的是什么意思所以在面对这些文件的时候都会有无从下手的感觉&#xff0c;所以…

入耳式无线蓝牙耳机哪款好?无线入耳蓝牙耳机推荐

随着近几年蓝牙耳机的快速发展&#xff0c;使用蓝牙耳机的人也越来越多&#xff0c;可供人们选择的蓝牙耳机也有很多。那么&#xff0c;在现如今的蓝牙耳机市场中&#xff0c;哪款无线蓝牙耳机好&#xff1f;下面&#xff0c;我来给大家推荐几款无线入耳蓝牙耳机&#xff0c;可…

HTML+CSS+JavaScript仿京东购物网站制作 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

JavaWeb中的VUE快速入门

目录 概述: Vue的安装 Vue的常用指令 通过VUE高效提交表单调用接口请求 Vue的生命周期 概述: Vue是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。Vue为当前的国内前端主流框架&#xff0c;基于MVVM&#xff08;Model-View-ViewModel&…

kubernetes之pod详解

pod详解 文章目录pod详解Pod生命周期一、创建和终止二、 初始化容器Pod调度定向调度亲和性调度污点和容忍Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程运行初始化容器&#xff08;init …

ByteX-shrink_r源码解析

背景 为什么要对R文件内联处理&#xff1f; 这里首先说一下Android R文件的产生&#xff0c;对于Android开发者我们都知道&#xff0c;当我们要使用要使用一些布局文件&#xff0c;drawable等其他资源时&#xff0c;可以直接用 R.id. R.drawble.等直接使用&#xff0c;而这个…

Redis 内存管理

前言 Redis 的同学应该都知道&#xff0c;它基于键值对&#xff08;key-value&#xff09;的内存数据库&#xff0c;所有数据存放在内存中&#xff0c;内存在 Redis 中扮演一个核心角色&#xff0c;所有的操作都是围绕它进行。我们在实际维护过程中经常会被问到如下问题&#x…