【JavaSE】小练习 —— 图书管理系统

news2025/4/6 15:58:02

【JavaSE】JavaSE小练习 —— 图书管理系统

  • 一、系统功能
  • 二、涉及的知识点
  • 三、业务逻辑
  • 四、代码实现
    • 4.1 book 包
    • 4.2 user 包
    • 4.3 Main 类
    • 4.4 完善管理员菜单和普通用户菜单
    • 4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书.....)
    • 4.6 operation 包
    • 4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?
    • 4.8 管理员的操作写完了,接下来是普通用户的操作:
    • 4.9 接下来实现具体业务:
      • 4.9.1 普通用户的具体业务实现 :
      • 4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书

一、系统功能

  1. 输入用户名
  2. 是以什么身份登录(普通用户 or 管理员)
  3. 普通用户选项菜单 && 管理员选项菜单
  4. 功能实现(普通用户和管理员菜单可操作的功能有所不同)
     4.1 查找图书(普通用户 和 管理员)
     4.2 新增图书(管理员)
     4.3 删除图书(管理员)
     4.4 显示图书(普通用户 和 管理员)
     4.5 退出系统(普通用户 和 管理员)
     4.6 借阅图书 (普通用户 )
     4.7 归还图书(普通用户 )
  5. 隐藏功能(就是背地里完成的功能)
     5.1 存储数的信息
     5.2 书不止一本,所以该怎么存储?
     5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。

二、涉及的知识点

  1. 基础语法:数据类型、数组、方法
  2. 类和对象
  3. 继承和多态
  4. 抽象类和接口

三、业务逻辑

  1. 找对象 --> 创建对象 --> 使用对象
  2. 抽象出来的对象:
    书 / 书架
    用户 :分为管理员 / 普通用户
  3. 这些操作,需要分类:
    哪些是管理员的?哪些是普通用户的?
    怎么分类?

四、代码实现

4.1 book 包

在这里插入图片描述

  • Book类

在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法。

package book;

//书籍对象
public class Book {
    private String name;//书籍名称
    private String author;//作者
    private int price;//书籍价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //因为前面的成员变量是private,需要提供get()和set()方法
    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 isBorrowed() {
        return isBorrowed;
    }

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


    //toString()方法
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

  1. BookList类

这里我们需要实现的有可以存放很多Book的数组,可以与增加、删除等功能的对应方法。

package book;
//书架

public class BookList {
    private Book[] books;//存放书籍
    private static final int DEFAULT_SIZE = 10;

    private int usedSize;//书架上 原有有效书籍的个数

    public BookList() {
        this.books = new Book[DEFAULT_SIZE];
    }

    public int getUsedSize() {
        return usedSize;
    }

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

    //还有待补充的.....
}

4.2 user 包

user 用户的意思,无论是管理员,还是普通用户,都是用户。那么就意味着两者具有共性,我们将其提取出来。
在这里插入图片描述

  • User 类
package user;

public abstract class User {
    public String name;

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

    public abstract void menu();//普通用户 或者 管理员,可以重写菜单
    //可先不实现,所以写成 抽象类
}

  • NormalUser 类
package user;

public class NormalUser extends User{

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

    @Override
    public void menu() {
        System.out.println("普通用户菜单.....");
    }
}

  • AdminUser 类
package user;

public class AdminUser extends User{

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

    @Override
    public void menu() {
        System.out.println("管理员菜单....");
    }
}

4.3 Main 类

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){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {
        User user = login();
        user.menu();

    }
}

运行Main:

输入1,管理员菜单;输入2,普通用户菜单。

在这里插入图片描述

总结:
(1)向上转型
在这里插入图片描述
(2)动态绑定
在这里插入图片描述

4.4 完善管理员菜单和普通用户菜单

//管理员菜单
package user;

public class AdminUser extends User{

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

    @Override
    public void 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("*****************************");

        System.out.println("请输入你的操作:");
    }
}
//普通用户菜单
package user;

public class NormalUser extends User{

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

    @Override
    public void 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("*****************************");

        System.out.println("请输入你的操作:");

    }
}

运行Main:

输入1,管理员菜单;输入2,普通用户菜单。

在这里插入图片描述

4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书…)

  • AdminUser 类
package user;

import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(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("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.IOperation;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{

        };
    }

    @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("*****************************");

        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

  • User 类
package user;

public abstract class User {
    public String name;

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

    public abstract int menu();//普通用户 或者 管理员,可以重写菜单
    //可先不实现,所以写成 抽象类
}

  • Main类
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){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {
        User user = login();
        int choice = user.menu();
    }
}

4.6 operation 包

在这里插入图片描述

  • FindBook
package operation;

import book.Book;

public class FindBook {
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}

  • AddBook
package operation;

import book.Book;

public class AddBook {
    @Override
    public void work(Book[] books) {
        System.out.println("新增图书.....");
    }
}

4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?

这些操作放在一起,需要一个统一类型的数组 – (接口)。

  • IOPeration接口
package operation;

import book.Book;

public interface IOperation {
    void work(Book[] books);
}

所以上面的操作需要继承IOperation接口,重写work()方法

  • 修改后的FindBook
package operation;

import book.Book;

public class FindBook implements IOperation{
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}

  • 修改后的AddBook
package operation;

import book.Book;

public class FindBook implements IOperation{
    @Override
    public void work(Book[] books) {
        System.out.println("查找图书.....");
    }
}
  • DelBook
package operation;

import book.Book;

public class DelBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("删除图书.....");
    }
}
  • ShowBook
package operation;

import book.Book;

public class ShowBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("打印图书.....");
    }
}

  • ExitBook
package operation;

import book.Book;

public class ExitBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("退出系统......");
    }
}

4.8 管理员的操作写完了,接下来是普通用户的操作:

查找图书和退出系统已经有了,还剩下借阅图书、归还图书操作。

  • BorrowedBook
public class BorrowedBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("借阅图书.....");
    }
}

ReturnBook

public class ReturnBook implements IOperation{

    @Override
    public void work(Book[] books) {
        System.out.println("归还图书....");
    }
}

所以的类都实现了IOPeration接口,意味着这个接口可以放 所以类的对象,但是还没有分开管理员和普通用户的操作,那么怎么分开?

给User 类定义成员变量,在这里插入图片描述
因为AdminUser和NormalUser继承了User,只需要在AdminUser和NormalUser 中对IOperation进行指定类型的初始化,就可以将 管理员对应的操作 和 普通用户对应的操作 分开。

  • 修改的User类
public abstract class User {
    public String name;

    public IOperation[] iOperations;//未被初始化

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

    public abstract int menu();
}
  • 修改后的AdminUser类
public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitBook(),
                new BorrowedBook(),
                new ReturnBook(),
        };
    }

    @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("*****************************");

        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;

    }
}

  • 修改后的AdminUser类
public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
            new ExitBook(),
            new FindBook(),
            new AddBook(),
            new DelBook(),
            new ShowBook()
        };
    }

    @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("4: 显示图书");
        System.out.println("0: 退出系统");
        System.out.println("*****************************");

        System.out.println("请输入你的操作:");

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

根据choice选择管理员/普通用户对应菜单的选择,即操作IOperation数组:
在User类中定义操作IOperation的方法。
在这里插入图片描述

  • User类
package user;

import book.Book;
import book.BookList;
import operation.IOperation;

public abstract class User {
    public String name;

    public IOperation[] iOperations;//未被初始化

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

    public abstract int menu();

    public void doiOperations(int choice, BookList books){
        //在Normal菜单中选择3,根据choice来
        // 操作NoramlUser的IOperation[]数组
        IOperation iOperation = this.iOperations[choice];
        //向上转型
        iOperation.work(books);
    }
}
  • Main类
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import book.BookList;

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){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        }//向上转型

    }
    public static void main(String[] args) {

        BookList bookList = new BookList();
        User user = login();
        int choice = user.menu();

        user.doiOperations(choice,bookList);
    }
}

4.9 接下来实现具体业务:

4.9.1 普通用户的具体业务实现 :

查找图书 - > 根据书名查找

  • BookList
package book;
//书架

public class BookList {
    private Book[] books;//存放书籍
    private static final int DEFAULT_SIZE = 10;

    private int usedSize;//书架上 原有有效书籍的个数

    public BookList() {
        this.books = new Book[DEFAULT_SIZE];
        //预先存3本书
        this.books[0] = new Book("三国演义","罗贯中",20,"武侠小说");
        this.books[1] = new Book("西游记","吴承恩",28,"神话小说");
        this.books[2] = new Book("红楼梦","曹雪芹",15,"小说");
        this.usedSize  = 3;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

    //还有待补充的.....
    public Book getBook(int pos){//下标pos
        return books[pos];
    }

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

  • FindBook实现
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

        //查找图书:遍历BookList的books数组,看看每一本书的name和输入的是否一样
        //1.确定当前数组中,有效的书籍个数
        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("没有你要找的书籍");
    }
}

在这里插入图片描述

  • ExitBook
package operation;

import book.Book;
import book.BookList;

public class ExitBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统......");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {//退出系统,需要把指向的对象回收
              //bookList[i] = null;
              bookList.setBooks(i,null);
        }
        bookList.setUsedSize(0);
        System.exit(0);//0表示正常退出
    }
}

  • BorrowedBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowedBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书.....");
        System.out.println("请输入你要借阅的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        //1.先遍历数组 查找是否存在要借阅的图书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //2.如果存在 检查 是否已经被借出
                if(book.isBorrowed()){
                    System.out.println("这本书已经被借出了!");
                }else{
                    //3.如果不存在 则不能借阅
                    book.setBorrowed(true);
                    System.out.println(book);
                    System.out.println("借阅成功");

                }
                return;
            }
        }
        //4. 如果没有借出 可以借阅;否则 不能借阅
        System.out.println("没有你要找的这本书,无法借阅!");
    }
}


在这里插入图片描述

  • ReturnBook 归还图书
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书....");
        System.out.println("请输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        //1.先遍历数组 查找是否存在要归还的图书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //2.如果没有被借出 则不用归还
                if(!book.isBorrowed()){
                    System.out.println("这本书没有被借出过,不用还!");
                }else{
                    //3.否则 归还 显示归还成功
                    System.out.println("归还成功");
                    System.out.println(book);
                    book.setBorrowed(false);
                }
                return;
            }
        }
        //4. 没有要找的图书 无法归还
        System.out.println("没有你要找的这本书,无法归还!");
    }
}

在这里插入图片描述

  • Book
package book;

//书籍对象
public class Book {
    private String name;//书籍名称
    private String author;//作者
    private int price;//书籍价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //因为前面的成员变量是private,需要提供get()和set()方法
    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 isBorrowed() {
        return isBorrowed;
    }

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


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

4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书

  • 新增图书 AddBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书.....");
/*
//扩容
        if(isFull(bookList)){
            System.out.println("书架满了....");
        }
*/
       /* if(isFull(bookList)){
            //扩容的代码
            //arrays.copyof()
        }*/

        //1.整理书籍信息
        //新增的图书 实际上 是一个一个的图书对象
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入书籍的名称:");
        String name = scanner.nextLine();

        System.out.println("请输入书籍的作者:");
        String author = scanner.nextLine();

        System.out.println("请输入书籍的价格:");
        int price = scanner.nextInt();
        scanner.next();

        System.out.println("请输入书籍的类型:");
        String type = scanner.nextLine();//nextLine会读取空格
        //next遇到空格 结束

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

        //放到书籍 数组里
        //2.如果书架上有这本书 则不能上架
        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;
            }
        }
        //3.没有这本书 则放到书籍数组当中
        bookList.setBooks(currentSize,book);

        bookList.setUsedSize(currentSize+1);
    }

    //判断书架的书 是否摆满
    private boolean isFull(BookList bookList){
        return bookList.getbooks().length == bookList.getUsedSize();
    }
}

在这里插入图片描述

  • 显示图书ShowBook
package operation;

import book.Book;
import book.BookList;

public class ShowBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("打印图书.....");

        //如果书架上有这本书 就展示书籍
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            System.out.println(tmp);
        }
    }
}

在这里插入图片描述

  • 删除图书DelBook
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelBook implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书.....");
        Scanner scanner = new Scanner(System.in);

        //1.输入你要删除的书籍名称
        System.out.println("请输入要删除的书籍名称:");
        String name = scanner.nextLine();

        //2.查看当前书籍是否存在
        int index = -1;
        int i = 0;
        int currentSize = bookList.getUsedSize();
        for ( i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)){
                index = i;
                break;
            }
        }
        //没有遇到break
        if(i >= currentSize){
            System.out.println("没有你要删除的书籍....");
        }

        //遇到breaK:此时开始真正删除
        for (int j = index; j < currentSize-1; j++) {
            //bookList[j] = bookList[j+1];
            Book tmp = bookList.getBook(j+1);
            bookList.setBooks(j,tmp);
        }

        //修改usedSize的值,清空内存
        bookList.setUsedSize(currentSize-1);
        bookList.setBooks(currentSize-1,null);
    }
}

在这里插入图片描述


💖💖💖
最后附上 图书管理系统码云链接

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

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

相关文章

多线程(多线程案例)(续~)

目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀&#xff0c;直达地址&#xf…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

闪记(FlashNote):让灵感快速成文的轻量级笔记工具

闪记&#xff08;FlashNote&#xff09;&#xff1a;让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况&#xff1a;桌面上放了一大堆的新建123.txt&#xff0c;想记录一个想法&#xff0c;应该是一键开个一个快捷键然后瞬间记录就自动保存了&#xff0c;现在的很多笔记…

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…

Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)

Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下&#xff0c;Kubernetes 已成为管理容器集群的事实标准。然而&#xff0c;面对复杂的集群管理和运维工作&#xff0c;一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …

【区块链安全 | 第二十三篇】单位和全局可用变量(一)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;以太单位&#xff08;Ether Units&#xff09;时间单位&#xff08;Time Units&#xff09;保留关键字 单位和全局可用变量&#xff08;Units and Globally Available Variables&am…

权重参数矩阵

目录 1. 权重参数矩阵的定义与作用 2. 权重矩阵的初始化与训练 3. 权重矩阵的解读与分析 (1) 可视化权重分布 (2) 统计指标分析 4. 权重矩阵的常见问题与优化 (1) 过拟合与欠拟合 (2) 梯度问题 (3) 权重对称性问题 5. 实际应用示例 案例1&#xff1a;全连接网络中的…

【现代深度学习技术】现代卷积神经网络06:残差网络(ResNet)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

《异常检测——从经典算法到深度学习》30. 在线服务系统中重复故障的可操作和可解释的故障定位

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

nut-ui下拉选的实现方式:nut-menu

nut-ui下拉选的实现方式&#xff1a;nut-menu 官方文档&#xff1a;https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/menu 案例截图&#xff1a; nut-tab选项卡组件实现&#xff1a; 官方组件地址&#xff1a;https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/tabs nut…

鸿蒙NEXT小游戏开发:扫雷

1. 引言 本文将介绍如何使用鸿蒙NEXT框架开发一个简单的扫雷游戏。通过本案例&#xff0c;您将学习到如何利用鸿蒙NEXT的组件化特性、状态管理以及用户交互设计来构建一个完整的游戏应用。 2. 环境准备 电脑系统&#xff1a;windows 10 工程版本&#xff1a;API 12 真机&…

LangChain4j 入门(二)

LangChain 整合 SpringBoot 下述代码均使用 阿里云百炼平台 提供的模型。 创建项目&#xff0c;引入依赖 通过 IDEA 创建 SpringBoot 项目&#xff0c;并引入 Spring Web 依赖&#xff0c;SpringBoot 推荐使用 3.x 版本。 引入 LangChain4j 和 WebFlux 依赖 <!--阿里云 D…