text: /**
   * @说明：工具集
   * @作者：陈万照
   * @公司：山东标梵互动技术有限公司
   * @官网：http://biaofun.com/
   * @版本：v1.0.0
   * @时间：2020年4月28日11:28:13
   */
  export default {
  	/**
  	 * 同步 try catch 的进一步封装处理
  	 * 使用方法：
  	 * let [err, res] = await this.$utils.asyncTasks(Promise函数);
  	 * if(res) 成功
  	 * if(err) 失败
  	 */
  	asyncTasks(promise) {
  		return promise.then(data => {
  			return [null, data];
  		}).catch(err => [err]);
  	},
  
  	/**
  	 * 精确判断数据是否是 Object 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isObject(val) {
  		return Object.prototype.toString.call(val) === '[object Object]' && val !== null && val !== undefined;
  	},
  
  	/**
  	 * 判断数据是否是 Array 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isArray(val) {
  		return Object.prototype.toString.call(val) === '[object Array]';
  	},
  
  	/**
  	 * 判断数据是否是 String 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isString(val) {
  		return Object.prototype.toString.call(val) === '[object String]';
  	},
  
  	/**
  	 * 精确判断数据是否是 Date 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isDate(val) {
  		return Object.prototype.toString.call(val) === '[object Date]';
  	},
  
  	/**
  	 * 精确判断数据是否是 Function 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isFunction(val) {
  		return Object.prototype.toString.call(val) === '[object Function]';
  	},
  
  	/**
  	 * 精确判断数据是否是 Number 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isNumber(val) {
  		return Object.prototype.toString.call(val) === '[object Number]';
  	},
  
  	/**
  	 * 精确判断数据是否是 Boolean 类型
  	 * @param {Any} val 要判断的数据
  	 * @returns {Boolean} true：是；false：不是；
  	 */
  	isBoolean(val) {
  		return Object.prototype.toString.call(val) === '[object Boolean]';
  	},
  
  	/**
  	 * 判断 URL 是否是绝对 URL。
  	 * @param {String} url 要判断的 URL
  	 * @return {Boolean} true：是绝对URL；false：不是绝对URL；
  	 */
  	isAbsoluteURL(url) {
  		// 如果 URL 以 “<scheme>：//” 或 “//”（协议相对URL）开头，则认为它是绝对的
  		// RFC 3986 将方案名称定义为以字母开头的字符序列，然后是字母，数字，加号，句点或连字符的任意组合
  		return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
  	},
  
  	/**
  	 * 合并 baseURL 和相对 URL 成一个完整的 URL
  	 * @param {String} baseURL baseURL
  	 * @param {String} relativeURL 相对 URL
  	 * @returns {String} 返回组合后的完整 URL
  	 */
  	combineURLs(baseURL, relativeURL) {
  		return relativeURL && this.isString(relativeURL) && this.isString(baseURL) ? baseURL.replace(/\/+$/, '') + '/' +
  			relativeURL.replace(/^\/+/, '') : baseURL;
  	},
  
  	/**
  	 * 深度合并对象，只支持合并两个对象，该方法不会改变原有的对象
  	 * @param {Object} FirstOBJ 第一个对象
  	 * @param {Object} SecondOBJ 第二个对象
  	 * @return {Object} 返回深度合并后的对象
  	 */
  	deepMargeObject(FirstOBJ, SecondOBJ) {
  		let ResultOBJ = {};
  		for (let key in FirstOBJ) {
  			ResultOBJ[key] = ResultOBJ[key] && ResultOBJ[key].toString() === "[object Object]" ? this.deepMargeObject(ResultOBJ[
  				key], FirstOBJ[key]) : ResultOBJ[key] = FirstOBJ[key];
  		}
  		for (let key in SecondOBJ) {
  			ResultOBJ[key] = ResultOBJ[key] && ResultOBJ[key].toString() === "[object Object]" ? this.deepMargeObject(ResultOBJ[
  				key], SecondOBJ[key]) : ResultOBJ[key] = SecondOBJ[key];
  		}
  		return ResultOBJ;
  	},
  	
  	/**
  	 * 生成指定长度的随机字符串
  	 * @param {Number} min 最小程度
  	 * @param {Number} max 最大长度 
  	 * @return {String} 返回生成的字符串
  	 */
  	randomString(min, max) {
  		let returnStr = "",
  			range = (max ? Math.round(Math.random() * (max - min)) + min : min),
  			arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
  				'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
  				'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
  			];
  		for (let i = 0; i < range; i++) {
  			let index = Math.round(Math.random() * (arr.length - 1));
  			returnStr += arr[index];
  		}
  		return returnStr;
  	},
  
  	/**
  	 * 格式化日期
  	 * @param {Date|String} date 日期或日期字符串
  	 */
  	formatDate(date) {
  		let YYYY = null;
  		let M = null;
  		let MM = null;
  		let D = null;
  		let DD = null;
  		let h = null;
  		let hh = null;
  		let m = null;
  		let mm = null;
  		let s = null;
  		let ss = null;
  		let ms = null;
  		let ms2 = null;
  		let ms3 = null;
  		let ms4 = null;
  		let dt = null;
  
  		// 如果 date 是 String 类型
  		if (date && this.isString(date)) {
  			// 真机运行时，如果直接用 new Date('YYYY-MM-DD hh:mm:ss') 会报 Invalid Date 错误，所以采用下面的方式创建日期
  			let dtArr = date.replace(/\//g, '.').replace(/-/g, '.').replace(/:/g, '.').replace(/T/g, ' ').replace(' ', '.').replace(
  				'Z', '').split('.');
  
  			let year = 2020;
  			let month = 12;
  			let day = 18;
  			let hour = 0;
  			let minute = 0;
  			let second = 0;
  			let millisecond = 0;
  			
  			// 年
  			if (dtArr.length > 0 && !isNaN(dtArr[0])) {
  				year = parseInt(dtArr[0]);
  			}
  			// 月
  			if (dtArr.length > 1 && !isNaN(dtArr[1])) {
  				month = parseInt(dtArr[1]);
  			}
  			// 日
  			if (dtArr.length > 2 && !isNaN(dtArr[2])) {
  				day = parseInt(dtArr[2]);
  			}
  			// 时
  			if (dtArr.length > 3 && !isNaN(dtArr[3])) {
  				hour = parseInt(dtArr[3]);
  			}
  			// 分
  			if (dtArr.length > 4 && !isNaN(dtArr[4])) {
  				minute = parseInt(dtArr[4]);
  			}
  			// 秒
  			if (dtArr.length > 5 && !isNaN(dtArr[5])) {
  				second = parseInt(dtArr[5]);
  			}
  			// 毫秒
  			if (dtArr.length > 6 && !isNaN(dtArr[6])) {
  				millisecond = parseInt(dtArr[6]);
  			}
  
  			date = new Date(year, month - 1, day, hour, minute, second, millisecond);
  		}
  
  		// 如果 date 是 Date 类型
  		if (date && this.isDate(date)) {
  			YYYY = date.getFullYear();
  			M = date.getMonth() + 1;
  			MM = M >= 10 ? M : '0' + M;
  			D = date.getDate();
  			DD = D >= 10 ? D : '0' + D;
  			h = date.getHours();
  			hh = h >= 10 ? h : '0' + h;
  			m = date.getMinutes();
  			mm = m >= 10 ? m : '0' + m;
  			s = date.getSeconds();
  			ss = s >= 10 ? s : '0' + s;
  			ms = date.getMilliseconds();
  			ms2 = ms;
  			ms3 = ms;
  			ms4 = ms;
  			if (ms < 10) {
  				ms2 = '0' + ms;
  				ms3 = '00' + ms;
  				ms4 = '000' + ms;
  			} else if (ms < 100) {
  				ms3 = '0' + ms;
  				ms4 = '00' + ms;
  			} else {
  				ms4 = '0' + ms;
  			}
  		}
  
  		// 返回的数据对象
  		let result = {
  			YYYY: YYYY,
  			MM: MM,
  			M: M,
  			DD: DD,
  			D: D,
  			hh: hh,
  			h: h,
  			mm: mm,
  			m: m,
  			ss: ss,
  			s: s,
  			ms: ms,
  			ms2: ms2,
  			ms3: ms3,
  			ms4: ms4,
  			dt: date,
  			f1: `${YYYY}-${MM}-${DD}`,
  			f2: `${YYYY}年${M}月${D}日`,
  			f3: `${YYYY}-${M}-${D} ${hh}:${mm}`,
  			f4: `${h}:${m}:${s}`,
  			f5: `${MM}-${DD}`,
  			f6: `${YYYY}-${MM}`,
  			f7: `${YYYY}年${M}月`,
  			f8: `${h}:${m}`,
  			f9: `${M}月${D}日`,
  			notes: 'YYYY（年），MM（月，补0），M（月，不补0），DD（日，补0），D（日，不补0），hh（时，补0），h（时，不补0），mm（分，补0），m（分，不补0），ss（秒，补0），s（秒，不补0），ms（毫秒，不补0），ms2（毫秒，补0到2位），ms3（毫秒，补0到3位），ms4（毫秒，补0到4位），其余的f1，f2，... 看格式就知道了！'
  		};
  		return result;
  	},
  
  	/**
  	 * 数字转中文
  	 * @param {Number} num 数字
  	 */
  	numberToChinese(num) {
  		if (!/^\d*(\.\d*)?$/.test(num)) return "Number is wrong!";
  		let AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
  		let BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
  		let a = ("" + num).replace(/(^0*)/g, "").split("."),
  			k = 0,
  			re = "";
  		for (let i = a[0].length - 1; i >= 0; i--) {
  			switch (k) {
  				case 0:
  					re = BB[7] + re;
  					break;
  				case 4:
  					if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
  						re = BB[4] + re;
  					break;
  				case 8:
  					re = BB[5] + re;
  					BB[7] = BB[5];
  					k = 0;
  					break;
  			}
  			if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
  			if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
  			k++;
  		}
  		if (a.length > 1) //加上小数部分(如果有小数部分) 
  		{
  			re += BB[6];
  			for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
  		}
  		return re;
  	},
  	
  	/**
  	 * 计算两个经纬度点之间的距离
  	 * @param {Number} lng1 第一个点的经度
  	 * @param {Number} lat1 第一个点的纬度
  	 * @param {Number} lng2 第二个点的经度
  	 * @param {Number} lat2 第二个点的纬度
  	 */
  	calcDistance(lng1, lat1, lng2, lat2) {
  		var radLat1 = lat1 * Math.PI / 180.0;
  		var radLat2 = lat2 * Math.PI / 180.0;
  		var a = radLat1 - radLat2;
  		var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
  		var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
  			Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
  		s = s * 6378.137; // EARTH_RADIUS;
  		s = Math.round(s * 10000) / 10000;
  		return s;
  	},
  	
  	/**
  	 * 获取数组最小值的下标
  	 * @param {Array} arr 数组
  	 */
  	getArrayMixValueIndex(arrar) {
  		let min = arrar[0];
  		let index = 0;
  		for (let i = 0; i < arrar.length; i++) {
  			if (min > arrar[i]) {
  				min = arrar[i];
  				index = i;
  			}
  		}
  		return index;
  	}
  }
  