vue+element-ui集成随机验证码+用户名+密码的form表单验证功能


Posted in Javascript onAugust 05, 2018

 在登入页面,我们往往需要通过输入验证码才能进行登入,那我们下面就详讲一下在vue项目中如何配合element-ui实现这个功能

第一步:自定义一个生产随机验证码的组件,其本质是使用canvas绘制,详细代码如下:

<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: 16
 },
 fontSizeMax: {
  type: Number,
  default: 40
 },
 backgroundColorMin: {
  type: Number,
  default: 180
 },
 backgroundColorMax: {
  type: Number,
  default: 240
 },
 colorMin: {
  type: Number,
  default: 50
 },
 colorMax: {
  type: Number,
  default: 160
 },
 lineColorMin: {
  type: Number,
  default: 40
 },
 lineColorMax: {
  type: Number,
  default: 180
 },
 dotColorMin: {
  type: Number,
  default: 0
 },
 dotColorMax: {
  type: Number,
  default: 255
 },
 contentWidth: {
  type: Number,
  default: 112
 },
 contentHeight: {
  type: Number,
  default: 38
 }
 },
 methods: {
 // 生成一个随机数
 randomNum(min, max) {
  return Math.floor(Math.random() * (max - min) + min)
 },
 // 生成一个随机的颜色
 randomColor(min, max) {
  var r = this.randomNum(min, max)
  var g = this.randomNum(min, max)
  var b = this.randomNum(min, max)
  return 'rgb(' + r + ',' + g + ',' + b + ')'
 },
 drawPic() {
  var canvas = document.getElementById('s-canvas')
  var 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'
  var x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
  var 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 < 8; 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 < 100; 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>

第二步:使用该组件:

我们首先新建一个vue组件,在该组件进行布局,其中还包括用户名和密码的验证(这只是前端的简单验证,真实项目中还需要请求登入接口进行后端验证)

<template>
 <el-form class="login-form" status-icon :rules="loginRules" ref="loginForm" :model="loginForm" label-width="0">
 <el-form-item prop="username">
  <el-input size="small" @keyup.enter.native="handleLogin" v-model="loginForm.username" auto-complete="off" placeholder="请输入用户名">
  <i slot="prefix" class="icon-yonghu"></i>
  </el-input>
 </el-form-item>
 <el-form-item prop="password">
  <el-input size="small" @keyup.enter.native="handleLogin" :type="passwordType" v-model="loginForm.password" auto-complete="off" placeholder="请输入密码">
  <i class="el-icon-view el-input__icon" :style="fontstyle" slot="suffix" @click="showPassword"></i>
  <i slot="prefix" class="icon-mima"></i>
  </el-input>
 </el-form-item>
 <el-form-item prop="verifycode">
  <!-- 注意:prop与input绑定的值一定要一致,否则验证规则中的value会报undefined,因为value即为绑定的input输入值 -->
  <el-input v-model="loginForm.verifycode" placeholder="请输入验证码" class="identifyinput"></el-input>
 </el-form-item>
 <el-form-item>
  <div class="identifybox">
  <div @click="refreshCode">
   <s-identify :identifyCode="identifyCode"></s-identify>
  </div>
  <el-button @click="refreshCode" type='text' class="textbtn">看不清,换一张</el-button>
  </div>
 </el-form-item>
 <el-checkbox v-model="checked">记住账号</el-checkbox>
 <el-form-item>
  <el-button type="primary" size="small" @click.native.prevent="handleLogin" class="login-submit">登录</el-button>
 </el-form-item>
 </el-form>
</template>

 第三步:生产随机码与进行登入验证

<script>
import { isvalidUsername } from '@/utils/validate'
import SIdentify from '@/components/identify/identify.vue'
export default {
 name: 'userlogin',
 data() {
 // 用户名自定义验证规则
 const validateUsername = (rule, value, callback) => {
  if (!isvalidUsername(value)) {
  callback(new Error('请输入正确的用户名'))
  } else {
  console.log('user', value)
  callback()
  }
 }
 // 验证码自定义验证规则
 const validateVerifycode = (rule, value, callback) => {
  if (value === '') {
  callback(new Error('请输入验证码'))
  } else if (value !== this.identifyCode) {
  console.log('validateVerifycode:', value)
  callback(new Error('验证码不正确!'))
  } else {
  callback()
  }
 }
 return {
  fontstyle: {
  },
  loginForm: {
  username: 'admin',
  password: '123456',
  verifycode: ''
  },
  checked: false,
  identifyCodes: '1234567890',
  identifyCode: '',
  loginRules: { // 绑定在form表单中的验证规则
  username: [
   { required: true, trigger: 'blur', validator: validateUsername }
  ],
  password: [
   { required: true, message: '请输入密码', trigger: 'blur' },
   { min: 6, message: '密码长度最少为6位', trigger: 'blur' }
  ],
  verifycode: [
   { required: true, trigger: 'blur', validator: validateVerifycode }
  ]
  },
  passwordType: 'password'
 }
 },
 components: {
 SIdentify
 },
 created() {
 },
 mounted() {
 // 验证码初始化
 this.identifyCode = ''
 this.makeCode(this.identifyCodes, 4)
 },
 computed: {
 },
 props: [],
 methods: {
 // 通过改变input的type使密码可见
 showPassword() {
  this.fontstyle === '' ? (this.fontstyle = 'color: red') : (this.fontstyle = '') // 改变密码可见按钮颜色
  this.passwordType === ''
  ? (this.passwordType = 'password')
  : (this.passwordType = '')
 },
 // 点击登入按钮
 handleLogin() {
  this.$refs.loginForm.validate(valid => {
  if (valid) {
   this.$store.dispatch('Login', this.loginForm).then(res => {
   this.$router.push({ path: '/dashboard/dashboard' })
   })
  }
  })
 },
 // 生成随机数
 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)
 }
 }
}
</script>
<style scoped>
.identifybox{
 display: flex;
 justify-content: space-between;
 margin-top:7px;
}
.iconstyle{
 color:#409EFF;
}
</style>

最后的效果如下,当我们输入之后鼠标失去焦点就会进行验证:

vue+element-ui集成随机验证码+用户名+密码的form表单验证功能

总结

以上所述是小编给大家介绍的vue+element-ui集成随机验证码+用户名+密码的form表单验证功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript下function声明一些小结
Dec 28 Javascript
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
May 23 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
理解JavaScript事件对象
Jan 25 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
javascript基础语法——全面理解变量和标识符
Jun 02 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
jquery拖动改变div大小
Jul 04 jQuery
js异步上传多张图片插件的使用方法
Oct 22 Javascript
js实现九宫格抽奖
Mar 19 Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 #Javascript
深入理解JavaScript的async/await
Aug 05 #Javascript
js数据类型检测总结
Aug 05 #Javascript
通过函数作用域和块级作用域看javascript的作用域链
Aug 05 #Javascript
vue实现简单的MVVM框架
Aug 05 #Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 #Javascript
详解Require.js与Sea.js的区别
Aug 05 #Javascript
You might like
php cli换行示例
2014/04/22 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
客户端静态页面玩分页
2006/06/26 Javascript
FCK调用方法..
2006/12/21 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JavaScript手机振动API
2016/06/11 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Flask之flask-script模块使用
2018/07/26 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
十佳班主任事迹材料
2014/01/18 职场文书
拔河比赛口号
2014/06/10 职场文书
大学生学习计划书
2014/09/15 职场文书
秋冬农业生产标语
2014/10/09 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python