個人博客系統后端 - 用戶信息管理功能實現指南(上)

本文記錄了如何實現用獲取戶信息,用戶信息更新,用戶頭像上傳三大基礎功能
先上接口實現截圖:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

一、項目結構概覽
先介紹一下
個人博客系統采用了標準的 Spring Boot 項目結構,用戶功能相關的文件主要分布在以下幾個目錄:

WeblogSystem/
├── src/main/java/com/zxy/weblogsystem/
│   ├── controller/        # 控制器層,處理HTTP請求
│   ├── service/           # 服務層,實現業務邏輯
│   │   └── impl/          # 服務實現類
│   ├── repository/        # 數據訪問層,與數據庫交互
│   ├── entity/            # 實體類,映射數據庫表
│   ├── dto/               # 數據傳輸對象,用于API交互
│   ├── exception/         # 自定義異常類
│   └── config/            # 配置類
├── src/main/resources/
│   ├── static/            # 靜態資源
│   ├── templates/         # 模板文件
│   ├── application.properties  # 應用配置
│   ├── schema.sql         # 數據庫表結構
│   └── data.sql           # 初始數據
└── docs/                  # 項目文檔

二、用戶信息功能實現

  1. 實體類定義
    文件位置:src/main/java/com/zxy/weblogsystem/entity/User.java

功能說明:定義用戶實體類,映射數據庫中的 users 表。

主要內容:

@Data  // Lombok注解,自動生成getter/setter等方法
@NoArgsConstructor  // 無參構造函數
@AllArgsConstructor  // 全參構造函數
@Entity  // JPA實體類注解
@Table(name = "users")  // 指定表名
public class User {@Id  // 主鍵@GeneratedValue(strategy = GenerationType.IDENTITY)  // 自增策略private Long id;@Column(nullable = false, unique = true, length = 50)private String username;@Column(nullable = false, length = 100)private String password;@Column(nullable = false, unique = true, length = 100)private String email;@Column(length = 50)private String nickname;@Column(length = 255)private String avatarUrl;  // 頭像URL@Column(nullable = false, length = 20)private String role = "USER";@Column(nullable = false)private Integer status = 1;@Column(name = "created_at", nullable = false, updatable = false)private LocalDateTime createdAt;@Column(name = "updated_at", nullable = false)private LocalDateTime updatedAt;@PrePersistprotected void onCreate() {createdAt = LocalDateTime.now();updatedAt = LocalDateTime.now();}@PreUpdateprotected void onUpdate() {updatedAt = LocalDateTime.now();}
}
  1. 數據傳輸對象(DTO)
    2.1 用戶信息DTO
    文件位置:src/main/java/com/zxy/weblogsystem/dto/UserInfoDto.java

功能說明:用于返回用戶信息的數據傳輸對象。

主要內容:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfoDto {private Long id;private String username;private String nickname;private String email;private String avatarUrl;private String role;private Integer status;private Integer followersCount;  // 粉絲數private Integer followingCount;  // 關注數private Integer articleCount;    // 文章數private LocalDateTime createdAt;
}

2.2 用戶更新DTO
文件位置:src/main/java/com/zxy/weblogsystem/dto/UserUpdateDto.java

功能說明:用于接收用戶信息更新請求的數據傳輸對象。

主要內容:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserUpdateDto {@Size(max = 50, message = "昵稱長度不能超過50個字符")private String nickname;@URL(message = "頭像URL格式不正確")private String avatarUrl;
}

2.3 API響應DTO
文件位置:src/main/java/com/zxy/weblogsystem/dto/ApiResponse.java

功能說明:統一的API響應格式。

主要內容:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiResponse<T> {private Integer code;private String message;private T data;public static <T> ApiResponse<T> success(T data) {return new ApiResponse<>(200, "OK", data);}public static <T> ApiResponse<T> success(String message, T data) {return new ApiResponse<>(200, message, data);}public static <T> ApiResponse<T> error(Integer code, String message) {return new ApiResponse<>(code, message, null);}
}
  1. 數據訪問層
    文件位置:src/main/java/com/zxy/weblogsystem/repository/UserRepository.java

功能說明:用戶數據訪問接口,提供數據庫操作方法。

主要內容:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);Optional<User> findByEmail(String email);boolean existsByUsername(String username);boolean existsByEmail(String email);
}
  1. 服務層
    4.1 用戶服務接口
    文件位置:src/main/java/com/zxy/weblogsystem/service/UserService.java

功能說明:定義用戶相關的業務邏輯接口。

主要內容:

public interface UserService {/*** 根據用戶ID獲取用戶信息* @param userId 用戶ID* @return 用戶詳細信息DTO*/UserInfoDto getUserInfo(Long userId);/*** 根據用戶ID更新用戶信息* @param userId 用戶ID* @param userUpdateDto 用戶更新信息DTO* @return 更新后的用戶信息DTO*/UserInfoDto updateUserInfo(Long userId, UserUpdateDto userUpdateDto);/*** 更新用戶頭像* @param userId 用戶ID* @param avatarUrl 頭像URL* @return 更新后的用戶信息DTO*/UserInfoDto updateUserAvatar(Long userId, String avatarUrl);
}

4.2 用戶服務實現類
文件位置:src/main/java/com/zxy/weblogsystem/service/impl/UserServiceImpl.java

功能說明:實現用戶服務接口中定義的業務邏輯。

主要內容:

@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {private final UserRepository userRepository;private final UserFollowRepository userFollowRepository;private final ArticleRepository articleRepository;@Override@Transactional(readOnly = true)public UserInfoDto getUserInfo(Long userId) {// 1. 查詢用戶基本信息User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("用戶不存在,ID: " + userId));// 2. 查詢統計數據Integer followersCount = userFollowRepository.countByFollowedId(userId);Integer followingCount = userFollowRepository.countByFollowerId(userId);Integer articleCount = articleRepository.countByAuthorId(userId);// 3. 構建并返回DTOreturn UserInfoDto.builder().id(user.getId()).username(user.getUsername()).nickname(user.getNickname()).email(user.getEmail()).avatarUrl(user.getAvatarUrl()).role(user.getRole()).status(user.getStatus()).followersCount(followersCount).followingCount(followingCount).articleCount(articleCount).createdAt(user.getCreatedAt()).build();}@Override@Transactionalpublic UserInfoDto updateUserInfo(Long userId, UserUpdateDto userUpdateDto) {// 1. 查詢用戶是否存在User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("用戶不存在,ID: " + userId));// 2. 更新用戶信息boolean isUpdated = false;// 更新昵稱if (userUpdateDto.getNickname() != null && !userUpdateDto.getNickname().isEmpty()) {user.setNickname(userUpdateDto.getNickname());isUpdated = true;}// 3. 保存更新后的用戶信息if (isUpdated) {user = userRepository.save(user);}// 4. 查詢統計數據并構建返回DTOreturn getUserInfo(userId);}@Override@Transactionalpublic UserInfoDto updateUserAvatar(Long userId, String avatarUrl) {// 1. 查詢用戶是否存在User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("用戶不存在,ID: " + userId));// 2. 更新用戶頭像URLuser.setAvatarUrl(avatarUrl);// 3. 保存更新后的用戶信息userRepository.save(user);// 4. 查詢統計數據并構建返回DTOreturn getUserInfo(userId);}
}
  1. 控制器層
    文件位置:src/main/java/com/zxy/weblogsystem/controller/UserController.java

功能說明:處理用戶相關的HTTP請求。

主要內容:

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {private final UserService userService;private final FileService fileService;/*** 獲取用戶信息*/@GetMapping("/{id}")public ApiResponse<UserInfoDto> getUserInfo(@PathVariable Long id) {UserInfoDto userInfo = userService.getUserInfo(id);return ApiResponse.success(userInfo);}/*** 更新用戶信息*/@PutMapping("/{id}")public ApiResponse<UserInfoDto> updateUserInfo(@PathVariable Long id, @Valid @RequestBody UserUpdateDto userUpdateDto) {UserInfoDto updatedUserInfo = userService.updateUserInfo(id, userUpdateDto);return ApiResponse.success("更新成功", updatedUserInfo);}/*** 上傳用戶頭像*/@PostMapping("/{id}/avatar")public ApiResponse<Map<String, String>> uploadAvatar(@PathVariable Long id, @RequestParam("file") MultipartFile file) {// 1. 調用文件服務上傳頭像String avatarUrl = fileService.uploadAvatar(id, file);// 2. 更新用戶頭像信息userService.updateUserAvatar(id, avatarUrl);// 3. 返回頭像URLMap<String, String> result = new HashMap<>();result.put("avatarUrl", avatarUrl);return ApiResponse.success("上傳成功", result);}
}

三、文件上傳功能實現

  1. 文件上傳配置
    文件位置:src/main/java/com/zxy/weblogsystem/config/FileUploadConfig.java

功能說明:配置文件上傳相關參數和靜態資源訪問。

主要內容:

@Configuration
public class FileUploadConfig implements WebMvcConfigurer {@Value("${file.upload.path:uploads}")private String uploadPath;@Value("${file.access.path:/uploads/}")private String accessPath;@Beanpublic MultipartResolver multipartResolver() {return new StandardServletMultipartResolver();}@Overridepublic void addResourceHandlers(@NonNull ResourceHandlerRegistry registry) {// 確保上傳目錄存在File uploadDir = new File(uploadPath);if (!uploadDir.exists()) {uploadDir.mkdirs();}// 獲取上傳目錄的絕對路徑String absolutePath = uploadDir.getAbsolutePath();// 添加資源處理器,將上傳路徑映射到訪問路徑registry.addResourceHandler(accessPath + "**").addResourceLocations("file:" + absolutePath + "/");}
}
  1. 文件上傳異常
    文件位置:src/main/java/com/zxy/weblogsystem/exception/FileUploadException.java

功能說明:自定義文件上傳異常類。

主要內容:

public class FileUploadException extends RuntimeException {public FileUploadException(String message) {super(message);}public FileUploadException(String message, Throwable cause) {super(message, cause);}
}
  1. 文件服務接口
    文件位置:src/main/java/com/zxy/weblogsystem/service/FileService.java

功能說明:定義文件上傳相關的業務邏輯接口。

主要內容:

public interface FileService {/*** 上傳頭像文件* * @param userId 用戶ID* @param file 頭像文件* @return 頭像訪問URL*/String uploadAvatar(Long userId, MultipartFile file);
}
  1. 文件服務實現類
    文件位置:src/main/java/com/zxy/weblogsystem/service/impl/FileServiceImpl.java

功能說明:實現文件上傳相關的業務邏輯。

主要內容:

@Service
@RequiredArgsConstructor
public class FileServiceImpl implements FileService {@Value("${file.upload.path:uploads}")private String uploadPath;@Value("${file.access.path:/uploads/}")private String accessPath;private static final List<String> ALLOWED_IMAGE_TYPES = Arrays.asList("image/jpeg", "image/png");@Overridepublic String uploadAvatar(Long userId, MultipartFile file) {// 1. 校驗文件是否為空if (file == null || file.isEmpty()) {throw new FileUploadException("上傳文件不能為空");}// 2. 校驗文件類型String contentType = file.getContentType();if (contentType == null || !ALLOWED_IMAGE_TYPES.contains(contentType)) {throw new FileUploadException("只支持JPG和PNG格式的圖片");}// 3. 校驗文件大小if (file.getSize() > 2 * 1024 * 1024) { // 2MBthrow new FileUploadException("文件大小不能超過2MB");}try {// 4. 確保上傳目錄存在File uploadDir = new File(uploadPath);if (!uploadDir.exists()) {uploadDir.mkdirs();}// 5. 創建用戶頭像目錄String userAvatarDir = uploadPath + "/avatars/" + userId;File userDir = new File(userAvatarDir);if (!userDir.exists()) {userDir.mkdirs();}// 6. 生成唯一文件名String originalFilename = file.getOriginalFilename();String fileExtension = originalFilename != null ? originalFilename.substring(originalFilename.lastIndexOf(".")) : ".jpg";String newFilename = UUID.randomUUID().toString() + fileExtension;// 7. 保存文件Path targetPath = Paths.get(userAvatarDir, newFilename);Files.copy(file.getInputStream(), targetPath);// 8. 返回文件訪問URLreturn accessPath + "avatars/" + userId + "/" + newFilename;} catch (IOException e) {throw new FileUploadException("文件上傳失敗: " + e.getMessage());}}
}

四、配置文件

  1. 應用配置
    文件位置:src/main/resources/application.properties

功能說明:配置應用參數,包括數據庫連接、文件上傳等。

主要內容:

# 數據庫配置
spring.datasource.url=jdbc:mysql://localhost:3306/weblog?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# JPA配置
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect# 文件上傳配置
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=2MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.file-size-threshold=0# 文件存儲路徑配置
file.upload.path=e:/個人博客系統/WeblogSystem/uploads
file.access.path=/uploads/
  1. 數據庫表結構
    文件位置:src/main/resources/schema.sql

功能說明:定義數據庫表結構。

主要內容:

-- 用戶表
CREATE TABLE IF NOT EXISTS users (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用戶ID',username VARCHAR(50) NOT NULL UNIQUE COMMENT '用戶名',password VARCHAR(100) NOT NULL COMMENT '密碼(加密)',email VARCHAR(100) NOT NULL UNIQUE COMMENT '郵箱',nickname VARCHAR(50) COMMENT '昵稱',avatar_url VARCHAR(255) COMMENT '頭像URL',role VARCHAR(20) NOT NULL DEFAULT 'USER' COMMENT '角色',status INT NOT NULL DEFAULT 1 COMMENT '狀態(0=禁用,1=啟用)',created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',INDEX idx_email(email),INDEX idx_username(username)
) COMMENT '用戶表';

五、功能測試

  1. 獲取用戶信息
    請求方法:GET

URL:/users/{id}

示例:GET http://localhost:8080/users/1

響應示例:

{"code": 200,"message": "OK","data": {"id": 1,"username": "admin","nickname": "管理員","email": "admin@example.com","avatarUrl": "/uploads/avatars/1/63675700-ad83-4e05-a64f-2e59f8a16eeb.jpg","role": "ADMIN","status": 1,"followersCount": 0,"followingCount": 0,"articleCount": 0,"createdAt": "2025-04-13T12:00:00"}
}
  1. 更新用戶信息
    請求方法:PUT

URL:/users/{id}

請求體:

{"nickname": "新昵稱"
}

示例:PUT http://localhost:8080/users/1

響應示例:

{"code": 200,"message": "更新成功","data": {"id": 1,"username": "admin","nickname": "新昵稱","email": "admin@example.com","avatarUrl": "/uploads/avatars/1/63675700-ad83-4e05-a64f-2e59f8a16eeb.jpg","role": "ADMIN","status": 1,"followersCount": 0,"followingCount": 0,"articleCount": 0,"createdAt": "2025-04-13T12:00:00"}
}
  1. 上傳用戶頭像
    請求方法:POST

URL:/users/{id}/avatar

Content-Type:multipart/form-data

請求參數:

file: 圖片文件(支持jpg、png,最大2MB)
示例:POST http://localhost:8080/users/1/avatar

響應示例:

{"code": 200,"message": "上傳成功","data": {"avatarUrl": "/uploads/avatars/1/63675700-ad83-4e05-a64f-2e59f8a16eeb.jpg"}
}

六、總結
通過以上實現,完成了用戶信息管理的三個主要功能:
獲取用戶信息:通過用戶ID獲取用戶詳細信息,包括基本資料和統計數據
更新用戶信息:支持更新用戶昵稱等基本信息
上傳用戶頭像:支持上傳JPG、PNG格式的頭像圖片,并自動更新用戶頭像URL

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

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

相關文章

趣味編程之分布式系統:負載均衡的“雨露均沾“藝術

#此篇文章由Deepseek大力支持&#x1f60b; 凌晨三點&#xff0c;西二旗某火鍋店后廚—— “羊肉卷走3號桌&#xff01;” “肥牛卷去7號&#xff01;” “蝦滑優先給VIP區&#xff01;” 我蹲在傳菜口的監控屏幕前&#xff0c;看著機器人服務生們忙而不亂地穿梭。突然間&am…

Linux——信號(1)信號的產生

我們在講進程的多種狀態時提到過&#xff0c;一個進程的退出有三種情況&#xff1a;正常退出&#xff0c;結果出錯退出&#xff08;代碼也執行完了&#xff09;&#xff0c;異常終止退出&#xff08;代碼未執行完&#xff09;&#xff0c;其中最后一種退出相當于進程在運行時&a…

LeetCode 2919 使數組變美的最小增量運算數

動態規劃解題&#xff1a;最小操作次數使數組變為美麗數組 問題描述 給定一個下標從0開始、長度為n的整數數組nums和一個整數k。你可以對數組中的任意一個元素進行加1操作&#xff0c;操作次數不限。如果數組中任意長度大于或等于3的子數組的最大值都大于或等于k&#xff0c;…

計算生物學在中國的發展情況?

李升偉 整理 計算生物學在中國的發展呈現出多方面積極態勢&#xff0c;具體表現如下&#xff1a; 發展概述&#xff1a; 上海發布了醫用AI發展的專項方案&#xff0c;特別強調了腦科學與計算生物學的前沿領域。這表明政府有意推動該領域的技術進步和技術合作平臺建設。國內的…

Linux之文件內容顯示(cat、grep、cut、sort、uniq、tr)

&#x1f3af; 本文專欄&#xff1a;Linux &#x1f680; 作者主頁&#xff1a;小度愛學習 1、瀏覽普通文件內容 命令常用選項說明cat-n 對輸出內容中的所有行標注行號&#xff1b;-b 對輸出內容中的非空行標注行號。查看文本文件的內容head-num 指定需要顯示文件num行的內容。…

3DS 轉 STL 全攻略:傳統工具與迪威模型網在線轉換深度解析

在 3D 建模與 3D 打印的技術領域中&#xff0c;常常會遇到需要將不同格式的文件進行轉換的情況。其中&#xff0c;把 3DS 文件轉換為 STL 格式是較為常見的操作。3DS 文件作為一種舊版 Autodesk 3D Studio 使用的 3D 圖像格式&#xff0c;存儲著豐富的信息&#xff0c;包括網格…

IoT FEM射頻前端模組芯片(2.4G PA)三伍微電子GSR2401 兼容替代RFX2401

型號&#xff1a;GSR2401應用&#xff1a;適用于藍牙&#xff08;BT&#xff09;、ZigBee及物聯網&#xff08;IoT&#xff09;設備 功能&#xff1a;集成了功率放大器&#xff08;PA&#xff09;、開關&#xff08;Switch&#xff09;和低噪聲放大器&#xff08;LNA&#xff…

Missashe考研日記-day22

Missashe考研日記-day22 1 專業課408 學習時間&#xff1a;3h學習內容&#xff1a; 先把昨天關于進程調度的課后習題做了&#xff0c;然后花了挺長時間預習OS的最最最最重要的一部分——同步與互斥問題&#xff0c;這部分大二上課的時候就懵懵懂懂的&#xff0c;得認真再領悟…

2025年最新Web安全(面試題)

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

Qt QML - qmldir使用方法詳解

以實際例子看qmldir的使用 1.搞一個qmldir2.讓QML找到你的qmldir &#xff08;重點&#xff09;.pro 工程文件QQmlApplicationEngine加載主QML處 3.用起來你的模塊 qmldir是Qt QML模塊化的基石&#xff0c;其設計初衷是為解決QML文件的組織、復用和依賴管理問題,。只需要在每個…

# Shell腳本參數設計規范(DeepSeek指導)

Shell腳本參數設計規范&#xff08;DeepSeek指導&#xff09; 文章目錄 Shell腳本參數設計規范&#xff08;DeepSeek指導&#xff09;A 我問&#xff1a;Q DeepSeek回答&#xff1a;**命令行參數表示規范****標準化表示示例**情況1&#xff1a;必選選項參數值情況2&#xff1a;…

MQTT協議:IoT通信的輕量級選手

文章總結&#xff08;幫你們節約時間&#xff09; MQTT協議是一種輕量級的發布/訂閱通信協議。MQTT通信包括連接建立、訂閱、發布和斷開等過程。MQTT基于TCP/IP&#xff0c;其通信過程涉及多種控制包和數據包。ESP32S3可以通過MQTT協議接收消息來控制IO9引腳上的LED。 想象一…

數據結構——反射、枚舉以及lambda表達式

1. 反射 Java的反射&#xff08;reflection&#xff09;機制是在運?時檢查、訪問和修改類、接?、字段和?法的機制&#xff1b;這種動態獲取信息以及動態調?對象?法的功能稱為java語?的反射&#xff08;reflection&#xff09;機制。 用途 1. 框架開發 2. 注解處理 3.…

C語言教程(十):C 語言函數詳解

一、引言 在 C 語言中&#xff0c;函數是一組執行特定任務的代碼塊。通過將復雜的程序邏輯劃分為多個函數&#xff0c;不僅能提高代碼的可讀性、可維護性&#xff0c;還便于代碼的復用。無論是簡單的數學計算&#xff0c;還是復雜的系統操作&#xff0c;函數都發揮著核心作用。…

力扣面試150題--有效的字母異位詞和字母異位詞分組

Day 24 題目描述 思路 初次思路&#xff1a;如果兩個字符串為異位詞&#xff0c;說明它們長度相同并且字母出現的次數相同&#xff0c;于是有以下做法&#xff1a; 定義一個map&#xff0c;來保存s中每個字符的出現次數處理特殊情況&#xff0c;如果長度不同&#xff0c;直接…

數理邏輯(Mathematical Logic)綜論與跨學科應用

李升偉 整理 數理邏輯&#xff08;Mathematical Logic&#xff09;是現代邏輯學與數學交叉的核心學科&#xff0c;以嚴格的數學方法研究邏輯推理的形式與規律。其發展深刻影響了數學基礎、計算機科學、語言哲學等領域。以下從多個維度綜論數理邏輯&#xff1a; 1. 核心分支 命…

高性能內存kv數據庫Redis(續)

目錄 四.主從同步與對象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis為什么要實現持久化 2.2fork進程的寫時復制機制 2.3大Key的影響 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的優缺點 3.redis里面的高可用體現在哪里&#xff1f; 3.1r…

泛型算法——只讀算法(一)

在 C 標準庫中&#xff0c;泛型算法的“只讀算法”指那些 不會改變它們所操作的容器中的元素&#xff0c;僅用于訪問或獲取信息的算法&#xff0c;例如查找、計數、遍歷等操作。 accumulate std::accumulate()是 C 標準庫**numeric**頭文件中提供的算法&#xff0c;用于對序列…

SvelteKit 最新中文文檔教程(21)—— 最佳實踐之圖片

前言 Svelte&#xff0c;一個語法簡潔、入門容易&#xff0c;面向未來的前端框架。 從 Svelte 誕生之初&#xff0c;就備受開發者的喜愛&#xff0c;根據統計&#xff0c;從 2019 年到 2024 年&#xff0c;連續 6 年一直是開發者最感興趣的前端框架 No.1&#xff1a; Svelte …

健康養生:開啟活力生活的密鑰

當我們在健身房看到年逾六旬卻身形矯健的老人&#xff0c;在公園偶遇精神矍鑠、步伐輕快的長者&#xff0c;總會驚嘆于他們的健康狀態。其實&#xff0c;這些都得益于長期堅持科學的養生之道。健康養生并非遙不可及的玄學&#xff0c;而是融入生活細節的智慧。? 在飲食的世界…