纯前端图形验证

1、直接上代码,vue2封装图形验证组件

<template>
  <div class="code-container" @click="freshCode">
    <canvas id="code-canvas" :width="contentWidth" :height="contentHeight"></canvas>
  </div>
</template>
<script>
  export default {
    props: {
      //验证码范围code
      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('code-canvas')
        let ctx = canvas.getContext('2d')
        ctx.textBaseline = 'bottom'
        // 绘制背景
        // ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)
        ctx.fillStyle = 'rgb(255,247,230)'
        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 < 6; 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 < 20; 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()
        }
      },
      //点击更新时间
      freshCode(){
        this.$emit('freshCode')
      }
    },
    watch: {
      identifyCode() {
        this.drawPic()
      }
    },
    mounted() {
      this.drawPic()
    }
  }
</script>

2、应用组件

<template>
  <div>
    <el-form ref="from" :model="from" :rules="Rules">
      <el-form-item prop="code">

        <el-form-item >
          <el-input type="text" style="height: 40px" placeholder="请输入图形验证码" v-model="from.code" autocomplete="off">
            <identify @freshCode="refreshCode" slot="append" style="display: inline-block" :identifyCode="identifyCode" :contentWidth="120" :contentHeight="40"></identify>
          </el-input>
          <!--验证码组件-->
        </el-form-item>
<!--        <el-button @click="comform">验证</el-button>-->
        <el-form-item>
          <el-button size="mini" type="primary" @click="doSave('from')">确定</el-button>
        </el-form-item>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
  import Identify from "./verification";
  export default {
    name: 'numberImgVerification',
    data() {
      const validateCode = (rule, value, callback) => {
        if (this.identifyCode !== value) {
          this.from.code = "";
          this.refreshCode();
          callback(new Error("请输入正确的验证码"));
        } else {
          callback();
        }
      };
      return {
        Rules: {
          code: [
            { required: true, message: '请输入验证码', trigger: 'blur' },
            { validator: validateCode, trigger: 'blur' }
          ]
        },
        from: {},
        identifyCodes: '赵钱孙李周吴郑王ABCabc789cbv',  // 设置验证码为数字验证码,如果想要验证码为字母数字组合,可以加字母,如: identifyCodes: 'ABCD1234567890abcd'
        identifyCode: '',
      }
    },
    components: { Identify },
    mounted() {
      this.identifyCode = "";
      this.makeCode(this.identifyCodes, 5);
    },
    methods: {
      //随机生成向下取整的数字
      randomNum(min, max) {
        return Math.floor(Math.random() * (max - min) + min);
      },
      //重置验证码
      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)
            ];
        }
      },
      //验证验证码
      doSave(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {

          } else {

            return false;
          }
        });
      },
    }
  }
</script>






 3、只是简单的说一些想法问题没有啥关系。其实,如果只是用纯前端的验证的话并没有啥用处,这个还是得和后台一起验证,才能更好的达到要求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端登录图形验证码通常是使用Canvas绘制实现的。具体步骤如下: 1. 在HTML中添加一个canvas元素,设置宽度和高度。 2. 在JavaScript中获取canvas元素的引用,并获取2D上下文。 3. 使用2D上下文绘制随机生成的验证码字符串。 4. 给canvas添加点击事件,当用户点击时,检查用户输入的验证码是否正确。 5. 在服务器端生成随机的验证码字符串,并保存在Session中。当用户提交表单时,比较用户输入的验证码和Session中保存的验证码是否一致。 下面是一个简单的示例代码: HTML代码: ```html <canvas id="canvas" width="200" height="50"></canvas> <input type="text" id="code" /> <button onclick="checkCode()">提交</button> ``` JavaScript代码: ```javascript var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); // 生成随机验证码字符串 var code = generateCode(); // 绘制验证码 ctx.fillStyle = '#ccc'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.font = '30px Arial'; ctx.fillStyle = 'black'; ctx.fillText(code, 50, 35); // 点击事件 canvas.onclick = function() { if (document.getElementById('code').value.toUpperCase() === code) { alert('验证通过!'); } else { alert('验证码错误!'); } }; // 生成随机验证码字符串 function generateCode() { var code = ''; var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for (var i = 0; i < 4; i++) { code += chars[Math.floor(Math.random() * chars.length)]; } return code; } // 检查验证码 function checkCode() { if (document.getElementById('code').value.toUpperCase() === code) { alert('验证通过!'); } else { alert('验证码错误!'); } } ``` 这个例子中,我们使用Canvas绘制了一个随机字符串的验证码,并且添加了一个点击事件来检查用户输入的验证码是否正确。在实际应用中,需要将生成的验证码字符串发送到服务器端进行保存,以便在用户提交表单时进行比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值