【验证码功能】vue简单实现验证码功能,纯前端实现验证码,拿来即用

效果图

可以让输入的验证码和图片验证码比对。
在这里插入图片描述
在这里插入图片描述
上面的是验证码的组件,直接复制贴里面就行了,然后引入到你需要的地方
在这里插入图片描述
很简单的两个步骤搞定

(1)验证码组件

这里是验证码的组件,啥也不用动,直接复制创建个文件贴进去。然后去你要用的地方引入

<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: 35,
    },
    backgroundColorMin: {
    
    
      // 验证码图片背景色最小值
      type: Number,
      default: 200,
    },
    backgroundColorMax: {
    
    
      // 验证码图片背景色最大值
      type: Number,
      default: 220,
    },
    dotColorMin: {
    
    
      // 背景干扰点最小值
      type: Number,
      default: 60,
    },
    dotColorMax: {
    
    
      // 背景干扰点最大值
      type: Number,
      default: 120,
    },
    contentWidth: {
    
    
      // 容器宽度
      type: Number,
      default: 90,
    },
    contentHeight: {
    
    
      // 容器高度
      type: Number,
      default: 38,
    },
  },
  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");
      //创建一个2D对象作为上下文。
      let ctx = canvas.getContext("2d");
      ctx.textBaseline = "bottom";
      // 绘制背景
      ctx.fillStyle = "#e6ecfd";
      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(50, 160); // 随机生成字体颜色
      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(-30, 30);
      // 修改坐标原点和旋转角度
      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 < 4; i++) {
    
    
        ctx.strokeStyle = this.randomColor(100, 200);
        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 < 30; 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>

(2)使用组件

在这里就是直接引入组件,然后把组件放到对应的位置就行了。参数看需要传

<template>
  <div class="home">
    <el-row>
      <el-col :span="4"
        ><el-input
          placeholder="请输入验证码"
          v-model="formLogin.code"
        ></el-input
      ></el-col>
      <el-col :span="4">
        <div class="login-code" width="100%" @click="refreshCode">
          <!--验证码组件-->
          <dentify :identifyCode="identifyCode"></dentify></div
      ></el-col>
    </el-row>
    <div><el-button @click="submit">提交</el-button></div>
  </div>
</template>

<script>
import dentify from "./dentify";
export default {
    
    
  name: "HomeView",
  components: {
    
    
    dentify,
  },
  data() {
    
    
    return {
    
    
      // 表单提交内容
      formLogin: {
    
    
        code: "", //验证码输入框
      },
      identifyCodes: "1234567890abcdefjhijklinopqrsduvwxyz", //随机串内容,从这里随机抽几个显示验证码
      identifyCode: "", //验证码图片内容
    };
  },
  mounted() {
    
    
    // 初始化验证码
    this.identifyCode = "";
    //参数:(1)随机串内容。(2)验证码显示位数
    this.makeCode(this.identifyCodes, 4);
  },
  methods: {
    
    
    // 重置验证码
    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)];
      }
    },
    //随机数字:用于当角标拿字符串的值
    randomNum(min, max) {
    
    
      return Math.floor(Math.random() * (max - min) + min);
    },
    submit() {
    
    
      console.log("验证码:", this.identifyCode);
      console.log("用户输入的验证码:",this.formLogin.code);
      console.log('是否验证通过:',this.identifyCode==this.formLogin.code);
    },
  },
};
</script>

猜你喜欢

转载自blog.csdn.net/seeeeeeeeeee/article/details/125522846