1. 程式人生 > 程式設計 >Vue 實現登入介面驗證碼功能

Vue 實現登入介面驗證碼功能

登入介面

SIdentify

建立驗證碼元件,實現繪畫出圖片驗證碼

<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: 30
 },backgroundColorMin: {
 type: Number,default: 255
 },backgroundColorMax: {
 type: Number,colorMin: {
 type: Number,default: 0
 },colorMax: {
 type: Number,default: 160
 },lineColorMin: {
 type: Number,default: 100
 },lineColorMax: {
 type: Number,dotColorMin: {
 type: Number,dotColorMax: {
 type: Number,contentWidth: {
 type: Number,default: 112
 },contentHeight: {
 type: Number,default: 31
 }
 },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 = this.randomColor(this.backgroundColorMin,this.backgroundColorMax)
 ctx.fillRect(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'
 let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
 let 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)
 // 恢復座標原點和旋轉角度
 ctx.rotate(-deg * Math.PI / 180)
 ctx.translate(-x,-y)
 },drawLine(ctx) {
 // 繪製干擾線
 for (let i = 0; i < 5; 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.contentHeight))
  ctx.stroke()
 }
 },drawDot(ctx) {
 // 繪製干擾點
 for (let i = 0; i < 80; i++) {
  ctx.fillStyle = this.randomColor(0,255)
  ctx.beginPath()
  ctx.arc(this.randomNum(0,this.contentHeight),1,2 * Math.PI)
  ctx.fill()
 }
 }
 },watch: {
 identifyCode() {
 this.drawPic()
 }
 },mounted() {
 this.drawPic()
 }
 }
</script>
<style scoped>
 .s-canvas {
 height: 38px;

 }
 .s-canvas canvas{
 margin-top: 1px;
 margin-left: 8px;
 }
</style>

在登入介面引入驗證碼元件並註冊

 import SIdentify from '@/components/common/SIdentify'
 components: { SIdentify },

登入的form

 <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm">
 <el-form-item prop="username">
  <el-input v-model="ruleForm.username" placeholder="賬號">
  <i slot="prepend" class="el-icon-s-custom"/>
  </el-input>
 </el-form-item>
 <el-form-item prop="password">
  <el-input type="password" placeholder="密碼" v-model="ruleForm.password">
  <i slot="prepend" class="el-icon-lock"/>
  </el-input>
 </el-form-item>
 <el-form-item prop="code">
  <el-row :span="24">
  <el-col :span="12">
  <el-input v-model="ruleForm.code" auto-complete="off" placeholder="請輸入驗證碼" size=""
   @keyup.enter.native="submitForm('ruleForm')"></el-input>
  </el-col>
  <el-col :span="12">
  <div class="login-code" @click="refreshCode">
  <!--驗證碼元件-->
  <s-identify :identifyCode="identifyCode"></s-identify>
  </div>
  </el-col>
  </el-row>
 </el-form-item>
 <el-form-item>
  <div class="login-btn">
  <el-button type="primary" @click="submitForm()">登入</el-button>
  </div>
 </el-form-item>
 <p style="font-size:12px;line-height:30px;color:#eaeaea;">Tips : 請輸入賬號密碼登陸</p>
 </el-form>

點選重新整理驗證碼

 randomNum (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)
 ]
 }
 }

總結

以上所述是小編給大家介紹的Vue 實現登入介面驗證碼功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!

如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!