let Util = { /*** * 将任意数量对象或者字符串传入该方法,若有任意一个为空,则返回true * 可判断 空对象 空数组 空字符串 undefined null * @returns {boolean} */ isEmpty: function (){ let len = arguments.length; if(len===0){ return true; } for(let i=0;i<len;i++){ let a = arguments[i]; if(typeof a === "undefined" || a == null || (typeof a === "string" && a.trim() === "")){ return true; }else if(typeof a === "object"){ let flg = true; for (let k in a ) { flg=false; break; } if(flg){ return true; } } } return false; }, isFunction: function(fn) { return typeof fn === "function" && typeof fn.nodeType !== "number"; }, isPlainObject: function( obj ) { let proto, Ctor, class2type = {}, toString = class2type.toString, hasOwn = class2type.hasOwnProperty, fnToString = hasOwn.toString, ObjectFunctionString = fnToString.call( Object ); if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = Object.getPrototypeOf( obj ); if ( !proto ) { return true; } Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isInteger: function(obj) { return typeof obj === 'number' && obj%1 === 0; }, extendCopy:function(s,t) { for (let i in t) { if(!this.isEmpty(s[i])) t[i] = s[i]; } }, /*** * 对象扩展,支持深拷贝 * 参数:[deep],target,object1,[objectN] */ extend:function() { let options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // 如果第一个参数是布尔类型,则判断是否是深拷贝 if ( typeof target === "boolean" ) { deep = target; // 如果是深拷贝,则取出第二个参数作为target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !Util.isFunction( target ) ) { target = {}; } for ( ; i < length; i++ ) { if ( ( options = arguments[ i ] ) != null ) { for ( name in options ) { src = target[ name ]; copy = options[ name ]; // 如果两者完全一样就跳出当前循环,防止死循环 if ( target === copy ) { continue; } // 只处理普通对象和数组类型 if ( deep && copy && ( Util.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && Array.isArray( src ) ? src : []; } else { clone = src && Util.isPlainObject( src ) ? src : {}; } // 递归扩展 target[ name ] = Util.extend( deep, clone, copy ); } else if ( copy !== undefined ) { target[ name ] = copy; } } } } return target; }, /*** * 批量修改对象中日期格式,将时间戳修改为日期字符串 * item为对象,keys为对象中需要修改的key,format为日期格式 */ dateToString: function (item,keys,format) { format = this.isEmpty(format)?"yyyy-MM-dd HH:mm:ss":format for(let i=0;i<keys.length;i++){ if(!this.isEmpty(item[keys[i]])){ item[keys[i]] = new Date(item[keys[i]]).format(format); } } }, stringToInt: function (item,keys) { for(let i=0;i<keys.length;i++){ if(!this.isEmpty(item[keys[i]])){ item[keys[i]] = parseInt(item[keys[i]]); } } }, /*** * 批量修改对象中数字格式,将数字修改为金额格式 * item为对象,keys为对象中需要修改的key,n为小数点保留位数 */ numberFormat:function(item,keys,n){ n = this.isEmpty(n)?"2":n for(let i=0;i<keys.length;i++){ let num = item[keys[i]]; n = n > 0 && n <= 20 ? n : 2; num = parseFloat((num + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; let l = num.split(".")[0].split("").reverse(), r = num.split(".")[1],t = ""; for (let j = 0; j < l.length; j++) { t += l[j] + ((j + 1) % 4 === 0 && (j + 1) !== l.length ? "," : ""); } item[keys[i]] = t.split("").reverse().join("") + "." + r; } }, checkIDCard: function(rule, value, callback) { setTimeout(function(){ if (!value) { return callback(new Error('请输入身份证号码')); } let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if(reg.test(value) === false){ return callback(new Error('输入的身份证号码无效')); } callback(); }, 200); }, checkPhone: function(rule, value, callback) { setTimeout(function(){ if (!value) { return callback(new Error('请输入联系方式')); } let reg = /^1[3|4|5|7|8][0-9]{9}$/; if(reg.test(value) === false){ return callback(new Error('输入的手机号码无效')); } callback(); }, 200); }, checkUsername: function(rule, value, callback) { setTimeout(function(){ let reg_first = /^[a-zA-Z_-]$/,reg = /^[a-zA-Z_-]([a-zA-Z0-9_.-]){5,19}$/; if (!value) { return callback(new Error('请输入用户名')); }else if(reg_first.test(value.substr(0,1)) === false){ return callback(new Error('请输入以a-zA-Z_-开头的内容')); }else if(value.length < 6){ return callback(new Error('用户名最小长度为6')); }else if(value.length > 20){ return callback(new Error('用户名最大长度为20')); }else if(reg.test(value) === false){ return callback(new Error('输入内容只能包含a-zA-Z0-9_.-')); } callback(); }, 200); }, checkNumber: function(rule, value, callback) { setTimeout(function(){ if(rule.required && !value){ return callback(new Error(rule.requiredMessage)); } if(value){ let reg = /^[1-9]\d*$/; if(reg.test(value) === false){ return callback(new Error(rule.invalidMessage)); } } callback(); }, 200); } }; /** * 扩展DATE属性,增加日期格式化方法 * @param f * @returns {*} */ Date.prototype.format = function(f){ let o ={ "M+" : this.getMonth()+1, //month "d+" : this.getDate(), //day "H+" : this.getHours(), //hour "m+" : this.getMinutes(), //minute "s+" : this.getSeconds(), //second "q+" : Math.floor((this.getMonth()+3)/3), //quarter "S" : this.getMilliseconds() //millisecond }; if(/(y+)/.test(f))f=f.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length)); for(let k in o) if(new RegExp("("+ k +")").test(f))f = f.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));return f }; export default {Util:Util}