hmdp知識點

1. 前置知識

1.1 MyBatisPlus的基本使用

1.1.1 引入依賴

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency>

1.1.2 建立實體類和數據庫表

實體類:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_user")
public class User implements Serializable {private static final long serialVersionUID = 1L;/*** 主鍵*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 手機號碼*/private String phone;/*** 密碼,加密存儲*/private String password;/*** 昵稱,默認是隨機字符*/private String nickName;/*** 用戶頭像*/private String icon = "";/*** 創建時間*/private LocalDateTime createTime;/*** 更新時間*/private LocalDateTime updateTime;}

數據庫表:

注解所屬框架用途說明
@DataLombok自動生成 getter/setter/toString/equals/hashCode
@EqualsAndHashCode(callSuper = false)Lombok控制 equals 和 hashCode 是否包含父類字段
@Accessors(chain = true)Lombok支持鏈式調用(set 方法返回 this)
@TableName("tb_user")MyBatis Plus指定當前類對應的數據庫表名
@TableId(value = "id", type = IdType.AUTO)MyBatis Plus標明主鍵字段,并設置數據庫主鍵列名和類型

1.1.3 application.yml

mybatis-plus:type-aliases-package: com.hmdp.entity # 別名掃描包

1.1.4 啟動類掃描包

package com.hmdp;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan("com.hmdp.mapper") // MyBatis掃描包
@SpringBootApplication
public class HmDianPingApplication {public static void main(String[] args) {SpringApplication.run(HmDianPingApplication.class, args);}
}

1.1.5 Mapper接口

import com.hmdp.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {}

BaseMapper 是什么?

BaseMapper<T> 是 MyBatis Plus 提供的一個接口,包含一系列常用的 CRUD 操作方法(增刪改查),這些方法已經實現好了,你可以直接使用。

常用方法舉例:

方法名功能說明
int insert(User entity)插入一條記錄
int deleteById(Serializable id)根據主鍵刪除一條記錄
int updateById(User entity)根據主鍵更新記錄
User selectById(Serializable id)根據主鍵查詢記錄
List<User> selectList(QueryWrapper<User> wrapper)查詢滿足條件的多條記錄
List<User> selectAll()查詢所有記錄(需自己定義 SQL 或擴展 Wrapper)

1.1.6 Service接口

package com.hmdp.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.hmdp.entity.User;public interface IUserService extends IService<User> {}

IService 是什么?

IService<T> 是 MyBatis Plus 提供的一個 通用服務接口,封裝了常見的 業務層操作方法(CRUD),例如:

方法名功能說明
boolean save(User entity)插入一條記錄
boolean removeById(Serializable id)根據主鍵刪除記錄
boolean updateById(User entity)根據主鍵更新記錄
User getById(Serializable id)根據主鍵查詢記錄
List<User> list()查詢所有記錄
IPage<User> page(IPage<User> page)分頁查詢數據
boolean saveOrUpdate(User entity)存在則更新,不存在則插入

1.1.8 ServiceImpl實現類

package com.hmdp.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.entity.User;
import com.hmdp.mapper.UserMapper;
import com.hmdp.service.IUserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}
UserServiceImpl?是?IUserService?的實現類繼承?ServiceImpl,獲得通用 CRUD 方法
必須指定兩個泛型參數Mapper 和 Entity
使用?@Service?注解讓 Spring 管理這個類
可以直接使用通用方法如?save(),?getById(),?list()?等
支持擴展自定義方法在接口中聲明,在實現類中實現

1.1.9?Controller接口

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate IUserService userService;@Resourceprivate IUserInfoService userInfoService;/*** 發送手機驗證碼*/@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {// TODO 發送短信驗證碼并保存驗證碼return Result.fail("功能未完成");}/*** 登錄功能* @param loginForm 登錄參數,包含手機號、驗證碼;或者手機號、密碼*/@PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){// TODO 實現登錄功能return Result.fail("功能未完成");}/*** 登出功能* @return 無*/@PostMapping("/logout")public Result logout(){// TODO 實現登出功能return Result.fail("功能未完成");}@GetMapping("/me")public Result me(){// TODO 獲取當前登錄的用戶并返回return Result.fail("功能未完成");}@GetMapping("/info/{id}")public Result info(@PathVariable("id") Long userId){// 查詢詳情UserInfo info = userInfoService.getById(userId);if (info == null) {// 沒有詳情,應該是第一次查看詳情return Result.ok();}info.setCreateTime(null);info.setUpdateTime(null);// 返回return Result.ok(info);}
}

1.2 校驗手機號/驗證碼格式的工具類

注意:要引入hutool依賴。

package com.hmdp.utils;public abstract class RegexPatterns {/*** 手機號正則*/public static final String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/*** 郵箱正則*/public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";/*** 密碼正則。4~32位的字母、數字、下劃線*/public static final String PASSWORD_REGEX = "^\\w{4,32}$";/*** 驗證碼正則, 6位數字或字母*/public static final String VERIFY_CODE_REGEX = "^[a-zA-Z\\d]{6}$";}
package com.hmdp.utils;import cn.hutool.core.util.StrUtil;public class RegexUtils {/*** 是否是無效手機格式* @param phone 要校驗的手機號* @return true:符合,false:不符合*/public static boolean isPhoneInvalid(String phone){return mismatch(phone, RegexPatterns.PHONE_REGEX);}/*** 是否是無效郵箱格式* @param email 要校驗的郵箱* @return true:符合,false:不符合*/public static boolean isEmailInvalid(String email){return mismatch(email, RegexPatterns.EMAIL_REGEX);}/*** 是否是無效驗證碼格式* @param code 要校驗的驗證碼* @return true:符合,false:不符合*/public static boolean isCodeInvalid(String code){return mismatch(code, RegexPatterns.VERIFY_CODE_REGEX);}// 校驗是否不符合正則格式private static boolean mismatch(String str, String regex){if (StrUtil.isBlank(str)) {return true;}return !str.matches(regex);}
}

2. 短信登陸

2.1 基于Session實現登陸

用戶第一次訪問服務器時,服務器內部會生成一個session,這個session屬于這個用戶,有一個sessionID,服務器會自動將sessionID傳遞給瀏覽器,瀏覽器會自動保存sessionID,之后瀏覽器的每一次請求都會自動攜帶這個sessionID

2.2.1 實現發送短信驗證碼功能

業務流程:

  1. 前端提交手機號到后端
  2. 后端校驗手機號
    1. 手機號格式不符合,返回手機號格式錯誤
    2. 手機號格式符合,下一步
  3. 生成驗證碼
  4. 保存驗證碼到當前用戶的session中
  5. 將驗證碼發送給前端

前端向后端發送請求的倆種方式(POST請求):

  • http://192.168.31.20:8080/api/user/code?phone=17771818987(通過Nginx代理轉發)
  • http://localhost:8081/code?phone=17771818987(直接訪問后端)

UserController.java

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate IUserService userService;/*** 發送手機驗證碼*/@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {//  發送短信驗證碼并保存驗證碼return userService.sendCode(phone,session);}}

IUserService.java

public interface IUserService extends IService<User> {/*** 登陸發送短信驗證碼接口* @param phone* @param session* @return*/Result sendCode(String phone, HttpSession session);
}

UserServiceImpl.java

@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {/*** 發送短信驗證碼實現* @param phone* @param session* @return*/@Overridepublic Result sendCode(String phone, HttpSession session) {// 1. 校驗手機號if (RegexUtils.isPhoneInvalid(phone)) {// 2. 不符合,返回錯誤信息return Result.fail("手機號格式錯誤");}// 3. 符合,設生成驗證碼String code = RandomUtil.randomNumbers(6);// 通過hutool包,生成6位隨機數// 4. 保存驗證碼到sessionsession.setAttribute("code", code);// 5. 發送驗證碼給前端log.debug("發送短信驗證碼成功, 短信驗證碼是:{}", code);// 返回OKreturn Result.ok();}
}

2.2.2 實現短信驗證碼登陸和注冊

前端參數:

  • 請求方式:POST
  • 請求路徑:/user/login
  • 請求參數:phone, code(json數據)
  • 返回值:無

業務流程:

  1. 前端傳遞phone和code
  2. 通過session對象校驗驗證碼
    1. 驗證碼錯誤,返回“驗證碼錯誤”
    2. 驗證碼正確,去數據庫根據手機號查詢用戶
  3. 用戶是否存在
    1. 用戶不存在,創建新用戶,保存新用戶的數據庫
    2. 用戶存在,保存用戶信息到session

LoginFormDTO對象:

@Data
public class LoginFormDTO {private String phone;private String code;private String password;
}

2.2.3 實現登陸校驗攔截器

業務流程:

  1. 請求并攜帶cookie
  2. 從session獲取用戶
  3. 判斷用戶是否存在session中
    1. 用戶存在,表示手機號和驗證碼已經核驗通過
    2. 用戶不存在,攔截

2.2 集群的session共享問題

2.3 基于Redis實現共享session登陸

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

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

相關文章

分享5個免費5個在線工具網站:Docsmall、UIED Tool在線工具箱、草料二維碼、圖片在線壓縮、表情符號

01. Docsmall 它是一個免費的在線圖片與PDF處理工具&#xff0c;功能主要包含Ai圖片處理工具&#xff0c;圖片壓縮工具&#xff0c;圖片PDF格式轉換工具等&#xff0c;如下圖&#xff0c;我認為比較實用的是自動摳圖、圖片變高清、圖片壓縮和PDF壓縮。 https://docsmall.com/…

打通印染車間“神經末梢”:DeviceNet轉Ethernet/IP連接機器人的高效方案

在印染行業自動化升級中&#xff0c;設備聯網需求迫切。老舊印染設備多采用Devicenet協議&#xff0c;而新型工業機器人普遍支持Ethernet/IP協議&#xff0c;協議不兼容導致數據交互困難&#xff0c;設備協同效率低、生產監控滯后&#xff0c;成了行業數字化轉型的阻礙。本文將…

RSA加密算法:非對稱密碼學的基石

一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非對稱加密算法&#xff0c;它基于大數分解的數學難題&#xff0c;是當今應用最廣泛的公鑰密碼系統。RSA的核心思想是使用一對密鑰&#xff08;公鑰…

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動,用于空調風門電機驅動,香薰電機驅動

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動&#xff0c;用于空調風門電機驅動&#xff0c;香薰電機驅動 簡述 MS35774/MS35774A 是一款高精度、低噪聲的兩相步進 電機驅動芯片&#xff0c;芯片內置功率 MOSFET &#xff0c;長時間工作的平均電 流可以達到 1…

駛向智能未來:車載 MCP 服務與邊緣計算驅動的駕駛數據交互新體驗

引言 在人工智能技術與車載算力持續突破的驅動下&#xff0c;現代車輛的數字化進程正加速推進。車聯網系統將突破傳統云端架構的局限&#xff0c;依托邊緣計算與 AI 融合技術&#xff0c;實現人車交互體驗的范式重構?。通過構建基于多源異構數據的自動化分析框架&#xff0c;…

Python數據可視化科技圖表繪制系列教程(三)

目錄 單一柱狀圖 分組柱狀圖 堆積柱狀圖 百分比柱狀圖 均值柱狀圖 不等寬柱狀圖 有序柱狀圖 條形圖 發散條形圖 在條上添加標簽的發散條形圖 基礎棒棒糖圖1 基礎棒棒糖圖2 【聲明】&#xff1a;未經版權人書面許可&#xff0c;任何單位或個人不得以任何形式復制、發…

JavaScript 數組與流程控制:從基礎操作到實戰應用

在 JavaScript 編程的世界里&#xff0c;數組是一種極為重要的數據結構&#xff0c;它就像是一個有序的 “收納盒”&#xff0c;能夠將多個值整齊地存儲起來。而流程控制語句則像是 “指揮官”&#xff0c;能夠按照特定的邏輯對數組進行遍歷和操作。接下來&#xff0c;就讓我們…

十(1). 強制類型轉換

繼第十部分C強制類型轉換的四種方式&#xff0c;再進行強化鞏固一下知識點 static_cast 最常用的&#xff0c;在指針之間做轉換 const_cast 去除常量屬性 dynamic_cast 用在基類和派生類之間的轉換 reinterpret_cast 在任意類型之間進行轉 10.1 static_cast 常見的使用場景&am…

Git版本控制工具詳解

如何區分開發環境和生產環境呢 答案就是寫不同的配置文件&#xff0c;開發的設置成開發需要的&#xff0c;生產的設置成生產需要的&#xff0c;共同放到config這個配置文件夾下面&#xff0c;開發和生成的時候分別加載不同的配置文件 方式二就是使用相同的一個入口配置文件&a…

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度=== 損失函數能通過計算圖連接到可訓練參數

反向傳播的核心是什么:計算損失函數對可訓練參數的梯度 損失函數能通過計算圖連接到可訓練參數 在深度學習中,反向傳播的核心是計算損失函數對可訓練參數的梯度,從而更新這些參數。對于LLM(大型語言模型)而言,是否需要“LLM輸出的參數”才能進行反向傳播 一、反向傳播…

KINGCMS被入侵

現象會強制跳轉到 一個異常網站,請掉截圖代碼. 代碼中包含經過混淆處理的JavaScript&#xff0c;它使用了一種技術來隱藏其真實功能。代碼中使用了eval函數來執行動態生成的代碼&#xff0c;這是一種常見的技術&#xff0c;惡意腳本經常使用它來隱藏其真實目的。 這段腳本會檢…

深入探索串的高級操作:從算法到 LeetCode 實戰

串是編程中最常用的數據結構之一&#xff0c;從簡單的文本處理到復雜的文本匹配算法&#xff0c;串的應用無處不在。在掌握了串的基本概念、存儲結構以及KMP算法之后&#xff0c;現在讓我們深入探索串的更多高級操作&#xff0c;例如求子串、串的替換等&#xff0c;并通過LeetC…

在rocky linux 9.5上在線安裝 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在網絡上搜索onenet&#xff0c;注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT&#xff0c;其他的內容自己填寫 6.這里產品以及開發完成&#xff0c;接下來就是添加設…

【Fiddler工具判斷前后端Bug】

Fiddler工具判斷前后端Bug的方法 使用Fiddler抓包工具可以高效定位問題是出在前端還是后端&#xff0c;主要通過分析請求和響應的內容、狀態碼、數據格式等關鍵信息。 分析請求是否成功發送 檢查請求是否從客戶端正確發出&#xff0c;觀察Fiddler抓取的請求列表。若請求未出…

【論文閱讀筆記】《A survey on deep learning approaches for text-to-SQL》

文章目錄 一、論文基本信息1. 文章標題2. 所屬刊物/會議3. 發表年份4. 作者列表5. 發表單位 二、摘要三、解決問題四、創新點五、自己的見解和感想六、研究背景七、研究方法&#xff08;模型、實驗數據、評估指標&#xff09;八、總結&#xff08;做了什么、得到了什么、有什么…

【強連通分量 縮點 最長路 拓撲排序】P2656 采蘑菇|普及+

本文涉及知識點 C圖論 強連通分量 縮點 最長路 拓撲排序 P2656 采蘑菇 題目描述 小胖和 ZYR 要去 ESQMS 森林采蘑菇。 ESQMS 森林間有 N N N 個小樹叢&#xff0c; M M M 條小徑&#xff0c;每條小徑都是單向的&#xff0c;連接兩個小樹叢&#xff0c;上面都有一定數量的…

Dubbo Logback 遠程調用攜帶traceid

背景 A項目有調用B項目的服務&#xff0c;A項目使用 logback 且有 MDC 方式做 traceid&#xff0c;調用B項目的時候&#xff0c;traceid 沒傳遞過期&#xff0c;導致有時候不好排查問題和鏈路追蹤 準備工作 因為使用的是 alibaba 的 dubbo 所以需要加入單獨的包 <depend…

nodejs:用 nodemailer 發送一封帶有附件的郵件

我們將使用 nodemailer 庫來發送帶有附件的郵件。 首先&#xff0c;確保已經安裝了nodemailer。如果沒有安裝&#xff0c;可以通過 npm install nodemailer 來安裝。 cnpm install nodemailer --save dependencies: – nodemailer ^7.0.3 步驟&#xff1a; 引入nodemailer模…

Scade 語言概念 - 方程(equation)

在 Scade 6 程序中自定義算子(Operator)的定義、或數據流定義(data_def)的內容中&#xff0c;包含一種基本的語言結構&#xff1a;方程(equation)(注1)。在本篇中&#xff0c;將敘述 Scade 語言方程的文法形式&#xff0c;以及作用。 注1: 對 Scade 中的 equation, 或 equation…