简单的验证码功能

简介: 简单的验证码功能

当你在页面进行登录时,时不时会遇到各种登录验证问题。例如发短信验证、图形验证码等,今天就来说说图形验证码。


identify是vue的一个插件,网上提供了一个vue插件库(入口)。identify是使用canvas来生成图形验证码,使用起来非常方便,可以直接拿过来注册使用。


1.首先创建一个identify.vue文件,具体名称自己命名  


<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: 20
        },
        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: 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 < 3; 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 < 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.其次在main.js里面进行注册,这里要特别注意引用路径


import SIdentify from './components/identify' //注意引入路径
Vue.use(SIdentify)

image.png

准备工作做好之后,直接步入主题,开始肝。


HTML代码:


<el-form-item label="验证码" prop="sidentify">
        <el-input v-model="loginForm.sidentify" style="width: 50%;float: left;" autocomplete="off" placeholder="请输入右侧验证码" />
        <div class="coderight" @click="refreshCode">
          <SIdentify :identifyCode="identifyCode"></SIdentify>
        </div>
      </el-form-item>

效果图:


image.png


JS代码:


<script>
  import SIdentify from "./identify";
  export default {
    name: 'Login',
    data() {
      const sidentify = (rule, value, callback) => {
        let newVal = value.toLowerCase()
        let identifyStr = this.identifyCode.toLowerCase()
        if (newVal === '') {
          callback(new Error('请输入验证码'))
        } else if (newVal !== identifyStr) {
          callback(new Error('验证码错误'))
        } else {
          callback()
        }
      };
      return {
        identifyCodes: '1234567890ABCDEFGHIGKLMNoPQRSTUVWXYZ',//定义随机数范围
        identifyCode: '', //验证码
        loginForm: {
          sidentify: '',
        },
        rules: {
          sidentify: [{ required: true,  validator: sidentify, trigger: 'blur' }]
        },
      };
    },
    components: {
      SIdentify: SIdentify
    },
    mounted() {
      this.identifyCode = "";
      this.makeCode(this.identifyCodes, 4);
    },
    methods: {
      // 生成随机数
      randomNum(min, max) {
            return Math.floor(Math.random() * (max - min) + min)
        },
      // 生成四位随机验证码
      makeCode(o, l) {
        for (let i = 0; i < l; i++) {
          this.identifyCode += this.identifyCodes[this.randomNum(0, this.identifyCodes.length)]
        }
      },
      // 切换验证码
      refreshCode() {
        this.identifyCode = ''
        this.makeCode(this.identifyCodes, 4)
      }
    }
  }
</script>


这边的的表单检验是自己定义的,也可以通过elementUI里面的的写法来实现。


具体效果:


image.png

image.png

点击验证码图片可以进行切换,具体源码可以私信或者评论。



相关文章
|
安全 Java API
阿里云——Java实现手机短信验证码功能
通过手机短信发送验证码,是最普遍、最安全验证用户真实身份的方式。目前,短信验证码广泛应用于用户注册、密码找回、登录保护、身份认证、随机密码、交易确认等应用场景。本文通过调用API开发一个短信验证码为例,带您了解如何实现短信验证码功能。
5649 5
阿里云——Java实现手机短信验证码功能
|
8月前
|
安全 机器人 PHP
在线行为验证码推荐
想要保护您的网站免受恶意攻击?不妨考虑一款免费行为验证插件。该插件基于用户的行为模式进行验证,可有效区分真实用户和机器人。其中,滑动拼图是一种常见的在线行为验证方式,能够增加验证的难度,提高网站的安全性。通过使用这款免费插件,您可以为您的网站添加一道可靠的安全防线。
|
8月前
|
缓存 前端开发 NoSQL
南南的文章-验证码还能这样生成?
南南的文章-验证码还能这样生成?
59 0
南南的文章-验证码还能这样生成?
|
10月前
|
缓存 JavaScript 安全
|
机器学习/深度学习 人工智能 前端开发
关于验证码,你不知道的一些问题!
关于验证码,大家也许会有很多疑问,下面我总结了一些常见问题。
关于验证码,你不知道的一些问题!
|
JavaScript 开发工具
同一页面生成多个验证码
一个页面需要两个验证码,使用同一个验证码调用两次会导致有前一个失效。那么我们需要创建不同的两个验证码,分别做验证。
同一页面生成多个验证码
|
安全 前端开发 定位技术
推荐一个非常好的行为验证码项目!
KgCaptcha 结合了设备指纹、行为特征、访问频率、地理位置等多项技术,有效的拦截恶意登录、批量注册,阻断机器操作,拦截非正常用户。较传统验证码相比,用户无需再经过思考或输入操作,只需轻轻一滑即可进行验证。
推荐一个非常好的行为验证码项目!
|
Java Spring
网站验证码的设计与实现
网站验证码的设计与实现
|
JavaScript Java
实现登录时进行校验验证码的功能
JavaEE中,实现登录时进行校验验证码的功能(图文并茂!!!)
实现登录时进行校验验证码的功能
|
Java 开发者
登录功能之添加验证码|学习笔记
快速学习登录功能之添加验证码
133 0
登录功能之添加验证码|学习笔记

热门文章

最新文章