常用方法合集

// 判断是pc端还是h5端
function isMobileUserAgent() {
  return /iphone|ipod|android|windows.*phone|blackberry.*mobile/i.test(
    window.navigator.userAgent.toLowerCase()
  );
}

//上传文件
export function upFile(file, url, success, error) {
  var formdata = new FormData();
  formdata.append("file", file);
  var xhr = new XMLHttpRequest();
  xhr.open("post", url);
  xhr.setRequestHeader("AUTHORIZATION", localStorage.getItem("TOKEN"));
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
      success && success(JSON.parse(xhr.responseText));
    }
  };
  xhr.onerror = function () {
    error && error();
  };
  xhr.send(formdata);
}

// 转换Base64
export function convertImageToBase64(file, callback) {
    // 创建一个FileReader对象,它允许Web应用程序异步读取存储在计算机上的文件
    // 也就是file对象
    let reader = new FileReader()
    // 添加一个load事件,load会在加载完毕之后进行触发(也就是readAsDataURL读取完毕后触发)
    reader.addEventListener("load", function (e) {
        const base64Image = e.target.result // 相当于reader.result 获取文件的Base64
        // 回收内存
        callback && callback(base64Image) // 调用callback压缩
        reader = null
    })

    // readAsDataURL方法读取指定的file或blob对象
    reader.readAsDataURL(file)
}


/**
 * 将base64转换为文件
 * @param {baseURL} dataurl 
 * @param {文件名称} filename 
 * @return {文件二进制流}
*/
export function dataURLtoFile(dataurl, filename) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, { type: mime });
}

// 压缩算法函数
/* 
1.首先拿到了base64的图片字符串 
2.创建一个image对象
4.调用canvasAPI进行绘制新的图片
5.绘制成功之后调用canvasAPI进行绘制(canvasAPI支持压缩-二次压缩-从质量压缩)
6.得到压缩后的文件流
 */
export function compress(base64Image, fileName, callback) {
    let image = new Image();
    image.src = base64Image;
    
    image.addEventListener('load', function () {
        console.log('---->>>触发')
        // 获得长宽比例
        //创建一个canvas
        let canvas = document.createElement('canvas');
        //获取上下文
        let context = canvas.getContext('2d');

        canvas.width = 1024

        canvas.height = 1024
        // 防止重新上传覆盖 
        context.clearRect(0, 0, canvas.width, canvas.height)
        //把图片绘制到canvas上面
        context.drawImage(image, 0, 0, canvas.width, canvas.height);
        // visibility hidden 需要创建的canvas隐藏 而不是不渲染DOM
        canvas.style.visibility = 'hidden'
        //压缩图片,获取到新的base64Url
        const compressImage = canvas.toDataURL('image/jpeg', 0.8) // 通常压缩是0.8-0.9
        let resultFile = dataURLtoFile(compressImage, fileName);
        console.log('resultFile', resultFile)
        callback && callback(resultFile);
        // 接下来移除canvas元素 调用DOM.remove()
        canvas.remove()
    })

}

// 复制文本

export function copyText(text) {
    const textString = text.toString();
    let input = document.getElementById('#copy-input');
    if (!input) {
        input = document.createElement('input');
        input.id = "copy-input";
        input.readOnly = "readOnly"; // 防止ios聚焦触发键盘事件
        input.style.position = "absolute";
        input.style.left = "-1000px";
        input.style.zIndex = "-1000";
        document.body.appendChild(input)
    }
    input.value = textString;
    // ios必须先选中文字且不支持 input.select();
    try {
        input.select();
    } catch (error) {
        selectText(input, 0, textString.length);
    }

    document.execCommand('copy');
    input.blur();
    document.body.removeChild(input);

    function selectText(textbox, startIndex, stopIndex) {
        textbox.setSelectionRange(startIndex, stopIndex);
        textbox.focus();
    }
}

// 获取电话号码获取验证码次数
export function phoneGetCodeNum(type, phone) {
    let phoneGetCodeNK = JSON.parse(localStorage.getItem('phoneGetCodeNK'));
    let obj = phoneGetCodeNK[type];
    let num = obj[phone] || 0
    return num
}


// 设置电话号码获取验证码次数
export function phoneSetCodeNum(type, phone) {
    let phoneGetCodeNK = JSON.parse(localStorage.getItem('phoneGetCodeNK'));
    let obj = phoneGetCodeNK[type];

    if (phone in obj) {
        obj[phone] = Number(obj[phone]) + 1
    } else {
        obj[phone] = 1
    }
    localStorage.setItem('phoneGetCodeNK', JSON.stringify(phoneGetCodeNK))
}

// 传入时间戳,判断是否是当天
export function isNowDate(time) {
    var date = new Date(time);
    var year = date.getFullYear();
    var month = date.getMonth()
    var day = date.getDate();

    var dateN = new Date();
    var yearN = dateN.getFullYear();
    var monthN = dateN.getMonth()
    var dayN = dateN.getDate();

    if (day == dayN && month == monthN && yearN == year) {
        return true;
    } else {
        return false;
    }
}

// 时间戳转时间
export function getTime(time) {
    let t = 'yyyy-MM-dd hh:mm'
    if (time) {
        let date = new Date(time * 1000);
        let month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
        let currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
        let hh = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
        let mm = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
        t = date.getFullYear() + "-" + month + "-" + currentDate + " " + hh + ":" + mm
    }
    return t
}

export function getTimes(time) {
    let t = 'yyyy-MM-dd hh:mm:ss'
    if (time) {
        let date = new Date(time * 1000);
        let month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
        let currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
        let hh = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
        let mm = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
        let ss = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
        t = date.getFullYear() + "-" + month + "-" + currentDate + " " + hh + ":" + mm + ":" + ss
    }
    return t
}

// 设置,取消全屏
export function setAllScreen(flag, document) {
    var element = document.documentElement;
    if (flag) {
        if (element.requestFullscreen) {
            element.requestFullscreen();
        } else if (element.mozRequestFullScreen) {
            element.mozRequestFullScreen();
        } else if (element.webkitRequestFullscreen) {
            element.webkitRequestFullscreen();
        } else if (element.msRequestFullscreen) {
            element.msRequestFullscreen();
        }
    } else { //取消全屏
        if (document.exitFullscreen) {
            document.exitFullscreen();
        } else if (document.mozCancelFullScreen) {
            document.mozCancelFullScreen();
        } else if (document.webkitCancelFullScreen) {
            document.webkitCancelFullScreen();
        } else if (document.msExitFullscreen) {
            document.msExitFullscreen();
        }
    }

}

/*
 * formatMoney(s,type)
 * 功能:金额按千位逗号分割
 * 参数:s,需要格式化的金额数值.
 * 参数:type,判断格式化后的金额是否需要小数位.
 * 返回:返回格式化后的数值字符串.
 */
export function formatMoney(s, type) {
	// eslint-disable-next-line no-useless-escape
	if (/[^0-9\.]/.test(s))
		return "0";
	if (s == null || s == "")
		return "0";
	s = s.toString().replace(/^(\d*)$/, "$1");
    s = (s + "").replace(/(\d*\.\d\d)\d*/, "$1");
	s = s.replace(".", ".");
	// s = (s + "00").replace(/(\d*\.\d\d)\d*/, "$1");
	// s = s.replace(".", ",");
	var re = /(\d)(\d{3},)/;
	while (re.test(s))
		s = s.replace(re, "$1,$2");
	s = s.replace(/,(\d\d)$/, ".$1");
	if (type == 0) {
        // 不带小数位(默认是有小数位)
		var a = s.split(".");
		if (a[1] == "00") {
			s = a[0];
		}
	}
	return s;
}

// 生成16位随机字符串
export const generateRandomString = (length = 16) => {
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';

  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * characters.length));
  }

  return result;
}

// 加密
// 未登录:bs64(encrypt)
// 已登录:123+bs64(iv)+&+bs64(encrypt)
export const encrypt = (data: any, key?: any, iv?: any, prefix?: any) => {
  let randomStr = '';
  if (iv) {
    randomStr = iv;
  } else {
    randomStr = generateRandomString();
  }
  IV = CryptoJS.enc.Utf8.parse(randomStr)
  // 如果有传递key的话使用传递的,否则使用默认的
  if (key) {
    KEY = CryptoJS.enc.Utf8.parse(key)
  } else {
    KEY = IV
  }
  let srcs = CryptoJS.enc.Utf8.parse(data);
  let encrypted = CryptoJS.AES.encrypt(srcs, KEY, {
    iv: IV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
  // 判断如果未登录则不拼接,否则拼接
  let result:any = null;
  if (iv) {
    result = CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
  } else {
    result = Base64.encode(prefix + randomStr) + ".XC8v" + CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
  }
  return result
}

// 解密
export const decrypt = (word: any, key?: any, iv?: any) => {
  // 如果有传递key的话使用传递的,否则使用默认的
  if (key) {
    KEY = CryptoJS.enc.Utf8.parse(key)
  } else {
    KEY = IV
  }
  let base64 = CryptoJS.enc.Base64.parse(word);
  let src = CryptoJS.enc.Base64.stringify(base64);
  var decrypt = CryptoJS.AES.decrypt(src, KEY, {
    iv: IV,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });

  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}


export const conversionUtcDate = (date: string, type: string) => {
  if (type === 'local') {
    // 将UTC时间转换为本地时间
    return dayjs.utc(date).local().format('YYYY-MM-DD HH:mm:ss')
  } else if (type === 'UTC') {
    // 将时间转换为UTC时间
    return dayjs(date).utc().format()
  }
}

export const deepClone = (targetObj: any) => {
  // 深拷贝
  let tempObj: any
  if (typeof targetObj === 'object') {
    if (targetObj === null) {
      tempObj = null
    } else {
      if (targetObj instanceof Date) {
        tempObj = targetObj
      } else if (targetObj instanceof Array) {
        tempObj = []
        for (let i = 0, len = targetObj.length; i < len; i++) {
          tempObj.push(deepClone(targetObj[i]))
        }
      } else {
        tempObj = {}
        for (const j in targetObj) {
          tempObj[j] = deepClone(targetObj[j])
        }
      }
    }
  } else {
    tempObj = targetObj
  }
  return tempObj
}

// 对象赋值已有的属性
export const copyExistingProperties = (source: any, target: any) => {
  Object.keys(target).forEach(key => {
    if (target.hasOwnProperty(key)) {
      target[key] = source[key];
    }
  });
  return target;
}

// 清空对象值
export const resetForm = (source: any) => {
  Object.keys(source).forEach(key => {
    if (source.hasOwnProperty(key)) {
      source[key] = '';
    }
  });
  return source;
}


// 获取当前时间
export function getCurrentDateTime() {
  const date = new Date()
  const year = date.getFullYear()
  let month: any = date.getMonth()
  let day: any = date.getDate()
  let h: any = date.getHours()
  let m: any = date.getMinutes()
  let s: any = date.getSeconds()
  month = month + 1 > 9 ? month + 1 : '0' + (month + 1)
  day = day > 9 ? day : '0' + day
  h = h > 9 ? h : '0' + h
  m = m > 9 ? m : '0' + m
  s = s > 9 ? s : '0' + s
  return year + '-' + month + '-' + day + ' ' + h + ':' + m + ':' + s
}

/**
 * (type: noYear) -->  23:23:34
 * (type: '') -->  2020-10-23 23:23:34
 */
export function getFormatDateTime(date: any) {
  const dateObject = new Date(date);

  // 获取日期时间的各个部分
  const year = dateObject.getFullYear();
  const month = dateObject.getMonth() + 1; // 月份是从0开始计数的,所以要加1
  const day = dateObject.getDate();
  const hour = dateObject.getHours();
  const minute = dateObject.getMinutes();
  const second = dateObject.getSeconds();

  // 构造特定格式的日期时间字符串
  const formattedDateTime = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}:${second.toString().padStart(2, '0')}`;

  return formattedDateTime
}

export function ExcelDateToJSDate(serial: any) {
   var utc_days  = Math.floor(serial - 25569);
   var utc_value = utc_days * 86400;                                        
   var date_info = new Date(utc_value * 1000);

   var fractional_day = serial - Math.floor(serial) + 0.0000001;

   var total_seconds = Math.floor(86400 * fractional_day);

   var seconds = total_seconds % 60;

   total_seconds -= seconds;

   var hours = Math.floor(total_seconds / (60 * 60));
   var minutes = Math.floor(total_seconds / 60) % 60;

   return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
}

// 表单校验有问题时,滚动到第一个el-error的位置
export function formRollToFirstError(paneNode: any, revise = 0) {
  setTimeout(() => {
    // 延时是为了解决偶发异步取不到is-error节点
    const pane = paneNode.getElementsByClassName('is-error')[0]
    if (pane) {
      paneNode.scrollTop = pane.offsetTop + revise
      const textareaNode = pane.getElementsByClassName('el-textarea__inner') // 多行文本
      const inputNode = pane.getElementsByClassName('el-input__inner') // 单行文本,日期,日期时间,下拉框,数字等
      if (textareaNode && textareaNode[0]) {
        textareaNode[0].focus()
      } else if (inputNode && inputNode[0]) {
        inputNode[0].focus()
      }
    }
  }, 100)
}


//处理数字千分位
export const numberToCurrencyNo = (value: any) => {
  value = Number(value).toFixed(2);
  if (!value) return 0;
  // 获取整数部分
  const intPart = Math.trunc(value);
  // 整数部分处理,增加,
  const intPartFormat = intPart
    .toString()
    .replace(/(\d)(?=(?:\d{3})+$)/g, "$1,");
  // 预定义小数部分
  let floatPart = "";
  // 将数值截取为小数部分和整数部分
  const valueArray = value.toString().split(".");
  if (valueArray.length === 2) {
    // 有小数部分
    floatPart = valueArray[1].toString(); // 取得小数部分
    return intPartFormat + "." + floatPart;
  }
  return intPartFormat + floatPart;
};

export const copyToClipboard = (text: string) => {
  if (navigator.clipboard) {
    navigator.clipboard.writeText(text).then(() => {
      ElMessage.success('复制成功')
    }).catch(err => {
      console.error('无法复制到剪贴板: ' + err);
    });
  } else {
    console.error('剪贴板 API 不可用');
  }
}
// 导出/下载Excel
export const exportExcel = (data: any, fileName: any) => {
  // data --数据流
  // fileName -- 文件名称
  const blob = new Blob([data], { type: "application/vnd.ms-excel" });
  const href = URL.createObjectURL(blob);
  const eLink = document.createElement("a");
  eLink.download = `${fileName}.xls`;
  eLink.style.display = "none";
  eLink.href = href;
  document.body.appendChild(eLink);
  eLink.click();
  document.body.removeChild(eLink);
  URL.revokeObjectURL(href);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值