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

 在登入页面,我们往往需要通过输入验证码才能进行登入,那我们下面就详讲一下在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表单验证功能 的全部内容, 来源链接: utcz.com/z/339706.html

回到顶部