/** * Valid类 * @return {[type]} [description] */ var net = require("net"); var Valid = module.exports = Class(function(){ return { field: "", init: function(field){ this.field = field; }, /** * 长度区域 * @param {[type]} min [description] * @param {[type]} max [description] * @return {[type]} [description] */ length: function(min, max){ min = min | 0; var length = this.field.length; if (length < min) { return false; }; if (max) { if (length > max) { return false; }; }; return true; }, /** * 必填 * @return {[type]} [description] */ required: function(){ return (this.field + "").length > 0; }, /** * 自定义正则校验 * @param {[type]} reg [description] * @return {[type]} [description] */ regexp: function(reg){ return reg.test(this.field); }, /** * 邮箱 * @return {[type]} [description] */ email: function(){ return this.regexp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/); }, /** * 时间戳 * @return {[type]} [description] */ time: function(){ return this.regexp(/^(([0-1]\d)|(2[0-3])):[0-5]\d:[0-5]\d$/); }, /** * 中文名 * @return {[type]} [description] */ cnname: function(){ return this.regexp(/^[\u4e00-\u9fa5a-zA-Z.\u3002\u2022]{2,32}$/); }, /** * 身份证号码 * @return {[type]} [description] */ idnumber: function(){ if (/^\d{15}$/.test(this.field)) { return true; }; if ((/^\d{17}[0-9xX]$/).test(this.field)) { 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 = this.field.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(){ return this.regexp(/^(13|15|18|14)\d{9}$/); }, /** * 邮编 * @return {[type]} [description] */ zipcode: function(){ return this.regexp(/^\d{6}$/); }, /** * 2次值是否一致 * @param {[type]} field [description] * @return {[type]} [description] */ confirm: function(field){ return this.field === field; }, /** * url * @return {[type]} [description] */ url: function(){ return this.regexp(/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/); }, /** * 整数 * @param {[type]} o [description] * @return {[type]} [description] */ int: function(o){ var value = parseInt(this.field, 0 || 10); if (isNaN(value)) { return false; }; return (value + "").length == this.field.length; }, /** * 浮点数 * @return {[type]} [description] */ float: function(){ var value = parseFloat(this.field); if (isNaN(value)) { return false; }; return (value + "").length == this.field.length; }, /** * 整数范围 * @param {[type]} min [description] * @param {[type]} max [description] * @return {[type]} [description] */ range: function(min, max){ var isInt = this.int(); if (!isInt) { return false; }; return this.field >= min && this.field <= max; }, /** * ip4校验 * @return {[type]} [description] */ ip4: function(){ return net.isIPv4(this.field); }, /** * ip6校验 * @return {[type]} [description] */ ip6: function(){ return net.isIPv6(this.field); }, /** * ip校验 * @return {[type]} [description] */ ip: function(){ return net.isIP(this.field); }, /** * 日期校验 * @return {[type]} [description] */ date: function(){ var reg = /^\d{4}-\d{1,2}-\d{1,2}$/; return this.regexp(reg); } } }); /** * 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] */ Valid.check = function(data){ data = data ||[]; var result = []; data.forEach(function(item){ var valid = item.valid; if (!is_array(valid)) { valid = [valid]; }; var instance = Valid(item.value); valid.some(function(validItem){ if (typeof validItem === 'function') { var flag = validItem(item.value, item); if (typeof flag === 'string') { item.msg = flag; result.push(item); return true; }; return false; }; var flag = instance[validItem].apply(instance, item[validItem + "_args"] || []); if (!flag) { item.msg = item.msg[validItem]; return true; }; }) }); return result; }