当前位置: 首页 > news >正文

随机验证码vue实现,登录验证码随机验证码数字和字母类型的

1、组件

<!--loginCode登录验证码组件-->

<template>

  <canvas id="canvasCode" :width="contentWidth" :height="contentHeight" />

</template>

<script>

export default {

  name: 'LoginCode',

  props: {

    identifyCode: {

      type: String,

      default: '6834'

    },

    fontSizeMin: {

      type: Number,

      default: 20

    },

    fontSizeMax: {

      type: Number,

      default: 38

    },

    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: 110

    },

    contentHeight: {

      type: Number,

      default: 46

    }

  },

  watch: {

    identifyCode() {

      this.drawPic()

    }

  },

  mounted() {

    this.drawPic()

  },

  methods: {

    // 生成一个随机数

    randomNum(min, max) {

      return Math.floor(Math.random() * (max - min) + min)

    },

    // 生成一个随机的颜色

    randomColor(min, max) {

      const r = this.randomNum(min, max)

      const g = this.randomNum(min, max)

      const b = this.randomNum(min, max)

      return 'rgb(' + r + ',' + g + ',' + b + ',' + '0.7' + ')'

    },

    drawPic() {

      const canvas = document.getElementById('canvasCode')

      const 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'

      const x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))

      const 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 < 8; 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 < 100; 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()

      }

    }

  }

}

</script>


2、登录页面上使用

data里面定义值

     identifyCodeType: 'abcdefghuiokvbnm1234567890', // 定义验证类型 1.数字 2.字母

      identifyCode: '',

      inputCode: '', // text框输入的验证码

// 导入组件

import loginCode from '@/components/loginCode.vue'

 <el-form-item prop="username" style="position: relative;">

                <!-- <span class="el-icon-document" style="font-size:20px;color:#A7A7A7;z-index:1;position: absolute;top:29%;" /> -->

                <span class="svg-container">

                  <svg-icon icon-class="login-user1" class="svg-icon" />

                </span>

                <el-input

                  v-model="inputCode"

                  style="width: 305px"

                  type="text"

                  placeholder="请输入您的验证码"

                />

                <div style="position: absolute;top:2px;right:0px" @click="refreshCode()">

                  <loginCode :identify-code="identifyCode" />

                </div>

                <!-- <div style="display: flex; align-items: center; justify-content: center"> -->

                <!-- <span>验证码:</span> -->

                <!--   <el-input

                    v-model="inputCode"

                    style="width: 180px"

                    type="text"

                    placeholder="请输入您的验证码"

                  /> -->

                <!--  <div @click="refreshCode()">

                    <loginCode :identify-code="identifyCode" />

                  </div> -->

                <!-- </div> -->

              </el-form-item>

 mounted() {

    this.refreshCode()

  },

 // 验证码规则

    getSubmitData() {

      if (this.inputCode === '') {

        alert('请输入验证码')

        return

      }

      if (this.identifyCode !== this.inputCode) {

        this.inputCode = ''

        this.refreshCode()

        alert('请输入正确的验证码!')

        return

      } else {

        this.$message({

          message: '验证成功',

          type: 'success'

        })

      }

    },

    // 验证码

    randomNum(min, max) {

      return Math.floor(Math.random() * (max - min) + min)

    },

    // 初始化验证码

    refreshCode() {

      this.identifyCode = '' // 输入框置空

      this.makeCode(this.identifyCodeType, 4) // 验证码长度为4

    },

    // 随机切换验证码

    makeCode(o, l) {

      for (let i = 0; i < l; i++) {

        this.identifyCode +=

          this.identifyCodeType[

            this.randomNum(0, this.identifyCodeType.length)

          ]

      }

      console.log(this.identifyCode)

    },

验证码校验和登录合并

handleLogin() {

      // 验证码校验

      if (this.inputCode === '') {

        alert('请输入验证码')

        return

      }

      if (this.identifyCode !== this.inputCode) {

        this.inputCode = ''

        this.refreshCode()

        alert('请输入正确的验证码!')

        return

      } else {

        this.$message({

          message: '验证成功',

          type: 'success'

        })

      }

相关文章:

随机验证码vue实现,登录验证码随机验证码数字和字母类型的

1、组件 <!--loginCode登录验证码组件--> <template> <canvas id"canvasCode" :width"contentWidth" :height"contentHeight" /> </template> <script> export default { name: LoginCode, props: { identif…...

xlrd与xlwt操作Excel文件详解

Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。下面是各个模块的支持情况&#xff1a; .xls.xlsx获取文件内容写入数据修改文件内容保存样式调整插入图片xlrd√√√xlwt√√√√√xlutils√√√√xlwings√√√√√…...

A Survey of Embodied AI: From Simulators to Research Tasks 论文阅读

论文信息&#xff1a; 题目&#xff1a;A Survey of Embodied AI: From Simulators to Research Tasks 作者&#xff1a;Jiafei Duan, Samson Yu 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 通过评估当前的九个具体人工智能模拟器与我们提出的七个功能&#xff0…...

spark-sql数据重复之File Output Committer问题

前言 我们先来回顾下之前介绍过的三种Committer&#xff1a;FileOutputCommitter V1、FileOutputCommitter V2、S3A Committer&#xff0c;其基本代表了整体的演进趋势。 核心代码讲解详细参照&#xff1a;Spark CommitCoordinator 保证数据一致性 OutputCommitter commitTask…...

面试热题(前中序遍历构建树)

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 题目中是给定两个数组&#xff0c;一个是存放这颗树的前序遍历的数组&#xff0c;一个是存放这棵树的…...

美术:贴图

游戏模型制作流程&#xff0c;SP和BP根据情况来选择软件对UV进行处理 3Dmax 制作模型和动画&#xff08;橘肉&#xff09;RizomUV 对模型进行展UV&#xff08;橘皮&#xff09;Substance Painter 纹理手绘&#xff08;给橘皮制定想要的皮肤&#xff09;BodyPaint 3D 纹理手绘&a…...

[MAUI]模仿微信“按住-说话”的交互实现

今天使用这个控件&#xff0c;做一个模仿微信“按住-说话”的小功能&#xff0c;最终效果如下&#xff1a; 使用.NET MAUI实现跨平台支持&#xff0c;本项目可运行于Android、iOS平台。 创建页面布局 新建.NET MAUI项目&#xff0c;命名HoldAndSpeak MainPage.xaml中创建一个…...

windows开机运行jar

windows开机自启动jar包&#xff1a; 一、保存bat批处理文件 echo off %1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit java -jar E:\projects\ruoyi-admin.jar > E:\server.log 2>&1 &…...

使用DockerFile一键创建自定义linux开发环境

1&#xff0c;使用dcokerfile文件构建镜像&#xff0c;参考如下文件 # 使用ubuntu:20.04镜像作为基础 FROM ubuntu:20.04# 调整时区 ENV DEBIAN_FRONTENDnoninteractive TZAsia/Shanghai# build参数 ARG userxiang usergroupduo# 设置默认工作路径 WORKDIR /home/${user}# 拷贝…...

“深入探索JVM:解密Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM&#xff1a;解密Java虚拟机的工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;从字节码到实际执行过程&#xff0c;从内存管理到垃圾回收等方面进行解析&#xff0c;帮助读者更好地理解和优…...

【华为OD机试】数字最低位排序【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号…...

【Odoo16前端源码分析】xml模板的加载

一、模板内容的来源 情况A&#xff0c;组件类的template属性&#xff0c;比如ActionContainer.template /* odoo/addons/web/static/src/webclient/actions/action_container.js */export class ActionContainer extends Component {setup() {..} } .. ActionContainer.templ…...

Open3D (C++) 计算矩阵的广义逆

目录 一、算法原理1、广义逆2、计算过程二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。爬虫网站自重,把自己当个人,爬些不完整的误导别人有意思吗???? 一、算法原理 1、广义逆 非方阵不存在逆,但是存在广义逆(伪逆)。对于一个矩阵...

11.物联网操作系统内存管理

一。STM32编译过程及程序组成 STM32编译过程 程序的组成、存储与运行 MDK生成的主要文件分析 1.STM32编译过程 1.源文件&#xff08;Source code&#xff09;--》目标文件&#xff08;Object code&#xff09; .c(C语言)通过armcc生成.o&#xff0c;.s&#xff08;汇编&…...

举办活动发布会,如何得到媒体支持?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 举办活动发布会并得到媒体报道的支持是一个关键的宣传和推广手段。以下是一些建议&#xff0c;帮助你增加吸引媒体关注和报道的机会&#xff1a; 1. 策划新闻价值&#xff1a;确保你的发…...

1139 First Contact(unique函数,string.substr()函数)

PTA | 程序设计类实验辅助教学平台 用map套个set来实现邻接表&#xff08;排序都免了&#xff09; #include<bits/stdc.h> using namespace std; int n,m,k; string a,b; map<string,set<string>>mp; int main() {cin.tie(0);cin >> n >> m;fo…...

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…...

python进程池的使用

进程池的创建 apply() apply()方法用于向进程池提交一个任务&#xff0c;并等待任务完成并返回结果。 apply_async() apply_async()方法用于向进程池提交一个异步任务&#xff08;即无需等待任务完成&#xff09;&#xff0c;将任务加入到进程池的队列里&#xff0c;并立即…...

Dockerfile构建lamp镜像

1、构建目录 [rootdocker ~]# mkdir compose_lamp [rootdocker ~]# cd compose_lamp/ 2、编写Docekerfile [rootdocker compose_lamp]# vim Dockerfile #基础镜像 FROM centos:7#维护该镜像的用户信息 MAINTAINER Crushlinux <crushlinux163.com>#安装httpd RUN yum -…...

LeetCode724. 寻找数组的中心下标

题干 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。…...

【MATLAB源码-第320期】基于matlab的混沌序列图像加密解密系统仿真,测试加解密速度、资源占用、模糊攻击测试、密钥空间和敏感性分析。

操作环境&#xff1a;MATLAB 2024a1、算法描述基于混沌序列的图像加密 与解密系统 随着数字信息技术的迅速发展&#xff0c;图像作为信息载体的使用越来越广泛。然而&#xff0c;图像数据在传输和存储过程中容易受到窃取、篡改或破坏&#xff0c;因此确保图像数据的安全性显得尤…...

免费验证码识别:用ddddocr实现Playwright自动化登录

免费验证码识别&#xff1a;用ddddocr实现Playwright自动化登录 在自动化爬虫、自动化登录等场景中&#xff0c;验证码是最常见的“拦路虎”。对于个人开发者、初学者而言&#xff0c;付费解码平台虽精准&#xff0c;但成本较高&#xff0c;而免费的OCR工具中&#xff0c;dddd…...

从父子到祖孙:用Protege玩转OWL属性链推理的3个典型场景

从父子到祖孙&#xff1a;用Protege玩转OWL属性链推理的3个典型场景 家族族谱中"曾祖父"的自动推导、企业架构里"间接上级"的智能识别、生物遗传学里"隔代基因传递"的规律验证——这些看似不相关的场景&#xff0c;其实都藏着同一个知识图谱建模…...

llama-factory || AutoDL || 自定义数据集微调实战指南

1. 从零开始&#xff1a;认识llama-factory与AutoDL 第一次接触llama-factory时&#xff0c;我完全被这个开源项目的设计理念打动了。它就像是为大模型微调量身定制的"乐高积木"&#xff0c;把复杂的模型训练过程封装成了可视化的操作界面。而AutoDL作为国内领先的AI…...

spring boot apm生态

一、spring boot actuatorSpring Boot Actuator Micrometer Prometheus Grafana组合1、spring boot actuator &#xff0c;提供实时指标查询2、prometheus(美/ proˈmiθɪəs /)&#xff0c;定期&#xff08;比如每15秒&#xff09;去调用应用的接口&#xff0c;把数据拉取…...

告别卡顿:在Windows10上通过QEMU与WHPX硬件加速高效部署Ubuntu20.04开发环境

1. 为什么选择QEMUWHPX方案&#xff1f; 很多开发者都遇到过这样的困境&#xff1a;在Windows系统上运行Linux虚拟机时&#xff0c;要么性能拉胯到让人抓狂&#xff0c;要么配置复杂得让人望而却步。我之前用VMware跑Ubuntu时&#xff0c;光是开个浏览器就能让CPU飙到100%&…...

2025届毕业生推荐的六大AI学术工具推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 智能写作工具DeepSeek&#xff0c;于论文写作里有着显著辅助价值&#xff0c;用户能够输入研…...

AI 编程 Harness 框架深度拆解(非常详细),6 大框架从入门到精通,收藏这一篇就够了!

AI 会写&#xff0c;不等于 AI 能稳定交付。 前段时间我们都在说 Vibe Coding&#xff0c;大家都知道是氛围编程的意思&#xff0c;但是现在也有叫“直觉编程”。什么叫直觉编程&#xff0c;就是完全不用管其它的&#xff0c;想到什么就做什么&#xff0c;主打一个靠直觉写代码…...

Atlas 800I A2实战:5小时搞定DeepSeek V3 W4A8量化全流程(含显存优化技巧)

Atlas 800I A2实战&#xff1a;5小时搞定DeepSeek V3 W4A8量化全流程&#xff08;含显存优化技巧&#xff09; 在AI模型部署领域&#xff0c;量化技术正成为突破硬件限制的关键手段。当我们面对Atlas 800I A2这样的高性能服务器时&#xff0c;如何充分发挥其64GB显存优势&#…...

告别subfloat!LaTeX中minipage+subfigure排版多图的最佳实践

LaTeX多图排版进阶指南&#xff1a;minipage与subfigure的黄金组合 在学术论文和技术文档写作中&#xff0c;图片排版往往是让人头疼的问题。特别是当需要处理多张图片并为其添加子标题时&#xff0c;传统的subfloat方法常常会遇到标题溢出、无法自动换行等令人沮丧的情况。本文…...