|
|
import dayjs from 'dayjs';
|
|
|
import _Vue from 'vue';
|
|
|
|
|
|
export const PATTERN_DATETIME = 'YYYY-MM-DD HH:mm:ss';
|
|
|
export const PATTERN_DATE = 'YYYY-MM-DD';
|
|
|
export const PATTERN_TIME = 'HH:mm:ss';
|
|
|
|
|
|
/**
|
|
|
* 对象数组去重
|
|
|
* 传入数组 list 返回去重后的数组对象
|
|
|
* @param list 数据
|
|
|
* @param valueKey 去重的属性 valueKey
|
|
|
*/
|
|
|
export const removeDuplicates = (list: any, valueKey: string) => {
|
|
|
const temp = {};
|
|
|
let arr = [];
|
|
|
arr = list.reduce(function (item, next) {
|
|
|
temp[next[valueKey]] ? '' : (temp[next[valueKey]] = true && item.push(next));
|
|
|
return item;
|
|
|
}, []);
|
|
|
return arr;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 数据NULL处理
|
|
|
* @param object 数据或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @param defaultValue
|
|
|
*/
|
|
|
|
|
|
export const optional = (object: any, path: any, defaultValue: any) => {
|
|
|
try {
|
|
|
if (defaultValue === undefined) {
|
|
|
defaultValue = path;
|
|
|
} else if (path) {
|
|
|
// this means path='a.b.c', object = object.a.b.c
|
|
|
object = path.split('.').reduce((o: any, i: any) => o[i], object);
|
|
|
}
|
|
|
} catch (e) {
|
|
|
console.warn(e.message);
|
|
|
}
|
|
|
return object || defaultValue;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 数据脱敏 123456 => 12**56
|
|
|
* @param data
|
|
|
* @return {string}
|
|
|
*/
|
|
|
export const masking = (data: string) => {
|
|
|
if (!data) return '****';
|
|
|
let size = data.length / 2 - 1;
|
|
|
if (size < 2) size = 2;
|
|
|
const masking = '********************'.substring(0, size);
|
|
|
const prefix = data.substring(0, (data.length - masking.length) / 2);
|
|
|
const suffix = data.substring(prefix.length + masking.length, data.length);
|
|
|
return prefix + masking + suffix;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 日期格式化
|
|
|
* @param object 日期或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @return {string}
|
|
|
*/
|
|
|
export const date = (object: any, path: any) => {
|
|
|
return format(object, path, PATTERN_DATE);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 时间格式化
|
|
|
* @param object 时间或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @return {string}
|
|
|
*/
|
|
|
export const time = (object: any, path: any) => {
|
|
|
return format(object, path, PATTERN_TIME);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 日期时间格式化
|
|
|
* @param object 日期时间或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @return {string}
|
|
|
*/
|
|
|
export const datetime = (object: any, path: any) => {
|
|
|
return format(object, path, PATTERN_DATETIME);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 日期时间格式化
|
|
|
* @param object 日期时间或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @param pattern 格式
|
|
|
* @return {string}
|
|
|
*/
|
|
|
export const format = (object: any, path: any, pattern: any) => {
|
|
|
const date = optional(object, path, '');
|
|
|
return date && dayjs(date).format(pattern);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 保留N位小数格式化
|
|
|
* @param object 数字或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @param fractionDigits 保留N位小数
|
|
|
*/
|
|
|
export const fixed = (object: any, path: any, fractionDigits: any) => {
|
|
|
if (fractionDigits === undefined) {
|
|
|
fractionDigits = path;
|
|
|
path = undefined;
|
|
|
}
|
|
|
return Number(optional(object, path, 0)).toFixed(fractionDigits);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 金额格式化 0.00
|
|
|
* @param object 数字或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
*/
|
|
|
export const money = (object: any, path: any) => {
|
|
|
return fixed(object, path, 2);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 距离格式化
|
|
|
* @param object 数字或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
*/
|
|
|
export const distance = (object: any, path: any) => {
|
|
|
return fixed(object, path, 2) + 'km';
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 返回静态资源路径处理方法
|
|
|
* @param staticPath 静态资源路径前缀
|
|
|
* @return {function(*=, *=): *}
|
|
|
*/
|
|
|
export const assets = (staticPath: any) => {
|
|
|
/**
|
|
|
* 静态资源路径处理
|
|
|
* @param return.object 路径或对象
|
|
|
* @param path 如果object传的是对象,path代表字段名称,支持 a.b.c 层级查询
|
|
|
* @return {*}
|
|
|
*/
|
|
|
return (object: any, path: any) => {
|
|
|
const suffixPath = optional(object, path, '');
|
|
|
if (!suffixPath || suffixPath.startsWith('http')) {
|
|
|
return suffixPath;
|
|
|
}
|
|
|
return staticPath + suffixPath;
|
|
|
};
|
|
|
};
|
|
|
|
|
|
export default {
|
|
|
install(Vue: typeof _Vue): void {
|
|
|
Vue.filter('optional', optional);
|
|
|
Vue.filter('masking', masking);
|
|
|
Vue.filter('date', date);
|
|
|
Vue.filter('time', time);
|
|
|
Vue.filter('datetime', datetime);
|
|
|
Vue.filter('format', format);
|
|
|
Vue.filter('fixed', fixed);
|
|
|
Vue.filter('money', money);
|
|
|
Vue.filter('distance', distance);
|
|
|
Vue.filter('assets', assets(process.env.VUE_APP_STATIC_PATH));
|
|
|
},
|
|
|
};
|