From e1699c4851f6ca397cd0ad1ff63f32c737654836 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Wed, 02 Apr 2025 19:14:54 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/utils/util.js |  604 +++++++++++++++++++++++++++---------------------------
 1 files changed, 302 insertions(+), 302 deletions(-)

diff --git a/src/utils/util.js b/src/utils/util.js
index 7de4a4e..8a7051b 100644
--- a/src/utils/util.js
+++ b/src/utils/util.js
@@ -1,176 +1,176 @@
-import { validatenull } from './validate';
-import sha256 from 'crypto-js/sha256';
-import Base64 from 'crypto-js/enc-base64';
+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('&');
-};
+	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)];
-};
+	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;
-};
+	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', '');
-  }
-};
+	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;
-};
+	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;
-};
+	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();
-  }
-};
+	if (fullscreenEnable()) {
+		exitFullScreen()
+	} else {
+		reqFullScreen()
+	}
+}
 /**
  * esc监听全屏
  */
 export const listenfullscreen = callback => {
-  function listen() {
-    callback();
-  }
+	function listen() {
+		callback()
+	}
 
-  document.addEventListener('fullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('mozfullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('webkitfullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('msfullscreenchange', function () {
-    listen();
-  });
-};
+	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;
-};
+	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();
-  }
-};
+	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();
-  }
-};
+	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);
-          }
-        }
-      }
-    }
-  }
-};
+	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个对象属性和值是否相等
  */
@@ -180,157 +180,157 @@
  */
 
 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);
-};
+	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;
-  }
+	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;
-  }
+	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;
-};
+	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;
-};
+	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;
-};
+	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;
-};
+	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;
+	// 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 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
-  );
+	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();
-  }
-};
+	// Puts focus on the newWindow
+	if (window.focus) {
+		newWindow.focus()
+	}
+}
 
 export const getScreen = isCollapse => {
-  if (document.body.clientWidth <= 768) {
-    return !isCollapse;
-  } else {
-    return isCollapse;
-  }
-};
+	if (document.body.clientWidth <= 768) {
+		return !isCollapse
+	} else {
+		return isCollapse
+	}
+}
 
 /**
  * 获取顶部地址栏地址
  */
 export const getTopUrl = () => {
-  return window.location.href.split('/#/')[0];
-};
+	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;
-};
+	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
+}
 
 /**
  * 下载文件
@@ -338,29 +338,29 @@
  * @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);
-    }
-  };
-};
+	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)
+		}
+	}
+}
 
 /**
  * 下载文件
@@ -368,26 +368,26 @@
  * @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);
-      };
-    }
-  };
-};
+	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
@@ -395,8 +395,8 @@
  * @param {String} filename 文件名称
  */
 export const downloadXls = (fileArrayBuffer, filename) => {
-  downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8');
-};
+	downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8')
+}
 
 /**
  * 下载json
@@ -404,8 +404,8 @@
  * @param {String} filename 文件名称
  */
 export const downloadJson = (fileArrayBuffer, filename) => {
-  downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8');
-};
+	downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8')
+}
 
 /**
  * 下载文件
@@ -414,20 +414,20 @@
  * @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));
-  }
-};
+	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))
+	}
+}

--
Gitblit v1.9.3