一、前言

1、动态获取图片验证码

2、实现手机验证码登录(工具准备)

3、手机验证码登录(后台实现)

3、前台实现

二、主要内容

1、动态获取图片验证码

(1)请求的接口如下,返回的是一张svg的图片

## 获取一次性验证码### 请求URL:http://localhost:3000/captcha

### 请求方式:

(2)初次显示图片,可以直接在image中的src中请求路径直接得到

 <!--第一次显示直接请求http://localhost:4000下面的-->
<!--点击图片的时候要更新图片,注册一个点击事件-->
<input type="text" maxlength="11" placeholder="验证码" v-model="captche">
<img class="get_verification" src="http://localhost:4000/captcha" alt="captcha" @click='getCaptcha'>

(3)点击图片的时候更新,methods中调用方法

 //获取图片验证码
      getCaptcha(event){console.log(this) console.log(event.target)event.target.src="http://localhost:4000/captcha?Time="+Date.now()}

 2、实现手机验证码登录(工具准备)

(1)这里用到“容联通信云”:https://www.yuntongxun.com注册登录好之后,每个人都有不同的id号

(2)然后选择你要的验证类型

(3)你需要添加一个测试号码来接收验证短信

(4)接下来就可以根据官方文档写代码了

3、手机验证码登录(后台实现)

(1)后台项目结构如图所示

(2)发送shengchen

var md5 = require('blueimp-md5')
var moment = require('moment')
var Base64 = require('js-base64').Base64;
var request = require('request');/*生成指定长度的随机数*/
function randomCode(length) {var chars = ['0','1','2','3','4','5','6','7','8','9'];var result = ""; //统一改名: alt + shift + Rfor(var i = 0; i < length ; i ++) {var index = Math.ceil(Math.random()*9);result += chars[index];}return result;
}
// console.log(randomCode(6));
exports.randomCode = randomCode;/*
向指定号码发送指定验证码*/
function sendCode(phone, code, callback) {var ACCOUNT_SID = '8a216da86a960fd9016a96d0eb580180';var AUTH_TOKEN = '3abf248c565446d0bf10d46eb62dee07';var Rest_URL = 'https://app.cloopen.com:8883';var AppID = '8a216da86a960fd9016a96d0eba80186';//1. 准备请求url/*1.使用MD5加密(账户Id + 账户授权令牌 + 时间戳)。其中账户Id和账户授权令牌根据url的验证级别对应主账户。时间戳是当前系统时间,格式"yyyyMMddHHmmss"。时间戳有效时间为24小时,如:201404161420302.SigParameter参数需要大写,如不能写成sig=abcdefg而应该写成sig=ABCDEFG*/var sigParameter = '';var time = moment().format('YYYYMMDDHHmmss');sigParameter = md5(ACCOUNT_SID+AUTH_TOKEN+time);var url = Rest_URL+'/2013-12-26/Accounts/'+ACCOUNT_SID+'/SMS/TemplateSMS?sig='+sigParameter;//2. 准备请求体var body = {to : phone,appId : AppID,templateId : '1',"datas":[code,"1"]}//body = JSON.stringify(body);//3. 准备请求头/*1.使用Base64编码(账户Id + 冒号 + 时间戳)其中账户Id根据url的验证级别对应主账户2.冒号为英文冒号3.时间戳是当前系统时间,格式"yyyyMMddHHmmss",需与SigParameter中时间戳相同。*/var authorization = ACCOUNT_SID + ':' + time;authorization = Base64.encode(authorization);var headers = {'Accept' :'application/json','Content-Type' :'application/json;charset=utf-8','Content-Length': JSON.stringify(body).length+'','Authorization' : authorization}//4. 发送请求, 并得到返回的结果, 调用callback// callback(true);
    request({method : 'POST',url : url,headers : headers,body : body,json : true}, function (error, response, body) {console.log(error, response, body);callback(body.statusCode==='000000');// callback(true);
    });
}
exports.sendCode = sendCode;/*调用方式
sendCode('13716**2779', randomCode(6), function (success) {console.log(success);
})*/

(2)在index.js中调用

var express = require('express');
var router = express.Router();
const md5 = require('blueimp-md5')
const models = require('../db/models')
const UserModel = models.getModel('user')
const _filter = {'pwd': 0, '__v': 0} // 查询时过滤掉
const sms_util = require('../util/sms_util')
const users = {}
const ajax = require('../api/ajax')
var svgCaptcha = require('svg-captcha')/*
发送验证码短信
*/
router.get('/sendcode', function (req, res, next) {//1. 获取请求参数数据var phone = req.query.phone;//2. 处理数据//生成验证码(6位随机数)var code = sms_util.randomCode(6);//发送给指定的手机号
  console.log(`向${phone}发送验证码短信: ${code}`);sms_util.sendCode(phone, code, function (success) {//success表示是否成功if (success) {users[phone] = codeconsole.log(users[phone])console.log('保存验证码: ', phone, code)res.send({"code": 0})} else {//3. 返回响应数据res.send({"code": 1, msg: '短信验证码发送失败'})}})
})/*
短信登陆
*/
router.post('/login_sms', function (req, res, next) {var phone = req.body.phone;var code = req.body.code;console.log('/login_sms', phone, code);if (users[code] != code) {res.send({code: 1, msg: '手机号或验证码不正确'});return;}//删除保存的codedelete users[phone];UserModel.findOne({phone}, function (err, user) {if (user) {req.session.userid = user._idres.send({code: 0, data: user})} else {//存储数据const userModel = new UserModel({phone})userModel.save(function (err, user) {req.session.userid = user._idres.send({code: 0, data: user})})}})})

3、前台实现

(1)输入正确的手机号之后,点击“获取验证码”,会异步调用getCode()方法

a:页面行为

b 调用getCode方法获取验证码

c在methods中定义获取验证码函数

// 异步获取短信验证码
      async getCode () {// 如果当前没有计时if(!this.computeTime) {// 启动倒计时this.computeTime = 60this.intervalId = setInterval(() => {this.computeTime--if(this.computeTime<=0) {// 停止计时clearInterval(this.intervalId)}}, 1000)// 发送ajax请求(向指定手机号发送验证码短信)const result = await reqSendCode(this.phone)if(result.code===1) {// 显示提示this.showAlert(result.msg)// 停止计时if(this.computeTime) {this.computeTime = 0clearInterval(this.intervalId)this.intervalId = undefined}}}},

d.异步请求时会调用自己封装的请求函数

//6.发送短信验证码
export const reqSendCode = (phone)=>ajax('/api/sendcode', {phone})

import axios from 'axios'
export default function ajax(url = '', data = {}, type = 'GET') {return new Promise(function (resolve, reject) {let promiseif (type === 'GET') {// 准备url query 参数数据let dataStr = '' //数据拼接字符串Object.keys(data).forEach(key => {dataStr += key + '=' + data[key] + '&'})if (dataStr !== '') {dataStr = dataStr.substring(0, dataStr.lastIndexOf('&'))url = url + '?' + dataStr}// 发送get 请求promise = axios.get(url)} else {// 发送post 请求promise = axios.post(url, data)}promise.then(response => {resolve(response.data)}).catch(error => {reject(error)})})
}

ajax函数封装

e.后台接受到get请求,会执行后台index.js中的get请求方式,先生成验证码,并且提示到手机上

router.get('/sendcode', function (req, res, next) {//1. 获取请求参数数据var phone = req.query.phone;//2. 处理数据//生成验证码(6位随机数)var code = sms_util.randomCode(6);//发送给指定的手机号
  console.log(`向${phone}发送验证码短信: ${code}`);sms_util.sendCode(phone, code, function (success) {//success表示是否成功if (success) {users[phone] = codeconsole.log(users[phone])console.log('保存验证码: ', phone, code)res.send({"code": 0})} else {//3. 返回响应数据res.send({"code": 1, msg: '短信验证码发送失败'})}})
})

f.用户收到验证码,并且输入点击“登录”按钮,提交表单,再次对服务器发起post请求,服务器在验证

router.post('/login_sms', function (req, res, next) {var phone = req.body.phone;var code = req.body.code;console.log('/login_sms', phone, code);if (users[code] != code) {res.send({code: 1, msg: '手机号或验证码不正确'});return;}//删除保存的codedelete users[phone];UserModel.findOne({phone}, function (err, user) {if (user) {req.session.userid = user._idres.send({code: 0, data: user})} else {//存储数据const userModel = new UserModel({phone})userModel.save(function (err, user) {req.session.userid = user._idres.send({code: 0, data: user})})}})})

g.前台接受到后台的响应数据之后,还需要进行以下操作

1)将电话号码保存到vuex的state中去

2)进行路由跳转

if(this.loginWay) {  // 短信登陆const {rightPhone, phone, code} = thisif(!this.rightPhone) {// 手机号不正确this.showAlert('手机号不正确')return} else if(!/^\d{6}$/.test(code)) {// 验证必须是6位数字this.showAlert('验证必须是6位数字')return}// 发送ajax请求短信登陆result = await reqSmsLogin(phone, code)}// 停止计时if(this.computeTime) {this.computeTime = 0clearInterval(this.intervalId)this.intervalId = undefined}// 根据结果数据处理if(result.code===0) {const user = result.datacosole.log(user)// 将user保存到vuex的statethis.$store.dispatch('recordUser', user)// 去个人中心界面this.$router.replace('/profile')} else {// 显示新的图片验证码this.getCaptcha()// 显示警告提示const msg = result.msgthis.showAlert(msg)}}

三、总结

转载于:https://www.cnblogs.com/xxm980617/p/10822624.html

Vue_注册登录(短信验证码登录)相关推荐

  1. Spring Security OAuth2 优雅的集成短信验证码登录以及第三方登录

    基于SpringCloud做微服务架构分布式系统时,OAuth2.0作为认证的业内标准,Spring Security OAuth2也提供了全套的解决方案来支持在Spring Cloud/Spring ...

  2. 2.vue3医疗在线问诊项目 - _登录模块 ==> 代码片段、css变量主题定制、cp-nav-bar组件封装、svg打包精灵图插件、cp-icon组件封装、表单校验、密码登录、短信验证码登录及两者

    2.医疗在线问诊项目 - _登录模块 ==> 代码片段.css变量主题定制.cp-nav-bar组件封装.svg打包精灵图插件.cp-icon组件封装.表单校验.密码登录.短信验证码登录及两者的 ...

  3. 网站app注册登录短信验证码是怎么获取实现的

    在我们的生活中,经常会遇到(www.yunxintong100.com)需要手机注册,手机验证,手机修改密码的时候,而这些操作都会收到手机验证码来进行身份验证,这样做的目的不仅是为了保护用户的安全使用 ...

  4. 手机发送短信验证码登录完整实例

    项目需求 后台生成随机6位数作为验证码,发送给手机,同时将验证码存入缓存,用户登录时验证输入的验证码是否过期或者是否正确. 一.发送短信 1.了解短信发送 通过发送短信的API,建立一个URL类的对象 ...

  5. Redis(2)短信验证码登录

    Redis实现短信验证码登录 登录流程 1.发送验证码: 2.短信验证码登录,注册 3.校验登录状态 解决状态登录刷新问题 redis指令参考:https://blog.csdn.net/weixin ...

  6. 手把手带你在集成SpringSecurity的SpringBoot应用中添加短信验证码登录认证功能

    本文目录 前言 1 自定义AuthenticationToken类 2 自定义AuthenticationProvider类 3 自定义MobilePhoneAuthenticationFilter ...

  7. Spring Security简单增加短信验证码登录

    查网上资料增加短信验证码登录都要增加一大推,要重头写Spring Security的实现,我呢,只想在原来的密码登录基础上简单实现一下短信验证码登录. 1.首先得先一个认证类,来认证验证码是否正确,这 ...

  8. 【开发测试个人小微接入短信验证码】thinkphp5.1+小程序使用短信验证码登录

    最近写一个小项目需要用到短信验证码登录,本来打算用阿里云的短信,但是各种审核什么的太麻烦,偶然间发现一个对个人开发测试比较友好的短信平台,注册就送100条验证码,测试用妥妥的够用.而且个人认证处理速度 ...

  9. cas5.3.9自定义手机短信验证码登录

    cas自定义多种登录方式 cas添加手机短信验证码登录 cas添加手机短信验证码登录 全部基于SpringBoot,以及SpringWebflow开发,请在有此基础再进行学习! 添加Maven依赖 & ...

  10. 5.Spring Security 短信验证码登录

    Spring Security 短信验证码登录 在 Spring Security 添加图形验证码一节中,我们已经实现了基于 Spring Boot + Spring Security 的账号密码登录 ...

最新文章

  1. cc arm linux gcc,(80分请教):armcc 与 arm-elf-gcc的区别?
  2. linux 0地址的妙用
  3. 1010. 一元多项式求导
  4. python partition by函数_python – 避免Spark窗口函数中单个分区模式的性能影响
  5. 从底层重学 Java 之 Stream 并行及标志 GitChat连接
  6. php读取模板生成静态功能,php 生成静态页面的办法与实现代码详细版
  7. php jwt怎么保存再客户端,php – 如何将JWT添加到授权标头?
  8. php文件上传接口测试,七牛云存储-用php上传图片,我在本地测试,用php接口,不成功...
  9. 11g RAC 安装后所需修改事项
  10. python字符串split()函数
  11. lua脚本语言学习(一)
  12. Android开发之实现多次点击事件
  13. 【Spark重点难点08】Spark3.0中的AQE和DPP小总结
  14. 怎样写好git comment
  15. CTF实验吧-简单的sql注入【SQL注入关键词绕过】
  16. 上海落户计算机水平毕业研究生,2021上海积分落户应届毕业生直接落户上海
  17. 【前端css】如何实现分隔线效果(css兄弟兄弟节点样式+ ~)
  18. C# GDI 手绘图片转化为电子版处理
  19. 使用C++设计贪食蛇小游戏
  20. AutoCAD Civil3D 2023安装图文教程及下载

热门文章

  1. 四元数和欧拉角的相互转换
  2. 【Qt】数据库SQL接口层
  3. 【MFC】MFC应用程序框架详解
  4. tif文件转pdf_PPT怎么转换成PDF文件?可以帮到你的PPT转PDF方法
  5. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
  6. linux 路由指向策略,Linux 路由 学习笔记 之六 策略规则的添加
  7. zookeeper快速入门,配置虚拟机ip、mac、虚拟机免密,jdk的安装与卸载
  8. Apache(1)——安装
  9. Pixhawk的传感器数据(陀螺、加计等)流程
  10. C++堆 和 栈 空间的区别