// 判断是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);
};