vue 生成随机验证码,数字加减 (单页面)

首先需要进入html2canvas.js

 

原来是生成海报的,改了改,改成生成验证码的了

仅供参考

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="js/public.js"></script>
        <link rel="stylesheet" href="css/style.css" />
        <script type="text/javascript" src="js/html2canvas.js"></script>
        <style>
            .haibao{position:absolute;top:0;left:0;width:4rem;z-index:0;width: 2.3rem;height: 1rem;line-height: 1rem; text-align: center;}
            .haibao span{font-size: .6rem;font-weight: bold;}
            .image{margin-top: 2rem;}
        </style>
    </head>
    <body>
        <div id="app" class="app" v-cloak>
            <p class="image">生成的图</p>
            <div class="myImage" @click="poster()" id="myImage" v-html="image"></div>

            <!-- 验证码背景 -->
            <div id="main-container" ref="container" class="haibao" :style="{'backgroundColor': colorBg}">
                <span :style="[{'color': item.color,'fontStyle':item.font}]" v-for="(item,index) in list":key="index">{{item.text}}</span>
            </div>
        </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                list: [
                    {text: '1'}, 
                    {text: '+'}, 
                    {text: '1'}, 
                    {text: '='}, 
                    {text: '?'},
                ],
                colorBg: '',
                result: '',
                image:'',
            },
            methods: {
                poster() {
                    this.image = '';
                    this.colorBg = this.colorFun();
                    this.list.forEach((item, index) => {
                        item['color'] = this.colorFun();
                        item['font'] = this.fontFun();
                        index == 0 ? item.text = this.numberFun(1) : '';
                        index == 1 ? item.text = this.operationFun(1) : '';
                        index == 2 ? item.text = this.numberFun(2) : '';
                    })
                    this.makePoster('main-container')
                },
                makePoster: function(id) { //生成验证码
                    var _this = this;
                    document.body.style.overflow = 'hidden';
                    this.$refs.container.style.pointerEvents = 'auto';
                    this.$nextTick(function() {
                        // 如正在生成时不再生成
                        if (this.isEnd) {
                            return;
                        }
                        this.isEnd = true;
                        _this.makeCode(id); //生成验证码
                    });
                },
                makeCode(id) { //生成验证码
                    this.$refs.container.style.disblock = 'block';
                    var _this = this;
                    var shareContent = document.getElementById(id); // 需要绘制的部分的 (原生)dom 对象 ,注意容器的宽度不要使用百分比,使用固定宽度,避免缩放问题
                    var width = shareContent.offsetWidth; // 获取(原生)dom 宽度
                    var height = shareContent.offsetHeight; // 获取(原生)dom 高
                    var offsetTop = shareContent.offsetTop; //元素距离顶部的偏移量
                    var canvas = document.createElement('canvas'); //创建canvas 对象
                    var context = canvas.getContext('2d');
                    var scaleBy = 2;
                    canvas.width = width * scaleBy; //这里 由于绘制的dom 为固定宽度,居中,所以没有偏移
                    canvas.height = (height + offsetTop) * scaleBy; // 注意高度问题,由于顶部有个距离所以要加上顶部的距离,解决图像高度偏移问题
                    context.scale(scaleBy, scaleBy);
                    var opts = {
                        scale: scaleBy, //添加的scale 参数
                        canvas: canvas, //自定义 canvas
                        logging: true, //日志开关,发布的时候记得改成false
                        width: width, //dom 原始宽度
                        height: height, //dom 原始高度
                        backgroundColor: "transparent",
                    };
                    html2canvas(document.querySelector('#' + id), opts).then(function(canvas) {
                        document.body.appendChild(canvas);
                        let oImg = new Image();
                        oImg.src = canvas.toDataURL("image/png"); // 导出图片
                        vm.image = '<img src="'+oImg.src+'"/>'
                        vm.isEnd = false;
                        vm.shadowHb = true;
                    });
                    this.result = eval(this.list[0].text + this.list[1].text + this.list[2].text);
                },
                colorFun() { //随机颜色
                    return `rgb(${Math.round(Math.random()*255)},${Math.round(Math.random()*255)},${Math.round(Math.random()*255)})`;
                },
                fontFun() { //随机字体样式
                    return this.randomNum(0, 1) == 0 ? 'normal' : 'italic'
                },
                randomNum(min, max) { //随机数范围
                    var range = max - min;
                    var rand = Math.random();
                    var num = min + Math.round(rand * range);
                    return num;
                },
                numberFun(type) { //随机数字
                    return type == 1 ? this.randomNum(10, 30) : this.randomNum(0, 9)
                },
                operationFun() { //随机运算符
                    return this.randomNum(0, 1) == 0 ? '+' : '-'
                }
            },
            mounted() {
                // 生成随机验证码
                this.poster();
            },
            created() {
            }
        });
    </script>

 

posted @ 2022-05-19 15:11  烂笔头~  Views(815)  Comments(0Edit  收藏  举报