前端常用的方法工具

// import {singleFileDownload} from '@/utils/downloads'
import cryptoJs from 'crypto-js'
import {
  Message
} from "element-ui";

/**
 * @description 本地存储包装器
 * @param type不传默认为 localStorage, 传 session 为 sessionStorage
 */
let storage = {
  checkWindow() {
    if (!window) {
      console.warn("[Storage] === Storage can ONLY used in browser.");
      return false;
    }
    return true;
  },
  checkSupport(type) {
    let winFlag = this.checkWindow();
    if (winFlag && window[type]) {
      return true;
    } else {
      console.warn([Storage] === ${type} Storage is NOT supported.);
      return false;
    }
  },
  checkType(type) {
    if (type && type === "session") {
      return "sessionStorage";
    } else {
      return "localStorage";
    }
  },
  setObj(obj, type) {
    Object.keys(obj).forEach((item) => {
      this.set(item, obj[item], type);
    });
  },
  set(key, value, type) {
    let curTime = new Date().getTime();
    let target = this.checkType(type);
    if (this.checkSupport(target)) {
      if (typeof value === "string" || Array.isArray(value)) {
        return window[target].setItem(key, JSON.stringify(value));
      } else {
        let data = Object.assign({}, value, {
          time: curTime,
        });
        return window[target].setItem(key, JSON.stringify(data));
      }
    }
  },
  get(key, type) {
    let target = this.checkType(type);
    if (this.checkSupport(target)) {
      if (
        window &&
        window[target] &&
        window[target][key] &&
        window[target][key] !== "undefined"
      ) {
        let data = window[target][key] || false;
        return data;
      } else {
        return window[target][key];
      }
    }
  },

  removeArr(arr, type) {
    if (Array.isArray(arr) && arr.length) {
      arr.forEach((item) => {
        this.remove(item, type);
      });
    } else {
      console.warn("[Storage] === Params must be an array.");
    }
  },
  remove(key, type) {
    let target = this.checkType(type);
    if (this.checkSupport(target)) {
      if (window[target][key] && window[target][key] !== "undefined") {
        return window[target].removeItem(key);
      }
    }
  },
  clear(type) {
    let target = this.checkType(type);
    window[target].clear();
  },
};

/**
 * [deepClone 对象拷贝]
 * @param  {[Object]} obj [需要被拷贝的对象]
 * @return {[type]}     [description]
 */
let deepClone = function (obj, ...args) {
  let copy;

  if (obj == null || typeof obj !== "object") return obj;
  if (obj instanceof Date) {
    copy = new Date();
    copy.setTime(obj.getTime());
    return copy;
  }

  // Handle Array
  if (obj instanceof Array) {
    copy = [];
    for (let i = 0, len = obj.length; i < len; i++) {
      copy[i] = deepClone(obj[i]);
    }
    return copy;
  }

  // Handle Function
  if (obj instanceof Function) {
    copy = function () {
      return obj.apply(this, args);
    };
    return copy;
  }

  // Handle Object
  if (obj instanceof Object) {
    copy = {};
    for (let attr in obj) {
      if (obj.hasOwnProperty(attr)) copy[attr] = deepClone(obj[attr]);
    }
    return copy;
  }

  throw new Error(
    "Unable to copy obj as type isn't supported " + obj.constructor.name
  );
};

/**
 * [setToken &#x8BBE;&#x7F6E;token]
 * @param {[type]} token      [description]
 * @param {[type]} token_type [description]
 */
function setToken(token, token_type) {
  storage.set("token", token);
  storage.set("token_type", token_type);
}

/**
 * [clearToken &#x6E05;&#x9664;token]
 * @param {[type]} token [description]
 */
function clearToken(token) {
  storage.remove("token");
  storage.remove("token_type");
}

/**
 * [uniqueArray &#x6570;&#x7EC4;&#x53BB;&#x91CD;]
 * @param  {[type]} arr [description]
 * @return {[type]}     [description]
 */
function uniqueArray(arr) {
  const set = new Set(arr);
  return [...set];
}

/**
 * [sum &#x6570;&#x7EC4;&#x6C42;&#x548C;]
 * @param  {[type]} arr [description]
 * @return {[type]}     [description]
 */
function sum(arr) {
  return arr.reduce(function (prev, curr, idx, arr) {
    return prev + curr;
  });
}

/**
 * [uniqueArrayObject &#x6570;&#x7EC4;&#x5BF9;&#x8C61;&#x53BB;&#x91CD;]
 * @param  {[type]} arr [description]
 * @param  {[type]} key [description]
 * @return {[type]}     [description]
 */
function uniqueArrayObject(arr, key) {
  let obj = {};
  return arr.reduce(function (item, next) {
    obj[next[key]] ? "" : (obj[next[key]] = true && item.push(next));
    return item;
  }, []);
}

/**
 * [getDateFormat &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65F6;&#x95F4;]
 * @param  {String} fmt [yyyy-MM-dd]
 * @return {[type]}     [description]
 * &#x6708;(M)&#x3001;&#x65E5;(d)&#x3001;&#x5C0F;&#x65F6;(h)&#x3001;&#x5206;(m)&#x3001;&#x79D2;(s)&#x3001;&#x5B63;&#x5EA6;(q) &#x53EF;&#x4EE5;&#x7528; 1-2 &#x4E2A;&#x5360;&#x4F4D;&#x7B26;&#xFF0C;
 * &#x5E74;(y)&#x53EF;&#x4EE5;&#x7528; 1-4 &#x4E2A;&#x5360;&#x4F4D;&#x7B26;&#xFF0C;&#x6BEB;&#x79D2;(S)&#x53EA;&#x80FD;&#x7528; 1 &#x4E2A;&#x5360;&#x4F4D;&#x7B26;(&#x662F; 1-3 &#x4F4D;&#x7684;&#x6570;&#x5B57;)
 * &#x4F8B;&#x5B50;&#xFF1A;getDateFormat("yyyy-MM-dd hh:mm:ss.S")
 */
function getDateFormat(fmt = "yyyy-MM-dd", day) {
  let date = day || new Date();
  let o = {
    "M+": date.getMonth() + 1, // &#x6708;&#x4EFD;
    "d+": date.getDate(), // &#x65E5;
    "h+": date.getHours(), // &#x5C0F;&#x65F6;
    "m+": date.getMinutes(), // &#x5206;
    "s+": date.getSeconds(), // &#x79D2;
    "q+": Math.floor((date.getMonth() + 3) / 3), // &#x5B63;&#x5EA6;
    S: date.getMilliseconds(), // &#x6BEB;&#x79D2;
  };
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(
      RegExp.$1,
      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  for (let 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;
}

/**
 * [getTimeDistance &#x83B7;&#x53D6;&#x65F6;&#x95F4;&#x95F4;&#x9694;]
 * @param  {[type]} time [description]
 * @return {[type]}      [description]
 */
function getTimeDistance(time) {
  // &#x652F;&#x6301;&#x4F20;&#x5165;10&#x4F4D;&#x6216;13&#x4F4D;&#x6BEB;&#x79D2;&#x6570;&#xFF0C;&#x5982; 1587367194536,"1587367194"
  // &#x652F;&#x6301;&#x4F20;&#x5165;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#xFF0C;&#x5982; "2020/4/20 15:31:18"

  if (typeof time == "number" || Number(time) == time) {
    if (String(time).length == 10) {
      time = Number(time) * 1000;
    } else if (String(time).length == 13) {
      time = Number(time);
    } else {
      console.log("&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x9519;&#x8BEF;");
      return time;
    }
  } else {
    if (
      typeof time == "string" &&
      time.split(" ").length == 2 &&
      time.split(/[- : \/]/).length == 6
    ) {
      time = new Date(time.replace(/\-/g, "/")).getTime();
    } else {
      console.log("&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x9519;&#x8BEF;");
      return time;
    }
  }

  // &#x5904;&#x7406;&#x4E4B;&#x540E;&#x7684;time&#x4E3A;13&#x4F4D;&#x6570;&#x5B57;&#x683C;&#x5F0F;&#x7684;&#x6BEB;&#x79D2;&#x6570;

  var date_now = new Date();
  var date_time = new Date(time);
  var distance = date_now.getTime() - time;

  var days = parseInt(distance / (1000 * 60 * 60 * 24));
  if (days == 1) {
    return "&#x6628;&#x5929;";
  } else if (days > 1 && days < 4) {
    return days + "&#x5929;&#x524D;";
  } else if (days > 3) {
    // &#x8D85;&#x8FC7;3&#x5929;&#x7684;&#xFF0C;&#x8FD4;&#x56DE;&#x65E5;&#x671F;&#xFF0C;&#x5982; 2018-12-05
    // &#x5982;&#x679C;&#x662F;&#x4ECA;&#x5E74;&#x7684;&#xFF0C;&#x5C31;&#x7701;&#x53BB;&#x5E74;&#x4EFD;&#xFF0C;&#x8FD4;&#x56DE; 12-05
    var year = date_time.getFullYear();
    var month = date_time.getMonth() + 1;
    if (month < 10) {
      month = "0" + month;
    }
    var day = date_time.getDate();
    if (day < 10) {
      day = "0" + day;
    }
    if (date_now.getFullYear() == year) {
      return month + "-" + day;
    } else {
      return year + "-" + month + "-" + day;
    }
  }

  var hours = parseInt((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  if (hours > 0) {
    return hours + "&#x5C0F;&#x65F6;&#x524D;";
  }

  var minutes = parseInt((distance % (1000 * 60 * 60)) / (1000 * 60));
  if (minutes > 0) {
    return minutes + "&#x5206;&#x949F;&#x524D;";
  }

  return "&#x521A;&#x521A;";
}

/**
 * [funDate &#x83B7;&#x53D6;7&#x5929;&#x4E4B;&#x524D;&#x7684;&#x65E5;&#x671F;&#x6216;&#x8005;7&#x5929;&#x4E4B;&#x540E;&#x7684;&#x65E5;&#x671F;]
 * @param  {Number} num  [description]
 * @param  {[type]} date [description]
 * @return {[type]}      [description]
 */
function funDate(num = 7, date) {
  let date1 = date || new Date();
  //&#x4ECA;&#x5929;&#x65F6;&#x95F4;
  let time1 =
    date1.getFullYear() + "-" + (date1.getMonth() + 1) + "-" + date1.getDate();
  let date2 = new Date(date1);
  date2.setDate(date1.getDate() + num);
  //num&#x662F;&#x6B63;&#x6570;&#x8868;&#x793A;&#x4E4B;&#x540E;&#x7684;&#x65F6;&#x95F4;&#xFF0C;num&#x8D1F;&#x6570;&#x8868;&#x793A;&#x4E4B;&#x524D;&#x7684;&#x65F6;&#x95F4;&#xFF0C;0&#x8868;&#x793A;&#x4ECA;&#x5929;
  return {
    today: time1,
    date: date2.getFullYear() +
      "-" +
      (date2.getMonth() + 1) +
      "-" +
      date2.getDate(),
  };
}

/**
 * [chunkArray &#x6839;&#x636E;&#x6307;&#x70B9;&#x957F;&#x5EA6;&#x5206;&#x5272;&#x6570;&#x7EC4;]
 * @param  {[type]} array &#x6570;&#x7EC4;
 * @param  {[type]} size  &#x957F;&#x5EA6;
 * @return {[type]}       [description]
 */
function chunkArray(array, size) {
  //&#x83B7;&#x53D6;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x4F20;&#x5165;&#x7684;&#x4E0D;&#x662F;&#x6570;&#x7EC4;&#xFF0C;&#x90A3;&#x4E48;&#x83B7;&#x53D6;&#x5230;&#x7684;&#x5C31;&#x662F;undefined
  const length = array.length;
  //&#x5224;&#x65AD;&#x4E0D;&#x662F;&#x6570;&#x7EC4;&#xFF0C;&#x6216;&#x8005;size&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;&#xFF0C;size&#x5C0F;&#x4E8E;1&#xFF0C;&#x5C31;&#x8FD4;&#x56DE;&#x7A7A;&#x6570;&#x7EC4;
  if (!length || !size || size < 1) {
    return [];
  }
  //&#x6838;&#x5FC3;&#x90E8;&#x5206;
  let index = 0; //&#x7528;&#x6765;&#x8868;&#x793A;&#x5207;&#x5272;&#x5143;&#x7D20;&#x7684;&#x8303;&#x56F4;start
  let resIndex = 0; //&#x7528;&#x6765;&#x9012;&#x589E;&#x8868;&#x793A;&#x8F93;&#x51FA;&#x6570;&#x7EC4;&#x7684;&#x4E0B;&#x6807;

  //&#x6839;&#x636E;length&#x548C;size&#x7B97;&#x51FA;&#x8F93;&#x51FA;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x5E76;&#x4E14;&#x521B;&#x5EFA;&#x5B83;&#x3002;
  let result = new Array(Math.ceil(length / size));
  //&#x8FDB;&#x884C;&#x5FAA;&#x73AF;
  while (index < length) {
    //&#x5FAA;&#x73AF;&#x8FC7;&#x7A0B;&#x4E2D;&#x8BBE;&#x7F6E;result[0]&#x548C;result[1]&#x7684;&#x503C;&#x3002;&#x8BE5;&#x503C;&#x6839;&#x636E;array.slice&#x5207;&#x5272;&#x5F97;&#x5230;&#x3002;
    result[resIndex++] = array.slice(index, (index += size));
  }
  //&#x8F93;&#x51FA;&#x65B0;&#x6570;&#x7EC4;
  return result;
}

/**
 * [getExtensionFileName &#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x540E;&#x7F00;]
 * @param  {[type]} filename [description]
 * @return {[type]}          [description]
 */
function getExtensionFileName(filename) {
  let reg = /(\\+)/g;
  let pString = filename.replace(reg, "#"); //&#x7528;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x6765;&#x5C06;\&#x6216;\\&#x66FF;&#x6362;&#x6210;#
  let arr = pString.split("#"); // &#x4EE5;&#x201C;#&#x201D;&#x4E3A;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x5C06;&#x5B57;&#x7B26;&#x5206;&#x89E3;&#x4E3A;&#x6570;&#x7EC4; &#x4F8B;&#x5982; D Program Files bg.png
  let lastString = arr[arr.length - 1]; //&#x53D6;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;
  let arr2 = lastString.split("."); //   &#x518D;&#x4EE5;"."&#x4F5C;&#x4E3A;&#x5206;&#x9694;&#x7B26;
  return arr2[arr2.length - 1]; //&#x5C06;&#x540E;&#x7F00;&#x540D;&#x8FD4;&#x56DE;&#x51FA;&#x6765;
}

/**
 * [getOssImgResize &#x6309;&#x6BD4;&#x4F8B;&#x7F29;&#x653E;&#x56FE;&#x7247;]
 * @param  {[type]} url   [description]
 * @param  {[type]} size  [description]
 * @param  {[type]} force [description]
 * @return {[type]}       [description]
 */
function getOssImgResize(url, size, force) {
  if (force)
    return ${url}?x-oss-process=image/resize,m_fixed,h_${size},w_${size};
  return ${url}?x-oss-process=image/resize,w_${size};
}

/**
 * [getTimeStamp &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x6233;]
 * @return {[type]} [description]
 */
function getTimeStamp(key) {
  return ${key}_${new Date().getTime()}_${
      Math.floor(Math.random() * (100 - 1)) + 1
    };
}

/**
 * [cookie&#x65B9;&#x6CD5;&#x5C01;&#x88C5;]
 * @type {Object}
 */
const cookie = {
  //&#x8BBE;&#x7F6E;cookie,&#x589E;&#x52A0;&#x5230;vue&#x5B9E;&#x4F8B;&#x65B9;&#x4FBF;&#x5168;&#x5C40;&#x8C03;&#x7528;
  setCookie: (c_name, value, expiredays) => {
    let exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie =
      c_name +
      "=" +
      escape(value) +
      (expiredays == null ? "" : ";expires=" + exdate.toGMTString());
  },

  //&#x83B7;&#x53D6;cookie&#x3001;
  getCookie: (name) => {
    let arr,
      reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
    if ((arr = document.cookie.match(reg))) return arr[2];
    else return null;
  },

  //&#x5220;&#x9664;cookie
  delCookie: (name) => {
    let exp = new Date();
    exp.setTime(exp.getTime() - 1);
    let cval = cookie.getCookie(name);
    if (cval != null)
      document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
  },

  // &#x6E05;&#x9664;&#x6240;&#x6709;cookie
  clearAllCookie() {
    var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
    if (keys) {
      for (var i = keys.length; i--;)
        document.cookie = keys[i] + "=0;expires=" + new Date(0).toUTCString();
    }
  },
};

/**
 * [getTokenInfo &#x89E3;&#x6790;token&#x83B7;&#x53D6;&#x4FE1;&#x606F;]
 * @return {[type]} [description]
 */
const getTokenInfo = function () {
  const token = getToken();
  if (token) {
    const info = decodeURIComponent(escape(window.atob(token.split(".")[1])));
    return JSON.parse(info);
  } else {
    return {};
  }
};

/**
 * [getToken &#x83B7;&#x53D6;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7684;token]
 * @return {[type]} [description]
 */
const getToken = function () {
  // return storage.get('token');
  return cookie.getCookie("token");
};

/**
 * @name:&#x5224;&#x65AD;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x662F;&#x5426;&#x5728;&#x6307;&#x5B9A;&#x7684;&#x4E24;&#x4E2A;&#x65F6;&#x95F4;&#x8303;&#x56F4;&#x5185;
 * @param {*} d1
 * @param {*} d2
 * @return {*}
 */
function nowInDateBetwen(d1, d2) {
  //&#x5982;&#x679C;&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x662F;&#x6B63;&#x786E;&#x7684;&#xFF0C;&#x90A3;&#x4E0B;&#x9762;&#x8FD9;&#x4E00;&#x6B65;&#x8F6C;&#x5316;&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x5C31;&#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x4E86;
  // var dateBegin = new Date(d1.replace(/-/g, "/"));//&#x5C06;-&#x8F6C;&#x5316;&#x4E3A;/&#xFF0C;&#x4F7F;&#x7528;new Date
  // var dateEnd = new Date(d2.replace(/-/g, "/"));//&#x5C06;-&#x8F6C;&#x5316;&#x4E3A;/&#xFF0C;&#x4F7F;&#x7528;new Date
  var dateBegin = new Date(d1); //&#x5C06;-&#x8F6C;&#x5316;&#x4E3A;/&#xFF0C;&#x4F7F;&#x7528;new Date
  var dateEnd = new Date(d2); //&#x5C06;-&#x8F6C;&#x5316;&#x4E3A;/&#xFF0C;&#x4F7F;&#x7528;new Date
  var dateNow = new Date(); //&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65F6;&#x95F4;

  var beginDiff = dateNow.getTime() - dateBegin.getTime(); //&#x65F6;&#x95F4;&#x5DEE;&#x7684;&#x6BEB;&#x79D2;&#x6570;
  var beginDayDiff = Math.floor(beginDiff / (24 * 3600 * 1000)); //&#x8BA1;&#x7B97;&#x51FA;&#x76F8;&#x5DEE;&#x5929;&#x6570;

  var endDiff = dateEnd.getTime() - dateNow.getTime(); //&#x65F6;&#x95F4;&#x5DEE;&#x7684;&#x6BEB;&#x79D2;&#x6570;
  var endDayDiff = Math.floor(endDiff / (24 * 3600 * 1000)); //&#x8BA1;&#x7B97;&#x51FA;&#x76F8;&#x5DEE;&#x5929;&#x6570;
  if (endDayDiff < 0) {
    //&#x5DF2;&#x8FC7;&#x671F;
    return false;
  }
  if (beginDayDiff < 0) {
    //&#x6CA1;&#x5230;&#x5F00;&#x59CB;&#x65F6;&#x95F4;
    return false;
  }
  return true;
}

// &#x662F;&#x5426;&#x56FE;&#x7247;
function isImg(suffix) {
  const suffixes = [
    "bmp",
    "jpeg",
    "png",
    "tiff",
    "gif",
    "pcx",
    "tga",
    "exif",
    "fpx",
    "svg",
    "psd",
    "jpg",
  ];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;excel
function isExcel(suffix) {
  const suffixes = ["xls", "xlsx"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;doc
function isDoc(suffix) {
  const suffixes = ["doc", "docx"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;ppt
function isPpt(suffix) {
  const suffixes = ["ppt", "pptx"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;pdf
function isPdf(suffix) {
  const suffixes = ["pdf"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;&#x538B;&#x7F29;&#x5305;
function isZip(suffix) {
  const suffixes = ["rar", "zip", "7z", "tar"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;&#x89C6;&#x9891;
function isVideo(suffix) {
  const suffixes = [
    "avi",
    "mov",
    "qt",
    "asf",
    "mkv",
    "rm",
    "revb",
    "mod",
    "mp4",
    "wmv",
  ];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x662F;&#x5426;&#x97F3;&#x9891;
function isAudio(suffix) {
  const suffixes = ["mp3", "wma", "wav"];
  const suffix_ = suffix.toLowerCase();
  return suffixes.some((it) => it == suffix_);
}

// &#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x540D;&#x540E;&#x7F00;
const getSuffix = (fileName) => {
  if (!fileName) return "";
  let clips = fileName.split(".");
  return clips[clips.length - 1];
};

/**
 * [&#x9632;&#x6296;&#x51FD;&#x6570;]
 * @param  {Function} fn   [&#x9700;&#x8981;&#x6267;&#x884C;&#x7684;&#x51FD;&#x6570;]
 * @param  {[type]}   wait [&#x51FD;&#x6570;&#x9700;&#x8981;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;]
 * @return {[type]}        void
 */
const debounce = (fn, wait) => {
  var timeout = null;
  return function () {
    if (timeout !== null) clearTimeout(timeout);
    timeout = setTimeout(fn, wait);
  };
};

//&#x5224;&#x65AD;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#x5426;&#x662F;&#x91D1;&#x94B1;
function validMoney(money) {
  let pattern = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
  if (pattern.test(money)) {
    return true;
  } else {
    return false;
  }
}

//&#x83B7;&#x53D6;&#x4E24;&#x4E2A;&#x65E5;&#x671F;&#x4E4B;&#x95F4;&#x76F8;&#x9694;&#x7684;&#x6240;&#x6709;&#x65E5;&#x671F;
function getDayAll(starDay, endDay) {
  var arr = [];
  var dates = [];
  // &#x8BBE;&#x7F6E;&#x4E24;&#x4E2A;&#x65E5;&#x671F;UTC&#x65F6;&#x95F4;
  var db = new Date(starDay);
  var de = new Date(endDay);
  // &#x83B7;&#x53D6;&#x4E24;&#x4E2A;&#x65E5;&#x671F;GTM&#x65F6;&#x95F4;
  var s = db.getTime() - 24 * 60 * 60 * 1000;
  var d = de.getTime() - 24 * 60 * 60 * 1000;
  // &#x83B7;&#x53D6;&#x5230;&#x4E24;&#x4E2A;&#x65E5;&#x671F;&#x4E4B;&#x95F4;&#x7684;&#x6BCF;&#x4E00;&#x5929;&#x7684;&#x6BEB;&#x79D2;&#x6570;
  for (var i = s; i <= 1 24 60 d;) { i="i" + * 1000; arr.push(parseint(i)); } 获取每一天的时间 yy-mm-dd for (var j in arr) var time="new" date(arr[j]); year="time.getFullYear(time);" mouth="time.getMonth()">= 10 ?
      time.getMonth() + 1 :
      "0" + (time.getMonth() + 1);
    var day = time.getDate() >= 10 ? time.getDate() : "0" + time.getDate();
    var YYMMDD = year + "-" + mouth + "-" + day;
    dates.push(YYMMDD);
  }
  return dates;
}

//xml&#x5B57;&#x7B26;&#x4E32;&#x8F6C;&#x6362;xml&#x5BF9;&#x8C61;&#x6570;&#x636E;
function xmlStr2XmlObj(xmlStr) {
  var xmlObj = {};
  if (document.all) {
    var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
    xmlDom.loadXML(xmlStr);
    xmlObj = xmlDom;
  } else {
    xmlObj = new DOMParser().parseFromString(xmlStr, "text/xml");
  }
  return xmlObj;
}

//xml&#x5B57;&#x7B26;&#x4E32;&#x8F6C;&#x6362;json&#x6570;&#x636E;
function xmlObj2json(xml) {
  var xmlObj = xmlStr2XmlObj(xml);
  var jsonObj = {};
  if (xmlObj.childNodes.length > 0) {
    jsonObj = xml2json(xmlObj);
  }
  return jsonObj;
}

//xml&#x8F6C;&#x6362;json&#x6570;&#x636E;
function xml2json(xml) {
  try {
    var obj = {};
    if (xml.children.length > 0) {
      for (var i = 0; i < xml.children.length; i++) {
        var item = xml.children.item(i);
        var nodeName = item.nodeName;
        if (typeof (obj[nodeName]) == "undefined") {
          obj[nodeName] = xml2json(item);
        } else {
          if (typeof (obj[nodeName].push) == "undefined") {
            var old = obj[nodeName];
            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xml2json(item));
        }
      }
    } else {
      obj = xml.textContent;
    }
    return obj;
  } catch (e) {
    console.log(e.message);
  }
}

//&#x6807;&#x51C6;&#x65F6;&#x95F4;&#x8F6C;&#x65F6;&#x95F4;
const formatDate = (timestamp, type = "datetime") => {
  let time = null;
  if ((timestamp.toString()).length == 13) {
    time = new Date(timestamp)
  } else {
    time = new Date(timestamp * 1000)
  }
  let year = time.getFullYear()
  let month = time.getMonth() + 1
  let date = time.getDate()
  let hours = time.getHours()
  let minute = time.getMinutes()
  let second = time.getSeconds()

  if (month < 10) {
    month = '0' + month
  }
  if (date < 10) {
    date = '0' + date
  }
  if (hours < 10) {
    hours = '0' + hours
  }
  if (minute < 10) {
    minute = '0' + minute
  }
  if (second < 10) {
    second = '0' + second
  }
  if (type == "datetime") {
    return year + '-' + month + '-' + date + ' ' + hours + ':' + minute + ':' + second;
  } else {
    return year + '-' + month + '-' + date
  }

}

/**
 * [&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x670D;&#x52A1;&#x5668;&#x7C7B;&#x578B;]
 * @return {[string]} [&#x670D;&#x52A1;&#x5668;&#x7C7B;&#x578B;]
 */
const getServerType = () => {
  // const deploy_way = storage.get("deploy_way");
  // if (deploy_way && deploy_way == 1) {
  //   return "local";
  // } else {
  //   return "oss";
  // }
  return "local"
};

const fileParse = (file, type = "base64") => {
  return new Promise((resolve, reject) => {
    let fileRead = new FileReader();
    if (type === "base64") {
      fileRead.readAsDataURL(file);
    } else if (type === "buffer") {
      fileRead.readAsArrayBuffer(file);
    }
    // console.log(fileRead, "fileRead");
    fileRead.onload = (ev) => {
      resolve(ev.target.result);

    };
    fileRead.onprogress = (e) => {
      console.log(e.loaded);
      console.log(e.total);
    };
    fileRead.onerror = (err) => {
      reject(err)
    }
  });
}

//&#x5BFB;&#x627E;&#x7236;&#x7C7B;id
const findPnodeId = (data = [], nodeId, allData = []) => {
  let res = [];
  if (data.length) {
    data.forEach(item => {
      if (item.children && item.children.length) {
        if (item.children.some(v => v.id == nodeId)) {
          res.push(item.id);
          res = res.concat(findPnodeId(allData, item.id, allData))
        } else {
          res = res.concat(findPnodeId(item.children, nodeId, allData))
        }
      } else {
        return
      }
    });
  }
  return res;
}

//&#x83B7;&#x53D6;&#x7528;&#x6237;&#x4FE1;&#x606F;
const getUserInfo = () => {
  return JSON.parse(storage.get("userInfo"));
}

/**
 * [loopRouterChildren &#x67E5;&#x627E;&#x5B50;&#x8DEF;&#x7531;]
 * @param  {[type]} router [description]
 * @param  {[type]} find   [description]
 * @return {[type]}        [description]
 */
const loopRouterChildren = (router, find) => {
  let res = [];
  router.map((v) => {
    if (v.path === find) {
      res.push(v);
    }
    if (v.children && v.children.length) {
      res = res.concat(loopRouterChildren(v.children, find));
    }
  });
  return res
};

const realFormatSecond = (second) => {
  var secondType = typeof second;
  if (secondType === "number" || secondType === "string") {
    second = parseInt(second);
    var hours = Math.floor(second / 3600);
    second = second - hours * 3600;
    var mimute = Math.floor(second / 60);
    second = second - mimute * 60;
    return (
      ("0" + hours).slice(-2) + ":" + ("0" + mimute).slice(-2) + ":" + ("0" + second).slice(-2)
    );
  } else {
    return "00:00:00";
  }
}

//&#x83B7;&#x53D6;&#x5468;&#x65E5;&#x671F;&#x8303;&#x56F4;
const weekDate = (day = 0) => {
  var date = new Date();
  // &#x672C;&#x5468;&#x65E5;&#x7684;&#x65E5;&#x671F;&#xFF0C;0&#x5468;&#x65E5;&#xFF0C;1 &#x5468;&#x4E00;
  date.setDate(date.getDate() - date.getDay() + day);
  var begin = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
  // &#x672C;&#x5468;&#x516D;&#x7684;&#x65E5;&#x671F;
  date.setDate(date.getDate() + 6);
  var end = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
  let timeInfo = {
    begin: begin,
    end: end
  }
  return timeInfo
}

// &#x83B7;&#x53D6;&#x4E24;&#x4E2A;&#x65E5;&#x671F;&#x4E4B;&#x95F4;&#x76F8;&#x5DEE;&#x7684;&#x5929;&#x6570;
const getDaysBetween = (dateString1, dateString2) => {
  let startDate = Date.parse(dateString1);
  let endDate = Date.parse(dateString2);
  let days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000);
  // alert(days);
  return days;
}

//JS&#x5C06;&#x5B57;&#x7B26;&#x4E32;yyyyMMddHHmmss&#x8F6C;Date
const strFormatedDate = (dateStr) => {
  let pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;
  let formatedDate1 = dateStr.replace(pattern, '$1/$2/$3 $4:$5:$6');
  let ddate1 = new Date(formatedDate1);
  return formatedDate1;
}

//&#x6BD4;&#x8F83;&#x65F6;&#x95F4;&#x5B57;&#x7B26;&#x4E32;&#x76F8;&#x5DEE;&#x51E0;&#x5206;&#x949F;
const compareTimeMin = (time1, time2) => {
  let m = 0;
  //&#x5224;&#x65AD;&#x5F00;&#x59CB;&#x65F6;&#x95F4;&#x662F;&#x5426;&#x5927;&#x4E8E;&#x7ED3;&#x675F;&#x65E5;&#x671F;
  if (time1 > time2) {
    m = 0;
  } else {
    //&#x622A;&#x53D6;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5F97;&#x5230;&#x65E5;&#x671F;&#x90E8;&#x5206;"2009-12-02",&#x7528;split&#x628A;&#x5B57;&#x7B26;&#x4E32;&#x5206;&#x9694;&#x6210;&#x6570;&#x7EC4;
    var begin1 = time1.substr(0, 10).split("-");
    var end1 = time2.substr(0, 10).split("-");

    var beginTime1 = time1.substr(11, 8).split(":");
    var endTime1 = time2.substr(11, 8).split(":");
    //&#x5C06;&#x62C6;&#x5206;&#x7684;&#x6570;&#x7EC4;&#x91CD;&#x65B0;&#x7EC4;&#x5408;&#xFF0C;&#x5E76;&#x5B9E;&#x4F8B;&#x6210;&#x5316;&#x65B0;&#x7684;&#x65E5;&#x671F;&#x5BF9;&#x8C61;
    var date1 = new Date(begin1[0] + '-' + begin1[1] + '-' + begin1[2] + ' ' + beginTime1[0] + ':' + beginTime1[1] + ':' + beginTime1[2]);
    var date2 = new Date(end1[0] + '-' + end1[1] + '-' + end1[2] + ' ' + endTime1[0] + ':' + endTime1[1] + ':' + endTime1[2]);

    //&#x5F97;&#x5230;&#x4E24;&#x4E2A;&#x65E5;&#x671F;&#x4E4B;&#x95F4;&#x7684;&#x5DEE;&#x503C;m&#xFF0C;&#x4EE5;&#x5206;&#x949F;&#x4E3A;&#x5355;&#x4F4D;
    m = parseInt(Math.abs(date2 - date1) / 1000 / 60);
  }
  return m;
}

const isRepeat = (arr) => {
  var hash = {};
  for (var i in arr) {
    if (hash[arr[i]]) {
      return true;
    }
    // &#x4E0D;&#x5B58;&#x5728;&#x8BE5;&#x5143;&#x7D20;&#xFF0C;&#x5219;&#x8D4B;&#x503C;&#x4E3A;true&#xFF0C;&#x53EF;&#x4EE5;&#x8D4B;&#x4EFB;&#x610F;&#x503C;&#xFF0C;&#x76F8;&#x5E94;&#x7684;&#x4FEE;&#x6539;if&#x5224;&#x65AD;&#x6761;&#x4EF6;&#x5373;&#x53EF;
    hash[arr[i]] = true;
  }
  return false;
}

// DES&#x52A0;&#x5BC6;
const encryptDes = (message, key = "200ceb26807d6bf99fd6f4f0d1ca54d4") => {
  var keyHex = cryptoJs.enc.Utf8.parse(key)
  var option = {
    mode: cryptoJs.mode.ECB,
    padding: cryptoJs.pad.Pkcs7
  }
  var encrypted = cryptoJs.DES.encrypt(message, keyHex, option)
  return encrypted.ciphertext.toString()
}

// DES&#x89E3;&#x5BC6;
const decryptDes = (message, key = "200ceb26807d6bf99fd6f4f0d1ca54d4") => {
  var keyHex = cryptoJs.enc.Utf8.parse(key)
  var decrypted = cryptoJs.DES.decrypt({
      ciphertext: cryptoJs.enc.Hex.parse(message)
    },
    keyHex, {
      mode: cryptoJs.mode.ECB,
      padding: cryptoJs.pad.Pkcs7
    }
  )
  return decrypted.toString(cryptoJs.enc.Utf8)
}

/**&#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x624B;&#x673A;&#x53F7;**/
const isPhoneNumber = (tel) => {
  var reg = /^0?1[3|4|5|6|7|8][0-9]\d{8}$/;////&#x624B;&#x673A;&#x7535;&#x8BDD;
  var zjdh = /^((0\d{2,3})-)?(\d{7,8})$/; //&#x5EA7;&#x673A;&#x7535;&#x8BDD;
  if (!reg.test(tel)&&!zjdh.test(tel)) {
    return false;
  } else {
    return true;
  }
}

//&#x83B7;&#x53D6;&#x8EAB;&#x4EFD;&#x8BC1;&#x547C;&#x53EB;
const getIdentityAddress = (str) => {
  let _arr = [{
      id: "11",
      name: "&#x5317;&#x4EAC;"
    },
    {
      id: "12",
      name: "&#x5929;&#x6D25;"
    },
    {
      id: "13",
      name: "&#x6CB3;&#x5317;"
    },

    {
      id: "14",
      name: "&#x5C71;&#x897F;"
    },
    {
      id: "15",
      name: "&#x5185;&#x8499;"
    },
    {
      id: "21",
      name: "&#x8FBD;&#x5B81;"
    },

    {
      id: "22",
      name: "&#x5409;&#x6797;"
    },
    {
      id: "23",
      name: "&#x9ED1;&#x9F99;&#x6C5F;"
    },

    {
      id: "31",
      name: "&#x4E0A;&#x6D77;"
    },
    {
      id: "32",
      name: "&#x6C5F;&#x82CF;"
    },

    {
      id: "33",
      name: "&#x6D59;&#x6C5F;"
    },
    {
      id: "34",
      name: "&#x5B89;&#x5FBD;"
    },

    {
      id: "35",
      name: "&#x798F;&#x5EFA;"
    },
    {
      id: "36",
      name: "&#x6C5F;&#x897F;"
    },
    {
      id: "37",
      name: "&#x5C71;&#x4E1C;"
    },
    {
      id: "41",
      name: "&#x6CB3;&#x5357;"
    },
    {
      id: "42",
      name: "&#x6E56;&#x5317;"
    },
    {
      id: "43",
      name: "&#x6E56;&#x5357;"
    },
    {
      id: "44",
      name: "&#x5E7F;&#x4E1C;"
    },
    {
      id: "45",
      name: "&#x5E7F;&#x897F;"
    },

    {
      id: "46",
      name: "&#x6D77;&#x5357;"
    },
    {
      id: "50",
      name: "&#x91CD;&#x5E86;"
    },

    {
      id: "51",
      name: "&#x56DB;&#x5DDD;"
    },
    {
      id: "52",
      name: "&#x8D35;&#x5DDE;"
    },

    {
      id: "53",
      name: "&#x4E91;&#x5357;"
    },
    {
      id: "54",
      name: "&#x897F;&#x85CF;"
    },
    {
      id: "61",
      name: "&#x9655;&#x897F;"
    },

    {
      id: "62",
      name: "&#x7518;&#x8083;"
    },
    {
      id: "63",
      name: "&#x9752;&#x6D77;"
    },

    {
      id: "64",
      name: "&#x5B81;&#x590F;"
    },

    {
      id: "65",
      name: "&#x65B0;&#x7586;"
    },
    {
      id: "71",
      name: "&#x53F0;&#x6E7E;"
    },

    {
      id: "81",
      name: "&#x9999;&#x6E2F;"
    },
    {
      id: "82",
      name: "&#x6FB3;&#x95E8;"
    },
    {
      id: "91",
      name: "&#x6D77;&#x5916;"
    }
  ]
  if (str) {
    let _obj=_arr.find(v=>v.id==str);
    return _obj?.name||""
  } else {
    return ""
  }
}

//&#x624B;&#x673A;&#x53F7;&#x8131;&#x654F;
const phoneNuberConvert=(number)=>{
  if (!number) return "";
  let pat = /(\d{3})\d*(\d{4})/;
  let result = number.replace(pat, "$1***$2");
  return result;
}

/**
 * &#x540D;&#x5B57;&#x8131;&#x654F;
 */
const nameConvert=(name)=>{
  let userName = "";
  if (name.length == 2) {
    userName = name.substring(0, 1) + "*"; //&#x622A;&#x53D6;name &#x5B57;&#x7B26;&#x4E32;&#x622A;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;
  } else if (name.length == 3) {
    userName = name.substring(0, 1) + "*" + name.substring(2, 3); //&#x622A;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#x548C;&#x7B2C;&#x4E09;&#x4E2A;&#x5B57;&#x7B26;
  } else if (name.length > 3) {
    userName =
      name.substring(0, 1) + "*" + "*" + name.substring(3, name.length); //&#x622A;&#x53D6;&#x7B2C;&#x4E00;&#x4E2A;&#x548C;&#x5927;&#x4E8E;&#x7B2C;4&#x4E2A;&#x5B57;&#x7B26;
  }
  return userName;
}

//&#x8EAB;&#x4EFD;&#x8BC1;&#x3001;&#x94F6;&#x884C;&#x5361;&#x8131;&#x654F;
const icardAndBankConvert=(str)=>{
  if (str) {
    return str.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
  } else {
    return ""
  }
}

//&#x6570;&#x7EC4;&#x5206;&#x7EC4;
const groupArray=(data,cols)=>{
  const r=data.reduce((r,t)=>{
    r.current.push(t);
    if(r.current.length===cols){
      r.list.push(r.current);
      r.current=[];
    }
    return r;
  },{list:[],current:[]});
  if (r.current.length) {
    r.list.push(r.current);
  }
  return r.list;
}

//&#x590D;&#x5236;&#x6570;&#x636E;&#x5DE5;&#x5177;
const copyDataUtil=(str)=>{
  let aux = document.createElement('input')
  // &#x83B7;&#x53D6;&#x590D;&#x5236;&#x5185;&#x5BB9;
  // const content = v
  // &#x8BBE;&#x7F6E;&#x5143;&#x7D20;&#x5185;&#x5BB9;
  aux.setAttribute('value', str)
  // &#x5C06;&#x5143;&#x7D20;&#x63D2;&#x5165;&#x9875;&#x9762;&#x8FDB;&#x884C;&#x8C03;&#x7528;
  document.body.appendChild(aux)
  // &#x590D;&#x5236;&#x5185;&#x5BB9;
  aux.select()
  // &#x5C06;&#x5185;&#x5BB9;&#x590D;&#x5236;&#x5230;&#x526A;&#x8D34;&#x677F;
  document.execCommand('copy')
  // &#x5220;&#x9664;&#x521B;&#x5EFA;&#x5143;&#x7D20;
  document.body.removeChild(aux)
}

//&#x5730;&#x5740;&#x8131;&#x654F;
const desensitizedAddr=(str)=>{
  if (!str) {
      return "";
  }
  let _addrReg = /(.{4})(.*)/; // &#x5730;&#x5740;&#x6B63;&#x5219;
  if(_addrReg.test(str)){
      let text1 = RegExp.$1;
      let text2 = RegExp.$2.replace(/./g,"*");
      return  text1 + text2 ;
  }
  return str;
}

/**
 * &#x6839;&#x636E;&#x65E5;&#x671F;&#x5B57;&#x7B26;&#x4E32;&#x83B7;&#x53D6;&#x661F;&#x671F;&#x51E0;
 * @param dateString &#x65E5;&#x671F;&#x5B57;&#x7B26;&#x4E32;&#xFF08;&#x5982;&#xFF1A;2020-05-02&#xFF09;
 * @returns {String}
 */
const getWeek = (dateString) => {
  if (!dateString) {
    return "&#x672A;&#x77E5;"
  }
  let _arr=(dateString||"").split(" ");
  let _str="";
  if (_arr.length==2) {
    _str=_arr[0];
  } else {
    _str=dateString;
  }
  if (!checkDate(_str)) {
    return "&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x6709;&#x8BEF;"
  }
  let dateArray = _str.split("-");
  let date = new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]);
  return "&#x5468;" + "&#x65E5;&#x4E00;&#x4E8C;&#x4E09;&#x56DB;&#x4E94;&#x516D;".charAt(date.getDay());
};

// &#x5224;&#x65AD;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x662F;&#x5426;&#x5408;&#x7406;,&#x683C;&#x5F0F;2022-04-16
const checkDate=(str)=>{
  let r = new RegExp(/^\d{4}\-\d{2}\-\d{2}$/);
  return r.test(str);
}

//&#x6241;&#x5E73;&#x51FD;&#x6570;
const flattenFun=(arr,key="children")=> {
  let result = [];

  for(let i = 0; i < arr.length; i++) {
    result.push(arr[i]);
    if (arr[i].hasOwnProperty(key)&&arr[i][key].length) {
      result = result.concat(flattenFun(arr[i][key],key));
    }
  }
  return result;
}

/**
 * &#x83B7;&#x53D6;&#x8BBE;&#x5907;&#x7C7B;&#x578B;
 */
export const getDeviceType = () => {
  const reg =  /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i
  return reg.test(navigator.userAgent) ? 'Mobile' : 'Desktop'
}

// &#x7528;&#x6237;&#x6570;&#x636E;&#x6392;&#x5E8F;
export const userAlphabeticSort = (arr,key="name") => {
  if (!String.prototype.localeCompare) return null
  let letters = 'ABCDEFGHJKLMNOPQRSTWXYZ'.split('')
  let zh = '&#x963F;&#x516B;&#x5693;&#x54D2;&#x59B8;&#x53D1;&#x65EE;&#x54C8;&#x8BA5;&#x5494;&#x5783;&#x75F3;&#x62CF;&#x5662;&#x5991;&#x4E03;&#x5465;&#x6268;&#x5B83;&#x7A75;&#x5915;&#x4E2B;&#x5E00;'.split('')
  let segs = []
  letters.map((item, i) => {
    let cur = {
      letter: item,
      data: []
    }
    arr.map((item) => {
      if (item[key].localeCompare(zh[i]) >= 0 && item[key].localeCompare(zh[i + 1]) < 0) {
        cur.data.push(item)
      }
    })
    if (cur.data.length != 0) {
      cur.data.sort(function (a, b) {
        return a[key].localeCompare(b[key], 'zh')
      })
      segs.push(cur)
    }
  })
  return segs
}

//&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6307;&#x5B9A;&#x7684;&#x524D;&#x51E0;&#x5929;&#x7684;&#x65E5;&#x671F;
//console.log(getBeforeDate(1));//&#x6628;&#x5929;&#x7684;&#x65E5;&#x671F;
const getBeforeDate = (days) => {
  var now = new Date().getTime();
  var ago = now - 86400000 * days; //&#x4E00;&#x5929;&#x7684;&#x6BEB;&#x79D2;&#x6570;&#x4E3A;86400000
  var agoData = new Date(ago);
  var year = agoData.getFullYear();
  var mon = agoData.getMonth() + 1;
  var day = agoData.getDate();
  mon = mon < 10 ? '0' + mon : mon;
  day = day < 10 ? '0' + day : day;
  var date = year + '-' + mon + '-' + day;
  return date;
}

//&#x83B7;&#x53D6;&#x552F;&#x4E00;&#x503C;
export function getUUID(len=10){
  return Number(
    Math.random().toString().substr(3, len) + Date.now()
  ).toString(36);
}

export function getCurrentTime() {
  let _m=new Date().getMonth() + 1;
  //&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x5E76;&#x6253;&#x5370;
  let yy = new Date().getFullYear();
  let mm = _m<10?'0'+_m:_m; 10 3600 let dd="new" date().getdate()<10?'0'+new date().getdate():new date().getdate(); hh="new" date().gethours()<10?'0'+new date().gethours():new date().gethours(); mf="new" date().getminutes() < ? '0' + new : date().getminutes(); ss="new" date().getseconds() date().getseconds(); time="yy" type mm ' ':' ss; return time; } ** * js 计算两个时间间隔多久(时分秒) @param starttime "2019-10-23 15:27:23" endtime 15:27:55" @return 1天2时3分5秒 export function twotimeinterval(starttime, endtime) { 开始时间 d1="startTime.replace(/\-/g," " "); date1="new" date(d1); 结束时间 d2="endTime.replace(/\-/g," date2="new" date(d2); 时间相差秒数 datediff="date2.getTime()" - date1.gettime(); 计算出相差天数 days="Math.floor(dateDiff" (24 1000)); 计算出小时数 residue1="dateDiff" % 1000); 计算天数后剩余的毫秒数 hours="Math.floor(residue1" (3600 计算相差分钟数 residue2="residue1" 计算小时数后剩余的毫秒数 minutes="Math.floor(residue2" (60 计算相差秒数 residue3="residue2" 计算分钟数后剩余的毫秒数 seconds="Math.round(residue3" returnval="((days" =="0)" "" days+"天") ((hours="=" 0) +"时") ((minutes="=" minutes+"分") ((seconds="=" seconds+"秒"); returnval; {秒数转化为时分秒} s @returns sectotime(s) t ; if(s> -1){
    let hour = Math.floor(s/3600)
    let min = Math.floor(s/60) % 60
    let sec = s % 60
    t=hour<10?'0'+ hour + ":":hour ":"; if(min < 10){ t } ":" if(sec return ** * 获取url的参数 @param {*} url @returns const getutlparam="(url)=">{
  url = url ? url : window.location.href.substring(0, window.location.href.length);
  let str = url.substring(url.indexOf('?') + 1);
  let arrs = str.split('&');
  let result = {};
  arrs.forEach(item => {
    let keyArr = item.split('=');
    let name = keyArr[0];
    let value = keyArr[1];
    result[name] = value;
  });
  return result;
}

/**
 * &#x6241;&#x5E73;&#x6570;&#x7EC4;
 * @param {*} arr &#x6241;&#x5E73;&#x6570;&#x636E;&#x6570;&#x636E;
 * @param {*} key &#x6811;&#x5F62;key
 */
export function flatArr(arr=[],key="children") {
  let _arr=[];
  (arr||[]).map(item=>{
    _arr.push(item);
    if (item[key]?.length) {
      _arr=_arr.concat(flatArr(item[key],key));
    }
  })
  return _arr;
}

/**
 * &#x6821;&#x9A8C;&#x5BC6;&#x7801;
 * @param {*} str &#x6821;&#x9A8C;&#x5BC6;&#x7801;&#x5B57;&#x7B26;&#x4E32;
 * @param {*} reg &#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;
 * @param {*} msg &#x6821;&#x9A8C;&#x63D0;&#x793A;&#x8BED;
 * @returns
 */
export function verifyPasswordFun(str, msg = "&#x5BC6;&#x7801;&#x5FC5;&#x987B;&#x5305;&#x542B;&#x5927;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;&#x3001;&#x6570;&#x5B57;&#x3001;&#x7279;&#x6B8A;&#x5B57;&#x7B26;&#x4E14;8~20&#x4F4D;", reg = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,20}$") {
  let _result = true
  let regexp = new RegExp(reg);
  if (!regexp.test(str)) {
    this.$message.error(msg);
    _result = false;
  }
  return _result;
}

/**
 * &#x65E5;&#x671F;&#x65F6;&#x95F4;&#x6709;&#x6548;&#x6027;&#x68C0;&#x67E5; &#x683C;&#x5F0F;&#x4E3A;&#xFF1A;YYYY-MM-DD HH:MM:SS
 * @param {*} str
 * @returns
 */
const CheckDateTime=(str)=>{
  var reg = /^(\d+)-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
  var r = str.match(reg);
  if(r==null)return false;
  r[2]=r[2]-1;
  var d= new Date(r[1], r[2],r[3], r[4],r[5], r[6]);
  if(d.getFullYear()!=r[1])return false;
  if(d.getMonth()!=r[2])return false;
  if(d.getDate()!=r[3])return false;
  if(d.getHours()!=r[4])return false;
  if(d.getMinutes()!=r[5])return false;
  if(d.getSeconds()!=r[6])return false;
  return true;
}

/**
 * &#x5224;&#x65AD;&#x662F;&#x5426;&#x662F;&#x5916;&#x90E8;&#x8FDE;&#x63A5;
 * @param path &#x8DEF;&#x5F84;
 * @returns
 */
const isExternal = (path: string) => {
  const reg = /^(https?:|mailto:|tel:)/;
  return reg.test(path);
};

/**
 * &#x5B57;&#x7B26;&#x4E32;&#x6821;&#x9A8C;
 * @param {*} str &#x5B57;&#x7B26;&#x4E32;
 * @param {*} rang &#x8303;&#x56F4;&#x6B63;&#x5219;
 * @returns
 */
const stringVerification=(str,rang=/^.{8,20}$/)=>{
  let _arr=[];//&#x5927;&#x5199;&#x5B57;&#x6BCD;&#xFF1A;capital&#xFF0C;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;&#xFF1A;lowerCase&#xFF0C;&#x7279;&#x6B8A;&#x5B57;&#x7B26;&#xFF1A;specialCharacters&#xFF0C;&#x6570;&#x5B57;&#xFF1A;digit&#xFF0C;&#x957F;&#x5EA6;&#x5728;&#x8303;&#x56F4;&#x4E2D;&#xFF1A;inScope
  let reg = /^(?=.*?[A-Z])/;
  let reg1 = /^(?=.*?[a-z])/;
  let reg2 = /^(?=.*?\d)/;
  let reg3 = /^(?=.*?[?!&&#xFFE5;$%^#,.\/@";:><\[\]}{\-=+_\\|》《。,、?''""~ `]) ; if (reg.test(str)) { _arr.push('capital') } (reg1.test(str)) _arr.push('lowercase') (reg2.test(str)) _arr.push('digit') (reg3.test(str)) _arr.push('specialcharacters') (rang.test(str)) _arr.push("inscope") return _arr; ** * aes加密 @param {*} data key 密钥字符串必须为16、24、32 iv iv16位的字符串 @returns const encryptaes="(data," key, )>{ //key,iv&#xFF1A;16&#x4F4D;&#x7684;&#x5B57;&#x7B26;&#x4E32;
  let key1 = cryptoJs.enc.Utf8.parse(key);
  let iv1 = cryptoJs.enc.Utf8.parse(iv);
  return cryptoJs.AES.encrypt(data, key1, {
      iv: iv1,
      mode: cryptoJs.mode.CBC,
      padding: cryptoJs.pad.Pkcs7
  }).toString();
}

/**
 * AES&#x89E3;&#x5BC6;
 * @param {*} data
 * @param {*} key &#x5BC6;&#x94A5;&#x5B57;&#x7B26;&#x4E32;&#x5FC5;&#x987B;&#x4E3A;16&#x3001;24&#x3001;32
 * @param {*} iv  iv16&#x4F4D;&#x7684;&#x5B57;&#x7B26;&#x4E32;
 * @returns
 */
const decryptAES =(data, key, iv="tdrdadq59tbss5n7")=>{ //key,iv&#xFF1A;16&#x4F4D;&#x7684;&#x5B57;&#x7B26;&#x4E32;
  let key1 = cryptoJs.enc.Utf8.parse(key);
  let iv1 = cryptoJs.enc.Utf8.parse(iv);
  let decrypted = cryptoJs.AES.decrypt(data, key1, {
      iv: iv1,
      mode: cryptoJs.mode.CBC,
      padding: cryptoJs.pad.Pkcs7
  });
  return decrypted.toString(cryptoJs.enc.Utf8)
}

// &#x751F;&#x6210;&#x968F;&#x673A;&#x5B57;&#x7B26;&#x4E32;
// &#x6570;&#x5B57;0~9&#x5BF9;&#x5E94;&#x7684;ASCII&#x7801;&#x503C;&#x662F; 48-57
// &#x5927;&#x5199;&#x5B57;&#x6BCD;A-Z&#x5BF9;&#x5E94;&#x7684;ASCII&#x7801;&#x503C;&#x662F; 65-90
// &#x5C0F;&#x5199;&#x5B57;&#x6BCD;a-z&#x5BF9;&#x5E94;&#x7684;ASCII&#x7801;&#x503C;&#x662F; 97-122
// &#x7279;&#x6B8A;&#x5B57;&#x7B26;&#x5BF9;&#x5E94;&#x7684;ASCII&#x7801;&#x7684;&#x503C;&#x662F;33-47 58-64
const getPassword = (legnth) => {
  // &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x7A7A;&#x6570;&#x7EC4;&#x4FDD;&#x5B58;&#x6211;&#x4EEC;&#x7684;&#x5BC6;&#x7801;
  let passArrItem = [];

  // &#x5B9A;&#x4E49;&#x83B7;&#x53D6;&#x5BC6;&#x7801;&#x6210;&#x5458;&#x7684;&#x65B9;&#x6CD5;
  const getNumber = () => Math.floor(Math.random() * 10); // 0~9&#x7684;&#x6570;&#x5B57;
  const getUpLetter = () => String.fromCharCode(Math.floor(Math.random() * 26) + 65); // A-Z
  const getLowLetter = () => String.fromCharCode(Math.floor(Math.random() * 26) + 97); // a-z
  const getCode = () => String.fromCharCode(Math.floor(Math.random() * 15) + 33) || String.fromCharCode(Math.floor(Math.random() * 7) + 58)

  // &#x5C06;&#x83B7;&#x53D6;&#x6210;&#x5458;&#x7684;&#x65B9;&#x6CD5;&#x4FDD;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x65B9;&#x4FBF;&#x7528;&#x540E;&#x9762;&#x751F;&#x6210;&#x7684;&#x968F;&#x673A;index&#x53D6;&#x7528;
  const passMethodArr = [getNumber, getUpLetter, getLowLetter, getCode];

  // &#x968F;&#x673A;index
  const getIndex = () => Math.floor(Math.random() * 4);

  // &#x4ECE;0-9&#xFF0C;a-z&#xFF0C;A-Z&#xFF0C;&#x4EE5;&#x53CA;&#x7279;&#x6B8A;&#x5B57;&#x7B26;&#x4E2D;&#x968F;&#x673A;&#x83B7;&#x53D6;&#x4E00;&#x9879;
  const getPassItem = () => passMethodArr[getIndex()]();

  // &#x4E0D;&#x591A;&#x89E3;&#x91CA;
  Array(legnth - 4).fill('').forEach(() => {
    passArrItem.push(getPassItem());
  })

  const confirmItem = [getNumber(), getUpLetter(), getLowLetter(), getCode()];

  // &#x52A0;&#x4E0A;&#x6211;&#x4EEC;&#x786E;&#x8BA4;&#x7684;&#x56DB;&#x9879;&#xFF0C;&#x4ECE;&#x800C;&#x4F7F;&#x751F;&#x6210;&#x7684;&#x5BC6;&#x7801;&#xFF0C;&#x5927;&#x5199;&#x5B57;&#x6BCD;&#x3001;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;&#x3001;&#x6570;&#x5B57;&#x548C;&#x7279;&#x6B8A;&#x5B57;&#x7B26;&#x81F3;&#x5C11;&#x5404;&#x5305;&#x542B;&#x4E00;&#x4E2A;
  passArrItem.push(...confirmItem);

  // &#x8F6C;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x8FD4;&#x56DE;
  return passArrItem.join('');
}

export default {
  storage,
  deepClone,
  getToken,
  setToken,
  clearToken,
  getTokenInfo,
  uniqueArray,
  uniqueArrayObject,
  sum,
  getDateFormat,
  getTimeDistance,
  funDate,
  chunkArray,
  getExtensionFileName,
  getOssImgResize,
  getTimeStamp,
  cookie,
  nowInDateBetwen,
  isImg,
  isExcel,
  isDoc,
  isPpt,
  isPdf,
  isZip,
  isVideo,
  isAudio,
  getSuffix,
  validMoney,
  debounce,
  getDayAll,
  getServerType,
  xmlObj2json,
  formatDate,
  fileParse,
  findPnodeId,
  getUserInfo,
  loopRouterChildren,
  realFormatSecond,
  weekDate,
  getDaysBetween,
  strFormatedDate,
  compareTimeMin,
  isRepeat,
  encryptDes,
  decryptDes,
  isPhoneNumber,
  getIdentityAddress,
  phoneNuberConvert,
  nameConvert,
  icardAndBankConvert,
  groupArray,
  desensitizedAddr,
  getWeek,
  checkDate,
  flattenFun,
  copyDataUtil,
  getDeviceType,
  userAlphabeticSort,
  getBeforeDate,
  getUUID,
  getCurrentTime,
  twoTimeInterval,
  secTotime,
  getUtlParam,
  flatArr,
  verifyPasswordFun,
  CheckDateTime,
  isExternal,
  stringVerification,
  encryptAES,
  decryptAES,
  getPassword,
};</\[\]}{\-=+_\\|》《。,、?''""~></10?'0'+></10?'0'+_m:_m;></=>

Original: https://www.cnblogs.com/wxchun/p/15892260.html
Author: 春春&
Title: 前端常用的方法工具

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586327/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • spring boot 发邮件

    Spring Boot 提供了一个发送邮件的简单抽象,使用的是 org.springframework.mail.javamail.JavaMailSender 1.添加依赖 or…

    Java 2023年5月30日
    066
  • Spring总结

    **Spring&#x7684;&#x4E2A;&#x4EBA;&#x603B;&#x7ED3;&#x548C;&#x914…

    Java 2023年6月5日
    086
  • Spring Boot:使用Memcached缓存

    综合概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用、…

    Java 2023年5月30日
    086
  • 体验.NET Core使用IKVM对接Java

    前言 与第三方对接最麻烦的是语言不同,因语言不同内置实现相关标准加密算法还是略微有所差异,对接单点登录场景再寻常不过,由于时间紧迫且对接方使用Java,所以留给我对接开发和联调的时…

    Java 2023年5月29日
    080
  • java日常开发必备:list的四种遍历

    在平时的开发过程中使用List的场景很多,你知道List的遍历有多少种方式?今天一起来梳理下List的几种遍历方式。这里以java.util.ArrayList为例来演示。 这里有…

    Java 2023年6月9日
    090
  • 10、SpringBoot 启动 刷新应用上下文 自动装配解析(二)

    书接上文中最重要的两个方法,我们先看第一个,debug进入 public void parse(Set<beandefinitionholder> configCand…

    Java 2023年6月13日
    076
  • 准备好写播客的准备:Markdown基础语法

    Markdown学习 标题 一级标题 二级标题 三级标题 字体 Hello,World! Hello,World! Hello,World! Hello,World! 引用 引用内…

    Java 2023年6月6日
    082
  • @EnableDiscoveryClient与Nacos的服务注册与拉取

    ​ 前一阵看到有篇博客说cloud从Edgware版本开始,可以不加@EnableDiscoveryClient注解,只要配置好注册中心的相关配置即可自动开启服务注册功能,比较好奇…

    Java 2023年6月5日
    080
  • 动力节点-王妈妈Springboot教程(三)Spring Boot和web组件

    第三章 Spring Boot 和 web 组件 *笔记中的视频观看地址 https://www.bilibili.com/video/BV1XQ4y1m7ex 3.1 Sprin…

    Java 2023年6月7日
    0111
  • PythonWeb开发

    1.什么是Flask?有什么优点? 2.Django和Flask有什么区别? 3.Flask-WTF是什么,有什么特点? 4.Flask脚本的常用方式是什么? 5.如何在Flask…

    Java 2023年6月7日
    080
  • java 继承关系判断

    Class.java # public native boolean isInstance(Object obj); // true System.out.println(chil…

    Java 2023年6月8日
    085
  • CSharp: Template Method Pattern

    csharp;gutter:true; /// /// Summary description for Triangle.</p> <pre><cod…

    Java 2023年6月16日
    066
  • 使用 Java Swing 编写 IpChat, 基于 IP Messenger 协议,支持 IPv4/IPv6

    最近一段时间居家办公,使用 Java Swing 编写 IpChat, 基于 IP Messenger 协议,支持 IPv4/IPv6。可实现简单的文本信息传输,点对点直接通讯,无…

    Java 2023年6月9日
    057
  • 二叉搜索树,一个简单但是非常常见的数据结构

    前言 今天leetcode的每日一题450是关于删除二叉搜索树节点的,题目要求删除指定值的节点,并且需要保证二叉搜索树性质不变,做完之后,我觉得这道题将二叉搜索树特性凸显的很好,首…

    Java 2023年6月9日
    081
  • golang并发编程中select关键字的使用

    golang并发编程中select关键字的使用 select的使用类似于switch语句,有case和default分支。其中每个case对应一个通道的通信过程: 1、select…

    Java 2023年6月13日
    071
  • 球队比赛预测

    一,乒乓球预测: 比赛规则:(1)一局比赛:在一局比赛中,先得11分的一方为胜方:10平后,先多得2分的一方为胜方。 (2)一场比赛:单打的淘汰赛为七局四胜制,双打淘汰赛或团体赛为…

    Java 2023年6月6日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球