springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能
1.創(chuàng)建user表

注意: phone這個(gè)字段設(shè)置的時(shí)候最好大于11位

2. mybatis-plus插件
安裝了mybatis-plus插件后,可以根據(jù)數(shù)據(jù)庫(kù)生成代碼

首先連接數(shù)據(jù)庫(kù)


然后



3.導(dǎo)入相關(guān)依賴
<strong>muybatis-plus依賴</strong>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>4.配置文件
server.port=8001 spring.datasource.url=jdbc:mysql://localhost:3306/test2?serverTimezone=GMT spring.datasource.username=root spring.datasource.password=1234
5.前端代碼
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
<link rel="stylesheet" type="text/css" href="/css/style.css" rel="external nofollow" />
</head>
<body>
<div class="control">
<div class="item">
<div class="active">注冊(cè)</div>
</div>
<div class="content">
<div style="display: block;">
<form action="/user/register" method="post">
<p>請(qǐng)輸入手機(jī)號(hào)</p>
<input type="tel" placeholder="請(qǐng)輸入手機(jī)號(hào)" name="phone" id="phone"/>
<input type="text" placeholder="請(qǐng)輸入驗(yàn)證碼" name="code"/>
<button type="button">獲取驗(yàn)證碼</button>
<p>請(qǐng)輸入密碼</p>
<input type="password" placeholder="請(qǐng)輸入密碼" name="password"/>
<br/>
<input type="submit" value="注冊(cè)"/>
</form>
<p>已注冊(cè),<a href="/user/login" rel="external nofollow" target="top">去登錄</a></p>
</div>
</div>
</div>
<script>
var btn = document.querySelector('button');
var phoneDom = document.getElementById("phone")
// 全局變量,定義剩下的秒數(shù)
var time = 59;
// 注冊(cè)單擊事件 X 這里是獲取驗(yàn)證碼按鈕事件
btn.addEventListener('click', function () {
// btn.send('post',"/user/code")
//判斷手機(jī)號(hào)為空
if (phoneDom.value !== null && phoneDom.value !== '') {
//發(fā)送請(qǐng)求,生成二維碼
let xhr = new XMLHttpRequest();
// methods:GET/POST請(qǐng)求方式等,url:請(qǐng)求地址,true異步(可為false同步)
xhr.open("GET", "/user/code?phone=" + phoneDom.value, true);
xhr.send(); // 發(fā)送
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) { // 成功,接收到數(shù)據(jù)
console.log(xhr.response); // 查看返回的數(shù)據(jù)(可輸出 xhr 哈)
// 禁用按鈕
btn.disabled = true;
// 開(kāi)啟定時(shí)器
var timer = setInterval(function () {
// 判斷剩余秒數(shù)
if (time == 0) {
// 清除定時(shí)器和復(fù)原按鈕
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = '獲取驗(yàn)證碼';
} else {
btn.innerHTML = time + '秒';
time--;
}
}, 1000);
} else if (xhr.status == 404) {
// 失敗,頁(yè)面未找到
}
}
} else {
alert("請(qǐng)輸入手機(jī)號(hào)!")
}
});
</script>
</body>
</html>style.css

*{
margin: 0;
padding: 0;
}
body{
background:#65cea7 ;
}
.control{
width: 340px;
background: white;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
border-radius: 5px;
}
.item{
width: 340px;
height: 60px;
background: #eeeeee;
}
.item div{
width: 340px;
height: 60px;
display: inline-block;
color: black;
font-size: 18px;
text-align: center;
line-height: 60px;
cursor: pointer;
}
.content{
width: 100%;
}
.content div{
margin: 20px 30px;
text-align: left;
}
p{
color: #4a4a4a;
margin-top: 30px;
margin-bottom: 6px;
font-size: 15px;
}
.content input[type="tel"]{
width: 100%;
height: 40px;
border-radius: 3px;
border: 1px solid #adadad;
padding: 0 10px;
box-sizing: border-box;
}
.content input[type="text"]{
width: 55%;
height: 40px;
border-radius: 3px;
border: 1px solid #adadad;
padding: 0 10px;
box-sizing: border-box;
}
.content input[type="password"]{
width: 100%;
height: 40px;
border-radius: 3px;
border: 1px solid #adadad;
padding: 0 10px;
box-sizing: border-box;
}
.content button{
margin-top: 40px;
width: 40%;
height: 40px;
border-radius: 5px;
color: white;
border: 1px solid #adadad;
background: cyan;
cursor: pointer;
letter-spacing: 4px;
margin-bottom: 40px;
}
.content input[type="submit"]{
margin-top: 40px;
width: 100%;
height: 40px;
border-radius: 5px;
color: white;
border: 1px solid #adadad;
background: cyan;
cursor: pointer;
letter-spacing: 4px;
margin-bottom: 40px;
}
.active{
background: white;
}
.item div:hover{
background: #f6f6f6;
}6.后端代碼
entity層
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String phone;
private String password;
private String code;
mapper層
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
sevice層
業(yè)務(wù)層接口
public interface IUserService extends IService<User> {
String register(User user, HttpSession session);
String sendCode(String phone, HttpSession session);
}
業(yè)務(wù)層實(shí)現(xiàn)類(lèi)
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public String sendCode(String phone, HttpSession session) {
//這里手機(jī)號(hào)碼為空則報(bào)空指針,判斷不嚴(yán)謹(jǐn)
if (StringUtils.hasText(phone) && RegexUtil.isMobile(phone)) {
//生成驗(yàn)證碼
String yzmCode = RandomUtil.randomNumbers(6);
//保存驗(yàn)證碼到session
session.setAttribute("yzmCode", yzmCode);
System.out.println("發(fā)送短信驗(yàn)證碼成功" + yzmCode);
return "發(fā)送短信驗(yàn)證碼成功!驗(yàn)證碼是:" + yzmCode;
} else {
return "手機(jī)號(hào)格式錯(cuò)誤";
}
}
@Override
public String register(User user, HttpSession session) {
//判斷輸入手機(jī)號(hào)的格式
if (StringUtils.hasText(user.getPhone()) && RegexUtil.isMobile(user.getPhone())) {
//從session拿出緩存的驗(yàn)證碼
Object cacheCode = session.getAttribute("yzmCode");
String code = user.getCode();
if (cacheCode == null || !cacheCode.equals(code)) {
return "html/register";
}
//3.根據(jù)手機(jī)號(hào)查詢用戶
User user1 = query().eq("phone", user.getPhone()).one();
if (user1 == null) {
userMapper.insert(user);
return "html/login";
}
session.setAttribute("user1", user1);
return "html/register";
}
return "html/register";
}
}controller層
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/code")
@ResponseBody
public String sendCode(String phone, HttpSession session) {
return userService.sendCode(phone, session);
}
@RequestMapping("/register")
public String register(User user, HttpSession session) {
return userService.register(user, session);
}
}工具類(lèi)(utils)
public class RegexUtil {
public static boolean isMobile(String str) {
Pattern p = null;
Matcher m = null;
boolean b = false;
p = Pattern.compile("^[1][3,4,5,8][0-9]{9}$"); // 驗(yàn)證手機(jī)號(hào)
m = p.matcher(str);
b = m.matches();
return b;
}
}
7.調(diào)試
前端頁(yè)面

1. 未輸入手機(jī)號(hào)的時(shí)候,直接點(diǎn)擊獲取驗(yàn)證碼按鈕

2.輸入手機(jī)號(hào),但是格式錯(cuò)誤

3.輸入手機(jī)號(hào),并且格式正確


驗(yàn)證碼是模擬生成的
String yzmCode = RandomUtil.randomNumbers(6);
4.調(diào)試的時(shí)候驗(yàn)證碼錯(cuò)誤或者手機(jī)重復(fù)注冊(cè)都是還在注冊(cè)頁(yè)面
8.代碼解析

實(shí)體類(lèi)
實(shí)體類(lèi)的屬性對(duì)應(yīng)數(shù)據(jù)user表字段

控制層主要寫(xiě)了兩個(gè)接口
一個(gè)是發(fā)送驗(yàn)證碼接口,當(dāng)我們點(diǎn)擊前端頁(yè)面獲取驗(yàn)證碼按鈕的時(shí)候,這個(gè)接口響應(yīng)
獲取驗(yàn)證碼事件
這里主要使用了ajax技術(shù)
<script>
var btn = document.querySelector('button');
var phoneDom = document.getElementById("phone")
// 全局變量,定義剩下的秒數(shù)
var time = 59;
// 注冊(cè)單擊事件 X 這里是獲取驗(yàn)證碼按鈕事件
btn.addEventListener('click', function () {
// btn.send('post',"/user/code")
//判斷手機(jī)號(hào)為空
if (phoneDom.value !== null && phoneDom.value !== '') {
//發(fā)送請(qǐng)求,生成驗(yàn)證碼
let xhr = new XMLHttpRequest();
// methods:GET/POST請(qǐng)求方式等,url:請(qǐng)求地址,true異步(可為false同步)
xhr.open("GET", "/user/code?phone=" + phoneDom.value, true);
xhr.send(); // 發(fā)送
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) { // 成功,接收到數(shù)據(jù)
console.log(xhr.response); // 查看返回的數(shù)據(jù)(可輸出 xhr 哈)
// 禁用按鈕
btn.disabled = true;
// 開(kāi)啟定時(shí)器
var timer = setInterval(function () {
// 判斷剩余秒數(shù)
if (time == 0) {
// 清除定時(shí)器和復(fù)原按鈕
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = '獲取驗(yàn)證碼';
} else {
btn.innerHTML = time + '秒';
time--;
}
}, 1000);
} else if (xhr.status == 404) {
// 失敗,頁(yè)面未找到
}
}
} else {
alert("請(qǐng)輸入手機(jī)號(hào)!")
}
});
</script>
控制層調(diào)用service的接口里的一個(gè)方法
實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)該方法
方法如下
@Override
public String sendCode(String phone, HttpSession session) {
//這里手機(jī)號(hào)碼為空則報(bào)空指針,判斷不嚴(yán)謹(jǐn)
if (StringUtils.hasText(phone) && RegexUtil.isMobile(phone)) {
//生成驗(yàn)證碼
String yzmCode = RandomUtil.randomNumbers(6);
//保存驗(yàn)證碼到session
session.setAttribute("yzmCode", yzmCode);
System.out.println("發(fā)送短信驗(yàn)證碼成功" + yzmCode);
return "發(fā)送短信驗(yàn)證碼成功!驗(yàn)證碼是:" + yzmCode;
} else {
return "手機(jī)號(hào)格式錯(cuò)誤";
}
}1.首先判斷手機(jī)號(hào)的格式
2.如果手機(jī)號(hào)格式不為空,且手機(jī)號(hào)格式正確
通過(guò)隨機(jī)生成驗(yàn)證碼,這里只是簡(jiǎn)單的模擬短信驗(yàn)證碼,真正的實(shí)現(xiàn)這里可以調(diào)用相關(guān)的方法
3.將驗(yàn)證碼保存到session中
4.在控制臺(tái)輸出該驗(yàn)證碼
一個(gè)是注冊(cè)接口
@Override
public String register(User user, HttpSession session) {
//判斷輸入手機(jī)號(hào)的格式
if (StringUtils.hasText(user.getPhone()) && RegexUtil.isMobile(user.getPhone())) {
//從session拿出緩存的驗(yàn)證碼
Object cacheCode = session.getAttribute("yzmCode");
String code = user.getCode();
if (cacheCode == null || !cacheCode.equals(code)) {
return "html/register";
}
//3.根據(jù)手機(jī)號(hào)查詢用戶
User user1 = query().eq("phone", user.getPhone()).one();
if (user1 == null) {
userMapper.insert(user);
return "html/login";
}
return "html/register";
}
return "html/register";
}
}
1.判斷手機(jī)號(hào)格式
2.判斷輸入的驗(yàn)證碼和session保存的驗(yàn)證碼是否相等
3.根據(jù)手機(jī)號(hào)查詢?cè)撚脩羰欠翊嬖?/p>
User user1 = query().eq("phone", user.getPhone()).one();到此這篇關(guān)于springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能的文章就介紹到這了,更多相關(guān)springboot session模擬短信注冊(cè) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java注解如何基于Redission實(shí)現(xiàn)分布式鎖
這篇文章主要介紹了Java注解如何基于Redission實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
解讀@ResponseBody與@RequestBody注解的用法
這篇文章主要介紹了Spring MVC中的@ResponseBody和@RequestBody注解的用法,@ResponseBody注解用于將Controller方法的返回對(duì)象轉(zhuǎn)換為指定格式(如JSON)并通過(guò)Response響應(yīng)給客戶端,@RequestBody注解用于讀取HTTP請(qǐng)求的內(nèi)容2024-11-11
Nacos服務(wù)注冊(cè)客戶端服務(wù)端原理分析
這篇文章主要為大家介紹了Nacos服務(wù)注冊(cè)客戶端服務(wù)端原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java使用訪問(wèn)者模式解決公司層級(jí)結(jié)構(gòu)圖問(wèn)題詳解
這篇文章主要介紹了Java使用訪問(wèn)者模式解決公司層級(jí)結(jié)構(gòu)圖問(wèn)題,結(jié)合實(shí)例形式分析了訪問(wèn)者模式的概念、原理及Java使用訪問(wèn)者模式解決公司曾經(jīng)結(jié)構(gòu)圖問(wèn)題的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-04-04
Java實(shí)現(xiàn)簡(jiǎn)單的迷宮游戲詳解
迷宮游戲作為經(jīng)典的小游戲,一直深受大家的喜愛(ài)。本文小編將為大家詳細(xì)介紹一下如何用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的迷宮小游戲,感興趣的可以動(dòng)手試一試2022-02-02
基于Spring Mvc實(shí)現(xiàn)的Excel文件上傳下載示例
本篇文章主要介紹了基于Spring Mvc實(shí)現(xiàn)的Excel文件上傳下載示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
SpringBoot+Prometheus+Grafana實(shí)現(xiàn)應(yīng)用監(jiān)控和報(bào)警的詳細(xì)步驟
這篇文章主要介紹了SpringBoot+Prometheus+Grafana實(shí)現(xiàn)應(yīng)用監(jiān)控和報(bào)警的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Windows和macOS系統(tǒng)下Java21環(huán)境配置全流程
在日常開(kāi)發(fā)工作中,合適的開(kāi)發(fā)環(huán)境是提升效率的重要前提,這篇文章主要介紹了Windows和macOS系統(tǒng)下Java21環(huán)境配置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03

