vue3简易文字验证码

news2024/12/23 12:44:04

大神勿喷,简易版本,demo中可以用一下。

需要几个文字自己codelen 赋值 灵活点直接父组件传过去,可以自己改造在这里插入图片描述

首先创建一个生成数字的js

**mathcode.js**

function MathCode(num){
        let str = "寻寻觅觅冷冷清清凄凄惨惨戚戚乍暖还寒时候最难将息三杯两盏淡酒怎敌他晚来风急雁过也正伤心却是旧时相识满地黄花堆积憔悴损如今有谁堪摘守着窗儿独自怎生得黑梧桐更兼细雨到黄昏点点滴滴这次第怎一个愁字了得";
        let arr = str.split("");
        let lastcoe =  getArrayItems(arr,num) 
        return lastcoe;
}


//随机生成指定个数的字符
 function getArrayItems(arr, num) {
    var temp_array = new Array();
    for (var index in arr) {
        temp_array.push(arr[index]);
    }
    var return_array = new Array();
    for (var i = 0; i<num; i++) {
        if (temp_array.length>0) {
            var arrIndex = Math.floor(Math.random()*temp_array.length);
            return_array[i] = temp_array[arrIndex];
            temp_array.splice(arrIndex, 1);
        } else {    
            break;
        }
    }
    return return_array;
}

 export { MathCode }

组件如下TextCode.vue

<!--
 * @Author: “1077321622@qq.com” lzr448470520
 * @Date: 2023-09-27 14:01:19
 * @LastEditors: “1077321622@qq.com” lzr448470520
 * @LastEditTime: 2023-10-01 17:31:53
 * @FilePath: \viteapp\src\components\TextCode.vue
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->

<template>
  <div class="mian">
    <el-dialog
      v-model="centerDialogVisible"
      :title="title"
      width="400px"
      align-center
      :show-close="false"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
    >
      <div class="img_txt">
        <img
          src="https://img2.baidu.com/it/u=3913729461,3658245748&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
          alt=""
        />
        <ul>
          <li
            v-bind:style="{
              top: mathPosition() + 'px',
              left: mathPosition() + 'px',
              position: 'absolute',
            }"
            :class="current === index ? 'bgColor' : ''"
            v-for="(item, index) in codelist"
            :key="index"
            @click="handCode(item, index)"
          >
            {{ item }}
          </li>
        </ul>
      </div>
      <template #footer>
        <span class="dialog-footer">
          {{ showtext }}
          <el-button type="primary" @click="Refresh"> 刷新 </el-button>
          <el-button type="primary" :disabled="disbtn" @click="handSuccess">
            确认
          </el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
  
<script  setup>
import { MathCode } from "../units/mathcode.js";
import { ElMessage } from "element-plus";
import { ref } from "vue";
let centerDialogVisible = ref(true);
let disbtn = ref(true);
let codelen = ref(4);
let codelist = ref([]);
let title = ref("");
let clickItem = ref([]);
let showtext = ref("");
let current = ref("-1");
let fristtxt = ref("");
let returnBoolen = ref(false);

const emit = defineEmits(["SelechChange"]);

onMounted(() => {
  let str = MathCode(codelen.value);
  codelist.value = str;
  title.value = "请依次点击=>" + str;
  fristtxt.value = str.join("");
});

//生成随机坐标
const mathPosition = () => {
  return parseInt(Math.random() * (280 - 20) + 20);
};

//刷新验证
const Refresh = () => {
  let str = MathCode(codelen.value);
  codelist.value = str;
  title.value = "请依次点击=>" + str;
  clickItem.value = [];
  fristtxt.value = str.join("");
  showtext.value = "";
  returnBoolen.value = false;
  current.value = -1;
};

const handCode = (item, index) => {
  current.value = index;
  if (clickItem.value.length < codelen.value) {
    clickItem.value.push(item);
    showtext.value = clickItem.value.join("");

    if (clickItem.value.join("") == fristtxt.value) {
      disbtn.value = false;
      returnBoolen.value = true;
    } else {
      disbtn.value = true;
      returnBoolen.value = false;
      if (clickItem.value.length == codelen.value) {
        ElMessage.error("验证码有误,请刷新重试");
      }
    }
  }
};

const handSuccess = () => {
  if (returnBoolen.value) {
    centerDialogVisible.value = false;
    emit("SelechChange", returnBoolen.value);
  }
};
</script>
  
  <style scoped>
.dialog-footer button:first-child {
  margin-right: 10px;
}
.img_txt {
  width: 100%;
  height: 350px;
  background: #f4f4f4;
  cursor: pointer;
  position: relative;
}
.img_txt img {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
.img_txt ul {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
.img_txt ul li {
  font-size: 30px;
  font-weight: bold;
  color: #fff;
  position: relative;
}
.bgColor {
  background-color: red;
  border-radius: 50%;
  padding: 5px;
}
</style>

使用方式在页面中引入

import TextCode from "./TextCode.vue";

例如 login.vue

<!--
 * @Author: your name
 * @Date: 2022-03-04 17:33:01
 * @LastEditTime: 2023-10-01 17:33:58
 * @LastEditors: “1077321622@qq.com” lzr448470520
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \viteapp\src\components\Login.vue
-->

<template>
  <div class="logo">
    <div class="logo_center">
      <div class="logo_pic">
        <p class="p1"><img src="" alt="" /></p>
        <p class="p2">vue3( setup 语法糖)开发听歌系统</p>
      </div>
      <div class="logo_input">
        <el-input
          v-model="username"
          type="password"
          class="username"
          placeholder="请输入163邮箱账号"
        >
          <template #suffix>
            <el-icon class="el-input__icon"><Stamp /></el-icon>
          </template>
        </el-input>

        <el-input
          v-model="password"
          type="password"
          class="pass"
          placeholder="请输入密码"
        >
        </el-input>

        <div class="btn">
          <button class="btn" @click="gologin">登录</button>
          <!-- <el-button type="success" style="width: 100%; height: 100%" plain @click="gologin">
            登录</el-button
          > -->
        </div>
      </div>
    </div>
    <TextCode  @SelechChange="SelechChange"></TextCode>
  </div>
</template>

<script setup>
import { Login,Login1 } from "../api/index.js";
import { ElMessage } from "element-plus";
import TextCode from "./TextCode.vue";

//l路由引入
import { useStore } from "vuex";
import Cookies from "js-cookie";
const username = ref("11111@163.com");
const password = ref("222222");
const router = useRouter();
const store = useStore();
let status =  ref(false);

const SelechChange = (val)=>{
    // 赋值
    status.value = val;
};
//登录
const gologin = () => {
   if(status.value){
     //alert("写自己的逻辑")
   }else{
      ElMessage.error("请刷新页面点击正确验证码")
   }
};
</script>
<style lang="scss" scoped>
.logo {
  width: 100%;
  height: 100%;
  // background: url("../assets/login/logobj.png");
  background: firebrick;
  background-size: 100% 100%;
  background-repeat: no-repeat;
  position: relative;
  .logo_center {
    width: 395px;
    height: 435px;
    background: #fff;
    position: absolute;
    transform: translate(-50%, -50%);
    top: 50%;
    left: 50%;
    border-radius: 8px;
    .logo_pic {
      width: 100%;
      height: 170px;
      position: relative;
      .p1 {
        width: 120px;
        height: 95px;
        background: url("../assets/login/logopic.png");
        position: absolute;
        top: 25px;
        left: 0px;
        right: 0px;
        bottom: 0px;
        margin: auto;
        background-size: 100% 100%;
        background-repeat: no-repeat;
        position: relative;
      }
      .p2 {
        width: 100%;
        height: 20px;
        text-align: center;
        position: absolute;
        top: 140px;
        left: 0px;
        right: 0px;
        bottom: 0px; 
        margin: auto;
        color: #606266;
        font-size: 15px;
      }
    }
    .logo_input {
      width: 70%;
      margin: 20px auto 0px auto;
      .pass {
        margin-top: 20px;
      }
      button {
        width: 100%;
        margin-top: 10px;
        --glow-color: rgb(217, 176, 255);
        --glow-spread-color: rgba(191, 123, 255, 0.781);
        --enhanced-glow-color: rgb(231, 206, 255);
        --btn-color: rgb(100, 61, 136);
        border: 0.25em solid var(--glow-color);
        padding: 1em 3em;
        color: var(--glow-color);
        font-size: 15px;
        font-weight: bold;
        background-color: var(--btn-color);
        border-radius: 1em;
        outline: none;
        box-shadow: 0 0 1em 0.25em var(--glow-color),
          0 0 4em 1em var(--glow-spread-color),
          inset 0 0 0.75em 0.25em var(--glow-color);
        text-shadow: 0 0 0.5em var(--glow-color);
        position: relative;
        transition: all 0.3s;
      }

      button::after {
        pointer-events: none;
        content: "";
        position: absolute;
        top: 120%;
        left: 0;
        height: 100%;
        width: 100%;
        background-color: var(--glow-spread-color);
        filter: blur(2em);
        opacity: 0.7;
        transform: perspective(1.5em) rotateX(35deg) scale(1, 0.6);
      }

      button:hover {
        color: var(--btn-color);
        background-color: var(--glow-color);
        box-shadow: 0 0 1em 0.25em var(--glow-color),
          0 0 4em 2em var(--glow-spread-color),
          inset 0 0 0.75em 0.25em var(--glow-color);
      }

      button:active {
        box-shadow: 0 0 0.6em 0.25em var(--glow-color),
          0 0 2.5em 2em var(--glow-spread-color),
          inset 0 0 0.5em 0.25em var(--glow-color);
      }

      .btn:hover::before {
        transform: translateX(0);
      }
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…

object-fit,object-position让img标签表现得像背景图那样能自适应和调整显示位置

文章目录 一、object-fit的用法二、object-position的用法 图片在网页中有2种表现形式&#xff0c;使用CSS的background-image或者HTML的img标签来实现。 背景图实现如notion的封面图效果可以使用background-position或者background-size轻松实现&#xff0c;首先来看看notion…

2023年安全员-C证证模拟考试题库及安全员-C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年安全员-C证证模拟考试题库及安全员-C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-C证证模拟考试题库是根据安全员-C证最新版教材&#xff0c;安全员-C证大纲整理而成&#xff08;含2023年…

【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口

在Java应用程序中&#xff0c;与数据库进行交互是一项常见的任务。为了执行数据库操作&#xff0c;我们需要使用JDBC&#xff08;Java Database Connectivity&#xff09;来建立与数据库的连接并执行SQL语句。Statement接口是JDBC中的一个重要接口&#xff0c;它用于执行SQL语句…

leetCode 376.摆动序列 贪心算法

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图…

.360、.halo勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 在网络犯罪的阴影下&#xff0c;.360和.halo勒索病毒显得格外神秘而危险&#xff0c;它们都属于BeijingCrypt勒索病毒家族旗下的病毒&#xff0c;两者加密特征一致&#xff0c;加密勒索信内容一致。本文91数据恢复将深度解析.360、.halo勒索病毒的内部机制&a…

【算法速查】一篇文章带你快速入门八大排序(上)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;首先在这里祝大家中秋国庆双节同乐&#xff01;&#xff01;今天用一篇文章为大家把八大排序算法都过一遍&#xff0c;当然由于篇幅的原因不是每…

华为云云耀云服务器L实例评测|Ubuntu系统MySQL 8.1.0 Innovation压测

文章目录 前言&#x1f4e3; 1.前言概述&#x1f4e3; 2.云服务器性能监控&#x1f4e3; 3.MySQL8.1版本安装✨ 3.1 安装包下载✨ 3.2 解压安装包✨ 3.3 登录验证 &#x1f4e3; 4.ubuntu安装sysbench&#x1f4e3; 5.云服务器压测✨ 5.1 IO测试✨ 5.2 CPU性能测试 &#x1f4e…

React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下&#xff1a; React&#xff1a; V18.2.0Node.js: V16.14.0TypeScript&#xff1a;最新版工具&#xff1a; VsCode 本文将采用图文详解的方式&#xff0c;手把手带你快速完成在React项目中配置husky、prettier、commitLint&#xff0c;实现编码规范的统…

Javaweb作业小结

简单的XML文档 用JS求连乘积 function product(N) { let p 1; for (let i 1; i < N; i) { p * 2 * i - 1; } return p; } // 调用函数并输出结果 const N 7; // 这里的 N 是你想要的奇数的个数 const result product(N); console.log(p ${result}); Servlet映射关系…

动态规划:两个数组的dp问题(C++)

动态规划&#xff1a;两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列&#xff08;中等&#xff09;2.不同的子序列&#xff08;困难&#xff09;3.通配符匹配&#xff08;困难&#xff09;4.正则表达式&#xff08;困难&#xff09;5.交错字符串&#xff08;中等&…

Go结构体深度探索:从基础到应用

在Go语言中&#xff0c;结构体是核心的数据组织工具&#xff0c;提供了灵活的手段来处理复杂数据。本文深入探讨了结构体的定义、类型、字面量表示和使用方法&#xff0c;旨在为读者呈现Go结构体的全面视角。通过结构体&#xff0c;开发者可以实现更加模块化、高效的代码设计。…

背包问题

目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…

JavaSE学习之--抽象类和接口

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类和接口 一.抽象类 1.抽象类的定义 我们知道&#x…

数仓精品理论-做大数据还有没有前途?

数仓精品理论-做大数据还有没有前途&#xff1f; 做大数据还有没有前途&#xff1f;大数据三要三不要我来讲讲大数据前景 做大数据还有没有前途&#xff1f; 先说&#xff0c;答案是肯定的&#xff0c;但一定要记住三要三不要。 datapulse官网&#xff1a; github:https://data…

cesium gltf控制

gltf格式详解 glTF格式本质上是一个JSON文件。这一文件描述了整个3D场景的内容。它包含了对场景结构进行描述的场景图。场景中的3D对象通过场景结点引用网格进行定义。材质定义了3D对象的外观,动画定义了3D对象的变换操作(比如选择、平移操作)。蒙皮定义了3D对象如何进行骨骼…

黑豹程序员-架构师学习路线图-百科:HTML-网页三剑客

为什么需要HTML 在网站技术发达之前&#xff0c;千年来我们获取信息是通过书籍。电脑流行后我们看文章、小说通过txt文件。看图通过单独的图片流量工具看单个的图片文件。 而HTML把文字和图片一起展示&#xff0c;让今天的电子书成为可能。 另外一点&#xff0c;我们的信息是…

【操作系统】了解Linux操作系统中PCB进程管理模块与进程PID

本篇要分享的内容是有关于操作系统中进程的内容。 目录 1.进程的简单理解 2.了解task_struct&#xff08;进程控制模块&#xff09;内容分类 3.task_struct&#xff08;进程控制模块&#xff09;中的PID 4.调用查看PID的函数 1.进程的简单理解 首先我们需要理解的是什么是…

简单讲解 glm::mat4

文章目录 前言一、下载glm库二、基本数学知识1. 三维中的 4 x 4 矩阵2.旋转3. 位移4. 缩放5. 组合 三、行向量或列向量四、总结 前言 glm库是OpenGL的官方数学库&#xff0c;里面内置多种跟几何变换相关的函数&#xff0c;熟练掌握glm库可以省下很多麻烦。 因为最近在项目中主…