You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
9.6 KiB
353 lines
9.6 KiB
/**
|
|
* @说明:工具集
|
|
* @作者:陈万照
|
|
* @公司:山东标梵互动技术有限公司
|
|
* @官网: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;
|
|
}
|
|
}
|
|
|