Java——圖書管理系統萬字詳解(附代碼)

框架搭建

book包

將書相關的放到book包中,創建一個Book類用來設置書的屬性,包括書名、作者、價格、類型、是否被借出等。

以上屬性均被private所修飾

利用編譯器生成構造方法(不需要構造isBorrowed,因為其初始值為false,表示為未借出),

生成get、set方法(其中isBorrowed方法生不生成無所謂,以后用不到)

重寫toString方法,用來打印書 屬性

代碼如下:

package book;public class Book {private String name;//書名private String author;//作者private int price;//價格private String type;//類型private boolean isBorrowed;//是否被借出public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public 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;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +'}';}
}

創建一個BookList類,作為書架

使用數組存放書

public class BookList {private Book[] books = new Book[10];private int useSize;//有效的數據個數【實際存放書的數量】
}

初始容量設為10,不夠的話,后面可以擴容數組

定義一個變量useSize,用來存放實際存放書的數量

再寫一個構造方法,當圖書管理系統運行后,里面默認存放了三本書

    public BookList() {books[0] = new Book("三國演義","羅貫中",10,"小說");books[1] = new Book("西游記","吳承恩",20,"小說");books[2] = new Book("紅樓夢","曹雪芹",30,"小說");this.useSize = 3;}

user包

創建一個user包,存放用戶信息

創建一個User類,用來提取用戶的共性屬性,如name

因為name一定會被繼承,所以不建議設置為private,為了代碼有一定的限制,也不能用public,用default修飾只能在同一個包訪問,也不合適,因此用protected來修飾最為合適

再添加一個構造方法,當子類繼承父類時,在子類中幫助父類成員進行初始化

因為User類不能表示某一種具體的用戶類型,所以將User設置為抽象類(abstract),更為合適

tips:抽象類中不一定有抽象方法,但有抽象方法的類一定是抽象類

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

創建一個AdminUser類作為管理員,繼承User

當子類繼承于父類時,父類中的構造方法一定要被調用,父類中的抽象方法一定要被重寫

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

同理,生成一個NormalUser,普通用戶類

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

管理員菜單和普通用戶菜單,分別寫在AdminUser和NormalUser

    public void 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("********************");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();}public void menu() {System.out.println("******普通用戶菜單******");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);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();}

Main函數

創建主函數Main,按照輸入值判斷用戶類型

import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static void 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作為統一的返回值進行接收,即可解決

在main函數中用User類型變量接收,去調用menu()卻報錯了:

這是因為父類中沒有menu()方法,不能調用子類中的方法

在父類中加一個抽象方法 menu() ,使其發生動態綁定,即可解決


ioperations包

我們的操作都是在書架上,代碼也應寫在BookList中,但這里發現管理員用戶和普通用戶的某些操作是不一樣的(如:同是操作 2 ,一個是新增,一個是借閱),為了方便區分不同用戶類型的操作,我們再創建一個 ioperations 包,在此包內放所有操作

為了區分不同用戶類型的操作,我們創建一個接口IOPeration,在此接口中,設置方法work()

package ioperations;import book.BookList;public interface IOPeration {void work(BookList bookList);
}

然后在其他操作中實現該接口,重寫此方法

package ioperations;import book.BookList;public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");}
}package ioperations;import book.BookList;public class BorrowedOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書。。。");}
}package ioperations;import book.BookList;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書。。。");}
}package ioperations;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系統。。。");}
}package ioperations;import book.BookList;public class FindOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找圖書。。。");}
}package ioperations;import book.BookList;public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書。。。");}
}package ioperations;import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("顯示圖書。。。");}
}

功能判斷選擇

下面將這些操作組織起來,首先要接收返回值,來確認調用哪一個操作

第一步:當用戶選擇管理員或普通用戶之后,這里演示為管理員,將choice值返回用來判斷調用哪一種操作

第二步:將返回值類型設置為int類型

第三步:同時將User父類中的同名方法的返回值類型也改為int(此處是子類重寫父類menu方法)

在main函數中接收返回值,并判斷需調用 哪個對象哪個方法

上圖中,1 操作已經確定 哪個對象,原理如下:


接下來要確定調用 該對象的 哪個方法

第一步,確定當前對象已經包含了這些方法?

User類,通過user調用某個方法,傳入choice,才能知道調用誰,通過user調,定義的東西就該放到user中,

定義一個接口數組:

NormalUser中,構造方法,通過this訪問 ioPerations?

給該數組直接初始化,數組元素為普通用戶中各種操作的類

相當于在子類里面確定了大小,同時初始化了該數組

只要這行代碼執行完,一定會知道數組中有哪些操作

同樣,在 AdminUser 中,初始化該數組,如下:

結論:在調用子類對象的時候,構造方法會初始化好對應的操作對象


具體調用:

main函數中目前四行代碼的具體實現分析:


具體功能實現

下面實現具體功能

退出系統:

設置狀態碼為0即可

書架類BookList其實就是一個數組

我們初始化書架有三本書,通過訪問其下標即可顯示圖書

通過BookList類中的useSize作為數組有效訪問長度,因為useSize修飾符為private

所以需創建get、set方法

來遍歷BookList類中的books數組,該數組也是private所修飾,也需get、set方法

?編譯器自動生成如下:

getBooks不符合我們的需求,我們想要獲取某一個下標的數組,這里返回的是成員變量boosk

改為以下:返回pos下標的書,這里不考慮pos不合法的情況

setBooks也不符合需求,我們要往某一個下標去放一本書,改為如下:往pos下標放一本書

查找圖書

根據書名查找

運行查找“三國演義”

修改重寫的toString方法,使用三目運算符改為借出、未借出

新增圖書

將新增圖書放到數組(順序表)的最后即可,即放到下標為 useSize 的位置

第一步:判滿

第二步:輸入各種成員變量,構建對象

第三步:放到數組最后一個位置

第四步:useSize++

public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");//1、判滿int currentSize = bookList.getUseSize();if(currentSize == bookList.getBooks().length) {System.out.println("書架滿了,不能新增圖書!");return;}//2、構建對象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.nextLine();System.out.println("請輸入書的類型:");String type = scanner.nextLine();Book newBook = new Book(name, author, price, type);//3、判斷書架有沒有同名書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;}}//4、插入新增書bookList.setBook(currentSize,newBook);bookList.setUseSize(currentSize+1);System.out.println("新增圖書成功!");}
}
具體實現分析

1、book數組由private修飾,無法被外部訪問,所以寫一個get方法

定義變量currentSize接收當前數組實際占用空間

獲取數組長度與實際占用空間相比較

2、構建書對象?

3、遍歷數組,比較有無同名書

4、新增圖書

將書添加到數組中currentSize下標處,currentSize+1

普通用戶專屬借閱圖書:

?歸還圖書:

?刪除圖書

本章示例代碼

book包

package book;public class Book {private String name;//書名private String author;//作者private int price;//價格private String type;//類型private boolean isBorrowed;//是否被借出public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public 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;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed == true) ? " 已借出" : " 未借出") +//", isBorrowed=" + isBorrowed +'}';}
}package book;public class BookList {private Book[] books = new Book[10];private int useSize;//有效的數據個數【實際存放書的數量】public BookList() {books[0] = new Book("三國演義","羅貫中",10,"小說");books[1] = new Book("西游記","吳承恩",20,"小說");books[2] = new Book("紅樓夢","曹雪芹",30,"小說");this.useSize = 3;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {this.books[pos] = book;}public Book[] getBooks() {return books;}
}

ioperations包

package ioperations;import book.BookList;import java.util.Scanner;import book.Book;
public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增圖書。。。");//1、判滿int currentSize = bookList.getUseSize();if(currentSize == bookList.getBooks().length) {System.out.println("書架滿了,不能新增圖書!");return;}//2、構建對象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.nextLine();System.out.println("請輸入書的類型:");String type = scanner.nextLine();Book newBook = new Book(name, author, price, type);//3、判斷書架有沒有同名書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;}}//4、插入新增書bookList.setBook(currentSize,newBook);bookList.setUseSize(currentSize+1);System.out.println("新增圖書成功!");}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowedOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("借閱圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要借閱的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){if(book.isBorrowed()) {System.out.println("這本書已借出!");return;}book.setBorrowed(true);System.out.println("借閱成功!");return;}}System.out.println("沒找到你要借閱的書。。。");}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("刪除圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入你要刪除的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();int pos = -1;int i = 0;for(;i < currentSize;i++){Book book = bookList.getBook(i);if(book.getName().equals(name)){pos = i;break;}}if(i == currentSize){System.out.println("沒有你要刪除的書!");return;}for(int j = pos;j < currentSize-1;j++){//錯誤示例://bookList[j] = bookList[j+1];Book book = bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setBook(currentSize-1,null);bookList.setUseSize(currentSize-1);System.out.println("刪除成功!");}
}package ioperations;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系統。。。");System.exit(0);}
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要查找的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();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("沒找到你要查找的書。。。");}
}package ioperations;import book.BookList;public interface IOPeration {void work(BookList bookList);
}package ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("歸還圖書。。。");Scanner scanner = new Scanner(System.in);System.out.print("請輸入要歸還的書名:");String name = scanner.nextLine();int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){if(book.isBorrowed()) {book.setBorrowed(false);System.out.println("歸還成功!");return;}}}System.out.println("沒有你要歸還的圖書!");}
}package ioperations;import book.Book;
import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("顯示圖書。。。");int currentSize = bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);//錯誤示例://Book book = bookList[i];}}
}

user包

package user;import ioperations.*;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("歡迎 " + 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("********************");Scanner scanner = new Scanner(System.in);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();return choice;}
}package user;import ioperations.*;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("歡迎 " + this.name + " 來到圖書管理系統");System.out.println("******普通用戶菜單******");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);System.out.println("請輸入你的操作:");int choice = scanner.nextInt();return choice;}
}package user;import book.BookList;
import ioperations.IOPeration;public abstract class User {protected String name;//此時這個數組沒有初始化protected IOPeration[] ioPerations;public User(String name) {this.name = name;}public abstract int menu();public void doIoperation(int choice, BookList bookList){ioPerations[choice].work(bookList);}
}

Main函數

import book.BookList;
import ioperations.IOPeration;
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) {BookList bookList = new BookList();User user = login();while(true) {int choice = user.menu();//要根據這個返回值來看調用 哪個對象 的 哪個方法user.doIoperation(choice, bookList);}}
}

擴展功能

將書籍數據存儲到文件中

將書籍數據存儲到MySQL中

加入網頁、框架,實現web端

功能上按書名、作者名、價格等排序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15903.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微前端架構 之 應用之間樣式隔離 (四)

1. 使用 CSS Modules 進行樣式隔離 1. 安裝必要的依賴 如果你使用 webpack 作為構建工具&#xff0c;你可能需要安裝 css-loader 和 style-loader。如果你的項目使用 Create React App 或其他現代前端框架&#xff0c;這些可能已經內置了。 npm install --save-dev css-loade…

springboot結合baomidou dynamic-datasource組件實現多數據源

dynamic-datasource組件實現多數據源 一、背景介紹二、 思路方案三、過程四、總結五、升華 一、背景介紹 博主最近研發的項目中由于業務需要&#xff0c;在項目中使用到多個數據源。使用到了baomidou的dynamic-datasource組件來實現訪問不同的數據源。覺得挺有意思的也是進行了…

Redis事務(1)

什么是事務&#xff1f; Redis 的事務和 MySQL 的事務概念上是類似的. 都是把?系列操作綁定成?組. 讓這?組能夠批量執行。 但是注意體會 Redis 的事務和 MySQL 事務的區別: 弱化的原?性: redis 沒有 “回滾機制”. 只能做到這些操作 “批量執?”. 不能做到 “?個失敗就…

海外鏈游地鐵跑酷全自動搬磚掛機掘金變現項目,號稱單窗口一天收益30+(教程+工具)

一、項目概述 地鐵跑酷海外版國外版自動搬磚掛機掘金項目是一款結合了地鐵跑酷元素的在線游戲&#xff0c;為玩家提供一個全新的游戲體驗&#xff0c;使得玩家可以輕松地進行游戲&#xff0c;無需手動操作&#xff0c;節省時間和精力。 二、游戲特點 1. 自動化操作&#xff1…

AI應用案例:影像報告智能輔助編輯系統

今天給大家介紹一個醫療行業的案例“影像報告智能輔助編輯系統”&#xff01;該案例已經在某三甲醫院落地&#xff0c;模型準確度超過80%。 該項目上線后&#xff0c;保守估計&#xff0c;能為每位醫生的每一張報告至少省下1分鐘時間和2分鐘的精力&#xff0c;20位初級醫生&…

Django Web:搭建Websocket服務器(入門篇)

Django Web架構 搭建Websocket服務器&#xff08;1&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

如何在Windows 10上對硬盤進行碎片整理?這里提供步驟

隨著時間的推移&#xff0c;由于文件系統中的碎片&#xff0c;硬盤驅動器可能會開始以較低的效率運行。為了加快驅動器的速度&#xff0c;你可以使用內置工具在Windows 10中對其進行碎片整理和優化。方法如下。 什么是碎片整理 隨著時間的推移&#xff0c;組成文件的數據塊&a…

Incremental Task and Motion Planning: A Constraint-Based Approach(翻譯)

摘要——我們提出了一種新的任務和運動算法規劃&#xff08;TMP&#xff09;&#xff0c;并討論獲得TMP的健壯解決方案所必需的需求和抽象。我們的迭代深化任務和運動規劃&#xff08;IDTMP&#xff09;與類似的、最先進的、概率完全的規劃器相比&#xff0c;該方法是概率完全的…

LeetCode熱題100——矩陣

73.矩陣清零 題目 給定一個 *m* x *n* 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例…

【Linux】端口映射

外部訪問http://127.0.0.1&#xff08;默認端口80&#xff09; 實際訪問http://127.0.0.1:8080 //添加規則 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 //移除規則 iptables -t nat -L -nv --line-numbers iptables -t nat -D PREROUT…

HTML+CSS 玻璃按鈕

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按鈕</title><li…

期權課程之第二節【買方和賣方的誤區和區別】

期權和股票不一樣&#xff0c;我們玩股票大部分情況我們只會做買方&#xff0c; 看漲多買點&#xff0c;看跌了減倉&#xff0c;或者直接離場&#xff0c;就算不看好的公司&#xff0c;一般也不會嘗試賣空股票的操作&#xff0c;但是期權不一樣&#xff0c;我們不僅能做買方還可…

設計模式 17 組合模式 Composite Pattern

設計模式 17 組合模式 Composite Pattern 1.定義 組合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整體模式&#xff0c;是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象&#xff0c;用來表示部分以及整體層次。這種類型的設…

window好用的網速工具

這是一個用于顯示當前網速、CPU及內存利用率的桌面懸浮窗軟件&#xff0c;并支持任務欄顯示&#xff0c;支持更換皮膚。 github鏈接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

無人機飛手:ASFC無人機和航模愛好者證書詳解

ASFC無人機和航模愛好者證書是由中國航空運動協會&#xff08;ASFC&#xff09;頒發的一種無人機操作資格認證。這種證書在無人機和航模愛好者群體中享有廣泛的認可度&#xff0c;并被視為操作無人機的一種重要資質。 ASFC證書的定義和用途十分明確。它是民航局頒發的民用無人駕…

springboot3微服務下結合springsecurity的認證授權實現

1. 簡介 在微服務架構中&#xff0c;系統被拆分成許多小型、獨立的服務&#xff0c;每個服務負責一個功能模塊。這種架構風格帶來了一系列的優勢&#xff0c;如服務的獨立性、彈性、可伸縮性等。然而&#xff0c;它也帶來了一些挑戰&#xff0c;特別是在安全性方面。這時候就體…

【前端筆記】Vue項目報錯Error: Cannot find module ‘webpack/lib/RuleSet‘

網上搜了下發現原因不止一種&#xff0c;這里僅記錄本人遇到的原因和解決辦法&#xff0c;僅供參考 原因&#xff1a;因為某種原因導致本地package.json中vue/cli與全局vue/cli版本不同導致沖突。再次提示&#xff0c;這是本人遇到的&#xff0c;可能和大家有所不同&#xff0c…

一張圖片中有多個一樣的目標物體,分別進行識別定位分割(Python實現)

需求&#xff1a; 一張圖片中有多個目標物體&#xff0c;將多個目標物體進行識別分割定位 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img_path r"test3.png" img cv2.imread(img…

關于微信小程序低功耗藍牙ECharts實時刷新

最近搞了這方面的東西&#xff0c;是剛剛開始接觸微信小程序&#xff0c;因為是剛剛開始接觸藍牙設備&#xff0c;所以這篇文章適合既不熟悉小程序&#xff0c;又不熟悉藍牙的新手看。 項目要求是獲取到藍牙傳輸過來的數據&#xff0c;并顯示成圖表實時顯示&#xff1b; 我看了…

轉運機器人負載最高可達 1000kg,重復精度高達±5mm

轉運機器人&#xff0c;內部搭載ICD系列核心控制器&#xff0c;擁有不同的移載平臺&#xff0c;負載最高可達 1000kg;重復精度高達5mm;支持 Wi-Fi漫游&#xff0c;實現更穩健的網絡數據交互;無軌化激光 SLAM 導航&#xff0c;配合 3D 避障相機等多傳感器進行安全防護。轉運器人…