美文网首页
vue 前端验证码组件

vue 前端验证码组件

作者: 柴东啊 | 来源:发表于2019-08-23 10:39 被阅读0次

<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) {

      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, 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, 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 前端验证码组件

      本文链接:https://www.haomeiwen.com/subject/iptprctx.html