UNPKG

gxd-vue-library

Version:

依赖与element Ui插件库,聚福宝福利PC端插件库

310 lines (276 loc) 8.61 kB
'use strict'; 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();