thinkjs/lib/Lib/Util/Valid.js

278 lines
5.9 KiB
JavaScript

/**
* Valid
* @return {[type]} [description]
*/
var net = require('net');
var Valid = {
/**
* 长度区域
* @param {[type]} min [description]
* @param {[type]} max [description]
* @return {[type]} [description]
*/
length: function(value, min, max){
'use strict';
min = min | 0;
var length = ((value || '') + '').length;
if (length < min) {
return false;
}
if (max && length > max) {
return false;
}
return true;
},
/**
* 必填
* @return {[type]} [description]
*/
required: function(value){
'use strict';
return ((value || '') + '').length > 0;
},
/**
* 自定义正则校验
* @param {[type]} reg [description]
* @return {[type]} [description]
*/
regexp: function(value, reg){
'use strict';
return reg.test(value);
},
/**
* 邮箱
* @return {[type]} [description]
*/
email: function(value){
'use strict';
var reg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
return this.regexp(value, reg);
},
/**
* 时间戳
* @return {[type]} [description]
*/
time: function(value){
'use strict';
var reg = /^[1-5]\d{12}$/;
return this.regexp(value, reg);
},
/**
* 中文名
* @return {[type]} [description]
*/
cnname: function(value){
'use strict';
var reg = /^[\u4e00-\u9fa5\u3002\u2022]{2,32}$/;
return this.regexp(value, reg);
},
/**
* 身份证号码
* @return {[type]} [description]
*/
idnumber: function(value){
'use strict';
if (/^\d{15}$/.test(value)) {
return true;
}
if ((/^\d{17}[0-9xX]$/).test(value)) {
var vs = '1,0,x,9,8,7,6,5,4,3,2'.split(','),
ps = '7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2'.split(','),
ss = value.toLowerCase().split(''),
r = 0;
for (var i = 0; i < 17; i++) {
r += ps[i] * ss[i];
}
var isOk = (vs[r % 11] === ss[17]);
return isOk;
}
return false;
},
/**
* 手机号
* @return {[type]} [description]
*/
mobile: function(value){
'use strict';
var reg = /^(13|15|18|14|17)\d{9}$/;
return this.regexp(value, reg);
},
/**
* 邮编
* @return {[type]} [description]
*/
zipcode: function(value){
'use strict';
var reg = /^\d{6}$/;
return this.regexp(value, reg);
},
/**
* 2次值是否一致
* @param {[type]} field [description]
* @return {[type]} [description]
*/
confirm: function(value, cvalue){
'use strict';
return value === cvalue;
},
/**
* url
* @return {[type]} [description]
*/
url: function(value){
'use strict';
var reg = /^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/;
return this.regexp(value, reg);
},
/**
* 整数
* @param {[type]} o [description]
* @return {[type]} [description]
*/
int: function(value){
'use strict';
var val = parseInt(value, 10);
if (isNaN(val)) {
return false;
}
return (val + '').length === (value + '').length;
},
/**
* 浮点数
* @return {[type]} [description]
*/
float: function(value){
'use strict';
return isNumberString(value);
},
/**
* 整数范围
* @param {[type]} min [description]
* @param {[type]} max [description]
* @return {[type]} [description]
*/
range: function(value, min, max){
'use strict';
value = parseInt(value, 10);
min = min | 0;
if (isNaN(value) || value < min) {
return false;
}
if (max && value > max) {
return false;
}
return true;
},
/**
* ip4校验
* @return {[type]} [description]
*/
ip4: function(value){
'use strict';
return net.isIPv4(value);
},
/**
* ip6校验
* @return {[type]} [description]
*/
ip6: function(value){
'use strict';
return net.isIPv6(value);
},
/**
* ip校验
* @return {[type]} [description]
*/
ip: function(value){
'use strict';
return net.isIP(value);
},
/**
* 日期校验
* @return {[type]} [description]
*/
date: function(value){
'use strict';
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/;
return this.regexp(value, reg);
},
/**
* 在一个范围内
* @param {[type]} value [description]
* @param {[type]} arr [description]
* @return {[type]} [description]
*/
in: function(value, arr){
'use strict';
return arr.indexOf(value) > -1;
}
};
/**
* data格式
* [{
* value: xxx,
* name: '',
* valid: ['required', 'range'],
* range_args: [],
* msg:{
* required: '',
* range: ''
* }
* },{
* value: xxx,
* name: '',
* valid: ['required', 'range'],
* range_args: [],
* msg:{
* required: '',
* range: ''
* }
* }]
* @param {[type]} data [description]
* @return {[type]} [description]
*/
module.exports = function(data){
'use strict';
if (!data) {
return true;
}
if (!isArray(data)) {
data = [data];
}
var result = {};
data.forEach(function(item){
var valid = item.valid;
if (!isArray(valid)) {
valid = [valid];
}
valid.some(function(validItem){
var flag = true;
//自定义检测方法
if (isFunction(validItem)) {
flag = validItem(item.value, item);
if (isString(flag)) {
result[item.name] = flag;
flag = false;
}
}else if(!isFunction(Valid[validItem])){
throw new Error(validItem + ' is not valid');
}else{
var args = item[validItem + '_args'] || [];
if (!isArray(args)) {
args = [args];
}
args = [item.value].concat(args);
flag = Valid[validItem].apply(Valid, args);
if (flag === false) {
var msg = (isObject(item.msg) ? item.msg[validItem] : item.msg) || '';
msg = msg.replace('{name}', item.name).replace('{value}', item.value);
result[item.name] = msg;
}
}
return !flag;
});
});
return result;
};