vue实现登录页面的验证码以及验证过程解析(面向新手)


Posted in Javascript onAugust 02, 2019

做成之后就

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: 35
  },
  backgroundColorMin: { // 验证码图片背景色最小值
   type: Number,
   default: 200
  },
  backgroundColorMax: { // 验证码图片背景色最大值
   type: Number,
   default: 220
  },
  dotColorMin: { // 背景干扰点最小值
   type: Number,
   default: 60
  },
  dotColorMax: { // 背景干扰点最大值
   type: Number,
   default: 120
  },
  contentWidth: { // 容器宽度
   type: Number,
   default: 90
  },
  contentHeight: { // 容器高度
   type: Number,
   default: 38
  }
 },
 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 = '#e6ecfd'
   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(50, 160) // 随机生成字体颜色
   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(-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)
  },
 
  drawLine (ctx) {
   // 绘制干扰线
   for (let i = 0; i < 4; i++) {
    ctx.strokeStyle = this.randomColor(100, 200)
    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 < 30; 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>

在登录页面中
验证码输输入框

<el-form-item prop="code">
  <el-input type="text" v-model="formLogin.code" placeholder="- - - -">
   <template slot="prepend">验证码</template>
   <template slot="append">
    <div class="login-code" @click="refreshCode">
     <Identify :identifyCode="identifyCode"></Identify>
    </div>
   </template>
  </el-input>
 </el-form-item>

登录按钮

<el-button-group>
        <el-button style="width:100%" @click="submit" type="primary">登录</el-button>
 </el-button-group>

引入之前的组件(在例子中它叫identify)

import Identify from './identify'

在登录组件中引入Identify (这是验证码组件)这一部分略

在data中

// 表单
   formLogin: {
    username: "",
    password: "",
    code: ""
   },
   identifyCodes: '1234567890abcdefjhijklinopqrsduvwxyz',
   identifyCode: '',
   // 校验
   rules: {
    username: [
     { required: true, message: "请输入用户名", trigger: "blur" }
    ],
    password: [{ required: true, message: "请输入密码", trigger: "blur" }],
    code: [{ required: true, message: "请输入验证码", trigger: "blur" }]
   }

在mounted中

mounted () {
  // 初始化验证码
  this.identifyCode = ''
  this.makeCode(this.identifyCodes, 4)
 },

在method中

// 引入验证接口
...mapActions("d2admin/account", ["login"]),
    // 重置验证码
  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)]
   }
  },
  randomNum (min, max) {
   return Math.floor(Math.random() * (max - min) + min)
  },
  /**
  * @description 提交表单
  */
  // 提交登录信息
  submit() {
    if (this.formLogin.code.toLowerCase() !== this.identifyCode.toLowerCase()) {
    this.$message.error('请填写正确验证码')
    this.refreshCode()
    return
   }
   this.$refs.loginForm.validate(valid => {
    if (valid) {
     // 登录
     // 注意 这里的演示没有传验证码
     // 具体需要传递的数据请自行修改代码
     this.login({
      vm: this,
      username: this.formLogin.username,
      password: this.formLogin.password
     });
    } else {
     // 登录表单校验失败
     this.$message.error("表单校验失败");
    }
   });
  }

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

Javascript 相关文章推荐
JavaScript 事件属性绑定带参数的函数
Mar 13 Javascript
异步动态加载js与css文件的js代码
Sep 15 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
Dec 12 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
Node.js 使用命令行工具检查更新
Jun 08 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 Javascript
详解element-ui中el-select的默认选择项问题
Aug 02 #Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 #jQuery
150行Node.js实现的dns代理工具
Aug 02 #Javascript
el-select 下拉框多选实现全选的实现
Aug 02 #Javascript
js动态获取时间的方法分析
Aug 02 #Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 #Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 #jQuery
You might like
PHP 7.0.2 正式版发布
2016/01/08 PHP
PHP如何将XML转成数组
2016/04/04 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python Django的web开发实例(入门)
2019/07/31 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
大专自我鉴定范文
2013/10/01 职场文书
事务机电主管工作职责
2014/02/25 职场文书
电力安全事故反思
2014/04/27 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
让生命充满爱观后感
2015/06/08 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers