vue+element-ui集成随机验证码+用户名+密码的form表单验证功能

yizhihongxing

下面是关于如何实现“vue+element-ui集成随机验证码+用户名+密码的form表单验证功能”的完整攻略。

确定所需组件

首先我们需要引入vue和element-ui组件库,以及一个用于生成随机验证码的插件,常用的有vue-verify-plugin等。

<template>
  <div class="form-container">
    <el-form :model="formData" :rules="formRules" ref="form" label-width="80px">
      <el-form-item label="用户名" prop="username">
        <el-input v-model="formData.username"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" v-model="formData.password"></el-input>
      </el-form-item>
      <el-form-item label="验证码" prop="verifyCode">
        <el-row>
          <el-col :span="16">
            <el-input v-model="formData.verifyCode"></el-input>
          </el-col>
          <el-col :span="8">
            <img :src="verifyCodeImg" class="verify-code-img" @click="refreshVerifyCode">
          </el-col>
        </el-row>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm">登录</el-button>
        <el-button @click="resetForm">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import { generateVerifyCode } from './utils/verifyCode'
import { mapState } from 'vuex'

Vue.use(ElementUI)

export default {
  data() {
    return {
      formData: {
        username: '',
        password: '',
        verifyCode: ''
      },
      formRules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' }
        ],
        verifyCode: [
          { required: true, message: '请输入验证码', trigger: 'blur' }
        ]
      }
    }
  },
  computed: {
    ...mapState({
      verifyCodeImg: state => state.verifyCodeImg
    })
  },
  methods: {
    refreshVerifyCode() {
      this.$store.dispatch('refreshVerifyCode')
    },
    submitForm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          // 提交表单
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm() {
      this.$refs.form.resetFields()
    }
  }
}
</script>

<style>
.form-container {
  width: 400px;
  margin: 20px auto;
}

.el-row {
  margin-bottom: 10px; 
}

.el-col:last-child {
  text-align: right;
}

.verify-code-img {
  width: 100%;
  cursor: pointer;
}
</style>

这是一个简单的登录表单组件,包含用户名、密码和验证码三项内容。其中,用户名和密码必填,而验证码需要用户填写生成的随机验证码。在表单提交时会进行表单验证,如果验证不通过则会提示用户输入正确的信息。

加载随机验证码图片

创建一张用于展现验证码的图片,并利用该字体来生成对应的随机验证码图片(这里我们可以调用使用到vue-verify-plugin这个插件)。

// ./utils/verifyCode.js

import Vue from 'vue'
import './verifyCode.css'

const VerifyCode = function() {
  const fontNames = ['Consolas', 'Arial', '宋体', '黑体', '楷体']

  const FONT_SIZE = 18 // 字体大小
  const CANVAS_WIDTH = 80
  const CANVAS_HEIGHT = 32
  const MIN_OFFSET = FONT_SIZE / 2 // 字体最小偏移量
  const MAX_OFFSET = FONT_SIZE // 字体最大偏移量
  const MAX_ANGLE = Math.PI / 6 // 字体最大旋转角度

  const getRandomFont = () => {
    const idx = Math.floor(Math.random() * fontNames.length)
    return fontNames[idx]
  }

  const getRandomChar = () => {
    const charCode = Math.floor(Math.random() * 26) + (Math.random() > 0.5 ? 65 : 97)
    return String.fromCharCode(charCode)
  }

  const getRandomAngle = () => {
    return (Math.random() - 0.5) * 2 * MAX_ANGLE // 随机方向(正负)
  }

  const getRandomNumber = (min, max) => {
    return Math.floor(Math.random() * (max - min) + min)
  }

  const drawLine = (ctx) => {
    const startX = getRandomNumber(0, CANVAS_WIDTH / 2)
    const startY = getRandomNumber(0, CANVAS_HEIGHT / 2)
    const endX = getRandomNumber(CANVAS_WIDTH / 2, CANVAS_WIDTH)
    const endY = getRandomNumber(CANVAS_HEIGHT / 2, CANVAS_HEIGHT)
    ctx.beginPath()
    ctx.lineWidth = 1
    ctx.strokeStyle = '#ccc'
    ctx.moveTo(startX, startY)
    ctx.lineTo(endX, endY)
    ctx.stroke()
  }

  const generateVerifyCode = () => {
    let verifyCode = ''
    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    canvas.width = CANVAS_WIDTH
    canvas.height = CANVAS_HEIGHT

    // 绘制背景
    ctx.fillStyle = '#fff'
    ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)

    // 绘制干扰线
    for (let i = 0; i < 4; i++) {
      drawLine(ctx)
    }

    // 绘制文字
    const halfSize = FONT_SIZE / 2
    const offsetTop = CANVAS_HEIGHT / 2 - halfSize
    const offsetLeft = CANVAS_WIDTH / 8

    for (let i = 0; i < 4; i++) {
      const char = getRandomChar()
      const x = i * offsetLeft + getRandomNumber(MIN_OFFSET, MAX_OFFSET)
      const y = getRandomNumber(offsetTop - MIN_OFFSET, offsetTop + MAX_OFFSET)
      const rotateAngle = getRandomAngle()

      ctx.font = `${FONT_SIZE}px ${getRandomFont()}`
      ctx.fillStyle = `rgb(${getRandomNumber(100, 200)}, ${getRandomNumber(100, 200)}, ${getRandomNumber(100, 200)})`
      ctx.translate(x + halfSize, y + halfSize)
      ctx.rotate(rotateAngle)
      ctx.fillText(char, -halfSize, halfSize)
      ctx.rotate(-rotateAngle) 
      ctx.translate(-x - halfSize, -y - halfSize)

      verifyCode += char
    }

    Vue.prototype.$verifyCodeImg = canvas.toDataURL('image/png')
    Vue.prototype.$verifyCodeText = verifyCode
  }

  return {
    generateVerifyCode
  }
}

export const verifyCode = new VerifyCode()

通过上面的代码在canvas中实现了随机验证码的生成,最终将生成的验证码图片和验证码字符串都挂载到了vue的原型上,由此可以通过 Vue.prototype.$verifyCodeImgVue.prototype.$verifyCodeText 访问到该图片以及相应的验证码字符串。

页面中使用该图片和字符串就可以展示随机验证码了(在上面的示例中,Img标签的src就是对应的图片地址)。

表单验证

在表单验证中,我们可以利用Element-ui提供的表单验证来完成用户输入项的验证。

export default {
  data() {
    return {
      formData: {
        username: '',
        password: '',
        verifyCode: ''
      },
      formRules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' }
        ],
        verifyCode: [
          { required: true, message: '请输入验证码', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          // 提交表单
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm() {
      this.$refs.form.resetFields()
    }
  }
}

以上就是利用Element-ui提供的Form表单验证完成用户输入项验证的代码示例,当用户输入的数据不符合表单规则时,登录将无法执行,同时表单下方对应的字段也会提示信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element-ui集成随机验证码+用户名+密码的form表单验证功能 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • wpf老矣 尚能饭否——且说说wpf今生未来(下):安心

    WPF老矣 尚能饭否——且说说WPF今生未来(下):安心 前言 作为WPF的爱好者,我们对其未来发展有着无限热爱和期待。上一篇文章我们已经讲述了WPF的历史和现状,本篇将会着重探讨WPF未来的发展方向。 WPF的市场前景 WPF作为.NET技术栈下最为出色的GUI框架之一,难免会受到市场的影响。但是,近年来WPF的确有了一些发展,并且越来越多的人关注和使用W…

    其他 2023年3月28日
    00
  • 使用scp命令在linux操作系统之间传递文件

    概述 在Linux操作系统中,可以使用scp命令在不同的Linux主机之间传递文件。本文将为您提供一份完整攻略,介绍如何使用scp命令在Linux操作系统之间传递文件。 使用scp命令传递文件 步骤1:登录目标主机 在传递文件之前,需要登录目标主机。可以使用以下命令登录目标主机: ssh username@hostname 其中,username是目标主机的…

    other 2023年5月5日
    00
  • Javascript基础教程之变量

    JavaScript基础教程之变量 什么是变量? 在JavaScript中,变量是用于存储数据的容器。它们可以存储各种类型的数据,例如数字、字符串、布尔值等。变量还可以在程序中被修改和访问。 声明变量 在JavaScript中,我们使用var、let或const关键字来声明变量。这些关键字有不同的作用范围和行为。 使用var声明变量 var是在ES5中引入的…

    other 2023年8月9日
    00
  • c字裤怎么穿

    下面就是如何穿c字裤的完整攻略。 1.选择合适的尺码 选择合适的尺码非常重要,因为过大或者过小的尺码都会影响舒适度和穿着效果。建议选购有弹性的面料,有助于更好地贴合身体。同时,要注意裤子腰围是否合适,以免裤子下滑。 2.搭配合适的上衣 穿搭是非常重要的,特别是在上半身的搭配。C字裤的紧身设计,需要搭配上衣和鞋子以达到更好的穿着效果和搭配感。对于女性来说,可以…

    其他 2023年4月16日
    00
  • ci框架浅析(全篇)

    CI框架浅析 CI(CodeIgniter)是一个轻量级的PHP框架,是现代化的Web应用程序开发的理想选择。下面我们就来具体分析一下CI框架的特点。 优点 简单易用 CI框架非常简单直观,对于初学者也比较友好,易于理解和上手。同时CI框架提供了强大的工具箱,支持快速开发和部署Web应用程序。 速度快 CI框架是轻量级框架,所以它的运行速度非常快。CI框架内…

    其他 2023年3月29日
    00
  • Android TabWidget切换卡的实现应用

    Android TabWidget切换卡的实现应用攻略 简介 Android TabWidget是一种常用的用户界面元素,用于实现多个选项卡之间的切换。本攻略将详细介绍如何在Android应用中实现TabWidget的使用。 步骤 步骤1:准备工作 在Android项目中,首先需要确保已经添加了TabWidget的依赖库。在项目的build.gradle文件…

    other 2023年9月7日
    00
  • Visual Studio 2022 配置 PCL 1.12.1 的问题小结

    下面是 “Visual Studio 2022 配置 PCL 1.12.1 的问题小结” 的完整攻略: 问题背景 该问题起源于 Visual Studio 2022 中的 PCL 工具问题,这会导致在配置 PCL 1.12.1 版本时出现一些问题。 解决步骤 在解决该问题之前,我们需要了解 PCL,它是什么以及它的版本号。 什么是 PCL? PCL(Port…

    other 2023年6月27日
    00
  • oracleinstantclient下载

    简介 Oracle Instant Client是一个轻量级的客户端,用于连接Oracle数据库。它可以在没有完整Oracle客户端安装的情况下使用,因此非常适合在开发和生产环境中使用。在本攻略中,我们将介绍如何下载Oracle Instant Client。 步骤 以下是下载Oracle Instant Client的步骤。 步骤1:访问Oracle官网 …

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部