首页 > 编程 > JavaScript > 正文

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

2019-11-19 13:20:27
字体:
来源:转载
供稿:网友

 在登入页面,我们往往需要通过输入验证码才能进行登入,那我们下面就详讲一下在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表单验证功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表