123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463 |
- import { cloneDeep } from 'lodash';
- import { useUserStore } from '@/store';
- 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) {
- return '-';
- }
- 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 {String} url 文件下载地址
- * @param {String}} filename 文件名
- */
- export function downloadByUrl(url, filename) {
- const tempLink = document.createElement('a');
- tempLink.style.display = 'none';
- tempLink.href = url;
- const fileName = filename || url.split('/').pop().split('?')[0];
- tempLink.setAttribute('download', fileName);
- if (tempLink.download === 'undefined') {
- tempLink.setAttribute('target', '_blank');
- }
- document.body.appendChild(tempLink);
- tempLink.click();
- document.body.removeChild(tempLink);
- window.URL.revokeObjectURL(url);
- }
- /**
- * 对象转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;
- };
- /**
- * 字典数据转成option list
- * @param {Object} data 字典数据
- * @returns list
- */
- export const dictToOptionList = (data) => {
- return Object.keys(data).map((k) => {
- const kstr = typeof k === 'number' ? k : k + '';
- return { value: kstr, label: data[k] };
- });
- };
- /**
- * 判断用户的权限集里有没有
- * @param {*} key
- * @returns
- */
- export const hasPerm = (key) => {
- const userStore = useUserStore();
- return userStore.finePermissionIds.includes(key);
- };
- /**
- * 获取随机code,默认获取16位
- * @param {Number} len 推荐8的倍数
- *
- */
- export function randomCode(len = 16) {
- if (len <= 0) return;
- let steps = Math.ceil(len / 8);
- let stepNums = [];
- for (let i = 0; i < steps; i++) {
- let ranNum = Math.random().toString(32).slice(-8);
- stepNums.push(ranNum);
- }
- return stepNums.join('');
- }
- /**
- * 判断对象类型
- * @param {*} obj 对象
- */
- export function objTypeOf(obj) {
- const toString = Object.prototype.toString;
- const map = {
- '[object Boolean]': 'boolean',
- '[object Number]': 'number',
- '[object String]': 'string',
- '[object Function]': 'function',
- '[object Array]': 'array',
- '[object Date]': 'date',
- '[object RegExp]': 'regExp',
- '[object Undefined]': 'undefined',
- '[object Null]': 'null',
- '[object Object]': 'object',
- '[object Blob]': 'blob',
- };
- return map[toString.call(obj)];
- }
- /**
- * 获取时间长度文字
- * @param {Number} timeNumber 时间数值,单位:毫秒
- */
- export function timeNumberToText(timeNumber) {
- const DAY_TIME = 24 * 60 * 60 * 1000;
- const HOUR_TIME = 60 * 60 * 1000;
- const MINUTE_TIME = 60 * 1000;
- const SECOND_TIME = 1000;
- let [day, hour, minute, second] = [0, 0, 0, 0];
- let residueTime = timeNumber;
- if (residueTime >= DAY_TIME) {
- day = Math.floor(residueTime / DAY_TIME);
- residueTime -= day * DAY_TIME;
- day += '天';
- }
- if (residueTime >= HOUR_TIME) {
- hour = Math.floor(residueTime / HOUR_TIME);
- residueTime -= hour * HOUR_TIME;
- hour += '小时';
- }
- if (residueTime >= MINUTE_TIME) {
- minute = Math.floor(residueTime / MINUTE_TIME);
- residueTime -= minute * MINUTE_TIME;
- minute += '分钟';
- }
- if (residueTime >= SECOND_TIME) {
- second = Math.round(residueTime / SECOND_TIME);
- second += '秒';
- }
- return [day, hour, minute, second].filter((item) => !!item).join('');
- }
|