【Java】图书管理系统,完整版+源代码!!!

news2024/10/7 10:24:57

1. 图书管理系统菜单

1.1 管理员菜单

  1. 查找图书
  2. 新增图书
  3. 删除图书
  4. 显示图书
  5. 退出系统

1.2普通用户菜单

  1. 查找图书
  2. 借阅图书
  3. 归还图书
  4. 退出系统

2.基本框架的实现

首先我们要建立一个新的文件,在文件内建立三个包,分别命名为user(用户)、book(图书),operation(操作)
在这里插入图片描述
先写book相关的代码。于是,我们先在book包中新建一个java类,名为:Book。
在这里插入图片描述
显示图书时,我们希望它能显示出所有图书的名称、作者、价格、类型和图书目前是否借出。

	private String name;//书名
    private String author;//作者
    private int price;//价格(价格也可以定义为浮点型)
    private String type;//图书的种类
    private boolean isLend;//图书是否被借出

右击鼠标,选择Generate(这里我加了汉化),选择Getter and Setter 选项,点击shift,点最后一个,就能全选
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自动生成:

 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 isLend() {
        return isLend;
    }

再写它们的构造方法:

当我们新增一本图书时,它默认就是未被借出的,所以不用构造方法。

快捷键:alt+insert。按ctrl,可以多选,直接生成下面代码块:

 public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
            // this.isLend = isLend;新生成的书籍默认是没有被借出的,所以省略
    }

我们再右键选择Generate,选择ToString,全选,点OK,自动生成:

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

此时,在book包中新建一个类:BookList(书架):
在这个书架中,我们希望能在里面固定的位置放书,并且能知道放了几本书:

 private Book[] books=new Book[10];//这个书架可以放十本书
 private int useSize;//记录下当前book数组中有几本书

然后依旧是右键Generate ,getter and setter(先选useSize),自动生成:

public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }

这边先按照思路把整体的框架下先实现出来,其中的细节之后再慢慢写出来

book包已经告一段落了,现在来写user包

我们在user包中新建三个类:AdminUser(管理员)、NormalUser(普通用户)、User

NormalUser、AdminUser,这也就是我们图书管理系统面对的两个对象了,管理员和普通用户,他们具有一些相同的属性。我们就可以写一个User类,让两个类去继承,来省一些代码了

这里先写user类

package user;
 
public class User {
    protected String name;//名字.这边的protect代表的是名字的权限。如果是private,它只能在同一个包的同一类使用。就不能让AdminUser类继承了。
    //写public的话,权限太大了,不是很好。
    public User(String name) {//构造方法
        this.name = name;
    }
}

所以在AdminUser类中:

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

可以直接用快捷键,alt+insert,直接生成构造方法。

同理,NormalUser类中:

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

现在书的属性和用户的属性的包和类已经完成差不多,现在要搭建用户的功能上去

由于想要实现的功能和操作基本上是针对图书的我们可以继续创一个包operation再创建一个接口命名为IOperation

package operation;

import book.BookList;

public interface IOperation {
    void work(BookList bookList);

}

我们在opera(实现功能的包)中,创建两个类,AddOperation、FindOperation,这两个类。

我们会发现这两个类的实现也都要依靠BookList(书架)来实现。所以,在这两个类中,实现接口:

FindOperation类中:

package operation;
 
import book.BookList;
public class FindOperation implements IOperation{//继承
    @Override
    public void work(BookList bookList) {//重写IOPeration类中的work方法
        System.out.println("查找图书!");
    }
}

AddOperation类中:

package operation;
 
import book.BookList;
 
public class AddOperation implements IOPeration {
    public void work(BookList bookList){
        System.out.println("新增图书!");
    }
}

同理,新建类DelOperation(删除图书):

package operation;
 
import book.BookList;
 
public class DelOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
    }
}

新建一个类:ShowOperation(显示图书):

package operation;
 
import book.BookList;
 
public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("打印所有图书!");
    }
}

再新建一个类:ExitOperation(退出系统):

package operation;
 
import book.BookList;
 
public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
    }
}

新建一个BrrowOperation类(借阅图书):

package operation;
 
import book.BookList;
 
public class BrrowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
    }
}

再新建一个类:ReturnOperation(归还图书):

package operation;
 
import book.BookList;
 
public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
    }
}

在这里插入图片描述
接着,我们来细化我们的类。

我们还没有给user添加菜单。

我们先给管理员添加菜单:

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("请输入你的操作:");
    }

再给普通用户添加菜单:

 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("请输入你的操作:");
    }
}

现在,我们写main方法。在src下新建一个类:Main:

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->管理员 0->普通用户");
            int choice =scanner.nextInt();
            if(choice==1){
                //说明是管理员
                //由于有返回值,所以我们的方法返回值就不能写void了。但是我们也无法确定返回值是什么,可能是管理员,可能是用户。所以,用向上转型,写User.
                return new AdminUser(name);//返回实例化一个管理员对象
            }else {
                return new NormalUser(name);//返回实例化一个用户对象
            }
        }
    public static void main(String[] args) {
  User user=login();//执行上面的login方法
        user.menu();//实现打印菜单
    }
}

执行login方法时,我们是还不知道new的对象是管理员还是用户的。所以,在打印菜单时,我们也不能直接使用我们在AdminUser类和NormalUser类中写的menu()方法

所以,我们在我们的menu菜单中,需要输入我们的功能选择

   Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;

输入功能选择,我们就要通过这个选择就实现:

首先,我们要根据对象(管理员或用户),选择引用哪一个菜单方法:

NormalUser类中:

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

AdminUser类中:

public AdminUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
    }

当我们在构造方法中,写了这些,也就为它们分配了内存。当main类中login()方法下,new一个对象时,就会执行相应的构造方法,在这里就是开辟内存:
在这里插入图片描述
在User类中:

我们加上这样一段代码:

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

this.ioPerations[choice]其实就是new了一个对象。后面的.work(bookList)是调用图书中对应的work方法。

由此一来,我们就可以根据我们一步步的选择,调用book包中对应的work方法。

为了让代码在输入0的时候退出系统,我们用while语句(在Main方法中修改):

   while (true){
            int choice=user.menu();//实现打印菜单
            user.doWork(choice,bookList);
        }

这下子基本框架就构造好了。

然后我们进行测试,测试通过——>继续

3.实现业务

3.1打印所有图书

我们先在BookList类,也就是书架中先添加图书:

public BookList(){
        books[0]=new Book("语文","张三",15,"教科书");
        books[1]=new Book("数学","李四",14,"教科书");
        books[2]=new Book("英语","王五",16,"教科书");
        this.useSize=3;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }

然后,我们实现打印所有图书这个业务 。

在ShowOperation类中,添加打印所有图书的程序,利用for循环。

在ShowOperation类中:

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("显示图书___");

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

我们会发现一些小瑕疵,比如这边输出的false我们想把它改成已借出,未借出。

这时,我们要用到三目运算符。条件?符合输出:不符合输出

在book类中修改:

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

显示结果:
在这里插入图片描述

3.2 退出系统

退出系统很简单,只需要加上下面语句即可。0代表正常退出。

System.exit(0);

在这里插入图片描述

3.3 查找图书

查找图书是跟刚才打印图书差不多的思路。通过for循环,利用equal()进行比对,输出图书信息。

在FindOperation类中补充代码:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("查找图书___");
        System.out.println("请输入你要查找的图书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)){
                System.out.println("找到了这本书:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要找的书。");
    }
}

3.4 增加图书

我们要先输入新增图书信息,new一个对象,判断这本图书是否已经存在,如果不存在,则存入书架中。

AddOperation类:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("新增图书___");

        if (bookList.isFull()) {
            System.out.println("书架满了,不能继续新增图书");
            return;
        }

        System.out.println("请输入你要新增图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        System.out.println("请输入你要新增图书的作者:");
        String author=scanner.nextLine();

        System.out.println("请输入你要新增图书的价格:");
        int price=scanner.nextInt();

        System.out.println("请输入你要新增的图书的类型:");
        String type=scanner.nextLine();

        Book book=new Book(bookName,author,price,type);

        int currentSize= bookList.getUseSize();

        bookList.setBook(currentSize,book);

        bookList.setUseSize(currentSize+1);

        System.out.println("新增图书成功");
    }
}

我在价格的地方,设置的是int类型。 int price=scanner.nextInt();这个语句执行完,它就不会执行后面的输入语句了。这是我疏忽的一个点。

查询了多种方法后,发现还是调换顺序可以更方便地解决

3.5删除图书

删除图书,我们要注意,不仅仅是把那本书删除就好了,还需要把后面的书往前挪。

DelOperation类:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("删除图书___");
        System.out.println("请输入你要删除的图书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        int pos=-1;
        int i = 0;
        for (; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)){
                //找到了这本书并记录下标
                pos=i;
                break;
            }
        }
        //没有找到
        if (i >= currentSize) {
            System.out.println("没有你要找的书");
            return;
        }
        //开始删除
        for (int j = pos; j < currentSize-1; j++) {
            Book book=bookList.getBooks(j+1);
            bookList.setBook(j,book);
        }

        //修改useSize
        bookList.setUseSize(currentSize-1);

        bookList.setBook(currentSize-1,null);

        System.out.println("删除成功");
    }
}

BookList类:

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

我们可以注意到在BookList新添加的这个方法跟刚才在写增加图书时放置图书的方法相似。不过,我们可以注意到,增加图书,就是在最后面放一本书,就好了。而这里,是把后面的书一本本往前挪一个书位。

3.6借阅图书

思路:判断图书是否在书库中存在,判断图书是否已经被借出。满足条件,执行

3.7归还图书

思路:判断图书是否在书库中存在,判断书是否已被借出。

4.总代码

在这里插入图片描述

Book

package book;

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

    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 isLend() {
        return isLend;
    }

    public void setLend(boolean lend) {
        isLend = lend;
    }

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
            // this.isLend = isLend;新生成的书籍默认是没有被借出的,所以省略
    }

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

BookList

package book;

/**
 * 书架
 */
public class BookList {
    private Book[] books=new Book[10];
    private int useSize;
    public BookList(){
        books[0]=new Book("语文","张三",15,"教科书");
        books[1]=new Book("数学","李四",14,"教科书");
        books[2]=new Book("英语","王五",16,"教科书");
        this.useSize=3;
    }

    public Book getBooks(int pos) {

        return books[pos];
    }

    public void setBook(int pos,Book book){
        books[pos]=book;
    }
    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
    public boolean isFull(){
        if (this.useSize == books.length) {
            return true;
        }
        return false;
    }

}

AddOperation

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("新增图书___");

        if (bookList.isFull()) {
            System.out.println("书架满了,不能继续新增图书");
            return;
        }

        System.out.println("请输入你要新增图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        System.out.println("请输入你要新增图书的作者:");
        String author=scanner.nextLine();

        System.out.println("请输入你要新增图书的价格:");
        int price=scanner.nextInt();

        System.out.println("请输入你要新增的图书的类型:");
        String type=scanner.nextLine();

        Book book=new Book(bookName,author,price,type);

        int currentSize= bookList.getUseSize();

        bookList.setBook(currentSize,book);

        bookList.setUseSize(currentSize+1);

        System.out.println("新增图书成功");
    }
}

BorrowOperation

package operation;

import book.Book;
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 bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)) {
                book.setLend(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("借阅失败");

    }
}

DelOperation

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("删除图书___");
        System.out.println("请输入你要删除的图书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        int pos=-1;
        int i = 0;
        for (; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)){
                //找到了这本书并记录下标
                pos=i;
                break;
            }
        }
        //没有找到
        if (i >= currentSize) {
            System.out.println("没有你要找的书");
            return;
        }
        //开始删除
        for (int j = pos; j < currentSize-1; j++) {
            Book book=bookList.getBooks(j+1);
            bookList.setBook(j,book);
        }

        //修改useSize
        bookList.setUseSize(currentSize-1);

        bookList.setBook(currentSize-1,null);

        System.out.println("删除成功");
    }
}

ExitOperation

package operation;

import book.BookList;

public class ExitOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("退出系统___");

        int currentSize=bookList.getUseSize();

        for (int i = 0; i < currentSize; i++) {
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}

FindOperation

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("查找图书___");
        System.out.println("请输入你要查找的图书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)){
                System.out.println("找到了这本书:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要找的书。");
    }
}

IOperation

package operation;

import book.BookList;

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

ReturnOperation

package operation;

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 bookName=scanner.nextLine();

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            if (book.getName().equals(bookName)) {
                book.setLend(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("归还失败");
    }
}

ShowOperation

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperation {
    public void work(BookList bookList){
        System.out.println("显示图书___");

        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

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("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;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                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;
    }
}

User

package user;

import book.BookList;
import operation.IOperation;

public abstract class User {
    protected String name;
    protected IOperation[] iOperations;
    public User(String name){
        this.name=name;
    }
    public abstract int menu();

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

Main

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

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.管理员  2.普通用户");

        int choice= scanner.nextInt();
        if (choice == 1) {
            AdminUser adminUser=new AdminUser(name);
            return adminUser;
        }else {
            NormalUser normalUser=new NormalUser(name);
            return normalUser;
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user=login();
        while (true){
        int choice=user.menu();
        user.doIoperations(choice,bookList);
        }
    }
}

部分测试截图:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于FPGA的图像锐化算法(USM)设计

免费获取源码请关注微信号《FPGA学习笔记册》&#xff01; 1.图像锐化算法说明 图像锐化算法在实际的图像处理应用很广泛&#xff0c;例如&#xff1a;医学成像、工业检测和军事领域等&#xff1b;它的作用就是将模糊的图像变的更加清晰。常用的图像锐化算法有拉普拉斯算子、s…

【全开源】JAVA情侣扭蛋机情侣游戏系统源码支持微信小程序+微信公众号+H5

一、功能介绍 会员功能、情侣扭蛋 收到的券、送出的券 合伙代理、意见反馈 我们技术使用JAVA后台服务 前后端分离 springbootmybatisplusmysql 用户端 uniapp&#xff08;vue语法&#xff09;管理后台 vueelementUi 适配小程序H5公众号&#xff0c;一套源码&#xff0c;无…

LeetCode 2684.矩阵中移动的最大次数:一列一列处理,只记能到哪行(BFS)

【LetMeFly】2684.矩阵中移动的最大次数&#xff1a;一列一列处理&#xff0c;只记能到哪行(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-number-of-moves-in-a-grid/ 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整…

VsCode 配置go开发环境之下载go tools

ctrl shift P 选择 go install/update tools&#xff0c;下载go tools 报错&#xff0c; 提升dial err。 将GOPROXY 和 GOSUMDB 按照如下配置&#xff0c;重启IDE即可成功下载 set GOPROXYhttps://goproxy.cn set GOSUMDBoff

oops-framework框架 之 启动流程(三)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 回顾 上篇博客中我们通过 oops-game-kit 模版构建了基础的项目&#xff0c;另外讲解了下assets目录结构和游戏配置文件的基本使用相关&#xff0c;详情内容可参考&#xff1a; oops-framewo…

「黄钊的AI日报·第三季」正式发布!

每天5条AI内容点&#xff1a;不是新闻汇总&#xff0c;而是站在11年AI产品经理的视角&#xff0c;将原AI信息中的干货认知&#xff0c;提炼成我自己的文字、展示“what I see”。 做社群“AI产品经理大本营”6年以来&#xff0c;我都是在非常用心的输出AI干货&#xff1b;这份“…

html5使用Websocket

html5使用Websocket 前言1、html5中的websocket2、创建一个 WebSocket 对象3、监听 WebSocket 连接事件4、监听 WebSocket 收到消息事件5、监听 WebSocket 关闭事件6、 监听 WebSocket 出错事件7、发送消息8、整体代码 前言 在即时通讯的交互方式中websocket是一个很使用的方式…

C/C++整数和浮点数在内存中存储

1. 整数在内存中的存储&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤1表⽰“负”&#xff0c;⽽数值位最 ⾼位的⼀位是被当做符号位&#xff0c;剩余的都是…

蓝桥杯2022年第十三届省赛真题-GCD

solution1(通过60%) 观察数据发现,最大公约数为abs(a-b) 当abs(a-b) > min(a, b)时&#xff0c;最小增量为g - min(a, b) #include<iostream> #include<algorithm>typedef long long LL;using namespace std; int main(){LL a, b, g, k -1, t1, t2;scanf(&qu…

Django验证码(二)

一、生成图片 1.1、说明 通过pillow模板库生成图片,步骤如下 安装pillow模板建立 生成验证码内容 方法建立 生成验证码颜色 方法建立 生成验证码 方法1.2、需要安装 Pillow 库 pip install Pillow==9.3.01.3、生成验证码内容 import randomdef random_str(length=4):"…

5 分钟小工具:使用 dive 分析 docker 镜像

需求 拿到一个镜像之后&#xff0c;我想知道&#xff1a; 分层查看镜像里都有哪些文件各层使用了什么命令构建的这个镜像镜像里比较大的文件有哪些&#xff08;可能需要优化&#xff09; dive 工具介绍 dive 工具可以做这些分析。dive 的 github 地址是 wagoodman/dive&…

由浅到深认识C语言(13):共用体

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

S4 Hana SD -信贷管理 - 03

6. 自动信贷控制及检查规则 6.1 自动信贷控制与检查规则简介 自动信用控制将针对同一信用控制范围的不同的客户风险类别和信贷组执行不同的信用控制政策。对于ECC系统而言,无需单独设置检查规则,可在自动信贷控制进行设置即可,如图1-5-2。在S4 HANA版本中,自动信贷控制和检…

Day39:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

目录 SpringBoot-监控系统-Actuator SpringBoot-接口系统-Swagger 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方组件使用等. 框架库&#xff1a;MyB…

[沉淀之华] 自研基于SpringBoot Mybaits 构建低代码数据治理脚手架分享:涵盖数据同步、数据比对、数据归档、数据恢复为一体

文章目录 成果演示背景整体能力功能描述相关细节安装使用 成果演示 Github地址&#xff1a;数据治理脚手架 wiki&#xff1a;kg-ctl-core使用文档 背景 为什么要做这个&#xff1f; 一个老生常谈且不得不谈问题&#xff1a;随着业务日益发展&#xff0c;如果不做数据迁移&…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

JVM学习-JVM的自动优化

目录 1.语法糖 1.1默认构造器 1.2自动拆装箱 1.3泛型集合取值 1.4可变参数实现 1.5 foreach循环 1.6 switch配合String使用 1.7 switch配合枚举使用​编辑 1.8 try-with-resources 1.9方法重写的桥接方法 2.运行时优化 2.1分层优化以及逃逸分析 2.2方法内联 2.3字段优化 JVM会…

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层&#xff0c;允许你在类 Unix 操作系统&#xff08;包括 Ubuntu&#xff09;上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤&#xff1a; 在 Ubuntu 上安装 Wine&#xff1a; 更新软件包列表&#xff1a; 打开终端并运行以下命令以…

Maya自定义工具架

有时候我们需要自己定义工具架上的内容&#xff0c;比如将一个工具放到工具架上&#xff0c;或者删除一个工具 添加一个工具 例如我们想在多边形建模栏位上添加一个分离按钮&#xff0c;默认 1 先切换到想要添加的工具架栏位 2 打开菜单&#xff0c;找到我们想添加的工具 …

重新认识BIO、NIO、IO多路复用、Select、Poll、Epollo它们之间的关系

目录 一、背景 二、名词理解 &#xff08;1&#xff09;BIO &#xff08;2&#xff09;NIO &#xff08;3&#xff09;IO多路复用 &#xff08;4&#xff09;Select、Poll、Epollo 三、他们之间的关系总结 一、背景 最近又在学习网络IO相关知识&#xff0c;对我们常说的…