vue实现随机验证码功能的实例代码


Posted in Javascript onApril 30, 2019

先给大家展示下效果图:

vue实现随机验证码功能的实例代码

1.html代码

vue实现随机验证码功能的实例代码

<div class="form-group" style="display: flex;">
     <div>
      <span>验证码:</span>
      <input type="text" id="code" v-model="code" class="code" placeholder="请输入您的验证码" />
     </div>
     <div class="login-code" @click="refreshCode">
   <!--验证码组件-->
   <s-identify :identifyCode="identifyCode"></s-identify>
   </div>
    </div>

2.css样式

vue实现随机验证码功能的实例代码

/*验证码样式*/
.code{
 width:124px;
 height:31px;
 border:1px solid rgba(186,186,186,1);
}
.login-code{
  cursor: pointer;
}

3.js引入验证码组件,并且定义三个变量。

vue实现随机验证码功能的实例代码

import SIdentify from '../components/sidentify'

components: { SIdentify },
data () {
 return {
  identifyCodes: "1234567890",
  identifyCode: "",
  code:"",//text框输入的验证码
 }
},

4.mounted里的代码

vue实现随机验证码功能的实例代码

mounted(){
  this.identifyCode = "";
  this.makeCode(this.identifyCodes, 4);
 },

5.在created里初始化验证码

vue实现随机验证码功能的实例代码

6.methods里添加以下方法。

vue实现随机验证码功能的实例代码

需要用到的方法

//验证码
randomNum(min, max) {
 return Math.floor(Math.random() * (max - min) + min);
},
  
refreshCode() {
 this.identifyCode = "";
 this.makeCode(this.identifyCodes, 4);
},
makeCode(o, l) {
 for (let i = 0; i < l; i++) {
  this.identifyCode += this.identifyCodes[
   this.randomNum(0, this.identifyCodes.length)
  ];
 }
 console.log(this.identifyCode);
},

在提交表单的时候对验证码进行判断。

vue实现随机验证码功能的实例代码

sidentify.vue组件代码:

vue实现随机验证码功能的实例代码

<template>
 <div class="s-canvas">
  <canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
 </div>
</template>
<script>
export default {
 name: 'SIdentify',
 props: {
  identifyCode: {
   type: String,
   default: '1234'
  },
  fontSizeMin: {
   type: Number,
   default: 25
  },
  fontSizeMax: {
   type: Number,
   default: 30
  },
  backgroundColorMin: {
   type: Number,
   default: 255
  },
  backgroundColorMax: {
   type: Number,
   default: 255
  },
  colorMin: {
   type: Number,
   default: 0
  },
  colorMax: {
   type: Number,
   default: 160
  },
  lineColorMin: {
   type: Number,
   default: 100
  },
  lineColorMax: {
   type: Number,
   default: 255
  },
  dotColorMin: {
   type: Number,
   default: 0
  },
  dotColorMax: {
   type: Number,
   default: 255
  },
  contentWidth: {
   type: Number,
   default: 112
  },
  contentHeight: {
   type: Number,
   default: 31
  }
 },
 methods: {
  // 生成一个随机数
  randomNum(min, max) {
   return Math.floor(Math.random() * (max - min) + min)
  },
  // 生成一个随机的颜色
  randomColor(min, max) {
   let r = this.randomNum(min, max)
   let g = this.randomNum(min, max)
   let b = this.randomNum(min, max)
   return 'rgb(' + r + ',' + g + ',' + b + ')'
  },
  drawPic() {
   let canvas = document.getElementById('s-canvas')
   let ctx = canvas.getContext('2d')
   ctx.textBaseline = 'bottom'
   // 绘制背景
   ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)
   ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)
   // 绘制文字
   for (let i = 0; i < this.identifyCode.length; i++) {
    this.drawText(ctx, this.identifyCode[i], i)
   }
   this.drawLine(ctx)
   this.drawDot(ctx)
  },
  drawText(ctx, txt, i) {
   ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)
   ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei'
   let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
   let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)
   var deg = this.randomNum(-45, 45)
   // 修改坐标原点和旋转角度
   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)
  },
  drawLine(ctx) {
   // 绘制干扰线
   for (let i = 0; i < 5; i++) {
    ctx.strokeStyle = this.randomColor(this.lineColorMin, this.lineColorMax)
    ctx.beginPath()
    ctx.moveTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))
    ctx.lineTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight))
    ctx.stroke()
   }
  },
  drawDot(ctx) {
   // 绘制干扰点
   for (let i = 0; i < 80; i++) {
    ctx.fillStyle = this.randomColor(0, 255)
    ctx.beginPath()
    ctx.arc(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 * Math.PI)
    ctx.fill()
   }
  }
 },
 watch: {
  identifyCode() {
   this.drawPic()
  }
 },
 mounted() {
  this.drawPic()
 }
}
</script>
<style scoped>
.s-canvas {
 height: 38px;
}
.s-canvas canvas{
 margin-top: 1px;
 margin-left: 8px;
}
</style>

总结

以上所述是小编给大家介绍的vue实现随机验证码功能的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
起点页面传值js,有空研究学习下
Jan 25 Javascript
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
jquery 快速回到页首的方法
Dec 05 Javascript
JavaScript中的数组特性介绍
Dec 30 Javascript
Vue.js自定义指令的用法与实例解析
Jan 18 Javascript
angular学习之ngRoute路由机制
Apr 12 Javascript
浅析Vue自定义组件的v-model
Nov 26 Javascript
vue中使用sessionStorage记住密码功能
Jul 24 Javascript
Node.js JSON模块用法实例分析
Jan 04 Javascript
JavaScript实现电灯开关小案例
Mar 30 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
详解vue 图片上传功能
Apr 30 #Javascript
vue移动端屏幕适配详解
Apr 30 #Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 #Javascript
微信小程序时间戳转日期的详解
Apr 30 #Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 #Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 #Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 #Javascript
You might like
文章推荐系统(三)
2006/10/09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php jsonp单引号转义
2014/11/23 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
ExpressJS入门实例
2015/01/14 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
python文件和目录操作函数小结
2014/07/11 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
编写strcpy函数
2014/06/24 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
会计毕业生自荐书
2014/06/12 职场文书
高中班主任评语
2014/12/30 职场文书
考察邀请函范文
2015/01/31 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
vue实现列表垂直无缝滚动
2022/04/08 Vue.js