首页 > 其他分享 >vue2 验证码

vue2 验证码

时间:2024-11-19 16:56:59浏览次数:1  
标签:vue2 default 验证码 randomNum width window let context

StaticVerify.vue

<template>
    <canvas ref="canvasRef" class="verify" :width="width" :height="height" @click="drawCode"></canvas>
</template>

<script>
export default {
    props: {
        // 加减计算最小值
        min: {
            type: Number,
            default: 0
        },
        // 加减计算最大值
        max: {
            type: Number,
            default: 9
        },
        // 验证码图片的宽高
        width: {
            type: Number,
            default: 160
        },
        height: {
            type: Number,
            default: 60
        },
        // 验证码的类型
        verifyType: {
            type: String,
            default: 'default',
            validator: (val) => {
                // default数字和小写字母混合
                // cal   两个数加减
                return ['default','cal'].includes(val);
            }
        },
        // 字母字符串的长度
        strLength: {
            type: Number,
            default: 5
        },
        // 背景色
        bg: {
            type: String,
            default: '#ffffff'
        }
    },
    data() {
        return {
            // 操作符号  只计算加减
            operator: [1,-1],
            // code集合
            codeList: [0,1,2,3,4,5,6,7,8,9,'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'],
            // 结果
            result: undefined
        };
    },
    mounted() {
        this.drawCode();
        this.adjustWindow(this.$refs.canvasRef);
    },
    methods: {
        // 绘制验证码
        drawCode() {
            // 获取对象
            let canvas = this.$refs.canvasRef;
            // 创建画布环境
            let context = canvas.getContext('2d');
            context.clearRect(0,0,this.width,this.height);
            // 绘制背景
            context.fillStyle = this.bg;
            // 清空画布
            context.fillRect(0,0,this.width,this.height);
            // 绘制80个点
            for(let i = 0;i < 80;i++) {
                this.drawPoint(context);
            }
            // 绘制内容
            context.strokeStyle = this.randColor();
            // 文字大小为高的一半,并随即加减-5~10
            let fontSize = parseInt(this.height / 2) + this.randomNum(-5,10);
            // 字体
            context.font = `${fontSize}px 楷体`;
            // 文字内容
            let textContent = this.createContent();
            // 计算文字偏移量
            let textX = parseInt((this.width - context.measureText(textContent).width) / 2) ;

            // 设置文字旋转
            let angle = this.randomNum(-8,8);
            context.rotate(Math.PI / 180 * -angle);
            context.strokeText(textContent, textX, parseInt(this.height / 1.5));
            context.rotate(Math.PI / 180 * angle);

            // 向父组件返回结果
            this.$emit('get-result',this.result);
        },
        // 绘制点
        drawPoint(context) {
            // 获取点的随机颜色
            context.fillStyle = this.randColor();
            context.beginPath();
            // 生成随机圆心
            let x = this.randomNum(0,this.width);
            let y = this.randomNum(0,this.height);
            // 生成随机半径
            let r = Math.random();
            // 生成圆环
            context.arc(x,y,r,0,Math.PI * 2,true);
            context.closePath();
            // 填充圆
            context.fill();
        },
        // 生成绘制内容
        createContent() {
            let str = '';
            // 判断类型
            if(this.verifyType == 'default') {
                // 绘制文字和数字的组合
                for(let i = 0;i < this.strLength;i++) {
                    let i = this.randomNum(0,35);
                    str += this.codeList[i] + ' ';
                }
                this.result = str;
            }else{
                // 加减
                let num1 = this.randomNum(this.min,this.max);
                let num2 = this.randomNum(this.min,this.max);
                let op = this.operator[this.randomNum(0,1)];
                // 计算结果
                this.result = num1 + op * num2;
                str = num1 + (op > 0 ? ' + ' : ' - ') + num2 + ' = ?';
            }
            //
            return str;
        },
        // 生成从minNum到maxNum的随机数
        randomNum(minNum,maxNum) {
            switch(arguments.length) {
                case 1:
                    return parseInt(Math.random() * minNum + 1,10);
                case 2:
                    return parseInt(Math.random() * (maxNum - minNum + 1) + minNum,10);
                default:
                    return 0;
            }
        },
        // 生成随机颜色
        randColor() {
            let r = this.randomNum(255);
            let g = this.randomNum(255);
            let b = this.randomNum(255);
            return `rgb(${r},${g},${b})`;
        },
        adjustWindow (dom) {
            // 获取屏幕参数
            let screen = window.screen;
            // 屏幕比例
            let screenZoom = screen.width / 1920;
            // 窗口比例
            let windowZoom = window.innerWidth / window.outerWidth;
            // 这里要考虑浏览器是否全屏的
            if(screen.width > window.outerWidth) {
                // 此时浏览器非全屏
                windowZoom = window.outerWidth / screen.width;
            }
            // 保留3位小数
            let zoom = parseFloat((screenZoom * windowZoom).toFixed(3));
            // 改变dom的style
            dom.style.zoom = zoom;


            // 监听窗口的变化
            window.addEventListener('resize', () => {
                // 屏幕比例
                screenZoom = screen.width / 1920;
                // 窗口比例
                windowZoom = window.innerWidth / window.outerWidth;
                // 这里要考虑浏览器是否全屏的
                if(screen.width > window.outerWidth) {
                    // 此时浏览器非全屏
                    windowZoom = window.outerWidth / screen.width;
                }
                // 保留三位小数
                zoom = parseFloat((screenZoom * windowZoom).toFixed(3));
                // 改变dom的style
                dom.style.zoom = zoom;
            });
        }
    }
};
</script>

<!-- <style scoped lang="scss">
.verify{
  cursor:pointer;
}
</style> -->

 

 

<template>
    <div>
        <static-verify :width="160" :strLength="4" @get-result="handleResult"></static-verify>
        <el-button type="primary" @click="refreshC">刷新</el-button>
        <p>接收到的结果: {{ receivedResult }}</p>
    </div>

</template>

<script>

import StaticVerify from '../../components/StaticVerify.vue'
export default {
    components: { StaticVerify },
    data() {
        return {
            receivedResult: '',
            verifyType: 'default',
            strLength: 4,
            bg: '#ffffff',
            width: 150,
            height: 60,
            // 操作符号  只计算加减
            operator: [1, -1],
            // code集合
            codeList: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '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'],
            // 结果
            result: undefined
        };
    },
    mounted() {
    },
    methods: {
        handleResult(result) {
            // 处理从子组件接收到的结果
            this.receivedResult = result;
        },
        refreshC() {
            console.log('refresh')
        }
    }
};
</script>

 

标签:vue2,default,验证码,randomNum,width,window,let,context
From: https://www.cnblogs.com/uoky/p/18555190

相关文章

  • 移动端Vue2实现文件图片上传功能
    基于Vue2 +Vant2组件库实现:废话不多说,直接看代码:主要代码:methods:{//上传图片之前的操作beforeRead(file){letarr=file.name.split('.');letfileType='.'+arr[arr.length-1].toLowerCase();con......
  • vue2-组件化编程
    模块:向外提供特定功能的js呈现组件:用来实现局部(特定)功能效果的代码集合模块化:当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用组件化:当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用编写组件-非单文件组件非单文件组......
  • 【验证码逆向专栏】vaptcha 手势验证码逆向分析
    逆向目标目标:vaptcha手势验证码网站:aHR0cHM6Ly93d3cudmFwdGNoYS5jb20vI2RlbW8=抓包分析抓包分析,首先是vaptcha-demo接口:这个接口返回了验证码类型,其中embed的值就是嵌入式点击验证码,其他三个分别对应三种类型。再看下面这个接口:目前猜测是请求或配置某些静态资源。......
  • vue2-基础核心
    vue简介vue中文官网动态构建用户界面的渐进式JavaScript框架vue的特点:遵循MVVM模式采用组件化模式,提高代码复用率,让代码更好维护声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高本身只关注UI,也可以引入其他三方库开发项目使用虚拟DOM+优秀的Diff算......
  • 10分钟入门vue2!!
    概念:Vue是用于构建用户界面的渐进式(就是学一点就能够用一点)框架,总的来说,就是基于数据来构建用户页面,以便于用户看懂。Vue的两种使用方式:1.核心包开发2.核心包加插件加工程化开发1.Vue的基础语法1.创建第一个Vue实例准备容器div引包<scriptsrc="https://cdn.jsdelivr.......
  • 基于YOLO实现滑块验证码破解
    申明:本案例中的思路和技术仅用于学习交流。请勿用于非法行为。一、训练模型详细训练步骤和导出模型参考滑块验证码识别模型训练二、模型试用通过YoloDotNet运行模型,计算出滑块缺口位置后用RESTful格式的接口返回坐标给其它应用调用。YoloDotNet案例参考 物体检测框架YoloDot......
  • 手机验证码漏洞挖掘(任意手机号注册,任意用户密码重置等等)
    一.短信验证码爆破漏洞挖掘1.漏洞原理服务端未对验证时间,次数做出限制,存在爆破的可能性。简单的系统可以直接爆破,但做过一些防护的系统还得进行一些绕过进行爆破。对与4位验证码:0000~9999的10000次,五分钟之内。对于6位验证码:1000000位,五分钟之内跑不完。2.爆破方法(没有次......
  • 使用 Tcl 实现滑动验证码识别
    滑动验证码是一种常见的验证方式,用于验证用户操作的真实性。以下是使用Tcl实现滑动验证码识别的简单示例。功能概述程序的主要功能包括:读取滑动验证码的图片。分析滑块与缺口位置。模拟滑块移动,完成验证。代码实现tcl引入必要的库packagerequireImgpackagerequire......
  • 使用 Chapel 实现滑动验证码识别
    滑动验证码识别是一种基于图像处理的技术,用于识别滑块的缺口位置。本篇文章将演示如何使用Chapel语言实现一个简单的滑动验证码识别程序。Chapel简介Chapel是一种并行编程语言,适合数据密集型计算任务。我们可以利用其强大的数组和数据处理能力完成图像分析。环境准备安装Ch......
  • 使用 Neko 编程语言实现简单的滑动验证码识别
    滑动验证码是一种常见的安全验证方式,要求用户将图块拖动到正确位置。本文将使用Neko编程语言实现一个简单的滑动验证码识别程序,通过基本的图像处理技术自动识别图块匹配位置。实现步骤加载图片:使用Neko的图像处理库加载滑块和背景图片。图像预处理:转换为灰度图并进行边缘......