Vue实现验证码功能


Posted in Javascript onDecember 03, 2019

本文实例为大家分享了Vue实现验证码的具体代码,供大家参考,具体内容如下

1.效果

Vue实现验证码功能

2.代码

2.1 创建js组件

Vue实现验证码功能

内容

(可直接粘贴过去,需要改宽度和高度,修改_init方法中的宽和高)

function GVerify (options) { // 创建一个图形验证码对象,接收options对象为参数
 this.options = { // 默认options参数值
  id: '', // 容器Id
  canvasId: 'verifyCanvas', // canvas的ID
  width: '80', // 默认canvas宽度
  height: '30', // 默认canvas高度
  type: 'number', // 图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
  code: ''
 }

 if (Object.prototype.toString.call(options) === '[object Object]') { // 判断传入参数类型
  for (var i in options) { // 根据传入的参数,修改默认参数值
   this.options[i] = options[i]
  }
 } else {
  this.options.id = options
 }

 this.options.numArr = '0,1,2,3,4,5,6,7,8,9'.split(',')
 this.options.letterArr = getAllLetter()

 this._init()
 this.refresh()
}

GVerify.prototype = {
 /** 版本号**/
 version: '1.0.0',

 /** 初始化方法**/
 _init: function () {
  var con = document.getElementById(this.options.id)
  var canvas = document.createElement('canvas')
  // this.options.width = con.offsetWidth > 0 ? con.offsetWidth : '30'
  // this.options.height = con.offsetHeight > 0 ? con.offsetHeight : '30'
  this.options.width = '160'
  this.options.height = '50'
  canvas.id = this.options.canvasId
  canvas.width = this.options.width
  canvas.height = this.options.height
  canvas.style.cursor = 'pointer'
  canvas.innerHTML = '您的浏览器版本不支持canvas'
  con.appendChild(canvas)
  var parent = this
  canvas.onclick = function () {
   parent.refresh()
  }
 },

 /** 生成验证码**/
 refresh: function () {
  var canvas = document.getElementById(this.options.canvasId)
  if (canvas.getContext) {
   var ctx = canvas.getContext('2d')
  }
  ctx.textBaseline = 'middle'

  ctx.fillStyle = randomColor(180, 240)
  ctx.fillRect(0, 0, this.options.width, this.options.height)

  if (this.options.type === 'blend') { // 判断验证码类型
   var txtArr = this.options.numArr.concat(this.options.letterArr)
  } else if (this.options.type === 'number') {
   var txtArr = this.options.numArr
  } else {
   var txtArr = this.options.letterArr
  }

  for (var i = 1; i <= 4; i++) {
   var txt = txtArr[randomNum(0, txtArr.length)]
   this.options.code += txt
   ctx.font = randomNum(this.options.height / 2, this.options.height) + 'px SimHei' // 随机生成字体大小
   ctx.fillStyle = randomColor(50, 160) // 随机生成字体颜色
   ctx.shadowOffsetX = randomNum(-3, 3)
   ctx.shadowOffsetY = randomNum(-3, 3)
   ctx.shadowBlur = randomNum(-3, 3)
   ctx.shadowColor = 'rgba(0, 0, 0, 0.3)'
   var x = this.options.width / 5 * i
   var y = this.options.height / 2
   var deg = randomNum(-30, 30)
   /** 设置旋转角度和坐标原点**/
   ctx.translate(x, y)
   ctx.rotate(deg * Math.PI / 180)
   ctx.fillText(txt, 0, 0)
   /** 恢复旋转角度和坐标原点**/
   ctx.rotate(-deg * Math.PI / 180)
   ctx.translate(-x, -y)
  }
  /** 绘制干扰线**/
  for (var i = 0; i < 4; i++) {
   ctx.strokeStyle = randomColor(40, 180)
   ctx.beginPath()
   ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height))
   ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height))
   ctx.stroke()
  }
  /** 绘制干扰点**/
  for (var i = 0; i < this.options.width / 4; i++) {
   ctx.fillStyle = randomColor(0, 255)
   ctx.beginPath()
   ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI)
   ctx.fill()
  }
 },

 /** 验证验证码**/
 validate: function (code) {
  var code = code.toLowerCase()
  var v_code = this.options.code.toLowerCase()
  if (code == v_code) {
   return true
  } else {
   return false
  }
 }
}
/** 生成字母数组**/
function getAllLetter () {
 var letterStr = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'
 return letterStr.split(',')
}
/** 生成一个随机数**/
function randomNum (min, max) {
 return Math.floor(Math.random() * (max - min) + min)
}
/** 生成一个随机色**/
function randomColor (min, max) {
 var r = randomNum(min, max)
 var g = randomNum(min, max)
 var b = randomNum(min, max)
 return 'rgb(' + r + ',' + g + ',' + b + ')'
}

export {
 GVerify
}

2.2 登录页面

2.2.1 引入组件

[....<script>]

import { GVerify } from '../../static/js/verifyCode';

[export default { ....]

2.2.2 定义验证对象

注意 verifyCode

data: function () {
  return {
   title: '若晨后台管理系统',
   ruleForm: {
    username: '',
    password: '',
    verifyCode: ''
   },
   rules: {
    username: [
     { required: true, message: '请输入用户名', trigger: 'blur' }
    ],
    password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
    verifyCode: [
     { required: true, message: '请输入验证码', trigger: 'blur' }
    ]
   },
   verifyCode: null
  }
 },

2.2.3 初始化节点

<el-form-item prop="verifyCode" class="verifyCodeItemCss">
     <el-input class="verify_css" placeholder="请输入4位验证码" v-model="ruleForm.verifyCode" @keyup.enter.native="submitForm('ruleForm')"></el-input>
     <!--关键 ↓-->
     <div id="v_container"></div>
</el-form-item>

mounted方法中初始化 'v_container' 为div的id

mounted () {
  this.verifyCode = new GVerify('v_container')
}

2.2.4 验证输入的是否正确

通过在data中定义的verifyCode对象的validate()方法,如果输入正确返回true 错误返回 false

var that = this

   // 获取验证码
   var verifyCode = this.ruleForm.verifyCode
   var verifyFlag = this.verifyCode.validate(verifyCode)
   if (!verifyFlag) {
    that.$notify.error({
     title: '系统提示',
     message: '验证码输入错误'
    })
    return;
   } else {
    that.$notify({
     title: '系统提示',
     message: '验证码输入正确',
     type: 'success'
    })
   }

3.全部页面代码

<template>
 <div class="login-wrap">
  <div class="video-bg">
   <video muted="" data-autoplay="" loop="" autoplay="" src="https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-movideo/65886292_9687ec67dfc37bfbf847d82b6b52a276_96e56b0f4bfc.mp4" class="video-tvc" id="video-tvc" data-object-fit="">
   </video>
  </div>
  <div class="ms-title">{{title}}</div>
  <div class="ms-login">
   <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm">
    <el-form-item prop="username">
     <el-input v-model="ruleForm.username" placeholder="请输入账号"></el-input>
    </el-form-item>
    <el-form-item prop="password">
     <el-input type="password" placeholder="请输入密码" v-model="ruleForm.password" @keyup.enter.native="submitForm('ruleForm')"></el-input>
    </el-form-item>
    <el-form-item prop="verifyCode" class="verifyCodeItemCss">
     <el-input class="verify_css" placeholder="请输入4位验证码" v-model="ruleForm.verifyCode" @keyup.enter.native="submitForm('ruleForm')"></el-input>
     <div id="v_container"></div>
    </el-form-item>
    <div class="login-btn">
     <el-button class="loginBtn" type="primary" @click="submitForm('ruleForm')">登录</el-button>
    </div>
    <!--
        <p style="font-size:12px;line-height:30px;color:#999;">Tips : 用户名和密码随便填。</p>
        -->
   </el-form>
  </div>
 </div>
</template>

<script>
import { GVerify } from '../../static/js/verifyCode';
export default {
 data: function () {
  return {
   title: '若晨后台管理系统',
   ruleForm: {
    username: '',
    password: '',
    verifyCode: ''
   },
   rules: {
    username: [
     { required: true, message: '请输入用户名', trigger: 'blur' }
    ],
    password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
    verifyCode: [
     { required: true, message: '请输入验证码', trigger: 'blur' }
    ]
   },
   verifyCode: null
  }
 },
 mounted () {
  // 随机播放帧数
  this.videoCut()

  this.verifyCode = new GVerify('v_container')
 },
 methods: {
  submitForm (formName) {
   var that = this

   // 获取验证码
   var verifyCode = this.ruleForm.verifyCode
   var verifyFlag = this.verifyCode.validate(verifyCode)
   if (!verifyFlag) {
    that.$notify.error({
     title: '系统提示',
     message: '验证码输入错误'
    })
    return;
   } else {
    that.$notify({
     title: '系统提示',
     message: '验证码输入正确',
     type: 'success'
    })
   }

   this.$refs[formName].validate(valid => {
    if (valid) {
     // 判断是否登录成功

     let param = {
      userName: that.ruleForm.username,
      passWord: that.ruleForm.password
     }

     // this.axios.post(this.$service.user.USER_LOGIN_API.url,param).then(res=>{
     //   console.log("请求成功",res)
     //   if(res.data.data != undefined){
     //     that.$notify({
     //       title: '系统提示',
     //       message: '登录成功',
     //       type:"success"
     //     });
     //           // 存local
     //     localStorage.setItem('ms_username',res.data.data.userNickName);
     //     localStorage.setItem('token',res.data.data.id);
     //     self.$router.push('/index');
     //   }else{
     //     that.$notify.error({
     //     title: '系统提示',
     //     message: '用户账户密码输出错误'
     //     });
     //   }

     localStorage.setItem('ms_username', 'admin')
     localStorage.setItem('token', 'admin')
     that.$router.push('/index')
    } else {
     console.log('error submit!!')
     return false
    }
   })
  },

  videoCut () {
   $('video').on('loadedmetadata', function (event) {
    var duration = Math.ceil(this.duration)
    this.currentTime = Math.round(Math.random() * duration)
   })
  }
 }
}
</script>


<style scoped>
.verify_css {
 width: 45%;
}

.login-wrap {
 position: relative;
 width: 100%;
 height: 100%;
}
.ms-title {
 position: absolute;
 top: 50%;
 width: 100%;
 margin-top: -230px;
 text-align: center;
 font-size: 30px;
 color: #fff;
}

.ms-login {
 position: absolute;
 left: 50%;
 top: 50%;
 width: 300px;
 height: 13rem;
 margin: -150px 0 0 -190px;
 padding: 40px;
 border-radius: 6%;
 background: #fff;
 box-shadow: -2px -2px 17px 1px #1e9fff;
}
.login-btn {
 text-align: center;
}
.login-btn button {
 width: 100%;
 height: 36px;
}
.video-bg {
 min-width: 100%;
 min-height: 100%;
 width: 100%;
 height: 100%;
 opacity: 0.9;
}
video {
 width: 100%;
 height: 100%;
 object-fit: cover;
 /* opacity: 0.6; */
}

.loginBtn:hover {
 box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3),
  0px 0px 20px rgba(0, 0, 0, 0.1) inset;
}

#v_container {
 width: auto;
 height: auto;
 display: inline-flex;
 position: relative;
 top: 1rem;
 margin-top: -2rem;
}
</style>

git 参考源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 1.4 中的Ajax问题
Jan 23 Javascript
json数据与字符串的相互转化示例
Sep 18 Javascript
JS禁用浏览器退格键实现思路及代码
Oct 29 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
Mar 01 Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 Javascript
详解js几个绕不开的事件兼容写法
Aug 30 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 jQuery
JavaScript 中的 this 工作原理
Jun 20 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 05 Javascript
vue.js实现简单购物车功能
May 30 Javascript
基于js实现的图片拖拽排序源码实例
Nov 04 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 #Javascript
js实现AI五子棋人机大战
May 28 #Javascript
angular inputNumber指令输入框只能输入数字的实现
Dec 03 #Javascript
JavaScript的console命令使用实例
Dec 03 #Javascript
JavaScript实现京东放大镜效果
Dec 03 #Javascript
微信小程序实现图片压缩
Dec 03 #Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 #Javascript
You might like
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
Python 字符串定义
2009/09/25 Python
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
简述Python中的进程、线程、协程
2016/03/18 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
项目副经理岗位职责
2013/12/30 职场文书
给医务人员表扬信
2014/01/12 职场文书
三年级数学教学反思
2014/01/31 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
节约用水倡议书
2014/04/16 职场文书
保证书格式
2015/01/16 职场文书
护士求职自荐信
2015/03/25 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
就业推荐表院系意见
2015/06/05 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis