在登入頁面,我們往往需要通過輸入驗證碼才能進行登入,那我們下面就詳講一下在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表單驗證功能,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
新聞熱點
疑難解答