/* eslint-disable no-prototype-builtins */ import { OAUTH_API_GROUP } from '@/utils/authorityAPI' import * as $CONST from './constant' import { Message } from 'element-ui' export const _ = require('lodash') /** * 集合转换为JSON * @param obj collection数据 * @author TJ 2019/03/11 * @example 略 */ export function collectionToJson(collection) { if (!_.isArray(collection)) return [] let arr = [] // 数据体 _.forEach(collection, function(item) { let tempObj = {} if (item.hasOwnProperty('data') && _.isArray(item.data)) { _.forEach(item.data, function(obj) { tempObj[_.trim(obj.name)] = _.trim(obj.value) }) } arr.push(tempObj) }) return arr } /** * collection数据转换为标准JSON * @param obj collection数据 * @author TJ 2019/03/11 * @example 略 */ export function transformStandardJson(obj) { let body = {} let data = null let pages = null let collection = obj.collection if (_.isObject(collection)) { // 错误的场景 if (collection.hasOwnProperty('error')) { return { code: 300, body: null, msg: collection.error } } // 数据体 if (collection.hasOwnProperty('items') && _.isArray(collection.items)) { data = collectionToJson(collection.items) } // 分页信息 if (collection.hasOwnProperty('page') && _.isArray(collection.data)) { pages = collectionToJson([collection.page]) } // 组装body数据 body = { data: data } if (pages) { _.extend(body, { total: pages[0].totalElements, pageIndex: 0, pageSize: pages[0].size, pages: pages[0].totalPages }) } return { code: 200, body: body, msg: '操作成功' } } } /** * POST PUT等请求参数转换成集合 * @param json object * @returns collection * @author TJ 2019/03/11 * @example 略 */ export function transformParams(obj) { let collection = { version: '1.0', href: '', items: [], templates: [] } if (_.isObject(obj)) { let arr = [] _.each(obj, function(val, key) { let newVal = val if (_.isArray(val)) { newVal = val.join(',') } arr.push({ name: key, value: newVal }) }) let o = { data: arr } collection.templates.push(o) } return { collection: collection } } /** * 将内容存储到sessionStorage * @param key {string} key * @param content {Object} 存储json对象 * @author TJ 2018/05/28 * @example 略 */ export function setSessionStorage(key, content) { if (!key) return false let jsonContent = JSON.stringify(content) jsonContent ? sessionStorage.setItem(key, jsonContent) : sessionStorage.setItem(key, content) } /** * 获取存储到sessionStorage的内容 * @param key {string} key * @return {object} 返回json对象 * @author TJ 2018/05/28 * @example 略 */ export function getSessionStorage(key) { let item = sessionStorage.getItem(key) if (!item) return false let result = JSON.parse(sessionStorage.getItem(key)) return result ? result : item } /** * 删除存储到sessionStorage的内容 * @param key {string} key * @author TJ 2018/05/28 * @example 略 */ export function removeSessionStorage(key) { sessionStorage.removeItem(key) } /** * 将内容存储到localStorage * @param key {string} key * @param content {Object} 存储json对象 * @author TJ 2018/05/28 * @example 略 */ export function setLocalStorage(key, content) { if (!key) return false let jsonContent = JSON.stringify(content) jsonContent ? localStorage.setItem(key, jsonContent) : localStorage.setItem(key, content) } /** * 获取存储到localStorage的内容 * @param key {string} key * @return {object} 返回json对象 * @author TJ 2018/05/28 * @example 略 */ export function getLocalStorage(key) { let item = localStorage.getItem(key) if (!item) return false let result = JSON.parse(localStorage.getItem(key)) return result ? result : item } /** * localStorage * @param key {string} key * @author TJ 2018/05/28 * @example 略 */ export function removeLocalStorage(key) { localStorage.removeItem(key) } /** * 判断json对象是否为空对象 * @param obj {object} json对象 * @return {boolean} 空对象返回 true 否则返回 false * @author TJ 2018/05/28 * @example 略 */ export function isEmptyObject(obj) { if (obj === null) return true return Object.keys(obj).length === 0 } /** * 过滤参数 * @param params {object} 需要格式化的时间 * @return {object} 格式化后的时间 * @author TJ 2017/05/28 * @example 略 */ export function filterParams(params) { if (!_.isObject(params)) { return params } let newParams = {} _.each(params, function(v, k) { // 过滤掉条件是空的项 if (typeof v === 'string' && (v.length === 0 || v === '*全*部*')) { console.log() } else { newParams[k] = v } }) return newParams } /** * 将null转换为空对象 * @param params {obj} * @author TJ 2018/05/31 */ export function emptyObjectWrapper(obj) { return obj === null ? {} : obj } /** * 格式化时间 * @param time {string} 需要格式化的时间 * @param cFormat {string} 时间格式 * @return {string} 格式化后的时间 * @author TJ 2017/07/21 * @example 略 */ export function parseTime(time, cFormat) { if (!time) return false if (arguments.length === 0) { return false } const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' let date if (typeof time === 'object') { date = time } else { if (('' + time).length === 10) time = parseInt(time) * 1000 if (('' + time).length === 8 && ('' + time).indexOf('-') === -1 && ('' + time).indexOf('/') === -1) { time = time.substring(0, 4) + '-' + time.substring(4, 6) + '-' + time.substring(6, 8) } date = new Date(time) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay() } const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1] if (result.length > 0 && value < 10) { value = '0' + value } return value || 0 }) return timeStr } /** * 将时间数组分割成开始时间和结束时间 * @param time {array} * @return {object} * @author TJ 2017/08/01 * @example 略 */ export function formatTime(time) { if (Array.isArray(time)) { if (!time[0] || !time[1]) return false var start = parseTime(time[0], '{y}-{m}-{d}') var end = parseTime(time[1], '{y}-{m}-{d}') return { start: start, end: end } } return false } /** * 判断请求的api是否是要追加权限的 * @param api {String} * @return {boolean} * @author TJ 2017/08/01 * @example 略 */ export function isExistOauthApi(api) { let isExist = false for (let item of OAUTH_API_GROUP) { if (api && api.includes(item)) { isExist = true break } } return isExist } /** * 权限API拼接用户名 * @param api {String} * @return {boolean} * @author TJ 2017/08/01 * @example 略 */ export function getJoinOauthApi(url) { let name = window._loginName ? window._loginName : '' if (url.includes('?')) { url += '&createId=' + name } else { url += 'createId=' + name } return url } /** * 拼接查询URL * @param url {String} * @param obj {obj} * @return {String} * @author TJ 2017/08/01 * @example 略 */ export function joinQueryUrl(url, obj) { let str = '' let fullUrl = '' for (let key in obj) { if (key) { if (!obj.hasOwnProperty(key)) return if (str) { str += '&' } str += key + '=' + obj[key] } } if (url.includes('?')) { fullUrl = url + '&' + str } else { fullUrl = url + '?' + str } return fullUrl } /** * 判断参数是否嵌入在url中 * @param url {String} * @return {Boolean} * @author TJ 2018/08/27 */ export function isInlineParams(url) { const splitChar = '{$' if (url && url.indexOf(splitChar) > -1) { return true } else { return false } } /** * 替换url里的参数 * @param url {String} * @param params {obj} * @author TJ 2018/05/31 */ export function replaceUrlParams(url, params) { if (url) { if (!isInlineParams(url)) { return url } // 正则匹配{},生成数组 let patt = /\{.*?\}/g let arr = url.match(patt) ? url.match(patt) : [] arr.forEach(function(item) { let key = item.replace('{', '').replace('}', '').replace('$', '') url = url.replace(item, params[key]) }) } return url } /** * 获取传入小时之前的日期 * @param pastHour {Number} * @param format {String} * @author ZC 2020/11/03 */ export function zcGetDate(pastHour, format) { if (!format) { format = 'yyyy-MM-dd' } // eslint-disable-next-line no-extend-native Date.prototype.Format = function(fmt) { let o = { 'M+': this.getMonth() + 1, // 月份 'd+': this.getDate(), // 日 'h+': this.getHours(), // 小时 'm+': this.getMinutes(), // 分 's+': this.getSeconds(), // 秒 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度 'S': this.getMilliseconds() // 毫秒 } if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)) for (let k in o) { // eslint-disable-next-line eqeqeq if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) } return fmt } if (pastHour) { // 获取之前的时间 return new Date(new Date().getTime() - pastHour * 60 * 60 * 1000).Format(format) } else { return new Date(new Date().getTime()).Format(format) } } /** * 获取传入小时之前的日期 * @param url {String} * @author ZC 2020/12/09 */ export function zcDownload(url) { let downloadElement = document.createElement('a') downloadElement.href = url // 创建 downloadElement.download = '导出.zip' // 下载后文件名 document.body.appendChild(downloadElement) downloadElement.click() // 点击下载 document.body.removeChild(downloadElement) // 下载完成移除元素 } /** * 配置Echart主题颜色 * @param {obj} echart 实例 * @author TJ 2017/10/17 * @return 无返回结果 */ export function resgisterTheme(echart) { /* eslint-disable */ let theme = { 'color': [ '#29d0b0', '#2d99ed', '#fd8667', '#72ccff', '#f7c5a0', '#d4a4eb', '#fdc547', '#76f2f2', '#da4d00', '#b0419e' ], 'backgroundColor': 'transparents', 'textStyle': { 'itemStyle': { 'normal': { 'color': '#fff' } } }, 'title': { 'textStyle': { 'color': '#ffffff' }, 'subtextStyle': { 'color': '#dddddd' } }, 'line': { 'itemStyle': { 'normal': { 'borderWidth': '1' } }, 'lineStyle': { 'normal': { 'width': '1' } }, 'symbolSize': '4', 'symbol': 'circle', 'smooth': false }, 'radar': { 'itemStyle': { 'normal': { 'borderWidth': '4' } }, 'lineStyle': { 'normal': { 'width': '3' } }, 'symbolSize': '1', 'symbol': 'circle', 'smooth': true }, 'bar': { 'itemStyle': { 'normal': { 'barBorderWidth': 0, 'barBorderColor': '#ccc' }, 'emphasis': { 'barBorderWidth': 0, 'barBorderColor': '#ccc' } } }, 'pie': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'scatter': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'boxplot': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'parallel': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'sankey': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'funnel': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' }, 'emphasis': { 'borderWidth': 0, 'borderColor': '#ccc' } } }, 'gauge': { 'itemStyle': { 'normal': { 'borderWidth': 1, 'borderColor': '#fff' }, 'emphasis': { 'borderWidth': 1, 'borderColor': '#fff' } } }, 'candlestick': { 'itemStyle': { 'normal': { 'color': '#fc97af', 'color0': 'transparent', 'borderColor': '#fc97af', 'borderColor0': '#87f7cf', 'borderWidth': '2' } } }, 'graph': { 'itemStyle': { 'normal': { 'borderWidth': 0, 'borderColor': '#ccc' } }, 'lineStyle': { 'normal': { 'width': '1', 'color': '#ffffff' } }, 'symbolSize': '5', 'symbol': 'circle', 'smooth': true, 'color': [ '#29d0b0', '#2d99ed', '#fd8667', '#72ccff', '#f7c5a0', '#d4a4eb', '#fdc547', '#76f2f2', '#da4d00', '#b0419e' ], 'label': { 'normal': { 'textStyle': { 'color': '#293441' } } } }, 'map': { 'itemStyle': { 'normal': { 'areaColor': '#f3f3f3', 'borderColor': '#999999', 'borderWidth': 0.5 }, 'emphasis': { 'areaColor': 'rgba(255,178,72,1)', 'borderColor': '#eb8146', 'borderWidth': 1 } }, 'label': { 'normal': { 'textStyle': { 'color': '#893448' } }, 'emphasis': { 'textStyle': { 'color': 'rgb(137,52,72)' } } } }, 'geo': { 'itemStyle': { 'normal': { 'areaColor': '#f3f3f3', 'borderColor': '#999999', 'borderWidth': 0.5 }, 'emphasis': { 'areaColor': 'rgba(255,178,72,1)', 'borderColor': '#eb8146', 'borderWidth': 1 } }, 'label': { 'normal': { 'textStyle': { 'color': '#893448' } }, 'emphasis': { 'textStyle': { 'color': 'rgb(137,52,72)' } } } }, 'categoryAxis': { 'axisLine': { 'show': true, 'lineStyle': { 'color': '#fff' } }, 'axisTick': { 'show': false, 'lineStyle': { 'color': '#fff' } }, 'axisLabel': { 'show': true, 'textStyle': { 'color': '#fff' } }, 'splitLine': { 'show': false, 'lineStyle': { 'color': [ '#e6e6e6' ] } }, 'splitArea': { 'show': false, 'areaStyle': { 'color': [ 'rgba(250,250,250,0.05)', 'rgba(200,200,200,0.02)' ] } } }, 'valueAxis': { 'axisLine': { 'show': true, 'lineStyle': { 'color': '#fff' } }, 'axisTick': { 'show': false, 'lineStyle': { 'color': '#fff' } }, 'axisLabel': { 'show': true, 'textStyle': { 'color': '#fff' } }, 'splitLine': { 'show': false, 'lineStyle': { 'color': [ '#e6e6e6' ] } }, 'splitArea': { 'show': false, 'areaStyle': { 'color': [ 'rgba(250,250,250,0.05)', 'rgba(200,200,200,0.02)' ] } } }, 'logAxis': { 'axisLine': { 'show': true, 'lineStyle': { 'color': '#fff' } }, 'axisTick': { 'show': false, 'lineStyle': { 'color': '#333' } }, 'axisLabel': { 'show': true, 'textStyle': { 'color': '#fff' } }, 'splitLine': { 'show': false, 'lineStyle': { 'color': [ '#e6e6e6' ] } }, 'splitArea': { 'show': false, 'areaStyle': { 'color': [ 'rgba(250,250,250,0.05)', 'rgba(200,200,200,0.02)' ] } } }, 'timeAxis': { 'axisLine': { 'show': true, 'lineStyle': { 'color': '#fff' } }, 'axisTick': { 'show': false, 'lineStyle': { 'color': '#fff' } }, 'axisLabel': { 'show': true, 'textStyle': { 'color': '#fff' } }, 'splitLine': { 'show': false, 'lineStyle': { 'color': [ '#fff' ] } }, 'splitArea': { 'show': false, 'areaStyle': { 'color': [ 'rgba(250,250,250,0.05)', 'rgba(200,200,200,0.02)' ] } } }, 'toolbox': { 'iconStyle': { 'normal': { 'borderColor': '#999999' }, 'emphasis': { 'borderColor': '#666666' } } }, 'legend': { 'textStyle': { 'color': '#e0e0e0' } }, 'tooltip': { 'axisPointer': { 'lineStyle': { 'color': '#cccccc', 'width': 1 }, 'crossStyle': { 'color': '#cccccc', 'width': 1 } } }, 'timeline': { 'lineStyle': { 'color': '#87f7cf', 'width': 1 }, 'itemStyle': { 'normal': { 'color': '#87f7cf', 'borderWidth': 1 }, 'emphasis': { 'color': '#f7f494' } }, 'controlStyle': { 'normal': { 'color': '#87f7cf', 'borderColor': '#87f7cf', 'borderWidth': 0.5 }, 'emphasis': { 'color': '#87f7cf', 'borderColor': '#87f7cf', 'borderWidth': 0.5 } }, 'checkpointStyle': { 'color': '#fc97af', 'borderColor': 'rgba(252,151,175,0.3)' }, 'label': { 'normal': { 'textStyle': { 'color': '#87f7cf' } }, 'emphasis': { 'textStyle': { 'color': '#87f7cf' } } } }, 'visualMap': { 'color': [ '#fc97af', '#87f7cf' ] }, 'dataZoom': { 'backgroundColor': 'rgba(255,255,255,0)', 'dataBackgroundColor': 'rgba(114,204,255,1)', 'fillerColor': 'rgba(114,204,255,0.2)', 'handleColor': '#72ccff', 'handleSize': '100%', 'textStyle': { 'color': '#fff' } }, 'markPoint': { 'label': { 'normal': { 'textStyle': { 'color': '#293441' } }, 'emphasis': { 'textStyle': { 'color': '#293441' } } } } } echart.registerTheme('dark', theme) /* eslint-enable */ } /** * 根据路由切换皮肤标识,默认皮肤未蓝色 * @author TJ 2019/05/29 */ export function changeThemeClass(toRouterName) { const darkSkinRouterName = [] if (darkSkinRouterName.includes(toRouterName)) { document.body.className = 'dark' } else { document.body.className = 'blue' } } /** * 判断要查询的数组是否至少有一个元素包含在目标数组中 * @param {Array} target 目标数组 * @param {Array} arr 需要查询的数组 */ export const hasOneOf = (targetarr, arr) => { return targetarr.some(_ => arr.indexOf(_) > -1) } /** * 判断两个对象是否相等,这两个对象的值只能是数字或字符串 * @param {Object} obj1 对象 * @param {Object} obj2 对象 */ export const objEqual = (obj1, obj2) => { const keysArr1 = Object.keys(obj1) const keysArr2 = Object.keys(obj2) if (keysArr1.length !== keysArr2.length) return false else if (keysArr1.length === 0 && keysArr2.length === 0) return true /* eslint-disable-next-line */ else return !keysArr1.some(key => obj1[key] != obj2[key]) } /** * 判断值是否为真,不包括对0的判断 * @param {String} val 字符 */ export function isTrue(val) { return !_.isNull(val) && !_.isUndefined(val) && val !== '' } /** * 解析URL参数 * * @param {String} url * @return {object} */ export function getQueryObject(url = window.location.href) { if (!url) return let search = url.substring(url.lastIndexOf('?') + 1) let obj = {} let reg = /([^?&=]+)=([^?&=]*)/g search.replace(reg, function(rs, $1, $2) { let name = decodeURIComponent($1) let val = decodeURIComponent($2) val = String(val) obj[name] = val // return rs }) return obj } /** * 递归查询树节点 * * @param {object} treeData 树结构数据集合 * @param {string} prop 属性字段 * @param {string} propValue 属性对应的值 * @return {object} 节点对象 */ export function recursion(tree, prop, propValue) { if (!tree || !Array.isArray(tree)) return false let result = {} function handelTree(tree) { for (let o of tree) { if (o.children && Array.isArray(o.children) && o.children.length) { if (o[prop] !== propValue) { // 递归 handelTree(o.children) } else { result = o break } } else { if (o[prop] === propValue) { result = o } } } return result } return handelTree(tree) } export function success(msg = $CONST.MSG_SYS_SUCCESS) { Message({ message: msg, type: 'success' }) } export function fail(msg = $CONST.MSG_SYS_FAIL) { Message({ message: msg, type: 'error' }) } export function error(msg = $CONST.MSG_SYS_ERR) { Message({ message: msg, type: 'error' }) } export function warning(msg = $CONST.MSG_SYS_WARNING) { Message({ message: msg, type: 'warning' }) } export function info(msg = $CONST.MSG_SYS_CANCELED) { Message({ message: msg, type: 'info' }) } export function alertError(msg = $CONST.MSG_SYS_ERR, options) { options = Object.assign({ dangerouslyUseHTMLString: true, title: '提示', type: 'error', 'show-icon': true }, options) window.vm.$alert(msg, options) } export function alertWarning(msg = $CONST.MSG_SYS_WARNING, options) { options = Object.assign({ dangerouslyUseHTMLString: true, title: '提示', type: 'warning', 'show-icon': true }, options) window.vm.$alert(msg, options) } export function todo() { warning('开发中。。。') } /** * 异步加载组件 * @author TJ 2019/05/30 */ /* eslint-disable */ export function lazyLoadView(AsyncView) { const AsyncComponent = () => ({ // 需要加载的组件 (应该是一个 `Promise` 对象) component: AsyncView, // 异步组件加载时使用的组件 loading: '', // 加载失败时使用的组件 error: '', // 展示加载时组件的延时时间。默认值是 200 (毫秒) delay: 200, // 如果提供了超时时间且组件加载也超时了, // 则使用加载失败时使用的组件。默认值是:`Infinity` timeout: 3000 }) return Promise.resolve({ functional: true, render(h, { data, children }) { // Transparently pass any props or children // to the view component. return h(AsyncComponent, data, children) } }) }