万字超详细的Java图书管理系统

news2024/7/4 6:01:03

💕”生命中的每个人都是一个故事,而每个故事都值得被讲述“💕

🎆作者:不能再留遗憾了🎆
🐼专栏:Java学习🐼
🚗该文章主要内容:用Java实现简单的图书管理系统
在这里插入图片描述

文章目录

  • 前言
  • 基本思路
  • 书和书架
    • 书Book类
    • 书架BookList类
  • 用户身份User
    • 父类User
    • 子类AdminUser管理员身份
    • 子类NormalUser普通用户身份
  • 登录
  • 菜单
    • User抽象类
    • AdminUser类
    • NormalUser类
  • 进行具体操作
    • User包补充
      • User
      • AdminUser
      • NormalUser
    • operation包
      • IOperation接口
      • AddOperation类
      • BorrowedOperation类
      • DelOperation类
      • ExitOperation类
      • FindOperation类
      • ReturnOperation类
      • ShowOperation类
  • 整体代码
  • 提示

前言

各位朋友们大家好,今天我为大家分享是可以被称为小项目的图书管理系统,这个小项目运用了我们前面学习的JavaSe的基本上所有的知识点,所以当我们学习JavaSe到一定程度时,我们可以通过实现一个图书管理系统来检测自己的JavaSe语法掌握的到底怎么样。那么废话不多说,大家就跟着我一起来看看吧。

基本思路

1.因为是图书管理系统,所以我们主要针对的对象是书架,书架上面有不同的书,所以我们首先需要创建出书这个对象,然后就是书架来存放我们的书。

2.用户分为管理员和普通用户,不同的身份所具有的权力也不同,管理员可以查找、新增、删除、显示图书,而普通用户则有查找、借阅、归还的功能,并且这些对象是作用在书架上的书上的。

我们可以先看看管理员身份的图书管理系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

普通用户的图书馆管理系统
在这里插入图片描述
在这里插入图片描述

书和书架

我们首先创建一个Book包来存放书Book类书架BookList类

书Book类

我们一本书有书名、作者、类型和价格等属性。我们将书的这些属性都设置为private,防止被别人拿到数据然后恶意修改,只需要提供公共的接口供用户使用数据,增强安全性。

public class Book {
//这里我们成员的属性都设置为private,防止被人恶意修改。增强安全性
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;

//构造方法
    public Book(String name, String author, String type, int price) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.price = price;
    }

    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 String getType() {
        return type;
    }

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

    public int getPrice() {
        return price;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

//我们这里重写toString方法,方便我们后面打印
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                (isBorrowed ? " 被借出" : " 未被借出") +
                '}';
    }
}

书架BookList类

我们使用Java提供的ArrayList链表来充当书架。

public class BookList {

    private ArrayList<Book> books = new ArrayList<>();

//默认书架上有三本书
    public BookList() {
        books.add(new Book("水浒传","罗贯中","小说",89));
        books.add(new Book("三国演义","施耐庵","小说",79));
        books.add(new Book("西游记","吴承恩","小说",49));
    }

    public Book getBook(int pos) {
        return books.get(pos);
    }

    public void setBook(int pos,Book book) {
        books.set(pos,book);
    }

//方便我们获取到书架
    public ArrayList<Book> getBooks() {
        return books;
    }
}

用户身份User

User包创建AdminUser类和NormalUser类
将书和书架完成后,我们就可以继续进行登陆的功能,我们实现的功能需要根据你输入的身份来确定你有哪些权限,所以我们需要创建出AdminUser管理员类NormalUser普通用户类。不同的身份有共同的特性,所以我们创建出User作为父类,将管理员身份和普通用户具有的共性都提取到User中,降低代码的复用性。

父类User

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

子类AdminUser管理员身份

public class AdminUser extends User{
//构造方法
    public AdminUser(String name) {
        super(name);
    }
}

子类NormalUser普通用户身份

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }
}

登录

当我们创建了管理员身份和普通用户身份后,我们就需要根据你输入的身份来决定创建什么身份的对象。我们在login这个方法中决定你的身份,但是我们方法的返回值该是什么呢?AdminUser?NormalUser?这当然不可以,因为我们不知道用户到底是什么身份,那么我们应该怎么解决呢?

这里就用到了我们前面学到的向上转型,我们在login方法中实现登录功能,login方法的返回值是User类型,因为你的AdminUser和NormalUser都继承了User,所以当你返回AdminUser类和NormalUser类都会发生向上转型,然后我们再用User类型的引用来接收返回值,这样就很好的解决了怎样创建不同身份的对象的问题。

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 user = login();
    }
}

菜单

当我们登陆进去后,我们就出现一个菜单提示用户输入,因为就算两种身份功能不同,但是他们都会被提示看到菜单,所以我们同样将menu方法抽取到父类User中,但是我们想一个问题,我们可以在User类中实现方法体吗?

答案是可以的,但是可以是可以,如果你实现的是AdminUser的menu方法,你的子类NormalUser中必须得重写这个方法,你如果实现的是Normaluser也是如此。其实还是比较麻烦的,所以不如直接把User设置成抽象类,将menu设置成抽象方法,不在User中实现方法体,你的不同身份有什么方法,你在对应类中就实现哪些。

User抽象类

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

    public abstract int menu();
}

AdminUser类

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
    }

    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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }

    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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

进行具体操作

我们创建出operation包来实现各种功能。

但是我们该如何根据用户输入的数字来实现不同的功能呢?其实我们可以想想之前C语言的计算器,在计算器中,我们将函数地址放在数组中,然后通过数组下标来调用不同的功能?我们用Java也是同样的思想,不同的是我们在数组中存放的不是函数,而是对象。在知道大概的思路后,我们又该怎么定义这个数组的类型呢?你的每个对象的类型都不同。这里就体现了Java
接口的好处了,如果大家不清楚,大家可以去回顾回顾Java抽象类和接口。接口有着一种特性,只要你不同的类实现了同一个接口,即使你们类类型不同,你们同样可以用这个接口的类型来接收。所以我们就创建一个IOperation接口,接口中有work方法,然后不同的功能去实现这个接口,重写work方法。

我们将IOeration数组定义在父类User中,但是我们只是声明,不初始化,让子类AdminUser和Normaluser分别实现这个IOperation数组。

User包补充

User

public abstract class User {
    String name;
    //创建ioperations这个成员变量
    public IOperation[] ioperations;
    public User(String name) {
        this.name = name;
    }

    public abstract int menu();
}

AdminUser

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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

NormalUser

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.ioperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

operation包

IOperation接口

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

AddOperation类

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
        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,type,price);
        //直接使用ArrayList提供的add方法添加
        bookList.getBooks().add(book);
        System.out.println("添加成功");
    }
}

BorrowedOperation类

public class BorrowedOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入你要借的书的书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
            //判断是否被借出
                if(!bookList.getBook(i).isBorrowed()) {
                    System.out.println("借阅成功");
                    //将该书籍标记为借出
                    bookList.getBook(i).setBorrowed(true);
                }else {
                    System.out.println("此书籍已被借出");
                }
                return;
            }
        }
        System.out.println("未找到该书籍");
    }
}

DelOperation类

public class DelOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的书的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
            //同样使用ArrayList提供的remove方法
                bookList.getBooks().remove(i);
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("书库中没有此书籍");
    }
}

ExitOperation类

public class ExitOperation implements IOperation{
    public void work(BookList bookList) {
    //将所有的书都置为null
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}

FindOperation类

public class FindOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书籍的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
            //这里就是我们在Book类中重写toString方法的原因
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("未找到此书籍");
    }
}

ReturnOperation类

public class ReturnOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的书籍的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                bookList.getBook(i).setBorrowed(false);
                return;
            }
        }
    }
}

ShowOperation类

public class ShowOperation implements IOperation{
    public void work(BookList bookList) {
        for(int i = 0; i < bookList.getBooks().size(); i++) {
            System.out.println(bookList.getBook(i));
        }
    }
}

整体代码

Main类

import Book.BookList;
import 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 ret = user.menu();
            user.ioperations[ret].work(booklist);
        }
    }
}

package Book

Book类

package Book;

public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;

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

    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 String getType() {
        return type;
    }

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

    public int getPrice() {
        return price;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                (isBorrowed ? " 被借出" : " 未被借出") +
                '}';
    }
}

BookList类

package Book;

import java.util.ArrayList;

public class BookList {
    private ArrayList<Book> books = new ArrayList<>();

    public BookList() {
        books.add(new Book("水浒传","罗贯中","小说",89));
        books.add(new Book("三国演义","施耐庵","小说",79));
        books.add(new Book("西游记","吴承恩","小说",49));
    }

    public Book getBook(int pos) {
        return books.get(pos);
    }

    public void setBook(int pos,Book book) {
        books.set(pos,book);
    }

    public ArrayList<Book> getBooks() {
        return books;
    }
}

package User

User类

package User;

import Operation.IOperation;

public abstract class User {
    String name;
    public IOperation[] ioperations;
    public User(String name) {
        this.name = name;
    }

    public abstract int menu();
}

AdminUser类

package User;

import Operation.*;

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("==================================");
        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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

NormalUser类

package User;

import Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.ioperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                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("请输入你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

package operation

IOperation接口

package Operation;

import Book.BookList;

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

AddOperation类

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
        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,type,price);
        bookList.getBooks().add(book);
        System.out.println("添加成功");
    }
}

BorrowedOperation类

package Operation;

import Book.BookList;

import java.util.Scanner;

public class BorrowedOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("请输入你要借的书的书名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                if(!bookList.getBook(i).isBorrowed()) {
                    System.out.println("借阅成功");
                    bookList.getBook(i).setBorrowed(true);
                }else {
                    System.out.println("此书籍已被借出");
                }
                return;
            }
        }
        System.out.println("未找到该书籍");
    }
}

DelOperation

package Operation;

import Book.BookList;

import java.util.Scanner;

public class DelOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的书的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                bookList.getBooks().remove(i);
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("书库中没有此书籍");
    }
}

ExitOperation

package Operation;

import Book.BookList;

public class ExitOperation implements IOperation{
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}

FindOperation类

package Operation;

import Book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书籍的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("未找到此书籍");
    }
}

ReturnOperation类

package Operation;

import Book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的书籍的书名");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBooks().size(); i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                bookList.getBook(i).setBorrowed(false);
                return;
            }
        }
    }
}

ShowOperation类

package Operation;

import Book.BookList;

public class ShowOperation implements IOperation{
    public void work(BookList bookList) {
        for(int i = 0; i < bookList.getBooks().size(); i++) {
            System.out.println(bookList.getBook(i));
        }
    }
}

提示

别忘记导入对应的包哦

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

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

相关文章

三、PEMFC基础之组件间热传导

三、PEMFC基础之组件间热传导 一、理论基础二、编程实践 一、理论基础 热传导主要基于傅里叶热传导定律。在燃料电池中&#xff0c;除了各组件内部的热传导外&#xff0c;还有冷却流体与双极板的对流换热。公式略。 燃料电池内部稳态导热&#xff1a; d 2 T d x 2 q i n t k…

iMazing2软件最新版本功能技术参数详细介绍

这里有iMazing 的产品概述、功能特性、技术参数等详细介绍&#xff0c; 可以帮助您快速入门&#xff0c;了解iMazing的功能。不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要使用 USB 电缆将设备连接到计算机&#xff0c;就可以处理不同类型的数据。 自动备份 iMazi…

【Linux】基础IO——文件描述符

目录 什么是文件描述符标准输入、输出、错误的返回值类型FILE*的理解进程中文件描述符的分配规则重定向的原理重定向的实际使用方法dup2 如何理解缓冲区 什么是文件描述符 在基础IO的上一篇博客里有提到过&#xff0c;系统调用open与close的返回值问题&#xff1a; 成功返回文…

PyQGIS中一次性加载多个shp文件

目录 遍历添加多个图层 打印图层列表清单 打开QGIS Desktop 3.22.16&#xff0c;点击菜单栏 【设置】——>【Python控制台】 在Python控制台中点击【显示编辑器】按钮&#xff0c;打开Python编辑器 点击Python编辑器的第一个按钮 【打开脚本文件】&#xff0c;选择加载遍历…

2023年继续使用WordPress的6个最重要原因

为什么要使用 WordPress&#xff1f;我的网站不够好吗&#xff1f;为什么我需要从另一个平台切换到 WordPress&#xff1f; 在本文中&#xff0c;我们将分享您应该使用 WordPress 的最重要原因。我们还将涵盖您可以使用 WordPress 创建的所有不同类型的网站&#xff0c;并展示…

c高级(常用命令及软件安装与下载)

初始工作路径不在家目录下&#xff0c;在不切换路径的情况下&#xff0c;在家目录下创建一个subdir目录&#xff0c;在subdir这个目录下&#xff0c;创建subdir1和subdir2&#xff0c;并且把/etc/passwd拷贝到subdir1中&#xff0c;把/etc/group文件拷贝到subdir2中&#xff0c…

开源趣事~ 记给 OpenHarmony 提 PR 的那些事

大家好哇&#xff0c;许久不见&#xff0c;也感谢大家这么久一直以来的关注&#xff0c;也感谢在短视频盛行的今天&#xff0c;你们还能静下心来坚守文字的阵地。 说到这次的主题&#xff0c;参加鸿蒙项目的开源&#xff0c;也是小编第一次拥抱开源&#xff0c;就像是别人有困…

vue脚手架+elementUI,实现登录用户时的Loading...窗口

文章目录 App.vuevuex全局变量登陆成功Login组件使用AboutMe组件中关闭 登录失败情况login组件中关闭 改为aop思想的请求拦截器 App.vue 为了全局通用控制此标签&#xff0c;所以我建议把他放到App.vue文件中 <!--全局加载ing&#xff0c;保证不会在转换组件时被销毁-->…

Day965.从持续集成到持续部署 -遗留系统现代化实战

从持续集成到持续部署 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于从持续集成到持续部署的内容。 只有做好任务分解和小步提交&#xff0c;才能放心大胆地 PUSH 代码&#xff0c;触发持续构建&#xff1b; 只有通过质量门禁&#xff0c;才能得到一个有信心的制…

【Spring MVC】Spring MVC的执行流程以及运行原理

文章目录 一、 什么是MVC&#xff1f;二、什么是SpringMVC&#xff1f;三、SpringMVC中的核心组件四、SpringMVC的执行流程五、关于DispatcherServlet的配置说明六、关于SpringMVC的配置文件以及常用部分注解解释七、参考资料 一、 什么是MVC&#xff1f; MVC 是 Model、View …

软件工程的基础

软件危机软件工程软件工程是将系统化的&#xff0c;严格约束的&#xff0c;可量化的方法应用于软件的开发&#xff0c;运行和维护&#xff0c;将工程应用于软件。 软件工程的三个要素&#xff1a;方法&#xff0c;工具&#xff0c;过程软件的生命周期&#xff0c;是指从从软…

Vue列表展示【第二篇】

&#x1f331; 1、vue列表展示案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vueDemo02列表展示</title> </head> <body> <div id"xy"><!--原始展示方式…

深入篇【C++】类与对象:运算符重载详解 -(下)+日期类的实现

[TOC](深入篇【C】类与对象&#xff1a;运算符重载详解-(下&#xff09;日期类的实现&#x1f4af;干货满满&#xff01;) ⏰一.运算符重载 内置类型(int /double…… )是可以之间进行运算符之间的比较的&#xff0c;因为编译器知道它们之间的比较规则&#xff0c;可以之间转…

Linux下C/C++(端口扫描技术)

随着互联网使用的不断增加&#xff0c;网络攻击也在增加。互联网本质上已经成为现代。因此&#xff0c;了解互联网和使用互联网是非常重要的。网络技术的安全性在当今时代是非常重要和必要的。 在本文中&#xff0c;我们将讨论一个非常重要的主题&#xff0c;即可能破坏计算机…

es 7.x 通过DSL的常用查询语句

一 模拟造数 1.1 模拟数据 添加数据修改数据的请求方式为post http://localhost:9200/student/_doc/101 { "name":"zhangsan", "nickname":"zhangsan","sex":"男","age":30,"createTime":…

InnoDB线程模型

新版本结构演变 MySQL 5.7 版本 将 Undo日志表空间从共享表空间 ibdata 文件中分离出来&#xff0c;可以在安装 MySQL 时由用户自行指定文件大小和数量增加了 temporary 临时表空间&#xff0c;里面存储着临时表或临时查询结果集的数据Buffer Pool 大小可以动态修改&#xff0…

2.3 利用NumPy进行统计分析

2.3 利用NumPy进行统计分析 2.3.1 读/写文件1、二进制的文件读写2、读取文本格式的数据 2.3.2 使用数组进行简单统计分析1、排序2、去重与重复数据3、常用的统计函数 2.3.1 读/写文件 NumPy文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式 1、二进制的文件读…

代码随想录算法训练营第三十六天 | 重叠区间

435. 无重叠区间 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;依然是判断重叠区间 | LeetCode&#xff1a;435.无重叠区间_哔哩哔哩_bilibili 状态&#xff1a;能做出来&#xff0c;用的“补充(1)”的左边界排序&#xff0c…

SpringCloud —— eureka

目录 1.认识微服务 1.0.学习目标 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 2.2.1.导入Sql语句 2.2.2.导入demo工程 2.3.实现远程调用案例 2.3.1.案例需求&#xff1a; 2.3.2.注…

4. Mysql索引优化实战一

一条SQL在MySQL中是如何执行的 1. 示例表举一个大家不容易理解的综合例子 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 索引下推优化详解Mysql优化器索引选择探究索引优化Order…