欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-22 14:41:14
 在登入页面,我们往往需要通过输入验证码才能进行登入,那我们下面就详讲一下在vue项目中如何配合element-ui实现这个功能 第一步:自定义一个生产随机验证...

 在登入页面,我们往往需要通过输入验证码才能进行登入,那我们下面就详讲一下在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'
 },
 fontsi*: {
  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.fontsi*, 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表单验证功能,希望对大家有所帮助