From e1afd6281a8cccd1484fb03cccee3985f98777d4 Mon Sep 17 00:00:00 2001
From: rain <1679827795@qq.com>
Date: Tue, 06 May 2025 18:40:52 +0800
Subject: [PATCH] Merge branch 'master' into test

---
 src/utils/util.js |  369 +++++++++++++++++++++++++++-------------------------
 1 files changed, 193 insertions(+), 176 deletions(-)

diff --git a/src/utils/util.js b/src/utils/util.js
index 0cdfc47..978bddf 100644
--- a/src/utils/util.js
+++ b/src/utils/util.js
@@ -1,16 +1,16 @@
-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 = [];
+  let list = []
   Object.keys(data).forEach(ele => {
-    list.push(`${ele}=${data[ele]}`);
-  });
-  return list.join('&');
-};
+    list.push(`${ele}=${data[ele]}`)
+  })
+  return list.join('&')
+}
 export const getObjType = obj => {
-  var toString = Object.prototype.toString;
+  var toString = Object.prototype.toString
   var map = {
     '[object Boolean]': 'boolean',
     '[object Number]': 'number',
@@ -22,136 +22,136 @@
     '[object Undefined]': 'undefined',
     '[object Null]': 'null',
     '[object Object]': 'object',
-  };
-  if (obj instanceof Element) {
-    return 'element';
   }
-  return map[toString.call(obj)];
-};
+  if (obj instanceof Element) {
+    return 'element'
+  }
+  return map[toString.call(obj)]
+}
 /**
  * 对象深拷贝
  */
 export const deepClone = data => {
-  var type = getObjType(data);
-  var obj;
+  var type = getObjType(data)
+  var obj
   if (type === 'array') {
-    obj = [];
+    obj = []
   } else if (type === 'object') {
-    obj = {};
+    obj = {}
   } else {
     //不再具有下一层次
-    return data;
+    return data
   }
   if (type === 'array') {
     for (var i = 0, len = data.length; i < len; i++) {
-      obj.push(deepClone(data[i]));
+      obj.push(deepClone(data[i]))
     }
   } else if (type === 'object') {
     for (var key in data) {
-      obj[key] = deepClone(data[key]);
+      obj[key] = deepClone(data[key])
     }
   }
-  return obj;
-};
+  return obj
+}
 /**
  * 设置灰度模式
  */
 export const toggleGrayMode = status => {
   if (status) {
-    document.body.className = document.body.className + ' grayMode';
+    document.body.className = document.body.className + ' grayMode'
   } else {
-    document.body.className = document.body.className.replace(' grayMode', '');
+    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));
+  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]);
-    });
+      result[ele] = Base64.stringify(result[ele])
+    })
   } else if (type == 'Aes') {
     param.forEach(ele => {
-      result[ele] = sha256(result[ele], key);
-    });
+      result[ele] = sha256(result[ele], key)
+    })
   }
-  return result;
-};
+  return result
+}
 
 /**
  * 浏览器判断是否全屏
  */
 export const fullscreenToggel = () => {
   if (fullscreenEnable()) {
-    exitFullScreen();
+    exitFullScreen()
   } else {
-    reqFullScreen();
+    reqFullScreen()
   }
-};
+}
 /**
  * esc监听全屏
  */
 export const listenfullscreen = callback => {
-  function listen() {
-    callback();
+  function listen () {
+    callback()
   }
 
   document.addEventListener('fullscreenchange', function () {
-    listen();
-  });
+    listen()
+  })
   document.addEventListener('mozfullscreenchange', function () {
-    listen();
-  });
+    listen()
+  })
   document.addEventListener('webkitfullscreenchange', function () {
-    listen();
-  });
+    listen()
+  })
   document.addEventListener('msfullscreenchange', function () {
-    listen();
-  });
-};
+    listen()
+  })
+}
 /**
  * 浏览器判断是否全屏
  */
 export const fullscreenEnable = () => {
   var isFullscreen =
-    document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;
-  return isFullscreen;
-};
+    document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen
+  return isFullscreen
+}
 
 /**
  * 浏览器全屏
  */
 export const reqFullScreen = () => {
   if (document.documentElement.requestFullScreen) {
-    document.documentElement.requestFullScreen();
+    document.documentElement.requestFullScreen()
   } else if (document.documentElement.webkitRequestFullScreen) {
-    document.documentElement.webkitRequestFullScreen();
+    document.documentElement.webkitRequestFullScreen()
   } else if (document.documentElement.mozRequestFullScreen) {
-    document.documentElement.mozRequestFullScreen();
+    document.documentElement.mozRequestFullScreen()
   }
-};
+}
 /**
  * 浏览器退出全屏
  */
 export const exitFullScreen = () => {
   if (document.documentElement.requestFullScreen) {
-    document.exitFullScreen();
+    document.exitFullScreen()
   } else if (document.documentElement.webkitRequestFullScreen) {
-    document.webkitCancelFullScreen();
+    document.webkitCancelFullScreen()
   } else if (document.documentElement.mozRequestFullScreen) {
-    document.mozCancelFullScreen();
+    document.mozCancelFullScreen()
   }
-};
+}
 /**
  * 递归寻找子类的父类
  */
@@ -161,16 +161,16 @@
     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];
+          return menu[i]
         } else {
           if (menu[i].children[j].children.length != 0) {
-            return findParent(menu[i].children[j].children, id);
+            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;
+  delete obj1.close
+  var o1 = obj1 instanceof Object
+  var o2 = obj2 instanceof Object
   if (!o1 || !o2) {
     /*  判断不是对象  */
-    return obj1 === obj2;
+    return obj1 === obj2
   }
 
   if (Object.keys(obj1).length !== Object.keys(obj2).length) {
-    return false;
+    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;
+    var t1 = obj1[attr] instanceof Object
+    var t2 = obj2[attr] instanceof Object
     if (t1 && t2) {
-      return diff(obj1[attr], obj2[attr]);
+      return diff(obj1[attr], obj2[attr])
     } else if (obj1[attr] !== obj2[attr]) {
-      return false;
+      return false
     }
   }
-  return true;
-};
+  return true
+}
 /**
  * 根据字典的value显示label
  */
 export const findByvalue = (dic, value) => {
-  let result = '';
-  if (validatenull(dic)) return 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);
+    let index = 0
+    index = findArray(dic, value)
     if (index != -1) {
-      result = dic[index].label;
+      result = dic[index].label
     } else {
-      result = value;
+      result = value
     }
   } else if (value instanceof Array) {
-    result = [];
-    let index = 0;
+    result = []
+    let index = 0
     value.forEach(ele => {
-      index = findArray(dic, ele);
+      index = findArray(dic, ele)
       if (index != -1) {
-        result.push(dic[index].label);
+        result.push(dic[index].label)
       } else {
-        result.push(value);
+        result.push(value)
       }
-    });
-    result = result.toString();
+    })
+    result = result.toString()
   }
-  return result;
-};
+  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 i
     }
   }
-  return -1;
-};
+  return -1
+}
 /**
  * 生成随机len位数字
  */
 export const randomLenNum = (len, date) => {
-  let random = '';
+  let random = ''
   random = Math.ceil(Math.random() * 100000000000000)
     .toString()
-    .substr(0, len ? len : 4);
-  if (date) random = random + Date.now();
-  return random;
-};
+    .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 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;
+      ? document.documentElement.clientWidth
+      : screen.width
   const height = window.innerHeight
     ? window.innerHeight
     : document.documentElement.clientHeight
-    ? document.documentElement.clientHeight
-    : screen.height;
+      ? document.documentElement.clientHeight
+      : screen.height
 
-  const left = width / 2 - w / 2 + dualScreenLeft;
-  const top = height / 2 - h / 2 + dualScreenTop;
+  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
-  );
+    w +
+    ', height=' +
+    h +
+    ', top=' +
+    top +
+    ', left=' +
+    left
+  )
 
   // Puts focus on the newWindow
   if (window.focus) {
-    newWindow.focus();
+    newWindow.focus()
   }
-};
+}
 
 export const getScreen = isCollapse => {
   if (document.body.clientWidth <= 768) {
-    return !isCollapse;
+    return !isCollapse
   } else {
-    return isCollapse;
+    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();
+  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;
+        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 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,46 +368,63 @@
  * @param {String} name - 文件名,eg: test.png
  */
 export const downloadFileBase64 = (path, name) => {
-  const xhr = new XMLHttpRequest();
-  xhr.open('get', path);
-  xhr.responseType = 'blob';
-  xhr.send();
+  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);
+      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 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) => {
-  let data = new Blob([fileArrayBuffer], { type: 'application/vnd.ms-excel,charset=utf-8' });
+  let data = new Blob([fileArrayBuffer], { type: 'application/vnd.ms-excel,charset=utf-8' })
   if (typeof window.chrome !== 'undefined') {
     // Chrome
-    var link = document.createElement('a');
-    link.href = window.URL.createObjectURL(data);
-    link.download = filename;
-    link.click();
+    var link = document.createElement('a')
+    link.href = window.URL.createObjectURL(data)
+    link.download = filename
+    link.click()
   } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
     // IE
-    var blob = new Blob([data], { type: 'application/force-download' });
-    window.navigator.msSaveBlob(blob, filename);
+    var blob = new Blob([data], { type: 'application/force-download' })
+    window.navigator.msSaveBlob(blob, filename)
   } else {
     // Firefox
-    var file = new File([data], filename, { type: 'application/force-download' });
-    window.open(URL.createObjectURL(file));
+    var file = new File([data], filename, { type: 'application/force-download' })
+    window.open(URL.createObjectURL(file))
   }
-};
+}
+
+export const calculateDefaultRange = () => {
+  const now = new Date()
+  const currentYear = now.getFullYear()
+  const currentMonth = now.getMonth() // 0-11
+
+  // 计算上个月
+  let lastMonthYear = currentYear
+  let lastMonth = currentMonth - 1
+  if (lastMonth < 0) {
+    lastMonth = 11
+    lastMonthYear = currentYear - 1
+  }
+
+  // 设置默认范围 [上个月, 当前月]
+  return [new Date(lastMonthYear, lastMonth, 1), new Date(currentYear, currentMonth, 1)]
+}

--
Gitblit v1.9.3