表单验证demo

/*
attribute value 数据格式 说明
1.required true/false boolen 是否必填
2.type ip/mobile/name/common/code/url/email/tel/telOrMobile/port/mac/identity/int/plateNumber string 类型
3.fixLength 1/2... number 固定长度
4.minLength 1/2... number 最小长度
5.maxLength 1/2... number 最大长度
6.extra [{ required: true, message: '必填项' , trigger: 'blur'}] array 自定义内容
*/
const rules = {
ip: new RegExp( '^(1 \\ d{2}|2[0-4] \\ d|25[0-5]|[1-9] \\ d|[1-9]) \\ .' +
'(1 \\ d{2}|2[0-4] \\ d|25[0-5]|[1-9] \\ d| \\ d) \\ .' +
'(1 \\ d{2}|2[0-4] \\ d|25[0-5]|[1-9] \\ d| \\ d) \\ .' +
'(1 \\ d{2}|2[0-4] \\ d|25[0-5]|[1-9] \\ d| \\ d)$'),
mobile: / ^ [ 1 ][ 1-9 ][ 0-9 ] {9} $ /,
name: / [^ A-Za-z0-9 \u4e00 - \u9fa5 ] + /, // 姓名特殊字符校验
common: / [ \\ /:*?"<|'%>&+ ] /, // 不包含特殊字符\/:*?"<|'%>&+校验
username: / [^ a-z0-9 ] + /, // 数字和小写字母
numberAndLetter: / [^ A-Za-z0-9 ] + /, // 数字和字母
chinese: / [ \u4E00 - \u9FA5 ] + / i, // 汉字
noChinese: / ^ [ \u4e00 - \u9fa5 ] + /, // 不包含汉字
version: / ^ [ \\ /:*?"<|'%>&+ \u4E00 - \u9FA5 ] + $ /, // 不包含汉字和特殊字符
code: / [^ A-Za-z0-9_ ] + /, // 编号只允许字母、数字和下划线!
number: / [^ 0-9 ] + /, // 内部编码只允许数字!
url: / (( http | https ) : \/\/ )(([ a-zA-Z0-9 \. _- ] +\. [ a-zA-Z ] {2,6} ) | ([ 0-9 ] {1,3}\. [ 0-9 ] {1,3}\. [ 0-9 ] {1,3}\. [ 0-9 ] {1,3} ))( : [ 0-9 ] {1,4} ) * ( \/ [ a-zA-Z0-9 \& %_ \.\/ -~- ] * ) ? /,
email: / ^ ([ a-zA-Z0-9_- ]) + @ ([ a-zA-Z0-9_- ]) + (( \. [ a-zA-Z0-9_- ] {2,3} ) {1,2} ) $ /,
tel: / ( ^ [ 0 ][ 1-9 ] {2,3} - [ 1-9 ] {1} [ 0-9 ] {6,8} $ ) | ( ^ [ 1-9 ] {1} [ 0-9 ] {6,8} $ ) /,
telOrMobile: / ( ^ ( \d {3,4} - ) ? \d {7,8} ) $| ( ^ [ 1 ][ 1-9 ][ 0-9 ] {9} ) $ /,
fixLength: 0,
identity: {
isIDCard1: / ^ [ 1-9 ] \d {7} (( 0\d ) | ( 1 [ 0-2 ]))(([ 0|1|2 ] \d ) | 3 [ 0-1 ]) \d {3} $ /, // 15位身份证
isIDCard2: / ^ [ 1-9 ] \d {5} ( 19\d {2} | [ 2-9 ] \d {3} )(( 0\d ) | ( 1 [ 0-2 ]))(([ 0|1|2 ] \d ) | 3 [ 0-1 ])( \d {4} | \d {3} X ) $ / i, // 18位身份证
aCity: {
11 : '北京',
12 : '天津',
13 : '河北',
14 : '山西',
15 : '内蒙古',
21 : '辽宁',
22 : '吉林',
23 : '黑龙江',
31 : '上海',
32 : '江苏',
33 : '浙江',
34 : '安徽',
35 : '福建',
36 : '江西',
37 : '山东',
41 : '河南',
42 : '湖北',
43 : '湖南',
44 : '广东',
45 : '广西',
46 : '海南',
50 : '重庆',
51 : '四川',
52 : '贵州',
53 : '云南',
54 : '西藏',
61 : '陕西',
62 : '甘肃',
63 : '青海',
64 : '宁夏',
65 : '新疆',
71 : '台湾',
81 : '香港',
82 : '澳门',
91 : '国外'
},
stard: '10X98765432', // 最后一位身份证的号码
first: [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 1-17系数
}
}

const info = {
required: '此项为必填项!',
ip: '请输入有效的IP',
mobile: '请输入有效的手机号',
name: '请输入1~32位数字、字母、中文',
port: '请输入 1 到 65535 之间的端口值',
common: '不包含特殊字符 \\ /:*?"<| \' %>&+',
username: '请输入数字、小写字母',
numberAndLetter: '请输入数字、字母',
chinese: '请输入汉字',
noChinese: '请输入字母、数字、字符',
version: '不包含汉字、特殊字符',
code: '请输入有效的编号(字母、数字、下划线的组合)',
number: '请输入数字',
url: '请输入有效的URL',
email: '请输入有效的邮箱地址',
tel: '请输入有效的电话号码',
telOrMobile: '请输入有效的手机号或者电话号码',
mac: '请输入有效的mac地址',
identity: '请输入有效的身份证号码',
int: '请输入整数'
}

const validateIp = ( rule, value, callback) => {
if ( value && value. length > 0) {
var pattern = rules. ip
if ( value && (! pattern. test( value) || value == '255.255.255.255')) {
callback( new Error( info. ip))
}
callback()
}
callback()
}
const validateMobile = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. mobile. test( value)) {
callback()
}
callback( new Error( info. mobile))
}
callback()
}

const validateName = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. name. test( value)) {
callback( new Error( info. name))
}
callback()
}
callback()
}

const validatePort = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( isNaN( value) || value > 65535 || value < 1) {
callback( new Error( info. port))
}
callback()
}
callback()
}

const validateCommon = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. common. test( value)) {
callback( new Error( info. common))
}
callback()
}
callback()
}

const validateUserName = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. username. test( value)) {
callback( new Error( info. username))
}
callback()
}
callback()
}

const validateNumberAndLetter = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. numberAndLetter. test( value)) {
callback( new Error( info. numberAndLetter))
}
callback()
}
callback()
}

const validateChinese = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. chinese. test( value)) {
callback( new Error( info. chinese))
}
callback()
}
callback()
}

const validateNoChinese = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. noChinese. test( value)) {
callback( new Error( info. noChinese))
}
callback()
}
callback()
}
const validateVersion = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. version. test( value)) {
callback( new Error( info. version))
}
callback()
}
callback()
}

const validateCode = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. code. test( value)) {
callback( new Error( info. code))
}
callback()
}
callback()
}

const validateNumber = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. number. test( value)) {
callback( new Error( info. number))
}
callback()
}
callback()
}

const validateUrl = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. url. test( value)) {
callback()
}
callback( new Error( info. url))
}
callback()
}

const validateEmail = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. email. test( value)) {
callback()
}
callback( new Error( info. email))
}
callback()
}

const validateTel = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. tel. test( value)) {
callback()
}
callback( new Error( info. tel))
}
callback()
}

const validateTelOrMobile = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( rules. telOrMobile. test( value)) {
callback()
}
callback( new Error( info. telOrMobile))
}
callback()
}

const validateMac = ( rule, value, callback) => {
let macs = null
/* macs = value.indexOf(':') > 0 ? value.split(":") : value.split("-"); */
if ( value. indexOf( ':') > 0) {
macs = value. split( ':')
} else {
macs = value. split( '-')
}
if ( macs == null || macs. length != 6) {
callback( new Error( info. mac))
}
for ( var s = 0; s < 6; s++) {
var temp = parseInt( macs[ s], 16)
if ( isNaN( temp) || temp < 0 || temp > 255) {
callback( new Error( info. mac))
}
}
callback()
}

const validateIdentity = ( rule, value, callback) => {
let sum = 0,
year, month, day, birthday,
isIDCard1 = rules. identity. isIDCard1,
isIDCard2 = rules. identity. isIDCard2,
aCity = rules. identity. aCity,
first = rules. identity. first,
stard = rules. identity. stard
if ( value. length == 15) {
year = '19' + value. substr( 6, 2)
month = value. substr( 8, 2)
day = value. substr( 10, 2)
birthday = '19' + value. substr( 6, 6)
if (! isIDCard1. test( value)) {
callback( new Error( info. identity))
}
} else if ( value. length == 18) {
year = value. substr( 6, 4)
month = value. substr( 10, 2)
day = value. substr( 12, 2)
birthday = value. substr( 6, 8)
if (! isIDCard2. test( value)) {
callback( new Error( info. identity))
}
// 检测身份证最后一位是否合法
for ( var i = 0; i < value. length - 1; i++) {
sum += value[ i] * first[ i]
}
var result = sum % 11
var last = stard[ result] // 计算出来的最后一位身份证号码
if ( value[ value. length - 1]. toUpperCase() !== last) {
callback( new Error( info. identity))
}
}
// 检测证件地区是否合法
if ( aCity[ parseInt( value. substr( 0, 2))] == null) {
callback( new Error( info. identity))
}
// 检测出生年月是否合法
if ( birthday != dateToString( new Date( year + '/' + month + '/' + day))) { // 校验日期是否合法
callback( new Error( info. identity))
}
callback()
}

const validateInt = ( rule, value, callback) => {
if ( value && value. length > 0) {
if ( /\D/. test( value)) {
callback( new Error( info. int))
} else {
callback()
}
}
}

const validateFixLength = ( fixLength) => {
return function( rule, value, callback) {
if ( value && value. length > 0) {
if ( value. length != fixLength) {
callback( new Error( '请输入' + fixLength + '个字符'))
}
callback()
}
callback()
}
}

const dateToString = ( date) => {
if ( date instanceof Date) {
var year = date. getFullYear()
var month = date. getMonth() + 1
month = month < 10 ? '0' + month : month
var day = date. getDate()
day = day < 10 ? '0' + day : day
return year + '' + month + '' + day
}
return ''
}

const validator = ( obj) => {
let validatorArray = []

// 判断是否为必填
if ( obj. required === 'true' || obj. required === true || obj. required === 'required') {
validatorArray. push({ required: true, message: info. required, trigger: 'blur' })
}

// 判断type的类型
if (!( obj. type === 'undefined' || obj. type === undefined || obj. type === null)) {
switch ( obj. type) {
case 'ip':
validatorArray. push({ validator: validateIp, trigger: 'blur' })
break
case 'mobile':
validatorArray. push({ validator: validateMobile, trigger: 'blur' })
break
case 'name':
validatorArray. push({ validator: validateName, trigger: 'blur' })
break
case 'port':
validatorArray. push({ validator: validatePort, trigger: 'blur' })
break
case 'common':
validatorArray. push({ validator: validateCommon, trigger: 'blur' })
break
case 'username':
validatorArray. push({ validator: validateUserName, trigger: 'blur' })
break
case 'numberAndLetter':
validatorArray. push({ validator: validateNumberAndLetter, trigger: 'blur' })
break
case 'chinese':
validatorArray. push({ validator: validateChinese, trigger: 'blur' })
break
case 'noChinese':
validatorArray. push({ validator: validateNoChinese, trigger: 'blur' })
break
case 'version':
validatorArray. push({ validator: validateVersion, trigger: 'blur' })
break
case 'code':
validatorArray. push({ validator: validateCode, trigger: 'blur' })
break
case 'number':
validatorArray. push({ validator: validateNumber, trigger: 'blur' })
break
case 'url':
validatorArray. push({ validator: validateUrl, trigger: 'blur' })
break
case 'email':
validatorArray. push({ validator: validateEmail, trigger: 'blur' })
break
case 'tel':
validatorArray. push({ validator: validateTel, trigger: 'blur' })
break
case 'telOrMobile':
validatorArray. push({ validator: validateTelOrMobile, trigger: 'blur' })
break
case 'mac':
validatorArray. push({ validator: validateMac, trigger: 'blur' })
break
case 'identity':
validatorArray. push({ validator: validateIdentity, trigger: 'blur' })
break
case 'int':
validatorArray. push({ validator: validateInt, trigger: 'blur' })
break
default:
console. error( '【Validate Error】No such type')
return []
}
}

// 固定长度
if (!( obj. fixLength === 'undefined' || obj. fixLength === undefined || obj. fixLength === null)) {
if ( isNaN( obj. fixLength)) {
console. error( '【Validate Error】fixLength is not a Number')
return []
}
validatorArray. push({ validator: validateFixLength( obj. fixLength), trigger: 'blur' })
}

// 最小长度
if (!( obj. minLength === 'undefined' || obj. minLength === undefined || obj. minLength === null)) {
if ( isNaN( obj. minLength)) {
console. error( '【Validate Error】minLength is not a Number')
return []
}
validatorArray. push({ min: obj. minLength, message: '输入的项的长度不能少于' + obj. minLength + '个字符', trigger: 'blur' })
}

// 最大长度
if (!( obj. maxLength === 'undefined' || obj. maxLength === undefined || obj. maxLength === null)) {
if ( isNaN( obj. maxLength)) {
console. error( '【Validate Error】maxLength is not a Number')
return []
}
validatorArray. push({ max: obj. maxLength, message: '输入的项的长度不能超过' + obj. maxLength + '个字符', trigger: 'blur' })
}

// 自定义
if (!( obj. extra === 'undefined' || obj. extra === undefined || obj. extra === null)) {
if ( Array. isArray( obj. extra)) {
if ( obj. extra. length > 0) {
validatorArray = validatorArray. concat( obj. extra)
}
} else {
console. error( '【Validate Error】extra is not a Array')
return []
}
}

return validatorArray
}

export default validator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用vue2进行表单校验的示例程序,希望对您有所帮助: template: ``` <div id="app"> <h4>表单校验示例</h4> <form @submit.prevent="submit"> <div class="form-group"> <label for="name">姓名:</label> <input id="name" type="text" v-model="name" :class="{ 'is-invalid': errors.name }"> <div v-if="errors.name" class="invalid-feedback">{{ errors.name }}</div> </div> <div class="form-group"> <label for="email">邮箱:</label> <input id="email" type="email" v-model="email" :class="{ 'is-invalid': errors.email }"> <div v-if="errors.email" class="invalid-feedback">{{ errors.email }}</div> </div> <div class="form-group"> <label for="password">密码:</label> <input id="password" type="password" v-model="password" :class="{ 'is-invalid': errors.password }"> <div v-if="errors.password" class="invalid-feedback">{{ errors.password }}</div> </div> <button type="submit">提交</button> </form> </div> ``` script: ``` new Vue({ el: '#app', data() { return { name: '', email: '', password: '', errors: {} } }, methods: { submit() { this.errors = {}; if (!this.name) { this.errors.name = '姓名不能为空'; } if (!this.email) { this.errors.email = '邮箱不能为空'; } else if (!/\S+@\S+\.\S+/.test(this.email)) { this.errors.email = '邮箱格式不正确'; } if (!this.password) { this.errors.password = '密码不能为空'; } else if (this.password.length < 6) { this.errors.password = '密码长度不足'; } if (Object.keys(this.errors).length) { return; } alert('表单已提交。'); } } }) ``` 在上面的示例中,我们首先定义了一个表单,其中包含姓名、邮箱和密码三个字段。每个字段前面有一个标签和一个输入框,用于输入相应的内容。每个输入框都有一个绑定到Vue实例数据的v-model属性。 表单的submit事件通过@submit.prevent指定了一个被调用的方法submit。在该方法中,我们首先初始化errors对象为空,并逐个检查姓名、邮箱和密码三个字段。 如果某个字段为空,则在errors对象中记录一个错误消息。如果邮箱格式不正确,则使用相应的错误消息记录错误。如果密码长度不足,也会记录一个错误。最后,如果errors对象中有任何错误,则不会提交表单。如果没有错误,则弹出一个成功消息。 以上就是Vue2表单校验的示例程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值