前端登录页面验证码

首先,在el-form-item里有两个div,各占一半,左边填验证码,右边生成验证码

复制代码
 <el-form-item prop="code">
            <div style="display: flex " prop="code">
              <el-input placeholder="请输入验证码" prefix-icon="el-icon-circle-check" 
                size="medium" style="flex: 1 " v-model="user.code"></el-input>
              <div style="flex: 1; height: 36px">
         <!-- 使用自定义组件 validCcode,并监听其 'update:value' 事件 -->
                <valid-code @update:value="getCode"></valid-code>
              </div>
            </div>
          </el-form-item>

在data()里(不在return里面)整个 validateCode 函数用于处理验证码输入的验证逻辑,确保用户输入了正确的验证码。如果输入为空或输入错误,都会通过回调函数返回相应的错误信息,从而提供用户友好的反馈。

复制代码
const validateCode = (rule, value, callback) => {
  
  // 检查用户输入的验证码 value 是否为空
  if (value === '') {
    // 如果验证码为空,则通过 callback 返回一个错误对象,提示用户需要输入验证码
    callback(new Error('请输入验证码'));
  
  // 如果用户输入的验证码(不区分大小写)与预期的验证码(this.code)不一致
  } else if (value.toLowerCase() !== this.code) {
    // 提示用户输入的验证码错误
    callback(new Error('验证码错误'));
  
  // 如果验证码输入正确
  } else {
    // 调用 callback 不带参数,表示验证成功
    callback();
  }
}

methods里忽略大小写

复制代码
getCode(code){
                this.code = code.toLowerCase()
            },

新建一个ValidCode文件,ValidCode代码cv就可以

复制代码
<template>
    <div class="ValidCode disabled-select" style="width: 100%; height: 100%" @click="refreshCode">
      <span v-for="(item, index) in codeList" :key="index" :style="getStyle(item)">{{item.code}}</span>
    </div>
  </template>
  
  <script>
  export default {
    name: 'validCode',
    data () {
      return {
        length: 4,
        codeList: []
      }
    },
    mounted () {
      this.createdCode()
    },
    methods: {
      refreshCode () {
        this.createdCode()
      },
      createdCode () {
        let len = this.length,
            codeList = [],
            chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789',
            charsLen = chars.length
        // 生成
        for (let i = 0; i < len; i++) {
          let rgb = [Math.round(Math.random() * 220), Math.round(Math.random() * 240), Math.round(Math.random() * 200)]
          codeList.push({
            code: chars.charAt(Math.floor(Math.random() * charsLen)),
            color: `rgb(${rgb})`,
            padding: `${[Math.floor(Math.random() * 10)]}px`,
            transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)`
          })
        }
        // 指向
        this.codeList = codeList
        // 将当前数据派发出去
        this.$emit('update:value', codeList.map(item => item.code).join(''))
      },
      getStyle (data) {
        return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}; transform: ${data.transform}`
      }
    }
  }
  </script>
  
  <style>
  .ValidCode{
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
  }
  .ValidCode span {
    display: inline-block;
    font-size: 18px;
  }
  </style>
相关推荐
kyriewen7 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒9 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
To_OC9 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
DigitalOcean10 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年10 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟10 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu1110 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue11 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区11 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两11 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js