要在 Vue.js 项目中使用 Canvas 实现随机验证码,并进行对比验证,可以按照以下步骤进行:
- 创建一个 Canvas 组件:用于生成随机验证码。
- 在登录表单中引入 Canvas 组件:并实现点击刷新验证码的功能。
- 在登录逻辑中进行验证码的对比验证。
以下是具体的实现步骤:
1. 创建一个 Canvas 组件
首先,创建一个 CaptchaCanvas.vue
组件,用于生成随机验证码。
<template>
<canvas ref="captchaCanvas" @click="generateCaptcha" width="100" height="40"></canvas>
</template>
<script>
export default {
name: 'CaptchaCanvas',
data() {
return {
captchaText: ''
}
},
mounted() {
this.generateCaptcha();
},
methods: {
generateCaptcha() {
const canvas = this.$refs.captchaCanvas;
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 生成随机验证码
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
let captcha = '';
for (let i = 0; i < 4; i++) {
captcha += chars.charAt(Math.floor(Math.random() * chars.length));
}
this.captchaText = captcha;
// 绘制验证码
ctx.font = '24px Arial';
ctx.fillStyle = '#000';
ctx.fillText(captcha, 10, 30);
// 绘制干扰线
for (let i = 0; i < 5; i++) {
ctx.strokeStyle = this.randomColor();
ctx.beginPath();
ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
ctx.stroke();
}
},
randomColor() {
const r = Math.floor(Math.random() * 256);
const g = Math.floor(Math.random() * 256);
const b = Math.floor(Math.random() * 256);
return `rgb(``{r},``{g},${b})`;
},
getCaptchaText() {
return this.captchaText;
}
}
}
</script>
<style scoped>
canvas {
cursor: pointer;
border: 1px solid #ccc;
}
</style>
2. 在登录表单中引入 Canvas 组件
在你的登录表单组件中引入 CaptchaCanvas
组件,并实现点击刷新验证码的功能。
<template>
<div class="login-container">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on"
label-position="left">
<el-form-item prop="captcha" class="captcha">
<div class="formBody">
<el-input
ref="captcha"
v-model="loginForm.captcha"
placeholder="验证码"
name="captcha"
tabindex="3"
auto-complete="on"
@keyup.enter.native="handleLogin"
/>
<CaptchaCanvas ref="captchaCanvas"/>
</div>
</el-form-item>
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;"
@click.native.prevent="handleLogin">登录
</el-button>
</el-form>
</div>
</template>
<script>
import CaptchaCanvas from './CaptchaCanvas.vue';
export default {
name: 'Login',
components: {
CaptchaCanvas
},
data() {
const validateUsername = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入正确的用户名'))
} else {
callback()
}
}
const validatePassword = (rule, value, callback) => {
if (value.length < 3) {
callback(new Error('密码不能少于3位'))
} else {
callback()
}
}
const validateCaptcha = (rule, value, callback) => {
if (!value) {
callback(new Error('请完成图形验证码'))
} else {
callback()
}
}
return {
captcha: '',
loginForm: {
name: '',
password: '',
captcha: '' // 新增字段用于存储图形验证码内容
},
loginRules: {
name: [{required: true, trigger: 'blur', validator: validateUsername}],
password: [{required: true, trigger: 'blur', validator: validatePassword}],
captcha: [{required: true, trigger: 'blur', validator: validateCaptcha}]
},
loading: false,
passwordType: 'password',
redirect: undefined,
allRoutes: [] // 用于存储所有路由页面
}
},
mounted() {
},
methods: {
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
const captchaText = this.$refs.captchaCanvas.getCaptchaText();
if (this.loginForm.captcha !== captchaText) {
this.$message.error('验证码错误');
return;
}
} else {
console.log('error submit!!')
return false
}
})
}
}
}
</script>
3. 验证验证码
在 handleLogin
方法中,添加对验证码的验证逻辑。这里我们增加一个条,不区分字母大小写
const captchaText = this.$refs.captchaCanvas.getCaptchaText().toLowerCase();
const userCaptcha = this.loginForm.captcha.toLowerCase();
// console.log(captchaText)
if (userCaptcha !== captchaText) {
this.$message.error('验证码错误');
return;
}
这样,你就可以在 Vue.js 项目中使用 Canvas 实现随机验证码,并进行对比验证了。点击 Canvas 可以刷新验证码,用户输入的验证码会与生成的验证码进行对比验证。