【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。(在IDEA中运行,启动类在src -> Main 中运行)

图书管理系统

设计一个简单的控制台输出的图书管理系统,我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个核心模块:书籍管理、用户管理、借阅与归还管理。以下是一个基础的设计方案:

设计内容

数据模型设计
  • Book 类:包含书的属性,如 name(书名)、author(作者)、price(价格)、type(类型)、borrowed(借出情况)等。
  • User 类:包含用户属性,如 name(姓名)、Books(已借书籍列表,可以是Book对象的集合)。
功能模块设计
  • 书籍管理

    • 添加书籍
    • 删除书籍
    • 显示书籍信息
    • 查询书籍(按书名查找)
  • 用户管理

    • 查找图书
    • 借阅图书
    • 归还图书

设计要求

用户交互友好性
  • 系统应提供清晰的菜单选项,方便用户进行操作。
  • 对于错误输入,系统应给出友好的提示信息,指导用户正确操作。
数据一致性与安全性
  • 保证数据的一致性,例如在借书时检查书籍是否可借。
  • 虽然是控制台应用,也应考虑简单安全措施,比如对用户密码进行基本的加密处理。
 系统扩展性
  • 设计时应考虑未来可能的功能扩展,如增加评论系统、推荐系统等,确保现有架构易于扩展。

在该项目中我们设计了两个菜单:

 用来各执行不同的操作。

项目操作步骤

1、建立包:

在该项目中我们建立三个包:1、book 2、operation 3、user 分别用来存放与书籍相关的类、与操作相关的类、与用户相关的类。

编写与书籍相关的类:

Book类的代码:

package book;

import java.util.Objects;

/**
 * Created with IntelliJ IDEA.
 * Description:图书
 * User: lenovo
 * Date: 2024-06-04
 * Time: 20:13
 */
public class Book {
    private String name;//书名
    private String auther;//作者
    private int price;//价格
    private String type;//书的类型
    private boolean isBorrowed;//书是否被借出

    public Book(String name, String auther, int price, String type) {
        this.name = name;
        this.auther = auther;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return name;
    }

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

    public String getAuther() {
        return auther;
    }

    public void setAuther(String auther) {
        this.auther = auther;
    }

    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 + '\'' +
                ", 作者:'" + auther + '\'' +
                ", 价格:" + price +
                ", 类型:'" + type + '\'' +
                ((isBorrowed == true)?",借出情况:已借出":",借出情况:未借出")  +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return price == book.price && isBorrowed == book.isBorrowed && Objects.equals(name, book.name) && Objects.equals(auther, book.auther) && Objects.equals(type, book.type);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, auther, price, type, isBorrowed);
    }
}

BookList类的代码:

package book;

/**
 * Created with IntelliJ IDEA.
 * Description:书架
 * User: lenovo
 * Date: 2024-06-04
 * Time: 20:29
 */
public class BookList {
    private Book[] booklist = new Book[10];//用来存放书
    private int usedSize;//计数器,用来记录当前书架有多少书

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

    public void setBooks(int pos, Book book){
        booklist[pos] = book;
    }
    public Book getBook(int pos){
        return booklist[pos];
    }
    public int getUsedSize() {
        return usedSize;
    }

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

编写与用户相关的类:

AdminUser 类的代码:

package user;

import operation.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:19
 */
public class AdminUser extends Users{
    public AdminUser(String name) {
        super(name);
        this.books = new IBooks[]{
                new ExitOperation(),
                new FindBooks(),
                new AddBooks(),
                new DelBooks(),
                new ShowBooks()
        };
    }

    @Override
    public int menu() {
        System.out.println("=====================================");
        System.out.println("hallo! "+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.println("=====================================");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

Normaluser 类的编写:

package user;

import operation.*;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:19
 */
public class NormalUser extends Users{
    public NormalUser(String name) {
        super(name);
        this.books = new IBooks[]{
                new ExitOperation(),
                new FindBooks(),
                new BorrowBooks(),
                new ReturnBooks()
        };
    }

    @Override
    public int menu() {
        System.out.println("========================================");
        System.out.println("hallo! "+this.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;
    }
}

Users 类的代码:

package user;

import book.BookList;
import operation.IBooks;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:13
 */
public abstract class Users {
    protected String name;
    public IBooks[] books;

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

    public abstract int menu();

    public void doOperation(int choice,BookList booklist){
        books[choice].work(booklist);
    }
}

编写与操作相关的类:

AddBooks 类代码的编写:

package operation;
import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 21:54
 */
public class AddBooks implements IBooks{
    @Override
    public void work(BookList booklist){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名");
        String name = scanner.nextLine();
        System.out.println("请输入作者");
        String auther = scanner.nextLine();
        System.out.println("请输入价格");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入书的类型");
        String type = scanner.nextLine();
        Book book = new Book(name,auther,price,type);
        int count = booklist.getUsedSize();
        for (int i = 0; i < count; i++) {
            Book book1 = booklist.getBook(i);
            if(book1.getName().equals(name)){
                System.out.println("已经存在这本书,不能在进行添加了");
                return;
            }
        }
        booklist.setBooks(count,book);
        booklist.setUsedSize(count+1);
        System.out.println("添加成功!");
    }
}

BorrowBooks 类的代码编写:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:09
 */
public class BorrowBooks implements IBooks{
    @Override
    public void work(BookList booklist) {
        int count = booklist.getUsedSize();
        if(count == 0){
            System.out.println("图书馆没有图书!");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的书籍的名字:>");
        String name = scanner.nextLine();
        int tmp = -1;
        for (int i = 0; i < count; i++) {
            Book book = booklist.getBook(i);
            if(book.getName().equals(name)){
                tmp = i;
                break;
            }
        }
        if(tmp == -1){
            System.out.println("图书馆没有该图书!");
            return;
        }
        Book book1 = booklist.getBook(tmp);
        if(book1.isBorrowed() == true){
            System.out.println("该书籍已经被借出!");
            return;
        }
        book1.setBorrowed(true);
        System.out.println("借阅成功!");
        return;
    }
}

DelBooks 类的代码编写:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:02
 */
public class DelBooks implements IBooks{
    @Override
    public void work(BookList booklist){
        int count = booklist.getUsedSize();
        if(count == 0){
            System.out.println("图书馆没有图书!");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的图书的名字:>");
        String name = scanner.nextLine();
        int tmp = -1;
        for (int i = 0; i < count; i++) {
            Book book = booklist.getBook(i);
            if(book.getName().equals(name)){
                tmp = i;
                break;
            }
        }
        if(tmp == -1){
            System.out.println("没有找到该图书,请重新选择!");
            return;
        }else{
            for (int i = tmp; i < count - 1; i++) {
                Book book1 = booklist.getBook(i+1);
                booklist.setBooks(i,book1);
            }
        }
        booklist.setUsedSize(count - 1);
        System.out.println("删除图书成功!");
        return;
    }
}

ExitOperation 类的代码编写:

package operation;

import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:06
 */
public class ExitOperation implements IBooks{
    @Override
    public void work(BookList booklist) {
        int count = booklist.getUsedSize();
        for (int i = 0; i < count; i++) {
            booklist.setBooks(i,null);
        }
        booklist.setUsedSize(0);
        System.out.println("成功退出图书管理系统");
        System.exit(0);
    }
}

FindBooks 类的代码:

package operation;
import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 21:57
 */
public class FindBooks implements IBooks{
    @Override
    public void work(BookList booklist){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书名");
        String name = scanner.nextLine();
        int count = booklist.getUsedSize();
        for (int i = 0; i < count; i++) {
            Book book = booklist.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本图书");
    }
}

IBooks 类的代码:

package operation;

import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:00
 */
public interface IBooks {
    void work(BookList booklist);
}

ReturnBooks 类的代码:

import book.BookList;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:10
 */
public class ReturnBooks implements IBooks{
    @Override
    public void work(BookList booklist) {
        int count = booklist.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要归还书籍的名字::");
        String name = scanner.nextLine();
        int tmp = -1;
        for (int i = 0; i < count; i++) {
            Book book = booklist.getBook(i);
            if(book.getName().equals(name)){
                tmp = i;
                break;
            }
        }
        if(tmp == -1){
            System.out.println("图书馆没有该图书");
            return;
        }
        Book book2 = booklist.getBook(tmp);
        book2.setBorrowed(false);
        System.out.println("图书归还成功!");
    }
}

ShowBooks 类的代码:

package operation;

import book.Book;
import book.BookList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 22:03
 */
public class ShowBooks implements IBooks{
    @Override
    public void work(BookList booklist) {
       int count = booklist.getUsedSize();
       if(count == 0){
           System.out.println("图书馆没有图书!");
           return;
       }
        for (int i = 0; i < count; i++) {
            Book book = booklist.getBook(i);
            System.out.println(book);
        }
    }
}

Main 类的代码:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.Users;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2024-06-04
 * Time: 20:08
 */
public class Main {
    public static Users 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();
        Users users = login();
        while(true){
            int choice = users.menu();
            users.doOperation(choice,booklist);
        }
    }
}

最后代码在Main类中启动。

运行结果如下图:

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

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

相关文章

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂&#xff0c; 挑起存储的大梁。因为内存的存取速度超凡地快&#xff0c; 但内存上的数据掉电又会丢失&#xff0c;一直其中缓存的作用&#xff0c;就像是我们的工…

基于System-Verilog的FPGA设计与仿真

一、System-Verilog System Verilog的发展 SystemVerilog 的出现是为了因应日益复杂的数位电路设计和验证需求。虽然Verilog HDL 在早期的数位电路设计中得到了广泛应用&#xff0c;但随着技术的发展和电路复杂度的增加&#xff0c;Verilog HDL 在某些方面已经显得有些不足以满…

线稳源极跟随 线性电源前端降压

功率MOSFET线性电源涉及跟随.ms14 根本原理是Vgs对Id的控制&#xff0c;Vgs越大&#xff0c;Id越大&#xff0c;反之亦然。 观察转移特性曲线&#xff0c;结合接线图可知&#xff0c;电路稳定后&#xff0c;如果负载电阻增大&#xff0c;则Vsgnd增大&#xff0c;由于Vggnd有稳…

【数据挖掘】机器学习中相似性度量方法-余弦相似度

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

在k8s上部署一个简单的应用

部署一个简单的应用 实验目标&#xff1a; 部署一个简单的 web 应用&#xff0c;比如 Nginx 或者一个自定义的 Node.js 应用。 实验步骤&#xff1a; 创建一个 Deployment。创建一个 Service 来暴露应用。验证应用是否可以通过 Service 访问。 今天我们来做一下昨天分享的可…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件&#xff1a; STM32F102C8T6核心板&#xff0c;按键&#xff0c;0.96 OLED显示屏。 软件&#xff1a; 1、硬件启动触发单片机输出PWM&#xff0c;未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇&#xff0c;甜蜜约会日常成网友热议焦点近日&#xff0c;有网友在日本街头再次偶遇了“国民老公”王思聪&#xff0c;这次他不仅携带着一位美丽的女友&#xff0c;还展现出了两人之间亲密无间的互动&#xff0c;让不少网友感叹&#xff1a;这真的是每天…

Kafka 如何保证消息顺序及其实现示例

Kafka 如何保证消息顺序及其实现示例 Kafka 保证消息顺序的机制主要依赖于分区&#xff08;Partition&#xff09;的概念。在 Kafka 中&#xff0c;消息的顺序保证是以分区为单位的。下面是 Kafka 如何保证消息顺序的详细解释&#xff1a; ⭕分区内消息顺序 顺序写入&#…

掌握特劳特定位理论核心,明晰企业战略定位之重

在当今瞬息万变的市场环境中&#xff0c;企业战略定位的重要性日益凸显。它不仅是企业在激烈竞争中保持优势的关键&#xff0c;更是企业实现长期可持续发展的基石。 哈佛大学战略学教授迈克尔波特&#xff08;Michael Porter&#xff09;指出战略就是形成一套独具的运营活动&a…

前端组件样式穿透修改

背景&#xff1a; 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式&#xff0c; 但是element-ui 并没有提供修改的接口。 这时&#xff0c;就是需要手动修改样式。 解决方法…

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

canvas学习

Canvas API 提供了一个通过 JavaScript 和 HTML 的 元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas 的基本用法 <canvas> 元素 <canvas id"tutorial" width"150" height"150&quo…

基数和基数转换

目录 一、定义&#xff1a; 二、各个进制&#xff1a; 1、二进制&#xff1a; 2、八进制&#xff1a; 3、十进制&#xff1a; 4、十六进制&#xff1a; 三、基数转换&#xff1a; 1、各类基数转十进制&#xff1a; 二转十&#xff1a; 八转十&#xff1a; 十六转八&a…

1. 人工智能中的相关术语的概述

1.1 机器学习的概念&#xff1a;机器学习是指从有限的观测数据中学习出具有一般性的规律&#xff0c;并利用这些规律对未知数据进行预测的方法。机器学习可以分为监督学习&#xff0c;无监督学习和强化学习。 传统的机器学习主要关注于如何学习一个预测模型。一般需要首先将数据…

【教程】学会用PS做海报(教你如何套模板+模板资源),以研电赛展架为例

网上的视频都是好几十个小时&#xff0c;看起来很耗费时间&#xff0c;其实做海报&#xff0c;展架只用到其中的一部分功能&#xff0c;本文会进行讲解 这里写目录标题 去年研电赛做的展架1.首先打开比赛给的展板照片&#xff0c;按照研电赛要求设置大小2.调出ps的几个窗口&am…

苹果发布云AI系统;谷歌警告0day漏洞被利用;微软紧急推迟 AI 召回功能;劫持活动瞄准 K8s 集群 | 网安周报0614

苹果发布私有云计算&#xff0c;开创 AI 处理新时代&#xff0c;隐私保护再升级&#xff01; 苹果宣布推出一个名为“私有云计算”&#xff08;PCC&#xff09;的“开创性云智能系统”&#xff0c;该系统专为在云中以保护隐私的方式处理人工智能&#xff08;AI&#xff09;任务…

【数学竞赛】阿里巴巴全球数学竞赛(附2019-2024年试题+答案)

阿里巴巴全球数学竞赛对所有年龄、背景和职业的个人开放。迄今为止&#xff0c;最年长的参赛者超过80岁&#xff0c;最年轻的仅8岁。 2024年共计801名选手参加比赛&#xff0c;涟水这中专的姜萍获得了全球12名的出众成绩&#xff0c;港中大也抛出了橄榄枝。 初赛注重享受数学之…

【Linux内核】伙伴系统算法和slab分配器(1)

【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09; 目录 【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09;伙伴系统&#xff08;buddy&#xff09;算法伙伴系统算法基本原理内存申请内存回收 接口函数源码分析内存分配接口物理内存释放接口规范…