Spring Boot MongoDB 分頁工具類封裝 (新手指南)

Spring Boot MongoDB 分頁工具類封裝 (新手指南)

目錄

  1. 引言:為何需要分頁工具類?
  2. 工具類一:PaginationUtils - 簡化 Pageable 創建
    • 設計目標
    • 代碼實現 (PaginationUtils.java)
    • 如何使用 PaginationUtils
  3. 工具類二:PageResponse<T> - 標準化分頁響應 DTO
    • 設計目標
    • 代碼實現 (PageResponse.java)
    • 如何使用 PageResponse<T>
  4. 整合示例:在 Controller 和 Service 中使用工具類
    • Controller 層 (UserController.java)
    • Service 層 (UserService.java)
  5. 重點內容總結
  6. 結語

1. 引言:為何需要分頁工具類?

在之前的筆記中,我們學習了如何使用 PageablePage 來實現分頁。雖然 Spring Data 提供了基礎,但在實際項目中,我們經常會重復以下操作:

  • 從 HTTP 請求參數(頁碼、大小、排序字段、排序方向)創建 Pageable 對象。
  • 處理 用戶友好的 1-based 頁碼Spring Data 內部 0-based 頁碼 之間的轉換。
  • 處理排序參數的解析和 Sort 對象的構建。
  • 可能希望 標準化 API 返回的分頁信息格式,使其更簡潔或符合前端特定需求,而不是直接暴露 Spring Data 的 Page 結構。

封裝分頁工具類可以:

  • 減少重復代碼:將通用的分頁邏輯集中處理。
  • 提高可讀性:使 Service 和 Controller 層的代碼更專注于業務邏輯。
  • 統一規范:確保項目中分頁參數處理和響應格式的一致性。
  • 簡化使用:讓新手更容易地實現正確的分頁。

2. 工具類一:PaginationUtils - 簡化 Pageable 創建

這個工具類的主要職責是接收前端傳入的原始分頁參數,并安全、便捷地將其轉換為 Spring Data 所需的 Pageable 對象。

設計目標

  • 接收 1-based 頁碼,內部轉換為 0-based。
  • 提供默認的頁碼和頁面大小。
  • 支持單個或多個排序字段及方向的解析。
  • 處理無效或缺失的參數,提供合理的默認行為(如不排序)。

代碼實現 (PaginationUtils.java)

package com.example.yourproject.utils; // 根據你的項目結構調整包名import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.util.CollectionUtils; // Spring 提供的集合工具類
import org.springframework.util.StringUtils; // Spring 提供的字符串工具類import java.util.ArrayList;
import java.util.List;/*** 分頁工具類** 幫助從原始請求參數創建 Spring Data Pageable 對象。* 核心功能:處理 1-based 頁碼轉換、默認值、排序參數解析。*/
public final class PaginationUtils { // final class, 防止被繼承// 默認頁碼(用戶傳入的第一頁)private static final int DEFAULT_PAGE_NUMBER = 1;// 默認每頁大小private static final int DEFAULT_PAGE_SIZE = 10;// 默認排序方向private static final Sort.Direction DEFAULT_SORT_DIRECTION = Sort.Direction.ASC;// 排序參數中,字段和方向的分隔符(例如 "name,desc")private static final String SORT_DELIMITER = ",";/*** 私有構造函數,防止實例化工具類*/private PaginationUtils() {throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");}/*** 創建 Pageable 對象。** @param pageInput 用戶傳入的頁碼 (從 1 開始計數)。如果為 null 或小于 1,則使用默認值 1。* @param sizeInput 用戶傳入的每頁大小。如果為 null 或小于 1,則使用默認值 10。* @param sortInput 排序參數列表。每個字符串格式為 "fieldName,direction" (例如 "name,asc", "age,desc")。*                 direction 可以省略,默認為升序 (ASC)。*                 如果列表為空或 null,則不進行排序。* @return 配置好的 Pageable 對象。*/public static Pageable createPageable(Integer pageInput, Integer sizeInput, List<String> sortInput) {// 1. 驗證并設置頁碼 (轉換為 0-based)// 如果 pageInput 為 null 或 < 1,則使用默認頁碼 1。然后減 1 得到 0-based 頁碼。int page = (pageInput == null || pageInput < 1) ? DEFAULT_PAGE_NUMBER - 1 : pageInput - 1;// 2. 驗證并設置頁面大小// 如果 sizeInput 為 null 或 < 1,則使用默認大小 10。int size = (sizeInput == null || sizeInput < 1) ? DEFAULT_PAGE_SIZE : sizeInput;// 3. 解析排序參數Sort sort = parseSort(sortInput);// 4. 創建并返回 PageRequest 對象return PageRequest.of(page, size, sort);}/*** 創建帶有默認排序的 Pageable 對象(如果未提供排序參數)。** @param pageInput 用戶傳入的頁碼 (從 1 開始計數)。* @param sizeInput 用戶傳入的每頁大小。* @param sortInput 排序參數列表 (同上)。* @param defaultSort 默認的 Sort 對象。如果 sortInput 為空或無效,則使用此默認排序。* @return 配置好的 Pageable 對象。*/public static Pageable createPageable(Integer pageInput, Integer sizeInput, List<String> sortInput, Sort defaultSort) {int page = (pageInput == null || pageInput < 1) ? DEFAULT_PAGE_NUMBER - 1 : pageInput - 1;int size = (sizeInput == null || sizeInput < 1) ? DEFAULT_PAGE_SIZE : sizeInput;Sort sort = parseSort(sortInput);// 如果解析出的 sort 是 unsorted,并且提供了默認 sort,則使用默認 sortif (sort.isUnsorted() && defaultSort != null && defaultSort.isSorted()) {sort = defaultSort;}return PageRequest.of(page, size, sort);}/*** 解析排序參數字符串列表,構建 Sort 對象。** @param sortParams 排序參數列表,每個元素如 "field,direction" 或 "field"。* @return 如果參數有效則返回 Sort 對象,否則返回 Sort.unsorted()。*/private static Sort parseSort(List<String> sortParams) {if (CollectionUtils.isEmpty(sortParams)) {return Sort.unsorted(); // 沒有提供排序參數,返回不排序}List<Sort.Order> orders = new ArrayList<>();for (String sortParam : sortParams) {// 跳過空或空白的排序參數if (!StringUtils.hasText(sortParam)) {continue;}String[] parts = sortParam.split(SORT_DELIMITER);// 第一個部分是字段名,必須存在String property = parts[0].trim();if (!StringUtils.hasText(property)) {continue; // 字段名為空,跳過}// 獲取排序方向,如果沒提供或無效,則使用默認方向Sort.Direction direction = DEFAULT_SORT_DIRECTION;if (parts.length > 1 && StringUtils.hasText(parts[1])) {// 嘗試從字符串解析方向 (忽略大小寫)try {direction = Sort.Direction.fromString(parts[1].trim());} catch (IllegalArgumentException e) {// 如果方向字符串無效 (例如 "ascend", "descend"), 使用默認值System.err.println("Invalid sort direction: " + parts[1] + ". Using default: " + DEFAULT_SORT_DIRECTION);// 這里可以選擇打印日志或忽略錯誤}}// 創建 Sort.Order 對象并添加到列表orders.add(new Sort.Order(direction, property));}// 如果成功解析出至少一個有效的 Order,則創建 Sort 對象,否則返回 unsortedreturn orders.isEmpty() ? Sort.unsorted() : Sort.by(orders);}}

注釋說明:

  • final class / private constructor: 這是工具類的標準寫法,表明它不應該被繼承或實例化。所有方法都是靜態的。
  • 常量定義: 定義默認值和分隔符,方便修改和維護。
  • createPageable 方法:
    • 接收 Integer 類型的 pageInputsizeInput,允許傳入 null
    • 核心: page = (pageInput == null || pageInput < 1) ? DEFAULT_PAGE_NUMBER - 1 : pageInput - 1; 這行處理了 null 值、小于 1 的無效值,并將用戶習慣的 1-based 頁碼轉換成 Spring Data 需要的 0-based 頁碼。
    • 調用 parseSort 方法處理排序參數。
    • 最后使用 PageRequest.of(page, size, sort) 創建 Pageable 實例。
  • createPageable (重載): 提供了一個可以傳入默認 Sort 對象的版本,當用戶沒有提供任何有效排序時,可以使用這個默認排序。
  • parseSort 方法:
    • 處理 null 或空列表的情況,返回 Sort.unsorted()
    • 遍歷 sortInput 列表中的每個字符串。
    • 使用 split(SORT_DELIMITER) 分割字段名和方向。
    • 進行健壯性檢查 (字段名是否為空)。
    • 解析排序方向,使用 Sort.Direction.fromString() 并包含 try-catch 處理無效方向字符串,回退到默認方向。
    • 創建 Sort.Order 對象。
    • 最后使用 Sort.by(orders) 將所有有效的 Order 組合成 Sort 對象。如果列表為空,則 Sort.by() 返回 Sort.unsorted()
  • 依賴: 使用了 Spring Framework 提供的 StringUtilsCollectionUtils 進行空值檢查,這是推薦的做法。

如何使用 PaginationUtils

在你的 Service 層Controller 層(取決于你處理分頁參數的位置,通常在 Service 層更合適),你可以這樣調用:

// 假設在 Service 層
import com.example.yourproject.utils.PaginationUtils;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.List;// ...public Page<User> findUsersPaginated(Integer page, Integer size, List<String> sort) {// 使用工具類創建 Pageable 對象// 假設我們希望默認按 "createdAt" 降序排序Sort defaultSort = Sort.by(Sort.Direction.DESC, "createdAt");Pageable pageable = PaginationUtils.createPageable(page, size, sort, defaultSort);// 現在可以直接將 pageable 傳遞給 Repository 方法return userRepository.findAll(pageable); // 或者 userRepository.findByXXX(..., pageable);
}

3. 工具類二:PageResponse<T> - 標準化分頁響應 DTO

這個類是一個數據傳輸對象 (DTO),用于包裝分頁查詢的結果,提供一個統一、簡潔的 JSON 結構給前端。

設計目標

  • 封裝當前頁的數據列表 (List<T>)。
  • 提供清晰的分頁元數據(當前頁碼 (1-based)、每頁大小、總記錄數、總頁數、是否首頁/末頁)。
  • 隱藏 Spring Data Page 對象的內部復雜結構。
  • 提供一個靜態工廠方法,方便從 Page<T> 對象轉換。

代碼實現 (PageResponse.java)

package com.example.yourproject.dto; // DTO 通常放在 dto 包下import org.springframework.data.domain.Page;
import java.util.List;/*** 標準化的分頁響應體 DTO (Data Transfer Object)** 用于封裝分頁查詢結果,提供給 API 調用者一個簡潔一致的結構。** @param <T> 數據的實體類型*/
public class PageResponse<T> {private final List<T> content;          // 當前頁的數據列表private final int currentPage;          // 當前頁碼 (從 1 開始)private final int pageSize;             // 每頁大小private final long totalElements;       // 總記錄數private final int totalPages;           // 總頁數private final boolean first;            // 是否為第一頁private final boolean last;             // 是否為最后一頁/*** 構造函數 (私有或包私有,推薦使用靜態工廠方法創建)*/private PageResponse(List<T> content, int currentPage, int pageSize, long totalElements, int totalPages, boolean first, boolean last) {this.content = content;this.currentPage = currentPage;this.pageSize = pageSize;this.totalElements = totalElements;this.totalPages = totalPages;this.first = first;this.last = last;}/*** 靜態工廠方法:從 Spring Data Page 對象創建 PageResponse 對象。* @param page Spring Data 的 Page 對象* @param <T>  數據的實體類型* @return 轉換后的 PageResponse 對象*/public static <T> PageResponse<T> fromPage(Page<T> page) {if (page == null) {// 可以選擇返回 null,或者一個表示空的 PageResponse,取決于你的 API 設計return new PageResponse<>(List.of(), 1, 0, 0L, 0, true, true); // 返回一個空響應示例// throw new IllegalArgumentException("Page object cannot be null");}return new PageResponse<>(page.getContent(),              // 獲取數據列表page.getNumber() + 1,           // **核心轉換:0-based to 1-based**page.getSize(),                 // 獲取頁面大小page.getTotalElements(),        // 獲取總記錄數page.getTotalPages(),           // 獲取總頁數page.isFirst(),                 // 是否第一頁page.isLast()                   // 是否最后頁);}// --- Getters ---public List<T> getContent() {return content;}public int getCurrentPage() {return currentPage;}public int getPageSize() {return pageSize;}public long getTotalElements() {return totalElements;}public int getTotalPages() {return totalPages;}public boolean isFirst() {return first;}public boolean isLast() {return last;}/** 預期 JSON 輸出示例:* {*   "content": [ ... data objects ... ],*   "currentPage": 1,*   "pageSize": 10,*   "totalElements": 153,*   "totalPages": 16,*   "first": true,*   "last": false* }*/
}

注釋說明:

  • 泛型 <T>: 使 PageResponse 可以用于任何類型的分頁數據。
  • 字段: 只包含前端最關心的分頁信息,字段名清晰。currentPage 特別設計為 1-based。
  • 構造函數: 設為 private,強制使用靜態工廠方法創建實例,這是一種良好的實踐。
  • fromPage 靜態工廠方法:
    • 接收一個 Spring Data Page<T> 對象作為輸入。
    • 做了 null 檢查。
    • 核心: page.getNumber() + 1 將 Spring Data 的 0-based 頁碼轉換為用戶友好的 1-based currentPage
    • Page<T> 對象中提取所有需要的數據,填充到 PageResponse 的字段中。
  • Getters: 提供公共的 getter 方法,以便 Jackson 等庫能正確地將對象序列化為 JSON。
  • JSON 示例: 注釋中給出了預期的 JSON 輸出格式,方便前后端對接。

如何使用 PageResponse<T>

在你的 Service 層 方法中,當從 Repository 獲取到 Page<T> 對象后,使用 PageResponse.fromPage() 進行轉換。然后 Controller 層 直接返回這個 PageResponse<T> 對象。

// 假設在 Service 層
import com.example.yourproject.dto.PageResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;// ...public PageResponse<User> findUsersPaginatedAndWrapped(Integer page, Integer size, List<String> sort) {Sort defaultSort = Sort.by(Sort.Direction.DESC, "createdAt");Pageable pageable = PaginationUtils.createPageable(page, size, sort, defaultSort);// 1. 從 Repository 獲取 Page<User> 對象Page<User> userPage = userRepository.findAll(pageable);// 2. 使用 PageResponse.fromPage() 轉換PageResponse<User> pageResponse = PageResponse.fromPage(userPage);// 3. 返回轉換后的 PageResponse 對象return pageResponse;
}

4. 整合示例:在 Controller 和 Service 中使用工具類

下面展示如何在 Controller 和 Service 中協同使用這兩個工具類。

Controller 層 (UserController.java)

Controller 負責接收 HTTP 請求參數,并將其傳遞給 Service 層。注意 @RequestParamsort 參數的處理。

package com.example.yourproject.controller;import com.example.yourproject.dto.PageResponse; // 導入 DTO
import com.example.yourproject.model.User;
import com.example.yourproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List; // 需要導入 List@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService; // 假設 UserService 已更新/*** 獲取用戶列表 (使用分頁工具類)** @param page API 接收的頁碼 (通常從 1 開始)。* @param size 每頁大小。* @param sort 排序參數列表。可以接收多個 sort 參數,*             例如: /api/users?sort=name,asc&sort=age,desc*             Spring 會自動將其收集到 List<String> 中。* @return ResponseEntity 包裝的 PageResponse<User> 對象。*/@GetMappingpublic ResponseEntity<PageResponse<User>> getAllUsersPaginated(@RequestParam(required = false) Integer page,        // required=false 讓參數可選@RequestParam(required = false) Integer size,@RequestParam(required = false) List<String> sort) { // 接收排序參數列表// 調用更新后的 Service 方法,傳入原始參數PageResponse<User> userPageResponse = userService.findUsersPaginatedAndWrapped(page, size, sort);// 返回標準化的 PageResponse DTOreturn ResponseEntity.ok(userPageResponse);}
}

關鍵點:

  • @RequestParam(required = false): 允許 page, size, sort 參數在請求中不提供,PaginationUtils 會使用默認值。
  • @RequestParam List<String> sort: Spring MVC 非常智能,如果 URL 中出現多個同名參數 (?sort=name,asc&sort=age,desc),它能自動將這些值收集到一個 List<String> 中。這正好符合我們 PaginationUtils 的設計!

Service 層 (UserService.java)

Service 層使用 PaginationUtils 創建 Pageable,調用 Repository,然后使用 PageResponse.fromPage() 包裝結果。

package com.example.yourproject.service;import com.example.yourproject.dto.PageResponse; // 導入 DTO
import com.example.yourproject.model.User;
import com.example.yourproject.repository.UserRepository;
import com.example.yourproject.utils.PaginationUtils; // 導入工具類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;/*** 分頁查詢用戶,并使用 PageResponse DTO 包裝結果。** @param pageInput 來自 Controller 的頁碼 (1-based)* @param sizeInput 來自 Controller 的每頁大小* @param sortInput 來自 Controller 的排序參數列表* @return PageResponse<User> 適合返回給客戶端*/public PageResponse<User> findUsersPaginatedAndWrapped(Integer pageInput, Integer sizeInput, List<String> sortInput) {// 定義默認排序(可選,如果希望在用戶未指定排序時應用)Sort defaultSort = Sort.by(Sort.Direction.DESC, "createdAt"); // 例如,默認按創建時間降序// 1. 使用 PaginationUtils 創建 Pageable// 將 Controller 傳來的原始參數交給工具類處理Pageable pageable = PaginationUtils.createPageable(pageInput, sizeInput, sortInput, defaultSort);// 2. 調用 Repository 進行查詢Page<User> userPage = userRepository.findAll(pageable);// Page<User> userPage = userRepository.findBySomeCondition(..., pageable); // 也可以用于條件查詢// 3. 使用 PageResponse DTO 轉換結果// 這一步將 Page<User> 轉換成前端友好的 PageResponse<User>return PageResponse.fromPage(userPage);}
}

5. 重點內容總結

  1. PaginationUtils:
    • 核心職責: 將請求參數(1-based 頁碼、大小、排序字符串列表)轉換為 Pageable 對象。
    • 關鍵特性: 自動處理 1-based 到 0-based 頁碼轉換、參數默認值、復雜排序參數 ("field,direction") 解析。
    • 使用位置: 通常在 Service 層調用,用于準備傳遞給 Repository 的 Pageable
  2. PageResponse<T>:
    • 核心職責: 作為分頁查詢結果的標準化 DTO,提供簡潔一致的 API 響應結構。
    • 關鍵特性: 包含數據列表 (content) 和清晰的分頁元數據(1-based currentPage, totalElements, totalPages 等),通過靜態工廠方法 fromPage(Page<T>) 方便地從 Spring Data Page 對象轉換。
    • 使用位置: 在 Service 層將 Page<T> 結果轉換為 PageResponse<T>,然后 Controller 直接返回此對象。
  3. 好處:
    • 簡化: 大幅減少 Controller 和 Service 中的樣板代碼。
    • 健壯: 統一處理參數驗證和默認值。
    • 清晰: 使代碼更易讀,API 響應更規范。
    • 易用: 對新手友好,隱藏了分頁實現的細節。
  4. Controller 參數綁定: 利用 @RequestParam List<String> sort 可以優雅地接收多個排序參數。

6. 結語

通過封裝 PaginationUtilsPageResponse<T> 這兩個工具類,你可以極大地簡化 Spring Boot 項目中 MongoDB(或其他 Spring Data 支持的數據庫)的分頁實現。這不僅提高了開發效率,也使得代碼更加規范和易于維護,尤其是在團隊協作或項目規模變大時。希望這份詳細的筆記能幫助你輕松掌握并運用這些分頁工具!

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

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

相關文章

MyBatis的緩存、逆向工程、使用PageHelper、使用PageHelper

一、MyBatis的緩存 緩存&#xff1a;cache 緩存的作用&#xff1a;通過減少IO的方式&#xff0c;來提高程序的執行效率。 mybatis的緩存&#xff1a;將select語句的查詢結果放到緩存&#xff08;內存&#xff09;當中&#xff0c;下一次還是這條select語句的話&#xff0c;直…

java中的JNI調用c庫

1. 簡單demo 如果是在某個項目中有包名就需要自己找ai問問去改寫下cmd命令去編譯執行等 java文件&#xff08;HelloJNI.java&#xff09; public class HelloJNI {// 聲明 native 方法public native void sayHello();// 加載本地庫static {System.loadLibrary("hello&quo…

人工智能:GPT技術應用與未來展望

GPT(Generative Pre-trained Transformer)作為自然語言處理領域的代表性技術,近年來在各行業的實際應用中展現出廣泛潛力。結合其技術特性與行業需求,以下是GPT的主要應用場景、案例分析及未來挑戰的總結: 一、核心應用領域與案例 文本生成與內容創作 自動化內容生產:GPT…

前端筆記-ECMAScript語法概覽

更多詳細可以查看1.1 ES6 教程 | 菜鳥教程 這里我將大概記錄ES與JS大概不一樣的部分&#xff0c;方便聯合記憶。 歷史與關系 ECMAScript&#xff1a;是一種由 Ecma 國際組織制定的腳本語言規范&#xff0c;它是 JavaScript 的標準化版本。ECMAScript 為 JavaScript 提供了語…

操作主機的管理

1.在AD林范圍內&#xff0c;有哪幾個操作主機角色 架構主機&#xff08;Schema Master&#xff09; 功能&#xff1a;負責整個AD林中所有對象和屬性的定義&#xff0c;是唯一可以更新目錄架構的DC。架構更新會從架構主機復制到目錄林中的所有其他域控制器。 作用范圍&#xf…

【Linux】網絡編程

目錄 端口號 網絡字節序 socket編程 接口 sockaddr結構 udp網絡程序 創建套接字 綁定 接收 發送 客戶端需要綁定嗎&#xff1f; 客戶端執行方法 本地環回地址 終端文件 代碼 tcp網絡程序 SOCK_STREAM 監聽 查詢網絡信息 獲取新連接 地址轉換函數 客戶端綁…

Go 語言中的select是做什么的

Go 語言中的 select 是做什么的 在 Go 語言中&#xff0c;select 語句是用于處理多個通道&#xff08;channel&#xff09;操作的一種控制結構。它類似于 switch 語句&#xff0c;但專門用于并發編程&#xff0c;允許 Goroutine 在多個通道上等待操作&#xff08;發送或接收&a…

智慧班牌系統解決方案,SaaS智慧電子班牌云平臺

智慧班牌系統解決方案 系統概述 智慧班牌是智慧校園建設不斷發展的產物&#xff0c;是教育信息化改革的載體。通過智慧班牌可以高效便捷傳遞各種知識信息和通知信息、及時反饋課堂信息、實現班級的透明化管理。智慧班牌將學生平安考勤、異常出勤情況及時反饋至家長、老師&…

利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案

以下是一個利用大模型和聚類算法找出 Excel 文件中重復或相似度高的數據,并使用 FastAPI 進行封裝的詳細方案: 方案流程 數據讀取:從 Excel 文件中讀取數據。文本向量化:使用大模型將文本數據轉換為向量表示。聚類分析:運用聚類算法對向量進行分組,將相似度高的數據歸為…

【Docker基礎】容器技術詳解:生命周期、命令與實戰案例

文章目錄 一、什么是容器&#xff1f;二、為什么需要容器三、容器的生命周期容器狀態容器OOM容器異常退出容器異常退出容器暫停 四、容器命令命令清單詳細介紹 五、容器操作案例容器的狀態遷移容器批量操作容器交互模式attached 模式detached 模式interactive 模式 容器 與 宿主…

Laravel 實現 隊列 發送郵件功能

一. 什么是隊列 在構建 Web 應用程序時&#xff0c;你可能需要執行一些任務&#xff0c;例如解析文件&#xff0c;發送郵件&#xff0c;大量的數據計算等等&#xff0c;這些任務在典型的 Web 請求期間需要很長時間才能執行。 慶幸的是&#xff0c;Laravel 可以創建在后臺運行…

flink Shuffle的總結

關于 ** ?5 種 Shuffle 類型** 的區別、使用場景及 Flink 版本支持的總結&#xff1a; * 注意:下面是問AI具體細節與整理學習 1. 核心區別 Shuffle 類型核心特點使用場景Flink 版本支持Pipelined Shuffle流式調度&#xff0c;純內存交換&#xff0c;低延遲&#xff08;毫秒級…

Git使用與管理

一.基本操作 1.創建本地倉庫 在對應文件目錄下進行&#xff1a; git init 輸入完上面的代碼&#xff0c;所在文件目錄下就會多一個名為 .git 的隱藏文件&#xff0c;該文件是Git用來跟蹤和管理倉庫的。 我們可以使用 tree 命令&#xff08;注意要先下載tree插件&#xff09…

計算機視覺——深度學習圖像處理中目標檢測平均精度均值(mAP)與其他常用評估指標

概述 平均精度均值&#xff08;mAP&#xff09;是目標檢測領域中最為流行且復雜的重要評估指標之一。它廣泛用于綜合總結目標檢測器的性能。許多目標檢測模型會輸出類似以下的參數結果&#xff1a; Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.3…

C語言中單鏈表操作:查找節點與刪除節點

一. 簡介 前面學習了C語言中創建鏈表節點&#xff0c;向鏈表中插入節點等操作&#xff0c;文章如下&#xff1a; C語言中單向鏈表&#xff1a;創建節點與插入新節點-CSDN博客 本文繼續學習c語言中對鏈表的其他操作&#xff0c;例如在鏈表中查找某個節點&#xff0c;刪除鏈表…

WePY 框架:小程序開發的“Vue式”利器!!!

WePY 框架&#xff1a;小程序開發的“Vue式”利器 &#x1f680; 哈嘍&#xff0c;大家好&#xff01;&#x1f44b; 今天我們要聊聊一個在微信小程序開發中大放異彩的框架——WePY&#xff01;它是什么&#xff1f;有什么特點&#xff1f;為啥值得一試&#xff1f;別急&#…

什么是微前端?有什么好處?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一種架構理念&#xff0c;借鑒了微服務的思想&#xff0c;將一個大型的前端應用拆分為多個獨立、自治的子應用&#xff0c;每個子應用可以由不同團隊、使用不同技術棧獨立開發和部署&#xff0c;最終聚合為一個整體產品…

【家政平臺開發(33)】庫存管理模塊開發實戰:從基礎搭建到智能管控

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

Mysql個人筆記

Mysql個人筆記 sql基礎書寫規則和種類種類書寫規則注釋規則啟動 DDL數據類型數據庫的操作useshowcreatedrop 表的操作useshowcreate創建表復制表 dropalter Mysql的存儲引擎 DMLselectselect語句like&#xff08;謂詞&#xff09;where聚合函數&#xff1a;關于nullgroup byexi…

【重裝系統】大白菜自制U盤裝機,備份C盤數據,解決電腦啟動黑屏/藍屏

1. 準備 U 盤 U 盤容量至少 8G&#xff0c;備份 U 盤的數據&#xff08;后期會格式化&#xff09; 2. 從微軟官網下載操作系統鏡像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下載安裝大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盤&#…