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

下面是关于如何实现“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日

相关文章

  • 农业银行总是提示安装安全控件无法登陆的解决方法

    下面是针对“农业银行总是提示安装安全控件无法登陆”的解决方法的完整攻略: 问题背景 农业银行是中国大型国有银行之一,在进行网上银行操作时,多数用户会遇到要求安装安全控件的提示,如果安装不成功就无法正常登录进入网上银行。这一情况困扰着很多用户,以下是解决办法的详细说明。 解决方法 方法一:卸载原有的安全控件,重新安装新版控件 在计算机中打开控制面板,找到“已安…

    other 2023年6月27日
    00
  • js判断数组中是否包含某个元素(转载)

    JS判断数组中是否包含某个元素(转载) 在JavaScript中,我们经常需要判断一个数组中是否包含某个指定的元素,本文将介绍几种实现该功能的方法。 方法一:使用indexOf方法 JavaScript提供了indexOf方法,该方法返回要查找的元素在数组中第一次出现的位置,如果找不到,返回-1。我们可以利用这个特性来实现判断一个数组中是否包含某个元素的功能…

    其他 2023年3月29日
    00
  • osgearth介绍

    osgEarth 介绍 osgEarth是一个开源的地理空间引擎,它使用OpenSceneGraph的各种功能来创建三维地球和地理空间数据的视觉化。osgEarth支持使用各种格式的数据(包括地形高度、矢量地图、遥感影像和OBS代码),可以从不同的数据源中获取数据,并可以快速可视化地展示它们。 osgEarth的设计哲学是通过建立多层次的渲染管道,使地球和地…

    其他 2023年3月29日
    00
  • 你真的了解java单例模式了吗?

    当我们在编写Java程序时,可能会需要某些类在整个程序运行周期内只能有一个实例被创建。这个时候,就可以采用单例(Singleton)模式。 单例模式是一种创建型设计模式。在单例模式中,一个类只允许有一个实例,而且该实例易于被外界访问。在很多情况下,对象如果被实例化多次可能会产生不必要的开销,如资源消耗、多次处理等。因此使用单例模式可以避免这种情况的产生。 下…

    other 2023年6月26日
    00
  • Go语言特点及基本数据类型使用详解

    当然!下面是关于\”Go语言特点及基本数据类型使用详解\”的完整攻略,包含两个示例说明。 … … … … … … … … … … … … … … … … … … … … … … …

    other 2023年8月20日
    00
  • 浅析BootStrap栅格系统

    浅析BootStrap栅格系统 什么是BootStrap栅格系统? BootStrap栅格系统是一种用于构建响应式网页布局的前端框架。它基于栅格系统的概念,将页面划分为12个等宽的列,通过在不同屏幕尺寸下的列的组合来实现灵活的布局。 栅格系统的基本原理 BootStrap栅格系统的基本原理是将页面划分为12个等宽的列,并通过CSS样式来控制每个列在不同屏幕尺…

    other 2023年7月28日
    00
  • Python开发装包八种方法详解

    Python开发装包八种方法详解 在Python开发中,我们经常需要使用第三方库或自己编写的模块。为了方便代码的复用和分发,我们需要将这些代码打包成包(package)或库(library)。以下是Python开发中常用的八种打包方法的详解: 使用setup.py打包:使用setuptools库提供的setup.py脚本来打包代码。这是Python官方推荐的…

    other 2023年10月13日
    00
  • 服务端配置实现AJAX跨域请求

    要实现AJAX跨域请求,需要在服务端进行配置。以下是实现AJAX跨域请求的完整攻略: 步骤一:使用CORS(跨域资源共享) CORS(Cross-Origin Resource Sharing)是W3C标准,用于跨域请求资源。通过CORS的配置,服务端允许客户端跨域访问资源。在服务端的响应头中添加如下代码即可实现CORS: Access-Control-Al…

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