首页 > 其他分享 >vue2动态生成(绘制)图形验证码(验证码图片)

vue2动态生成(绘制)图形验证码(验证码图片)

时间:2024-09-12 17:25:13浏览次数:11  
标签:canvas code 验证码 verifyCode vue2 var 绘制 options

 

方案1:js绘制条形验证码

 

参考文档:https://blog.csdn.net/LOVE_mingjing/article/details/130622848

 

utils文件夹下新建GVerify.js文件:

function GVerify(options) {
  // 创建一个图形验证码对象,接收options对象为参数
  this.options = {
    // 默认options参数值
    id: "", // 容器Id
    canvasId: "verifyCanvas", // canvas的ID
    width: "80", // 默认canvas宽度
    height: "30", // 默认canvas高度
    type: "blend", // 图形验证码默认类型 blend:数字字母混合类型、number:纯数字、letter:纯字母
    code: "",
  };

  if (Object.prototype.toString.call(options) === "[object Object]") {
    // 判断传入参数类型
    for (var i in options) {
      // 根据传入的参数,修改默认参数值
      this.options[i] = options[i];
    }
  } else {
    this.options.id = options;
  }

  this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
  this.options.letterArr = getAllLetter();

  this._init();
  this.refresh();
}

GVerify.prototype = {
  /** 版本号**/
  version: "1.0.0",

  /** 初始化方法**/
  _init: function () {
    var con = document.getElementById(this.options.id);
    var canvas = document.createElement("canvas");
    this.options.width = "140";
    this.options.height = "56";
    canvas.id = this.options.canvasId;
    canvas.width = this.options.width;
    canvas.height = this.options.height;
    canvas.style.cursor = "pointer";
    canvas.innerHTML = "浏览器不支持canvas";
    con.appendChild(canvas);
    var parent = this;
    canvas.onclick = function () {
      parent.refresh();
    };
  },

  /** 生成验证码**/
  refresh: function () {
    var canvas = document.getElementById(this.options.canvasId);
    if (canvas.getContext) {
      var ctx = canvas.getContext("2d");
    }
    ctx.textBaseline = "middle";

    ctx.fillStyle = randomColor(180, 240);
    ctx.fillRect(0, 0, this.options.width, this.options.height);

    if (this.options.type === "blend") {
      // 判断验证码类型
      var txtArr = this.options.numArr.concat(this.options.letterArr);
    } else if (this.options.type === "number") {
      var txtArr = this.options.numArr;
    } else {
      var txtArr = this.options.letterArr;
    }

    for (var i = 1; i <= 4; i++) {
      var txt = txtArr[randomNum(0, txtArr.length)];
      this.options.code += txt;
      ctx.font =
        randomNum(this.options.height / 2, this.options.height) + "px SimHei"; // 随机生成字体大小
      ctx.fillStyle = randomColor(50, 160); // 随机生成字体颜色
      ctx.shadowOffsetX = randomNum(-3, 3);
      ctx.shadowOffsetY = randomNum(-3, 3);
      ctx.shadowBlur = randomNum(-3, 3);
      ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
      var x = (this.options.width / 5) * i;
      var y = this.options.height / 2;
      var deg = 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);
    }
    /** 绘制干扰线**/
    for (var i = 0; i < 4; i++) {
      ctx.strokeStyle = randomColor(40, 180);
      ctx.beginPath();
      ctx.moveTo(
        randomNum(0, this.options.width),
        randomNum(0, this.options.height)
      );
      ctx.lineTo(
        randomNum(0, this.options.width),
        randomNum(0, this.options.height)
      );
      ctx.stroke();
    }
    /** 绘制干扰点**/
    for (var i = 0; i < this.options.width / 4; i++) {
      ctx.fillStyle = randomColor(0, 255);
      ctx.beginPath();
      ctx.arc(
        randomNum(0, this.options.width),
        randomNum(0, this.options.height),
        1,
        0,
        2 * Math.PI
      );
      ctx.fill();
    }
  },

  /** 验证验证码**/
  validate: function (code) {
    var code = code.toLowerCase();
    var v_code = this.options.code.toLowerCase();
    if (code == v_code) {
      return true;
    } else {
      return false;
    }
  },
};
/** 生成字母数组**/
function getAllLetter() {
  var letterStr =
    "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
  return letterStr.split(",");
}
/** 生成一个随机数**/
function randomNum(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}
/** 生成一个随机色**/
function randomColor(min, max) {
  var r = randomNum(min, max);
  var g = randomNum(min, max);
  var b = randomNum(min, max);
  return "rgb(" + r + "," + g + "," + b + ")";
}

export { GVerify };

  

可以手动修改内容类型、长度等等,支持手动刷新

 

使用方式:

1.组件中自行配置样式:

  <div :class="$style.verifyBox" v-show="verifyVisible">
              <input
                type="text"
                maxlength="4"
                :class="[$style.verifyInput]"
                v-model="userCode"
              />
              <div id="v_container" @click="btncode"></div>
              <button @click="xxxxVerifyCode">提交</button>
            </div>

  

2.引入文件:

import { GVerify } from "@/utils/GVerify.js";


  data() {
    return {
      verifyCode: "",
      imgData: "", // 验证码
      userCode: "", // 用户填写的动态验证码
    };
  },

  

3.methods中配置刷新与校验的方法:

    // 获取动态验证码
    btncode() {
      this.imgData = this.verifyCode.options.code.substring(
        this.verifyCode.options.code.length - 4
      );
    },
    // 校验动态验证码
    xxxxVerifyCode() {
      var userCode = this.userCode.toLowerCase();
      var v_code = this.verifyCode.options.code.toLowerCase();
      if(userCode === v_code){
        alert('duile')
      }
    },

  

4.mounted或逻辑中调用:

          this.verifyCode = new GVerify("v_container");
          this.imgData = this.verifyCode.options.code;
          this.verifyVisible = true;

  

效果:

 

 

方案2:使用插件vue2-verify

 

参考文档(随便找的,网上很多大佬分享):https://blog.csdn.net/q2724338648/article/details/134488798

 

此插件提供了5种验证码样式,有最常见的图形验证码,还有滑动验证码、拼图验证码、计算验证码、填块验证码,样式可以自行覆盖,封装较完善

效果:

 

使用方法:

【这里用了普通条形验证码,其余4种文档中有列出参数】

 

1.npm引入插件:

npm i vue2-verify

 

2.组件中调用:

<verify
                @success="onVerifySuccess"
                @error="onVerifyError"
                :type="1"
                :codeLength="4"
              ></verify>

  

3.文件中引入:

import Verify from "vue2-verify";
  data() {
    return {
      verifyVisible: false,
    };
  },
components: { Verify, },

  

4.methoed中配置校验方法即可:

    onVerifySuccess(obj) {
      //验证码正确回调
      setTimeout(() => {
        this.verifyVisible = false;
        this.onClick(this.verifyCode);
      }, 300);
    },
    onVerifyError(obj) {
      //验证码错误回调
      console.log("verify error");
      //错误刷新验证码
      obj.refresh();
    },

  

p.s.不过滑块验证体验稍微有些不好,遂放弃使用

 

标签:canvas,code,验证码,verifyCode,vue2,var,绘制,options
From: https://www.cnblogs.com/nangras/p/18410679

相关文章

  • python利用matplot绘制横向条形图,并调整每个条形的位置
    通过color_x和t_x控制每个条形的颜色和文本,draw_mybar里的y和left可以控制条形显示的位置。importmatplotlib.pyplotaspltimportnumpyasnp#数据设置categories=["A","B","C","D"]color_1="#9dc3e4"color_2="#f8cbbd"color_3=......
  • PbootCMS如何取消后台、留言、自定义表单验证码
    取消PBootCMS后台、留言、自定义表单的验证码是一个相对直接的过程。如果你想要取消这些地方的验证码,可以按照以下步骤操作:登录后台:使用管理员账号登录PBootCMS的后台管理系统。进入全局配置:在后台管理界面中,找到“全局配置”或类似的设置入口。找到安全配置:在......
  • 前端vue2 常用的函数
    1、在el-menu开启路由模式,default-active使用动态值等于当前路由,就需要用:default-active="$route.path" 2、阿里巴巴矢量图icfont的使用 ①将自己需要的图标下载到矢量库对应的项目文件中 ②更新对应的css代码,点击css代码链接,更新到本地去 ③使用<iclass="iconfont......
  • 手搓一个验证码
    importioimportosimportstringfromrandomimportchoice,randrange,samplefromPILimportImage,ImageDraw,ImageFontdefgenerate_captcha():img_width=58img_height=30font_size=16font_color=["black","dark......
  • vue2+swiper 纵向弧形滚动效果
    很垃圾的弧形轮播效果,其实不算弧形,只是一个爬坡效果,最终否了但保留一下配置项的代码。。方案1:swiperOptions:{direction:"vertical",spaceBetween:-80,slidesPerView:5,loop:true,centeredSlides:true,//当前的activesl......
  • 《JavaEE进阶》----14.<SpringMVC配置文件实践之【验证码项目】>
    本篇博客介绍的是Google的开源项目Kaptcha来实现的验证码。这种是最简单的验证码。也是很常见的一种验证码。可以去看项目结果展示。就可以明白这个项目了。前言:随着安全性的要求越来越高、很多项目都使用了验证码。如今验证码的形式也是有许许多多、更复杂的图形验证码......
  • Springboot使用kaptcha生成验证码
    <dependency><groupId>com.youkol.support.kaptcha</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>importcom.google.code......
  • Origin2024中绘制多因子分组柱状图,直观展示不同组别内的数据变化!
    当我们需要对比多组平行数据时,采用Origin多因子分组柱状图,不仅可以直接的对比多组数据,同时还能够直观展示各个指标因子的数据变化及趋势操作步骤:1、先打开Origin2024软件,然后在Book1中输入如下示例数据: 2、第一步,绘制分组柱形图图表,选中所有数据:3、点击菜单栏中【绘图】......
  • (5-1)绘制饼状图:绘制基本的饼状图(绘制简易的饼状图+修饰饼状图+突出显示某个饼状图的部
    饼状图常用于数据统计和分析领域,通常分为2D与3D饼状图。饼状图显示一个数据系列(数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。在现实应用中,经常使用饼状图来展示数据分析的结果,这样可以更加直观的展示数据分析结果。在本节的内容中,将详细讲解使用Python绘制......
  • 抛物线绘制 代码 ForceMode.VelocityChange,这种模式,忽略质量变化的影响 , 质量默认为1
    publicLineRenderer线渲染器;publicVector3[]线的点们=newVector3[60];publicTransform发射点;publicfloat力度=10;publicfloat细分长度=.02f;publicGameObject子弹;voidUpdate(){for(intfFor=0;fFor<线的点们.Length;f......