文章目录

  • 移动端开发_手机快速登录
  • 第一章. 需求分析
  • 第二章. 手机快速登录
  • 【路径】
  • 2.1. 前台代码
  • 2.1.1. 发送验证码
  • 2.1.2. 提交登录请求
  • 2.2. 后台代码
  • 2.2.1. Controller
  • 2.2.2. 服务接口
  • 2.2.3. 服务实现类
  • 2.2.4. Dao接口
  • 2.2.5. Mapper映射文件

移动端开发_手机快速登录

第一章. 需求分析

手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完成登录,是目前比较流行的登录方式。

第二章. 手机快速登录

【路径】

(1)发送验证码

  1. 获得用户输入的手机号码
  2. 生成动态验证码(4或者6位)
  3. 使用阿里云发送短信验证码
  4. 把验证码存到redis(存5分钟)
    (2)登录
  5. 获得用户输入的信息(Map)
  6. 取出redis里面的验证码和用户输入的验证码进行校验
  7. 如果校验通过
    • 判断是否是会员, 不是会员, 自动注册为会员
    • 保存用户的登录状态( CAS(Central Authentication Service)或者自己手动签发token ,我们这里可以使用Cookie存储用户信息)

2.1. 前台代码

登录页面为/pages/login.html

2.1.1. 发送验证码

(1)为获取验证码按钮绑定事件,并在事件对应的处理函数中校验手机号,如果手机号输入正确则显示30秒倒计时效果并发送ajax请求,发送短信验证码

<div class="input-row"><label>手机号</label><div class="loginInput"><input v-model="loginInfo.telephone" id='account' type="text" placeholder="请输入手机号"><input id="validateCodeButton" @click="sendValidateCode()" type="button" style="font-size: 12px" value="获取验证码"></div>
</div>

(2)调用sendValidateCode()方法

//发送验证码
sendValidateCode(){var telephone = this.loginInfo.telephone;if (!checkTelephone(telephone)) {this.$message.error('请输入正确的手机号');return false;}validateCodeButton = $("#validateCodeButton")[0];clock = window.setInterval(doLoop, 1000); //一秒执行一次axios.post("/validateCode/send4Login.do?telephone=" + telephone).then((response) => {if(!response.data.flag){//验证码发送失败this.$message.error('验证码发送失败,请检查手机号输入是否正确');}});
},

(3)在 ValidateCodeController 中提供 send4Login方法,调用短信服务发送验证码并将验证码保存到redis
注意:存放到redis的可以值:手机号+002(RedisMessageConstant.SENDTYPE_LOGIN)

package com.atguigu.controller;import com.atguigu.constant.MessageConstant;
import com.atguigu.constant.RedisConstant;
import com.atguigu.constant.RedisMessageConstant;
import com.atguigu.entity.Result;
import com.atguigu.utils.SMSUtils;
import com.atguigu.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;@RestController
@RequestMapping("/validateCode")
public class ValidateCodeController {@Autowiredprivate JedisPool jedisPool;//手机快速登录时发送手机验证码@RequestMapping("/send4Login")public Result send4Login(String telephone){Integer code = ValidateCodeUtils.generateValidateCode(4);//生成4位数字验证码try {//发送短信SMSUtils.sendShortMessage(telephone,code.toString());} catch (ClientException e) {e.printStackTrace();//验证码发送失败return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);}System.out.println("发送的手机验证码为:" + code);//将生成的验证码缓存到redisjedisPool.getResource().setex(telephone+RedisMessageConstant.SENDTYPE_LOGIN,5 * 60,code.toString());//验证码发送成功return new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);}

2.1.2. 提交登录请求

(1)为登录按钮绑定事件

<div class="btn yes-btn"><a @click="login()" href="#">登录</a></div>

(2)点击登录,login方法:

//登录
login(){var telephone = this.loginInfo.telephone;if (!checkTelephone(telephone)) {this.$message.error('请输入正确的手机号');return false;}axios.post("/login/check.do",this.loginInfo).then((response) => {if(response.data.flag){//登录成功,跳转到index.htmlwindow.location.href="index.html";}else{//失败,提示失败信息this.$message.error(response.data.message);}});
}

2.2. 后台代码

2.2.1. Controller

在meinian_mobile_web工程中创建LoginController并提供check方法进行登录检查,处理逻辑为:
【路径】
1、校验用户输入的短信验证码是否正确,如果验证码错误则登录失败
2、如果验证码正确,则判断当前用户是否为会员,如果不是会员则自动完成会员注册
3、向客户端写入Cookie,内容为用户手机号

package com.atguigu.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.constant.MessageConstant;
import com.atguigu.constant.RedisMessageConstant;
import com.atguigu.entity.Result;
import com.atguigu.pojo.Member;
import com.atguigu.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;/*** 用户登录*/
@RestController
@RequestMapping("/login")
public class LoginController {@Referenceprivate MemberService memberService;@Autowiredprivate JedisPool jedisPool;//使用手机号和验证码登录@RequestMapping("/check")public Result check(HttpServletResponse response, @RequestBody Map map){String telephone = (String) map.get("telephone");String validateCode = (String) map.get("validateCode");//1:从Redis中获取缓存的验证码,判断验证码输入是否正确String codeInRedis = jedisPool.getResource().get(telephone + RedisMessageConstant.SENDTYPE_LOGIN);if(codeInRedis == null || !codeInRedis.equals(validateCode)){//验证码输入错误return new Result(false, MessageConstant.VALIDATECODE_ERROR);}else{//验证码输入正确//2:判断当前用户是否为会员Member member = memberService.findByTelephone(telephone);if(member == null){//当前用户不是会员,自动完成注册member = new Member();member.setPhoneNumber(telephone);member.setRegTime(new Date());memberService.add(member);}//3::登录成功//写入Cookie,跟踪用户Cookie cookie = new Cookie("login_member_telephone",telephone);cookie.setPath("/");//路径cookie.setMaxAge(60*60*24*30);//有效期30天(单位秒)response.addCookie(cookie);return new Result(true,MessageConstant.LOGIN_SUCCESS);}}
}

2.2.2. 服务接口

在MemberService服务接口中提供findByTelephone和add方法

package com.atguigu.service;
import com.atguigu.pojo.Member;
public interface MemberService {Member findByTelephone(String telephone);void add(Member member);
}

2.2.3. 服务实现类

在 MemberServiceImpl 服务实现类中实现 findByTelephone 和 add 方法
【路径】
1:使用手机号查询会员
2:新增会员

package com.atguigu.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.dao.MemberDao;
import com.atguigu.pojo.Member;
import com.atguigu.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;@Service(interfaceClass = MemberService.class)
@Transactional
public class MemberServiceImpl implements MemberService {@Autowiredprivate MemberDao memberDao;public Member findByTelephone(String telephone) {return memberDao.findByTelephone(telephone);}public void add(Member member) {if(member.getPassword() != null){member.setPassword(MD5Utils.md5(member.getPassword()));}memberDao.add(member);}
}

导入MD5Utils.java

2.2.4. Dao接口

在 MemberDao接口中声明findByTelephone和add方法

public void add(Member member);
public Member findByTelephone(String telephone);

2.2.5. Mapper映射文件

在 MemberDao.xml 映射文件中定义SQL语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.dao.MemberDao"><!--新增会员--><insert id="add" parameterType="member"><selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">SELECT LAST_INSERT_ID()</selectKey>insert into t_member(fileNumber,name,sex,idCard,phoneNumber,regTime,password,email,birthday,remark)values(#{fileNumber},#{name},#{sex},#{idCard},#{phoneNumber},#{regTime},#{password},#{email},#{birthday},#{remark})</insert><!--根据手机号查询会员--><select id="findByTelephone" parameterType="string" resultType="member">select * from t_member where phoneNumber = #{phoneNumber}</select>
</mapper>

登录:http://localhost/pages/login.html

登录成功之后可以查看浏览器Cookie是否写入成功。


登录成功

移动端开发_手机快速登录相关推荐

  1. 传智健康_第9章 移动端开发-手机快速登录、权限控制

    传智健康_第9章 移动端开发-手机快速登录.权限控制 文章目录 传智健康_第9章 移动端开发-手机快速登录.权限控制 1. 需求分析 2. 手机快速登录 2.1 页面调整 2.1.1 发送验证码 2. ...

  2. 学习【瑞吉外卖⑥】SpringBoot单体项目_手机验证码登录业务开发

    视频:[黑马程序员]Java 项目实战<瑞吉外卖>,轻松掌握 SpringBoot + MybatisPlus 开发核心技术 资料:2022 最新版 Java学习 路线图>第 5 阶 ...

  3. java 微博不出现授权_新浪微博快速登录,为什么出现了授权页面,点击授权但是却没有获取用户信息呢?...

    从别人那里接手一个H5的项目,项目主要使用 gulp (nodejs),基于 zepto , canjs 做为主要框架, 进行路由.模板渲染和数据绑定, reqiuriejs 作为 js 加载器. 在 ...

  4. .net移动端开发_移动端开发1(前端一)

    Day14 1.视口:浏览器显示内容的屏幕区域 < meta name="viewport"//视图标签 content="width"//设备宽度 in ...

  5. java移动端开发_移动端开发

    1.移动端视口问题 视口是指浏览器的可视区域,移动端的视口到底是多宽呢? 现在市面上的大部分手机,比如iphone X,它的默认视口宽度为980px,而一个iphone X的屏幕宽度仅仅为375px. ...

  6. Revit二次开发_轴网快速标注

    通过Revit二次开发实现对平行轴网的快速标注.交互操作是框选轴网->点选尺寸标注出现的位置->生成两道尺寸标注. 要达到设想的结果一些地方需要特殊考虑: 框选操作容易误选轴网,起码要把与 ...

  7. 美年_移动端开发_权限控制_Spring Security入门与进阶

    文章目录 第三章权限控制 3.1. 认证和授权概念 3.2. 权限模块数据模型 3.3 RBAC权限模型扩展: [小结] 3.3. Spring Security简介 [讲解] [小结] 3.4. S ...

  8. Linux开发_反编译开发_破解简单登录程序外加缓冲区溢出攻击

    缓冲区溢出攻击即破坏指定buff的缓冲区大小,使其溢出到别的空间上去,破坏堆栈. 比如有如下代码: #include <stdio.h> #include <string.h> ...

  9. 阅文java服务端开发_阅文笔试复盘

    本文记录2020-05-19的阅文Java方向笔试复盘,有些题目不是很记得了,把自己记得的写一下吧. 单选题 多播的IP地址是哪一类? 说实话这个题一开始我也懵逼,虽然自己有点记忆但是不是很敢选,后来 ...

最新文章

  1. Balanced Binary Tree leetcode java
  2. xampp访问php显示空白,运行PHP项目显示空白
  3. 【Spring注解】@Condition条件注册
  4. 删除 多个表_合并汇总多个工作簿多个工作表,删除修改新增更新内容只需刷新...
  5. php implicit_flush,php – ob_implicit_flush(),flush(),ob_flush() – 不在远程服务器上工作...
  6. 《System语言详解》——5. 语言元素
  7. 计算机网络-3-局域网数据链路层原理与技术
  8. 基于数据挖掘技术的客户关系管理系统设计与实现
  9. 第三方平台可以通过微信公众平台素材管理接口实现同步了
  10. Lattice FPGA 使用指南4 - 全局复位网络GSR的使用
  11. 5855. 找出数组中的第 K 大整数
  12. autoit入门小教程_入门介绍
  13. Mac删除OBS的虚拟摄像头
  14. 游戏2:HTML5制作网页游戏看看你有多色--createjs
  15. 用Excel地图可视化——2017世界各国和地区GDP排名(初步统计版)
  16. linux log4cxx 静态库,log4cxx的个人实践
  17. Linux芯片级移植与底层驱动(基于3.7.4内核) --SMP多核启动以及CPU热插拔驱动
  18. ajax的响应与取消响应
  19. SpringBoot搭建微信公众号后台(一):消息接收与响应
  20. 【离散数学】第一章 —— 基础:逻辑和证明

热门文章

  1. Django做一个简单的博客系统(14)----增加文章标签
  2. 笔记本计算机怎么调出来,笔记本电脑如何恢复出厂设置【方法介绍】
  3. 关注流动儿童心理健康,这场亲子营游学活动很“有爱”
  4. PlantSimulation中4中移动对象的方法对比
  5. html的网页效果不一样,新人问:html中不同尺寸的显示器,显示的效果不一样,怎么解决?_html/css_WEB-ITnose...
  6. 医疗机器人在AI领域的广泛应用
  7. 云计算与大数据-虚拟化与容器技术题库
  8. oracle中的数据类型
  9. 结构体初始化的几种方式
  10. 计算机表格定义,怎么进行报表定义