Reggie外卖项目 —— 移动端小程序之手机验证码登录

这篇具有很好参考价值的文章主要介绍了Reggie外卖项目 —— 移动端小程序之手机验证码登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

23、手机验证码登录

23.1、需求分析

1、为了方便用户登录,移动端通常都会提供通过手机验证码登录的功能。

2、手机验证码登录的优点:

  • 方便快捷,无需注册,直接登录
  • 使用短信验证码作为登录凭证,无需记忆密码
  • 安全

3、登录流程:

输入手机号码>获取验证码>输入验证码>点击登录>登录成功

注意:通过手机验证码登录,手机号是区分不同用户的标识。

23.2、数据模型

通过手机验证码登录时,涉及的表为user表,即用户表。结构如下:

Reggie外卖项目 —— 移动端小程序之手机验证码登录

23.3、代码开发

23.3.1、梳理交互过程

在开发代码之前,需要梳理一下登录时前端页面和服务端的交互过程:

1、在登录页面(front/page/login.html)输入手机号,点击【获取验证码】按钮,页面发送ajax请求,在服务端调用短信服务API给指定的手机号发送验证码短信。

2、在登录页面输入验证码,点击【登录】按钮,发送ajax请求,在服务端处理登录请求

开发手机验证码登录功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。

23.3.2、准备工作

在开发业务功能前,先将需要用到的类和接口基本结构创建好:

  • 实体类User

    /**
     * 用户信息
     */
    @Data
    public class User implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        //姓名
        private String name;
    
        //手机号
        private String phone;
    
        //性别 0 女 1 男
        private String sex;
    
        //身份证号
        private String idNumber;
    
        //头像
        private String avatar;
    
        //状态 0:禁用,1:正常
        private Integer status;
    }
    
  • Mapper接口UserMapper

    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
    
  • 业务层接口Userservice

    public interface UserService extends IService<User> {
    }
    
  • 业务层实现类UserServiceImpl

    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    }
    
  • 控制层UserController

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
    
        @Autowired
        private UserService userService;
    }
    
  • 工具类SMSUtilsvalidateCodeUtils

    SMSUtils.java

    /**
     * 短信发送工具类
     */
    public class SMSUtils {
    
       /**
        * 发送短信
        * @param signName 签名
        * @param templateCode 模板
        * @param phoneNumbers 手机号
        * @param param 参数
        */
       public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
          DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
          IAcsClient client = new DefaultAcsClient(profile);
    
          SendSmsRequest request = new SendSmsRequest();
          request.setSysRegionId("cn-hangzhou");
          request.setPhoneNumbers(phoneNumbers);
          request.setSignName(signName);
          request.setTemplateCode(templateCode);
          request.setTemplateParam("{\"code\":\""+param+"\"}");
          try {
             SendSmsResponse response = client.getAcsResponse(request);
             System.out.println("短信发送成功");
          }catch (ClientException e) {
             e.printStackTrace();
          }
       }
    
    }
    

    validateCodeUtils.java

    /**
     * 随机生成验证码工具类
     */
    public class ValidateCodeUtils {
        /**
         * 随机生成验证码
         * @param length 长度为4位或者6位
         * @return
         */
        public static Integer generateValidateCode(int length){
            Integer code =null;
            if(length == 4){
                code = new Random().nextInt(9999);//生成随机数,最大为9999
                if(code < 1000){
                    code = code + 1000;//保证随机数为4位数字
                }
            }else if(length == 6){
                code = new Random().nextInt(999999);//生成随机数,最大为999999
                if(code < 100000){
                    code = code + 100000;//保证随机数为6位数字
                }
            }else{
                throw new RuntimeException("只能生成4位或6位数字验证码");
            }
            return code;
        }
    
        /**
         * 随机生成指定长度字符串验证码
         * @param length 长度
         * @return
         */
        public static String generateValidateCode4String(int length){
            Random rdm = new Random();
            String hash1 = Integer.toHexString(rdm.nextInt());
            String capstr = hash1.substring(0, length);
            return capstr;
        }
    }
    

23.3.3、修改LoginCheckFilter

1、前面我们已经完成了LoginCheckFilter过滤器的开发,此过滤器用于检查用户的登录状态。我们在进行手机验证码登录时,发送的请求需要在此过滤器处理时直接放行。

//定义不需要处理的请求路径
String[] urls = new String[]{
        "/employee/login",
        "/employee/logout",
        "/backend/**",
        "/front/**",
        "/common/**",
        "/user/sendMsg",//移动端发送短信
        "/user/login" //移动端登录
};

2、在LoginCheckFilter过滤器中扩展逻辑,判断移动端用户登录状态:

//4-2、判断登录状态,如果已登录,则直接放行
if (request.getSession().getAttribute("user") != null) {
    log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("user"));

    Long userId = (Long) request.getSession().getAttribute("user");
    BaseContext.setCurrentId(userId);

    filterChain.doFilter(request, response);
    return;
}

23.4、功能测试

23.4.1、发送手机验证码

1、前端开发

Reggie外卖项目 —— 移动端小程序之手机验证码登录

2、Controller开发文章来源地址https://www.toymoban.com/news/detail-488781.html

/**
 * 发送手机验证码
 * @param user
 * @return
 */
@PostMapping("/sendMsg")
public R<String> sendMsg(@RequestBody User user, HttpSession session) {
    //获取手机号
    String phone = user.getPhone();

    if (StringUtils.isNotEmpty(phone)) {
        //生成随机的4位验证码
        String code = ValidateCodeUtils.generateValidateCode(4).toString();
        log.info("code={}", code);

        //调用阿里云提供的短信服务API完成发送短信
        //SMSUtils.sendMessage("瑞吉外卖", "", phone, code);

        //需要将生成的验证码保存到Session
        session.setAttribute(phone, code);
        return R.success("手机验证码短信发送成功");
    }
    return R.error("手机验证码短信发送失败");

}

23.4.2、移动端登录

1、前端开发

Reggie外卖项目 —— 移动端小程序之手机验证码登录

2、Controller开发

/**
 * 移动端用户登录
 * @param map
 * @param session
 * @return
 */
@PostMapping("/login")
public R<User> login(@RequestBody Map map, HttpSession session) {
    log.info(map.toString());
    //获取手机号
    String phone = map.get("phone").toString();

    //获取验证码
    String code = map.get("code").toString();

    //从Session获取保存的验证码
    String codeInSession = session.getAttribute(phone).toString();

    //进行验证码的比对(页面提交的验证码和Session中保存的验证码比对)
    if (codeInSession != null && codeInSession.equals(code)) {
        //如果比对成功,说明登录成功
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getPhone, phone);

        User user = userService.getOne(queryWrapper);
        if (user == null) {
            //判断当前手机号对应的用户是否为新用户,如果是新用户就自动完成注册
            user = new User();
            user.setPhone(phone);
            user.setStatus(1);
            userService.save(user);
        }
        session.setAttribute("user",user);
        return R.success(user);
    }

    return R.error("登录失败");
}

到了这里,关于Reggie外卖项目 —— 移动端小程序之手机验证码登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jQuery源码,想让两个jQuery库并存 怎么做?,来看看移动端小程序技术的前世今生

    jQuery源码,想让两个jQuery库并存 怎么做? $ = jQuery 1.11.3 ; //先引入1.11.3 版本 $ = jQuery 3.4.1 ; //然后引入3.4.1 版本 内部处理 var _jQuery = window.jQuery; jQuery1.11.3 _$ = window.$ ; jQuery1.11.3 window.jQuery = window.$ = jQuery; jQuery3.4.1 let j = $.noConflict(true); if (window.$ === jQuery) { //如果 $ 和 jQuery 相同

    2024年04月09日
    浏览(53)
  • reggie优化01-缓存短信验证码和菜品数据

    在config包下,创建Redis配置类RedisConfig: 纳入Git管理: 之前的短信验证码存放在session中,是存在一定的时间有效期,现在要将短信验证码存放到Redis中。 1、注入RedisTemplate对象: 2、在sendMsg方法中,将生成的验证码缓存到Redis中,并且设置有效期为5分钟: 其中:redisTemplate.

    2024年02月16日
    浏览(38)
  • 外卖项目,登录设计,nginx反向代理,MD5明文加密

    .gitignore文件里的东西是进行排除,不用git进行管理。 登录设计, controller 接收并封装参数 调用service方法查询数据库 封装结果并响应 登录成功后,生成jwt令牌 Service层 调用mapper查询数据库 密码比对 返回结果 Mapper 编写sql语句 为什么前端不能直接发请求,请求tomcat服务器,

    2024年02月14日
    浏览(44)
  • SpringBoot——短信发送、手机验证码登录

    目录 一、短信发送 1.1 阿里云短信服务 1.1.1 设置短信签名 1.1.2 模板管理 1.1.3 设置AccessKey 1.2 短信发送——代码开发 1.2.1 导入maven坐标 1.2.2 调用API 1.2  手机验证码登录 1.2.1 用户数据库表 1.2.2  修改过滤器 1.2.3   随机生成验证码的工具类 1.2.4 手机验证码登录-- 发送验证码

    2023年04月22日
    浏览(42)
  • 【账号系统之(手机验证码登录)】使用阿里云短信服务,实现服务商给手机发送验证码功能。

    目录 一、前言 二、前期准备 三、购买短信服务 四、申请签名和模板 (1) 进入阿里云短信服务控制台 (2) 添加签名 (3) 添加模板 五、RAM申请及权限配置 (1) 进入RAM访问控制界面 (2) 创建用户 (3) 分配权限 (4) 创建角色 (5) 记录段的值 六、阿里云.NET SDK身份验证接入 (1) 了解

    2024年02月04日
    浏览(52)
  • 在 Spring Security 中定义多种登录方式,比如邮箱、手机验证码登录

    现在各大网站登录的方式是越来越多。比如:传统的用户名密码登录、快捷的邮箱、手机验证码登录,还有流行的第三方登录。那本篇呢,就给大家带来如何在 Spring Security 中定义使用邮箱验证码登录方式。看完本篇,让你学会自定义认证方式,如果公司还需要使用手机验证

    2024年02月11日
    浏览(42)
  • 移动端利用 input 标签调用手机摄像头拍照,实现人脸验证的功能

    近期在做项目时,有一个需求需要实现人脸识别功能,该功能的底层原理就是利用手机的拍照功能,获取用户的人脸图片,然后调用公安部的图像库进行逐一比对。实现这个功能只需要两步,第一步就是获取用户人脸图片;第二步就是将图片传给后端进行人脸比对。由于现在

    2024年02月16日
    浏览(41)
  • 【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)

    目录 效果图: 一、template部分 二、style样式 三、script部分 1.先对手机号的格式进行一个判断 2.接下来就是表单验证规则rules 3.最后就是methods了 (1)首先我们给获取验证码绑定一个方法 (2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样) (3)然

    2024年02月17日
    浏览(50)
  • 2022.9.17 vue、element-ui实现登录获取手机验证码,进行手机号校验、验证码CD60秒

    1、直接点击,不为空校验 2、输入手机号格式不正确时 3、获取完验证码进行读秒 三、vue 1、进行手机号校验关键在对单个手机号输入框进行校验,需要使用到validateField对部分表单字段进行校验,valid是校验完的提示信息,当valid为空时代表校验成功 2、读秒和设置禁用,在校

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包