vue项目实现随机验证码效果

vue yekong

vue项目实现随机验证码效果

要在 Vue.js 项目中使用 Canvas 实现随机验证码,并进行对比验证,可以按照以下步骤进行:

  1. 创建一个 Canvas 组件:用于生成随机验证码。
  2. 在登录表单中引入 Canvas 组件:并实现点击刷新验证码的功能。
  3. 在登录逻辑中进行验证码的对比验证

以下是具体的实现步骤:

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 可以刷新验证码,用户输入的验证码会与生成的验证码进行对比验证。

喜欢