2024-02-02 15:04:47 +08:00
|
|
|
|
import XLSX from 'xlsx'
|
|
|
|
|
|
|
|
|
|
|
|
import {validatenull} from './validate'
|
|
|
|
|
|
|
|
|
|
|
|
//表单序列化
|
|
|
|
|
|
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 getViewDom =
|
|
|
|
|
|
() => {
|
|
|
|
|
|
return window.document.getElementById('avue-view')
|
|
|
|
|
|
.getElementsByClassName('el-scrollbar__wrap')[0]
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 对象深拷贝
|
|
|
|
|
|
*/
|
|
|
|
|
|
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] = btoa(result[ele]);
|
|
|
|
|
|
})
|
|
|
|
|
|
} else if (type == 'Aes') {
|
|
|
|
|
|
param.forEach(ele => {
|
|
|
|
|
|
result[ele] = window.CryptoJS.AES.encrypt(result[ele], key).toString();
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
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()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 导出excel
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const exportFunc =
|
|
|
|
|
|
(title, data, fileName) => {
|
|
|
|
|
|
const aoa = [title]
|
|
|
|
|
|
data.forEach(item => {aoa.push(item)})
|
|
|
|
|
|
const sheet = XLSX.utils.aoa_to_sheet(aoa)
|
|
|
|
|
|
const book = XLSX.utils.book_new()
|
|
|
|
|
|
XLSX.utils.book_append_sheet(book, sheet, 'sheet1')
|
|
|
|
|
|
XLSX.writeFile(book, fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 下载文件
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const download =
|
|
|
|
|
|
(fileName, data) => {
|
|
|
|
|
|
if (!data) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let url = window.URL.createObjectURL(new Blob([data]));
|
|
|
|
|
|
let link = document.createElement('a');
|
|
|
|
|
|
link.style.display = 'none';
|
|
|
|
|
|
link.href = url;
|
|
|
|
|
|
link.setAttribute('download', fileName);
|
|
|
|
|
|
|
|
|
|
|
|
document.body.appendChild(link);
|
|
|
|
|
|
link.click();
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 数据分页
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const pagination =
|
|
|
|
|
|
(arr, currentPage, pageSize) => {
|
|
|
|
|
|
const res = [];
|
|
|
|
|
|
const start = (currentPage - 1) * pageSize;
|
|
|
|
|
|
const end = start + pageSize;
|
|
|
|
|
|
for (let index = start; index < end && index < arr.length; index++) {
|
|
|
|
|
|
res.push(arr[index]);
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通过身份证获取年龄
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const getAgeByIdNumber =
|
|
|
|
|
|
(idNumber) => {
|
|
|
|
|
|
const year = idNumber.substring(6, 10)
|
|
|
|
|
|
const month = idNumber.substring(10, 12)
|
|
|
|
|
|
const day = idNumber.substring(12, 14)
|
|
|
|
|
|
const now = new Date()
|
|
|
|
|
|
let age = now.getFullYear() - year
|
|
|
|
|
|
if (now.getMonth() < month ||
|
|
|
|
|
|
(now.getMonth() == month && day < now.getDay())) {
|
|
|
|
|
|
age--;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return age
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通过身份证获取性别
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const getGenderByIdNumber = (idNumber) => {
|
|
|
|
|
|
if (idNumber.substring(16, 17) % 2) {
|
|
|
|
|
|
return '男'
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return '女'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通过身份证号脱敏显示
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const idNumberDDesensitization = (idNumber) => {
|
|
|
|
|
|
if (!idNumber) return '';
|
|
|
|
|
|
let str = idNumber;
|
|
|
|
|
|
str = str.toString().replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2")
|
|
|
|
|
|
return str;
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通过姓名脱敏显示
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const nameDesensitization = (name) => {
|
|
|
|
|
|
if (!name) return '';
|
|
|
|
|
|
let str = name;
|
|
|
|
|
|
str = str.substring(0,1) + new Array(str.length).join('*')
|
|
|
|
|
|
return str;
|
|
|
|
|
|
}
|
2024-03-19 17:23:29 +08:00
|
|
|
|
export function debounce(fn, delay) {
|
|
|
|
|
|
let timer = null
|
|
|
|
|
|
return function() {
|
|
|
|
|
|
const context = this
|
|
|
|
|
|
const args = arguments
|
|
|
|
|
|
clearTimeout(timer)
|
|
|
|
|
|
timer = setTimeout(function() {
|
|
|
|
|
|
fn.apply(context, args)
|
|
|
|
|
|
}, delay)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|