import { cloneDeep } from 'lodash'; export const extractFileName = (str) => { if (/filename=([^;\s]*)/gi.test(str)) { return decodeURIComponent(RegExp.$1); } return '下载文件'; }; const typeColor = (type = 'default') => { let color = ''; switch (type) { case 'default': color = '#35495E'; break; case 'primary': color = '#3488ff'; break; case 'success': color = '#43B883'; break; case 'warning': color = '#e6a23c'; break; case 'danger': color = '#f56c6c'; break; default: break; } return color; }; /** * LocalStorage */ export const local = { set(table, settings) { const _set = JSON.stringify(settings); return localStorage.setItem('sop_' + table, _set); }, get(table) { let data = localStorage.getItem('sop_' + table); try { data = JSON.parse(data); } catch (err) { return null; } return data; }, remove(table) { return localStorage.removeItem('sop_' + table); }, clear() { return localStorage.clear(); }, }; /** * SessionStorage */ export const session = { set(table, settings) { const _set = JSON.stringify(settings); return sessionStorage.setItem('sop_' + table, _set); }, get(table) { let data = sessionStorage.getItem('sop_' + table); try { data = JSON.parse(data); } catch (err) { return null; } return data; }, remove(table) { return sessionStorage.removeItem('sop_' + table); }, clear() { return sessionStorage.clear(); }, }; export const clear = () => { localStorage.clear(); sessionStorage.clear(); }; /** * CookieStorage */ export const cookie = { set(name, value, config = {}) { const cfg = { expires: null, path: null, domain: null, secure: false, httpOnly: false, ...config, }; let cookieStr = `${name}=${escape(value)}`; if (cfg.expires) { const exp = new Date(); exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000); cookieStr += `;expires=${exp.toGMTString()}`; } if (cfg.path) { cookieStr += `;path=${cfg.path}`; } if (cfg.domain) { cookieStr += `;domain=${cfg.domain}`; } document.cookie = cookieStr; }, get(name) { const arr = document.cookie.match(new RegExp(`(^| )${name}=([^;]*)(;|$)`)); if (arr != null) { return unescape(arr[2]); } return null; }, remove(name) { const exp = new Date(); exp.setTime(exp.getTime() - 1); document.cookie = `${name}=;expires=${exp.toGMTString()}`; }, }; /* Fullscreen */ export const screen = (element) => { const isFull = !!( document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement ); if (isFull) { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } else if (element.requestFullscreen) { element.requestFullscreen(); } else if (element.msRequestFullscreen) { element.msRequestFullscreen(); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if (element.webkitRequestFullscreen) { element.webkitRequestFullscreen(); } }; /* 复制对象 */ export const objCopy = (obj) => { if (obj === undefined) { return undefined; } return JSON.parse(JSON.stringify(obj)); }; export const generateId = function () { return Math.floor( Math.random() * 100000 + Math.random() * 20000 + Math.random() * 5000 ); }; /* 日期格式化 */ export const dateFormat = ( date, fmt = 'yyyy-MM-dd hh:mm:ss', isDefault = '-' ) => { if (date.toString().length === 10) { date *= 1000; } date = new Date(date); if (date.valueOf() < 1) { return isDefault; } const o = { 'M+': date.getMonth() + 1, // 月份 'd+': date.getDate(), // 日 'h+': date.getHours(), // 小时 'm+': date.getMinutes(), // 分 's+': date.getSeconds(), // 秒 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 'S': date.getMilliseconds(), // 毫秒 }; if (/(y+)/.test(fmt)) { fmt = fmt.replace( RegExp.$1, `${date.getFullYear()}`.substr(4 - RegExp.$1.length) ); } for (const k in o) { 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; }; /* 千分符 */ export const groupSeparator = (num) => { num += ''; if (!num.includes('.')) { num += '.'; } return num .replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) { return `${$1},`; }) .replace(/\.$/, ''); }; export const capsule = (title, info, type = 'primary') => { console.log( `%c ${title} %c ${info} %c`, 'background:#35495E; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;', `background:${typeColor( type )}; padding: 1px; border-radius: 0 3px 3px 0; color: #fff;`, 'background:transparent' ); }; export const download = (res, downName = '') => { const aLink = document.createElement('a'); let fileName = downName; let blob = res; // 第三方请求返回blob对象 // 通过后端接口返回 if (res.headers && res.data) { blob = new Blob([res.data], { type: res.headers['content-type'].replace(';charset=utf8', ''), }); if (!downName) { fileName = extractFileName(res.headers?.['content-disposition']); } } aLink.href = URL.createObjectURL(blob); // 设置下载文件名称 aLink.setAttribute('download', fileName); document.body.appendChild(aLink); aLink.click(); document.body.removeChild(aLink); URL.revokeObjectURL(aLink.href); }; /** * 对象转url参数 * @param {*} data * @param {*} isPrefix */ export const httpBuild = (data, isPrefix = false) => { const prefix = isPrefix ? '?' : ''; const _result = []; for (const key in data) { const value = data[key]; // 去掉为空的参数 if (['', undefined, null].includes(value)) { continue; } if (value.constructor === Array) { value.forEach((_value) => { _result.push( `${encodeURIComponent(key)}[]=${encodeURIComponent(_value)}` ); }); } else { _result.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`); } } return _result.length ? prefix + _result.join('&') : ''; }; export const getRequestParams = (url) => { const theRequest = new Object(); if (url.indexOf('?') != -1) { const params = url.split('?')[1].split('&'); for (let i = 0; i < params.length; i++) { const param = params[i].split('='); theRequest[param[0]] = decodeURIComponent(param[1]); } } return theRequest; }; export const getTreeList = (oldDataList, sortField = '') => { if (!Array.isArray(oldDataList)) { throw new TypeError(`${oldDataList}不是数组`); } const dataList = cloneDeep(oldDataList); const formatObj = dataList.reduce((pre, cur) => { return { ...pre, [cur.id]: cur }; }, {}); const sortArray = sortField ? dataList.sort((a, b) => a.sort - b.sort) : dataList; const formatArray = sortArray.reduce((arr, cur) => { const pid = cur.parentId ? cur.parentId : '-1'; const parent = formatObj[pid]; if (parent) { parent.children ? parent.children.push(cur) : (parent.children = [cur]); } else { arr.push(cur); } return arr; }, []); return formatArray; }; /** * 将一维数组转换为二维数组 * @param {*} arr * @returns */ export const toSecondFloorArray = (arr) => { if (!Array.isArray(arr)) { throw new TypeError(`${arr}不是数组`); } const newArr = arr.reduce((initArr, item, index) => { if (index % 2 == 0) { initArr.push([item]); } else { initArr[initArr.length - 1].push(item); } return initArr; }, []); return newArr; };