Vue實(shí)戰(zhàn)之生成隨機(jī)驗(yàn)證碼

近期正在學(xué)習(xí)Vue量窘,做項(xiàng)目時(shí)遇到此功能荐捻,故做此記錄潘明,供大家參考交流辐棒。

效果展示

效果圖

安裝插件

下載identify插件病曾,輸入如下命令:

npm i identify

創(chuàng)建組件

在components目錄新建一個(gè)vue組件,例如:SIdentify.vue
源碼如下:

<template>
  <!-- 圖形驗(yàn)證碼 -->
  <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: 35
    },
    fontSizeMax: {
      type: Number,
      default: 35
    },
    backgroundColorMin: {
      type: Number,
      default: 180
    },
    backgroundColorMax: {
      type: Number,
      default: 240
    },
    colorMin: {
      type: Number,
      default: 50
    },
    colorMax: {
      type: Number,
      default: 160
    },
    lineColorMin: {
      type: Number,
      default: 100
    },
    lineColorMax: {
      type: Number,
      default: 200
    },
    dotColorMin: {
      type: Number,
      default: 0
    },
    dotColorMax: {
      type: Number,
      default: 255
    },
    contentWidth: {
      type: Number,
      default: 120
    },
    contentHeight: {
      type: Number,
      default: 40
    }
  },
  methods: {
    // 生成一個(gè)隨機(jī)數(shù)
    randomNum(min, max) {
      return Math.floor(Math.random() * (max - min) + min);
    },
    // 生成一個(gè)隨機(jī)的顏色
    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 + ")";
    },
    transparent() {
      return "rgb(255,255,255)";
    },
    drawPic() {
      let canvas = document.getElementById("s-canvas");
      let ctx = canvas.getContext("2d");
      ctx.textBaseline = "bottom";
      // 繪制背景
      ctx.fillStyle = this.randomColor(
        this.backgroundColorMin,
        this.backgroundColorMax
      );
      ctx.fillStyle = this.transparent();
      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(-10, 10);
      // 修改坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度
      ctx.translate(x, y);
      ctx.rotate((deg * Math.PI) / 180);
      ctx.fillText(txt, 0, 0);
      // 恢復(fù)坐標(biāo)原點(diǎn)和旋轉(zhuǎn)角度
      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) {
      // 繪制干擾點(diǎn)
      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>

引用該組件

<template>
<div class="get-code" @click="refreshCode()">
    <s-identify :identifyCode="identifyCode"></s-identify>
</div>
</template>
<script>
    import SIdentify from "@/components/SIdentify.vue";
    export default {
        components: { SIdentify },
        data() {
           return {
                identifyCode: "",
                identifyCodes: "0123456789abcdwerwshdjeJKDHRJHKOOPLMKQ", //隨便
            }
        },
        methods: {            
           refreshCode() {
             this.identifyCode = "";
             this.makeCode(this.identifyCodes,4);
           },
           randomNum (min, max) {
             max = max + 1
             return Math.floor(Math.random() * (max - min) + min)
           },
           // 隨機(jī)生成驗(yàn)證碼字符串
           makeCode (data, len) {
             for (let i = 0; i < len; i++) {
             this.identifyCode += data[this.randomNum(0, data.length - 1)]
           }
        }
    }
</script>

補(bǔ)充

如果想要簡潔的背景可去掉如下


簡單背景

效果如下:


效果

文章來源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾根,一起剝皮案震驚了整個(gè)濱河市知态,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立叛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡茅,死亡現(xiàn)場離奇詭異秘蛇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顶考,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門赁还,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驹沿,你說我怎么就攤上這事艘策。” “怎么了渊季?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵朋蔫,是天一觀的道長罚渐。 經(jīng)常有香客問我,道長驯妄,這世上最難降的妖魔是什么荷并? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮青扔,結(jié)果婚禮上源织,老公的妹妹穿的比我還像新娘。我一直安慰自己微猖,他們只是感情好谈息,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凛剥,像睡著了一般侠仇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上当悔,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天傅瞻,我揣著相機(jī)與錄音,去河邊找鬼盲憎。 笑死嗅骄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饼疙。 我是一名探鬼主播溺森,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窑眯!你這毒婦竟也來了屏积?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磅甩,失蹤者是張志新(化名)和其女友劉穎炊林,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卷要,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渣聚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僧叉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕枝。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓶堕,靈堂內(nèi)的尸體忽然破棺而出隘道,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布谭梗,位于F島的核電站忘晤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏默辨。R本人自食惡果不足惜德频,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩幸。 院中可真熱鬧壹置,春花似錦、人聲如沸表谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爆办。三九已至难咕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間距辆,已是汗流浹背余佃。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跨算,地道東北人爆土。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像诸蚕,于是被迫代替她去往敵國和親步势。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容