【功能栏】基于session的模拟短信注册功能

news2024/11/16 19:32:00

框架: spring boot   mybatis-plus    

目录

1.创建user表

​编辑2. mybatis-plus插件

3.导入相关依赖

4.配置文件

 5.前端代码

register.html

style.css

6.后端代码

entity层

mapper层

 sevice层

业务层接口

业务层实现类

controller层

7.调试

1. 未输入手机号的时候,直接点击获取验证码按钮

2.输入手机号,但是格式错误

3.输入手机号,并且格式正确

4.调试的时候验证码错误或者手机重复注册都是还在注册页面

8.代码解析


1.创建user表

注意:  phone这个字段设置的时候最好大于11位

2. mybatis-plus插件

安装了mybatis-plus插件后,可以根据数据库生成代码 

首先连接数据库

然后

 

3.导入相关依赖

muybatis-plus依赖
<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"/>
</head>
<body>
<div class="control">
    <div class="item">
        <div class="active">注册</div>
    </div>
    <div class="content">
        <div style="display: block;">
            <form action="/user/register" method="post">
                <p>请输入手机号</p>
                <input type="tel" placeholder="请输入手机号" name="phone" id="phone"/>

                <input type="text" placeholder="请输入验证码" name="code"/>


                <button type="button">获取验证码</button>

                <p>请输入密码</p>
                <input type="password" placeholder="请输入密码" name="password"/>
                <br/>
                <input type="submit" value="注册"/>
            </form>
            <p>已注册,<a href="/user/login" target="top">去登录</a></p>
        </div>
    </div>
</div>


<script>
    var btn = document.querySelector('button');
    var phoneDom = document.getElementById("phone")
    // 全局变量,定义剩下的秒数
    var time = 59;
    // 注册单击事件  X     这里是获取验证码按钮事件
    btn.addEventListener('click', function () {

        // btn.send('post',"/user/code")
        //判断手机号为空
        if (phoneDom.value !== null && phoneDom.value !== '') {

            //发送请求,生成二维码
            let xhr = new XMLHttpRequest();
            // methods:GET/POST请求方式等,url:请求地址,true异步(可为false同步)
            xhr.open("GET", "/user/code?phone=" + phoneDom.value, true);
            xhr.send();                                            // 发送
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {   // 成功,接收到数据
                    console.log(xhr.response);                 // 查看返回的数据(可输出 xhr 哈)
                    // 禁用按钮
                    btn.disabled = true;
                    // 开启定时器
                    var timer = setInterval(function () {
                        // 判断剩余秒数
                        if (time == 0) {
                            // 清除定时器和复原按钮
                            clearInterval(timer);
                            btn.disabled = false;
                            btn.innerHTML = '获取验证码';
                        } else {
                            btn.innerHTML = time + '秒';
                            time--;
                        }
                    }, 1000);

                } else if (xhr.status == 404) {
                    // 失败,页面未找到

                }
            }
        } else {
            alert("请输入手机号!")
        }
    });
</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层

业务层接口

public interface IUserService extends IService<User> {



    String register(User user, HttpSession session);

    String sendCode(String phone, HttpSession session);
}

业务层实现类

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {


    @Autowired
    private UserMapper userMapper;


    @Override
    public String sendCode(String phone, HttpSession session) {
        //这里手机号码为空则报空指针,判断不严谨
        if (StringUtils.hasText(phone) && RegexUtil.isMobile(phone)) {
            //生成验证码
            String yzmCode = RandomUtil.randomNumbers(6);

            //保存验证码到session
            session.setAttribute("yzmCode", yzmCode);

            System.out.println("发送短信验证码成功" + yzmCode);
            return "发送短信验证码成功!验证码是:" + yzmCode;
        } else {
            return "手机号格式错误";
        }
    }


    @Override
    public String register(User user, HttpSession session) {
        //判断输入手机号的格式
        if (StringUtils.hasText(user.getPhone()) && RegexUtil.isMobile(user.getPhone())) {
            //从session拿出缓存的验证码
            Object cacheCode = session.getAttribute("yzmCode");
            String code = user.getCode();
            if (cacheCode == null || !cacheCode.equals(code)) {
                return "html/register";
            }
            //3.根据手机号查询用户
            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);
    }
}

工具类(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}$"); // 验证手机号
        m = p.matcher(str);
        b = m.matches();
        return b;
    }
}

 

7.调试

前端页面

1. 未输入手机号的时候,直接点击获取验证码按钮

2.输入手机号,但是格式错误

3.输入手机号,并且格式正确

 

验证码是模拟生成的

 String yzmCode = RandomUtil.randomNumbers(6);

4.调试的时候验证码错误或者手机重复注册都是还在注册页面

8.代码解析

实体类

实体类的属性对应数据user表字段

控制层主要写了两个接口

一个是发送验证码接口,当我们点击前端页面获取验证码按钮的时候,这个接口响应

获取验证码事件

这里主要使用了ajax技术

<script>
    var btn = document.querySelector('button');
    var phoneDom = document.getElementById("phone")
    // 全局变量,定义剩下的秒数
    var time = 59;
    // 注册单击事件  X     这里是获取验证码按钮事件
    btn.addEventListener('click', function () {

        // btn.send('post',"/user/code")
        //判断手机号为空
        if (phoneDom.value !== null && phoneDom.value !== '') {

            //发送请求,生成验证码
            let xhr = new XMLHttpRequest();
            // methods:GET/POST请求方式等,url:请求地址,true异步(可为false同步)
            xhr.open("GET", "/user/code?phone=" + phoneDom.value, true);
            xhr.send();                                            // 发送
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {   // 成功,接收到数据
                    console.log(xhr.response);                 // 查看返回的数据(可输出 xhr 哈)
                    // 禁用按钮
                    btn.disabled = true;
                    // 开启定时器
                    var timer = setInterval(function () {
                        // 判断剩余秒数
                        if (time == 0) {
                            // 清除定时器和复原按钮
                            clearInterval(timer);
                            btn.disabled = false;
                            btn.innerHTML = '获取验证码';
                        } else {
                            btn.innerHTML = time + '秒';
                            time--;
                        }
                    }, 1000);

                } else if (xhr.status == 404) {
                    // 失败,页面未找到

                }
            }
        } else {
            alert("请输入手机号!")
        }
    });
</script>

控制层调用service的接口里的一个方法

实现类实现该方法

方法如下 

 @Override
    public String sendCode(String phone, HttpSession session) {
        //这里手机号码为空则报空指针,判断不严谨
        if (StringUtils.hasText(phone) && RegexUtil.isMobile(phone)) {
            //生成验证码
            String yzmCode = RandomUtil.randomNumbers(6);

            //保存验证码到session
            session.setAttribute("yzmCode", yzmCode);

            System.out.println("发送短信验证码成功" + yzmCode);
            return "发送短信验证码成功!验证码是:" + yzmCode;
        } else {
            return "手机号格式错误";
        }
    }

1.首先判断手机号的格式

2.如果手机号格式不为空,且手机号格式正确

通过随机生成验证码,这里只是简单的模拟短信验证码,真正的实现这里可以调用相关的方法

3.将验证码保存到session中

4.在控制台输出该验证码

一个是注册接口

  @Override
    public String register(User user, HttpSession session) {
        //判断输入手机号的格式
        if (StringUtils.hasText(user.getPhone()) && RegexUtil.isMobile(user.getPhone())) {
            //从session拿出缓存的验证码
            Object cacheCode = session.getAttribute("yzmCode");
            String code = user.getCode();
            if (cacheCode == null || !cacheCode.equals(code)) {
                return "html/register";
            }
            //3.根据手机号查询用户
            User user1 = query().eq("phone", user.getPhone()).one();
            if (user1 == null) {
                userMapper.insert(user);
                return "html/login";
            }
         
            return "html/register";
        }
        return "html/register";
    }
}

1.判断手机号格式

2.判断输入的验证码和session保存的验证码是否相等

3.根据手机号查询该用户是否存在

  User user1 = query().eq("phone", user.getPhone()).one();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1211649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】Django——连接mysql数据库

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——连接mysql数据库 连接MySQL数据库…

免费开源客服机器人tiledesk 实现一个查询天气机器人

第一步,槽位收集: 第二步:天气api接口调用: 效果展示:

基于电力需求侧能效管理平台的建设及应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;电力是国民经济和居民生活的命脉&#xff0c;为贯彻落实国家对于节能减排工作的总体部署&#xff0c;深入推进电力需求侧管理工作、本文从电力需求侧能效管理平台所要实现的功能与应用信息技术两个方面&#x…

windows上安装make

windows上安装make 1.使用包管理工具Cygwin:&#xff08;官网&#xff1a;https://www.cygwin.com/&#xff09; 来进行安装&#xff0c;根据上述网址找到cygwin下载链接&#xff08;准确地址为&#xff1a;https://www.cygwin.com/setup-x86_64.exe&#xff09; 2.在安装程序…

开发程序员的宝藏工具/网站

博主在这里收录各式各样的工具/网站&#xff0c;都是一些能够帮助开发、提高效率的好东西 博主会不断更新&#xff0c;更加欢迎大家把自己觉得好用的分享在评论区 记得收藏起来&#xff0c;免得以后找不到了 1.文本对比 在线文本差异对比,文本比对、文本比较工具 能够将两边的…

RNA模型可以帮助发现疾病机制和候选药物

今天为大家介绍的是来自Tehmina Masud, Amit Deshwar, Shreshth Gandhi, Brendan J. Frey团队的一篇论文。精确地对RNA生物学进行建模和预测一直是一个长期存在的挑战&#xff0c;对于变异解释和定制治疗的制定具有重要的临床意义。作者提出了一个RNA生物学的基础模型&#xff…

传统的纸质设备保养方式的痛点以及解决方案

传统的纸质设备保养方式&#xff0c;在现代企业管理中面临多种痛点&#xff0c;这些问题可能影响企业的运营效率和设备维护的效果。以下是一些主要痛点&#xff1a; 信息更新缓慢和访问不便&#xff1a;纸质记录的更新通常需要手动完成&#xff0c;这不仅耗时&#xff0c;而且在…

echarts:graph图表拖拽节点

需求&#xff1a;实现一个可视化编辑器&#xff0c;用户可以添加节点&#xff0c;并对节点进行拖拽编辑等 实现期间碰到很多问题&#xff0c;特意记录下来&#xff0c;留待将来碰到这些问题的同学&#xff0c;省去些解决问题的时间 问题1&#xff1a;节点的data如下&#xff0…

excel中vlookup用法

excel中vlookup用法 用法示例 参数说明 参数1&#xff1a;E1用于匹配的字段 参数2&#xff1a;E1:F4&#xff0c;匹配表格范围 参数3&#xff1a;要取的字段属于匹配表格范围的第几列 数据4&#xff1a;精确匹配

JumpServer2023漏洞复现合集

本文主要复现JumpServer2023年出现的大批量漏洞&#xff0c;既是分享也是为了记录自己的成长&#xff0c;近期会持续更新。 1. JumpServer MongoDB远程代码执行漏洞&#xff08;CVE-2023-43651&#xff09; 1.1 漏洞级别 高危 1.2 漏洞描述 经过身份验证的用户可以利用Mon…

CV计算机视觉每日开源代码Paper with code速览-2023.11.13

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】PolyMaX: Gener…

官网下载tomcat

1、Tomcat官网地址&#xff1a; https://tomcat.apache.org/ 2、下载以及安装步骤

美颜sdk是什么?美颜sdk技术解析与比较

美颜SDK的出现为开发者提供了快速实现高质量美颜效果的工具&#xff0c;然而&#xff0c;在众多美颜SDK中&#xff0c;技术实现和效果差异巨大。本文将对美颜SDK进行技术解析&#xff0c;并进行比较&#xff0c;以帮助开发者更好地选择适合其应用需求的美颜SDK。 一、美颜SDK…

巷议:跌落尘埃与风光无限

近几来制造业的退潮是不争的事实&#xff0c;其中以老资格直辖市天津尤为突出。曾记否&#xff0c;想当年韩国的三星集团是天津最强的外企&#xff0c;但是从2015年开始便撤离了&#xff0c;给天津经济带来了重创。 而天津的汽车产业&#xff0c;也日渐变得软弱。其中那曾经小…

上门预约洗衣洗鞋系统,互联网洗鞋店小程序

干洗店预约下单小程序的功能一览&#xff0c;开发一个成功的干洗店小程序需要具备哪些功能&#xff1a; 最近我们开发了一款洗衣洗鞋工厂小程序&#xff0c;其功能强大&#xff0c;主要功能包括&#xff1a; 用户选择洗护用品&#xff0c;选择取衣方式&#xff0c;取衣方式有&a…

Postman如何发送Https请求

Postman如果想要发送Https请求&#xff0c;需要从设置中将SSL安全认证禁用

录制电脑屏幕的软件推荐,满足你的各种需求

屏幕录制是我们在现代数字世界中常常需要用到的技能。无论是为了创建教程、分享游戏经验&#xff0c;还是制作演示文稿&#xff0c;录制电脑屏幕都是一项重要的任务&#xff0c;本文将介绍三款录制电脑屏幕的软件&#xff0c;帮助用户了解并选择合适的录屏工具。 录制电脑屏幕软…

四川芸鹰蓬飞商务信息咨询有限公司是可靠的选择

随着电商行业的快速发展&#xff0c;越来越多的消费者选择通过线上平台购物。在这个大背景下&#xff0c;四川芸鹰蓬飞商务信息咨询有限公司以其独特的抖音电商服务&#xff0c;为广大消费者带来了更加便捷、安全的购物体验。 一、服务的优势 专业团队&#xff1a;公司拥有一支…

没有 SegWit 和 Taproot 的比特币序数

序号 &#xff08;Ordinals&#xff09;已成为 BTC 圈子中创建不可替代令牌&#xff08;NFT&#xff09;的热门话题。 它的主要特点是将 NFT 本身完全存储在链上。 我们表明原始的比特币协议已经可以支持它。 Ordinals 不需要任何重大更改&#xff0c;包括 SegWit 和 Taproot。…

vue+springboot实现图形验证码Kaptcha

1、前端 form使用了element-ui的组件&#xff0c;主要还是看img标签&#xff0c;src绑定了form.imgCodeUrl数据&#xff0c;点击图片时触发refreshCode更新图片验证码。 <el-form-item prop"verificationCode" label"验证码" style"text-align: l…