init
This commit is contained in:
468
src/utils/util.js
Normal file
468
src/utils/util.js
Normal file
@@ -0,0 +1,468 @@
|
||||
import { validatenull } from './validate';
|
||||
import sha256 from 'crypto-js/sha256';
|
||||
import Base64 from 'crypto-js/enc-base64';
|
||||
//表单序列化
|
||||
export const serialize = data => {
|
||||
let list = [];
|
||||
Object.keys(data).forEach(ele => {
|
||||
list.push(`${ele}=${data[ele]}`);
|
||||
});
|
||||
return list.join('&');
|
||||
};
|
||||
export const getObjType = obj => {
|
||||
var toString = Object.prototype.toString;
|
||||
var 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',
|
||||
};
|
||||
if (obj instanceof Element) {
|
||||
return 'element';
|
||||
}
|
||||
return map[toString.call(obj)];
|
||||
};
|
||||
/**
|
||||
* 对象深拷贝
|
||||
*/
|
||||
export const deepClone = data => {
|
||||
var type = getObjType(data);
|
||||
var obj;
|
||||
if (type === 'array') {
|
||||
obj = [];
|
||||
} else if (type === 'object') {
|
||||
obj = {};
|
||||
} else {
|
||||
//不再具有下一层次
|
||||
return data;
|
||||
}
|
||||
if (type === 'array') {
|
||||
for (var i = 0, len = data.length; i < len; i++) {
|
||||
obj.push(deepClone(data[i]));
|
||||
}
|
||||
} else if (type === 'object') {
|
||||
for (var key in data) {
|
||||
obj[key] = deepClone(data[key]);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
/**
|
||||
* 设置灰度模式
|
||||
*/
|
||||
export const toggleGrayMode = status => {
|
||||
if (status) {
|
||||
document.body.className = document.body.className + ' grayMode';
|
||||
} else {
|
||||
document.body.className = document.body.className.replace(' grayMode', '');
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 设置主题
|
||||
*/
|
||||
export const setTheme = name => {
|
||||
document.body.className = name;
|
||||
};
|
||||
|
||||
/**
|
||||
* 加密处理
|
||||
*/
|
||||
export const encryption = params => {
|
||||
let { data = {}, type, param, key } = params;
|
||||
let result = JSON.parse(JSON.stringify(data));
|
||||
if (type == 'Base64') {
|
||||
param.forEach(ele => {
|
||||
result[ele] = Base64.stringify(result[ele]);
|
||||
});
|
||||
} else if (type == 'Aes') {
|
||||
param.forEach(ele => {
|
||||
result[ele] = sha256(result[ele], key);
|
||||
});
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* 浏览器判断是否全屏
|
||||
*/
|
||||
export const fullscreenToggel = () => {
|
||||
if (fullscreenEnable()) {
|
||||
exitFullScreen();
|
||||
} else {
|
||||
reqFullScreen();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* esc监听全屏
|
||||
*/
|
||||
export const listenfullscreen = callback => {
|
||||
function listen() {
|
||||
callback();
|
||||
}
|
||||
|
||||
document.addEventListener('fullscreenchange', function () {
|
||||
listen();
|
||||
});
|
||||
document.addEventListener('mozfullscreenchange', function () {
|
||||
listen();
|
||||
});
|
||||
document.addEventListener('webkitfullscreenchange', function () {
|
||||
listen();
|
||||
});
|
||||
document.addEventListener('msfullscreenchange', function () {
|
||||
listen();
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 浏览器判断是否全屏
|
||||
*/
|
||||
export const fullscreenEnable = () => {
|
||||
var isFullscreen =
|
||||
document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;
|
||||
return isFullscreen;
|
||||
};
|
||||
|
||||
/**
|
||||
* 浏览器全屏
|
||||
*/
|
||||
export const reqFullScreen = () => {
|
||||
if (document.documentElement.requestFullScreen) {
|
||||
document.documentElement.requestFullScreen();
|
||||
} else if (document.documentElement.webkitRequestFullScreen) {
|
||||
document.documentElement.webkitRequestFullScreen();
|
||||
} else if (document.documentElement.mozRequestFullScreen) {
|
||||
document.documentElement.mozRequestFullScreen();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 浏览器退出全屏
|
||||
*/
|
||||
export const exitFullScreen = () => {
|
||||
if (document.documentElement.requestFullScreen) {
|
||||
document.exitFullScreen();
|
||||
} else if (document.documentElement.webkitRequestFullScreen) {
|
||||
document.webkitCancelFullScreen();
|
||||
} else if (document.documentElement.mozRequestFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 递归寻找子类的父类
|
||||
*/
|
||||
|
||||
export const findParent = (menu, id) => {
|
||||
for (let i = 0; i < menu.length; i++) {
|
||||
if (menu[i].children.length != 0) {
|
||||
for (let j = 0; j < menu[i].children.length; j++) {
|
||||
if (menu[i].children[j].id == id) {
|
||||
return menu[i];
|
||||
} else {
|
||||
if (menu[i].children[j].children.length != 0) {
|
||||
return findParent(menu[i].children[j].children, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 判断2个对象属性和值是否相等
|
||||
*/
|
||||
|
||||
/**
|
||||
* 动态插入css
|
||||
*/
|
||||
|
||||
export const loadStyle = url => {
|
||||
const link = document.createElement('link');
|
||||
link.type = 'text/css';
|
||||
link.rel = 'stylesheet';
|
||||
link.href = url;
|
||||
const head = document.getElementsByTagName('head')[0];
|
||||
head.appendChild(link);
|
||||
};
|
||||
/**
|
||||
* 判断路由是否相等
|
||||
*/
|
||||
export const diff = (obj1, obj2) => {
|
||||
delete obj1.close;
|
||||
var o1 = obj1 instanceof Object;
|
||||
var o2 = obj2 instanceof Object;
|
||||
if (!o1 || !o2) {
|
||||
/* 判断不是对象 */
|
||||
return obj1 === obj2;
|
||||
}
|
||||
|
||||
if (Object.keys(obj1).length !== Object.keys(obj2).length) {
|
||||
return false;
|
||||
//Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
|
||||
}
|
||||
|
||||
for (var attr in obj1) {
|
||||
var t1 = obj1[attr] instanceof Object;
|
||||
var t2 = obj2[attr] instanceof Object;
|
||||
if (t1 && t2) {
|
||||
return diff(obj1[attr], obj2[attr]);
|
||||
} else if (obj1[attr] !== obj2[attr]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
/**
|
||||
* 根据字典的value显示label
|
||||
*/
|
||||
export const findByvalue = (dic, value) => {
|
||||
let result = '';
|
||||
if (validatenull(dic)) return value;
|
||||
if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') {
|
||||
let index = 0;
|
||||
index = findArray(dic, value);
|
||||
if (index != -1) {
|
||||
result = dic[index].label;
|
||||
} else {
|
||||
result = value;
|
||||
}
|
||||
} else if (value instanceof Array) {
|
||||
result = [];
|
||||
let index = 0;
|
||||
value.forEach(ele => {
|
||||
index = findArray(dic, ele);
|
||||
if (index != -1) {
|
||||
result.push(dic[index].label);
|
||||
} else {
|
||||
result.push(value);
|
||||
}
|
||||
});
|
||||
result = result.toString();
|
||||
}
|
||||
return result;
|
||||
};
|
||||
/**
|
||||
* 根据字典的value查找对应的index
|
||||
*/
|
||||
export const findArray = (dic, value) => {
|
||||
for (let i = 0; i < dic.length; i++) {
|
||||
if (dic[i].value == value) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
/**
|
||||
* 生成随机len位数字
|
||||
*/
|
||||
export const randomLenNum = (len, date) => {
|
||||
let random = '';
|
||||
random = Math.ceil(Math.random() * 100000000000000)
|
||||
.toString()
|
||||
.substr(0, len ? len : 4);
|
||||
if (date) random = random + Date.now();
|
||||
return random;
|
||||
};
|
||||
/**
|
||||
* 打开小窗口
|
||||
*/
|
||||
export const openWindow = (url, title, w, h) => {
|
||||
// Fixes dual-screen position Most browsers Firefox
|
||||
const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left;
|
||||
const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top;
|
||||
|
||||
const width = window.innerWidth
|
||||
? window.innerWidth
|
||||
: document.documentElement.clientWidth
|
||||
? document.documentElement.clientWidth
|
||||
: screen.width;
|
||||
const height = window.innerHeight
|
||||
? window.innerHeight
|
||||
: document.documentElement.clientHeight
|
||||
? document.documentElement.clientHeight
|
||||
: screen.height;
|
||||
|
||||
const left = width / 2 - w / 2 + dualScreenLeft;
|
||||
const top = height / 2 - h / 2 + dualScreenTop;
|
||||
const newWindow = window.open(
|
||||
url,
|
||||
title,
|
||||
'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' +
|
||||
w +
|
||||
', height=' +
|
||||
h +
|
||||
', top=' +
|
||||
top +
|
||||
', left=' +
|
||||
left
|
||||
);
|
||||
|
||||
// Puts focus on the newWindow
|
||||
if (window.focus) {
|
||||
newWindow.focus();
|
||||
}
|
||||
};
|
||||
|
||||
export const getScreen = isCollapse => {
|
||||
if (document.body.clientWidth <= 768) {
|
||||
return !isCollapse;
|
||||
} else {
|
||||
return isCollapse;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取顶部地址栏地址
|
||||
*/
|
||||
export const getTopUrl = () => {
|
||||
return window.location.href.split('/#/')[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取url参数
|
||||
* @param name 参数名
|
||||
*/
|
||||
export const getQueryString = name => {
|
||||
let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
|
||||
let r = window.location.search.substr(1).match(reg);
|
||||
if (r != null) return unescape(decodeURI(r[2]));
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
* @param {String} path - 文件地址
|
||||
* @param {String} name - 文件名,eg: test.png
|
||||
*/
|
||||
export const downloadFileBlob = (path, name) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('get', path);
|
||||
xhr.responseType = 'blob';
|
||||
xhr.send();
|
||||
xhr.onload = function () {
|
||||
if (this.status === 200 || this.status === 304) {
|
||||
// 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob
|
||||
if ('msSaveOrOpenBlob' in navigator) {
|
||||
navigator.msSaveOrOpenBlob(this.response, name);
|
||||
return;
|
||||
}
|
||||
const url = URL.createObjectURL(this.response);
|
||||
const a = document.createElement('a');
|
||||
a.style.display = 'none';
|
||||
a.href = url;
|
||||
a.download = name;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
URL.revokeObjectURL(url);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
* @param {String} path - 文件地址
|
||||
* @param {String} name - 文件名,eg: test.png
|
||||
*/
|
||||
export const downloadFileBase64 = (path, name) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('get', path);
|
||||
xhr.responseType = 'blob';
|
||||
xhr.send();
|
||||
xhr.onload = function () {
|
||||
if (this.status === 200 || this.status === 304) {
|
||||
const fileReader = new FileReader();
|
||||
fileReader.readAsDataURL(this.response);
|
||||
fileReader.onload = function () {
|
||||
const a = document.createElement('a');
|
||||
a.style.display = 'none';
|
||||
a.href = this.result;
|
||||
a.download = name;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 下载excel
|
||||
* @param {blob} fileArrayBuffer 文件流
|
||||
* @param {String} filename 文件名称
|
||||
*/
|
||||
export const downloadXls = (fileArrayBuffer, filename) => {
|
||||
downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8');
|
||||
};
|
||||
|
||||
/**
|
||||
* 下载json
|
||||
* @param {blob} fileArrayBuffer 文件流
|
||||
* @param {String} filename 文件名称
|
||||
*/
|
||||
export const downloadJson = (fileArrayBuffer, filename) => {
|
||||
downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8');
|
||||
};
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
* @param fileArrayBuffer 文件流
|
||||
* @param filename 文件名
|
||||
* @param mimeType 文件类型
|
||||
*/
|
||||
export const downloadFile = (fileArrayBuffer, filename, mimeType = 'application/octet-stream') => {
|
||||
let data = new Blob([fileArrayBuffer], { type: mimeType });
|
||||
if (typeof window.chrome !== 'undefined') {
|
||||
// Chrome
|
||||
let link = document.createElement('a');
|
||||
link.href = window.URL.createObjectURL(data);
|
||||
link.download = filename;
|
||||
link.click();
|
||||
} else if (typeof window.navigator.msSaveBlob !== 'undefined') {
|
||||
// IE
|
||||
let blob = new Blob([data], { type: 'application/force-download' });
|
||||
window.navigator.msSaveBlob(blob, filename);
|
||||
} else {
|
||||
// Firefox
|
||||
let file = new File([data], filename, { type: 'application/force-download' });
|
||||
window.open(URL.createObjectURL(file));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 通过URL下载文件
|
||||
* @param {String} url 文件URL
|
||||
* @param {String} filename 文件名
|
||||
*/
|
||||
export const downloadFileByUrl = (url, filename) => {
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = filename || '下载文件';
|
||||
link.style.display = 'none';
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
};
|
||||
|
||||
/**
|
||||
* 在 option 配置中查找指定 prop 的 column 对象
|
||||
* 支持两种格式:
|
||||
* 1. column 数组格式:[{ prop: 'xxx', ... }, ...]
|
||||
* 2. group 数组格式:[{ column: [...] }, ...] - group 中包含 column 数组
|
||||
* @param {Array} arr - column 数组或 group 数组
|
||||
* @param {string} prop - 要查找的 column 的 prop 值
|
||||
* @returns {Object|null} 返回找到的 column 对象引用,未找到返回 null
|
||||
*/
|
||||
export const findColumn = (arr, prop) => {
|
||||
if (!Array.isArray(arr) || arr.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 使用 flatMap 统一处理两种格式:
|
||||
// - group 格式:item.column 存在,展开为 column 数组
|
||||
// - column 格式:item.column 不存在,返回 item 本身
|
||||
return arr.flatMap(item => item.column || item).find(col => col.prop === prop) || null;
|
||||
};
|
||||
Reference in New Issue
Block a user