gxd-vue-library
Version:
依赖与element Ui插件库,聚福宝福利PC端插件库
310 lines (276 loc) • 8.61 kB
JavaScript
;
import {runtime} from "@/utils/runtime";
const settings = require('./../../settings');
import moment from 'moment';
import Vue from 'vue';
const BrowserLogger = require('alife-logger');
import {
baseCheckVarType
} from "@/utils/xd.base";
let logInstance = null;
/**
* @description 获取时间格式
* @param time {Number|String} 时间戳 单位:秒
* @param formatStr {String} 时间格式 默认: ''
*/
window['getTimeFormat'] = function (time, formatStr = 'YYYY-MM-DD HH:mm:ss') {
if (!time) {
return '--'
}
if (Number(time)) time = Number(time);
else time = new Date(time).getTime() / 1000;
return moment.unix(time).format(formatStr)
};
/**
* @description 对象数组转化为特定字符串
* @param data {Object} 特定对象值
* @param key {String} 需要转化的键值
* [
{..., value: ['q', 's', 'd'],...},
{..., value: [{label: 'xxx', value: 'xxx'}, {label: 'bbb', value: 'bbb'}], ...},
{..., value: [{label: 'xxx', id: 'xxx'}, {label: 'bbb', id: 'bbb'}], ...},
{..., value: 'str1' ,...}
* ]
* @param formatStr {String} 时间格式 默认: ''
* [
{..., value: 'q,s,d',...},
{..., value: 'xxx,bbb',...},
{..., value: 'xxx,bbb',...},
{..., value: 'str1',...},
* }
*/
window['transformArrayToString'] = function (data,formatStr = ',', key = 'value') {
return data.map(item=>{
let temp = {};
Object.keys(item).map(k => {
if (key === k) {
if (baseCheckVarType(item[k]) === 'string') temp[k] = item[k];
if (baseCheckVarType(item[k]) === 'array') {
temp[k] = item[k].map(it => {
if (baseCheckVarType(it) === 'string') return it;
else if (baseCheckVarType(it) === 'object' && it.value) return it.value;
else if (baseCheckVarType(it) === 'object' && it.id) return it.id;
else return it;
}).join(formatStr);
}
} else temp[k] = item[k]
});
return temp
})
};
/**
* @description 对象的特定字符串转化为数组
* @param data {Object} 对象值
* @param key {String} 需要转化的键值
[
{..., value: 'string', ...}
{..., value: 'string1,string2,string3', ...}
]
* @param formatStr {String} 时间格式 默认: ''
* @return {*}
[
{..., value: 'string', ...}
{..., value: ['string1','string3', 'string3'], ...}
]
*
*/
window['transformStringToArray'] = function (data, key='value', formatStr = ',') {
return data.map(item=>{
let temp = {};
Object.keys(item).map(k =>{
if(key === k) {
let arr = item[k].split(formatStr);
if (arr.length === 1) temp[k] = item[k];
if (arr.length > 1) temp[k] = arr;
}else {
temp[k] = item[k];
}
});
return temp
});
};
/**
* @description 过滤上报url
* @returns {Function[]}
*/
const ignoreUrls = ()=>{
return [
function (str) {
return !!(str && str === '[index]');
}
]
};
/**
* @description 错误日志
* @returns {Function[]}
*/
const ignoreErrors = ()=>{
return [
'$vm', //跟uniApp uni.createSelectorQuery() 有关
"e.x", //跟uniApp滚动组件有关
'null is not an object (evaluating', //跟uniApp滚动组件有关
"Cannot read property 'x' of ",// 跟uniApp滚动组件有关
/^Script error\.?$/,
/Script error\.?$/,
function (str) {
return !!(str && str.indexOf('Script error') !== -1);
},
function (str) {
return !!(str && str.indexOf('_pois') !== -1);
},
function (str) {
return !!(str && str.indexOf('selectValue') !== -1);
},
//与XdTinymce编辑有关
function (str) {
return !!(str && str.indexOf('startContainer') !== -1);
},
//与element ui中table组件的resize回调,解决方案:所有列都增加width
function (str) {
return !!(str && str.indexOf('ResizeObserver') !== -1);
},
function (str) {
return !!(str && str.indexOf('getCheckedNodes') !== -1);
},
//与element ui中table组件的resize回调,解决方案:所有列都增加width
function (str) {
return !!(str && str.indexOf('loop limit exceeded') !== -1);
},
//与后台报错接口有关
function (str) {
return !!(str && str.indexOf('status') !== -1);
},
//与图片传输为空
function (str) {
return !!(str && str.indexOf('传入的路径') !== -1);
},
]
};
const ignoreApis = ()=>{
return [
//只上报jufubao.cn
function (str) {
return !!(str && str.indexOf('.jufubao.cn') === -1);
}
]
};
const ignoreResErrors = ()=>{
return [
//只上报jufubao.cn
function (str) {
return !!(str && str.indexOf('.jufubao.cn') === -1);
}
]
}
window['__bl'] = window['__bl']||{};
function aliInit(){
let isAddressDebug = window.location.href.indexOf('closeLog=1') !==-1;
if(settings['aliDisabled'] === true || settings.isDebug || isAddressDebug) {
window['__bl'].error = (error, errorStr)=>{
console.error(error);
console.error(errorStr);
};
window['__bl'].custom = (data)=>{
console.log('custom',data)
};
return
}
window['__bl'] = BrowserLogger['singleton']({
pid: settings.aliPid,
tag: settings.system,
environment: settings.aliEnvironment,
sample:settings.aliSample,
pvSample: settings.aliPvSample,
disableHook: settings['aliDisableHook'] !== undefined ? settings['aliDisableHook'] : true, //禁用AJAX请求监听
behavior: settings['aliBehavior'] !== undefined ? settings['aliBehavior'] : true, //是否为了便于排查错误而记录报错的用户行为。
enableSPA: settings['aliEnableSPA'] !== undefined ? settings['aliEnableSPA'] : false, //是否启动单页面上报pv日志
enableConsole: settings['aliEnableConsole'] !== undefined ? settings['aliEnableConsole'] : false, //是否劫持Console
sendResource: settings['aliSendResource'] !== undefined ? settings['aliSendResource'] : true,//静态资源错误上报
autoSendPerf: settings['aliAutoSendPerf'] !== undefined ? settings['aliAutoSendPerf'] : true, //性能和api分析日志
appType: "web",
imgUrl: "https://arms-retcode.aliyuncs.com/r.png?",
ignore: {
ignoreUrls: ignoreUrls(),
ignoreApis: ignoreApis(),
ignoreErrors: ignoreErrors(),
ignoreResErrors: ignoreResErrors()
},
});
}
aliInit();
class Logs {
constructor(){
this.initH5GlobalEvent()
}
/**
* @description 自定义错误日志上报
* @param error {*}
*/
setARMSError(error) {
//非错误对象
if (Object.prototype.toString.call(error) !== '[object Error]') {
if (Object.prototype.toString.call(error) === '[object Object]'
|| Object.prototype.toString.call(error) === '[object Array]'
) {
error = JSON.stringify(error)
}
error = new Error(error);
}
__bl.error(error)
}
/**
* @description 自定义日志上报
* @param params {*} 上传数据对象
* @param eventName {string} 事件名字
*/
setARMSInfo(params, eventName = 'default') {
if (Object.prototype.toString.call(params) === '[object Object]'
|| Object.prototype.toString.call(params) === '[object Array]'
) {
params = JSON.stringify(params)
}
__bl.custom({data: params, c1: eventName})
}
getARMS(){
return __bl;
}
initH5GlobalEvent(){
/**promise全局报错捕获错误**/
window.addEventListener('unhandledrejection', (event)=> {
if(Object.prototype.toString.call(event.reason) === '[object Error]') {
let errorStr = JSON.stringify(runtime().getErrorInfo(event.reason));
__bl.error(event.reason,errorStr)
}
});
/**vue捕获全局错误**/
this.vueErrorHandler();
}
/**
* @description vue全局报错
*/
vueErrorHandler(){
Vue.config.errorHandler = (error, vm) => {
let errorStr = JSON.stringify(runtime().getErrorInfo(error));
__bl.error(error, errorStr)
};
}
/**
* @description 统一Promise catch处理
* @param error {Error|String} 错误对象(new Error())|字符串当为字符串时候,全局捕获不会处理
* @param callback 回调事件
*/
catch(error, callback = null){
if(typeof callback === "function") callback();
if (Object.prototype.toString.call(error) === '[object Error]') {
let errorStr = JSON.stringify(runtime().getErrorInfo(error));
__bl.error(error, errorStr)
}
}
}
function logs() {
if(logInstance === null){
logInstance = new Logs();
}
return logInstance;
}
export default logs();