var DataUtils = {
htmlDecode: function (str) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
''': "'",
''': "'",
};
return str.replace(/&|<|>|"|'|'/g, function (m) {
return map[m];
});
}
}
var RequestUtils = {
get: function (uri, params, successCallback, finallyCallback) {
if (window.ekey && window.eiv) {
params = {d: CommonUtils.encryptData(params, window.ekey, window.eiv)};
}
axios.get(uri, params)
.then(function (res) {
var response = res.data;
if (window.ekey && window.eiv && typeof response == 'string') {
response = CommonUtils.decryptData(response, window.ekey, window.eiv);
response = JSON.parse(response);
}
if (response.code != 200) {
ElementPlus.ElMessage.error(response.message || '服务端出错了');
return;
}
successCallback && successCallback(response);
})
.finally(finallyCallback)
},
post: function (uri, params, successCallback, finallyCallback, headers) {
if (window.ekey && window.eiv) {
params = {d: CommonUtils.encryptData(params, window.ekey, window.eiv)};
}
axios.post(uri, params, {headers: headers || {}})
.then(function (res) {
var response = res.data;
if (window.ekey && window.eiv && typeof response == 'string') {
response = CommonUtils.decryptData(response, window.ekey, window.eiv);
response = JSON.parse(response);
}
if (response.code != 200) {
ElementPlus.ElMessage.error(response.message || '服务端出错了');
return;
}
successCallback && successCallback(response.data, response.code, response.message);
})
.catch(function (err) {
if (err.response) {
ElementPlus.ElMessage.error(err.response.message || '服务端出错了');
}
})
.finally(finallyCallback && finallyCallback())
},
excel: function (uri, params, successCallback, finallyCallback) {
axios.post(uri, params, {responseType: 'arraybuffer'}).then(function (response) {
var fileType = [
'application/vnd.ms-excel;charset=utf-8', // xls
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' // xlsx
]
const blob = new Blob([response.data], {type: fileType})
const downloadElement = document.createElement('a')
const href = window.URL.createObjectURL(blob)
const contentDisposition = response.headers['content-disposition'] // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
const result = patt.exec(contentDisposition)
const filename = decodeURI(escape(result[1])) // 处理文件名,解决中文乱码问题
downloadElement.style.display = 'none'
downloadElement.href = href
downloadElement.download = filename // 下载后文件名
document.body.appendChild(downloadElement)
downloadElement.click() // 点击下载
document.body.removeChild(downloadElement) // 下载完成移除元素
window.URL.revokeObjectURL(href) // 释放掉blob对象
successCallback && successCallback();
}).finally(finallyCallback && finallyCallback());
},
upload: function (formData, onSuccess) {
RequestUtils.post('/' + TP_MODULE_NAME + '/common/upload', formData, function (res) {
onSuccess && onSuccess(res);
});
},
};
var CommonUtils = {
generateUUID: function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
},
createRandomNumber: function () {
return Math.random().toString().replace('.', '');
},
getUrlFileName: function (url) {
if (url && typeof url === 'string') {
return url.split('/').pop();
}
return '';
},
getFileExt: function (filename) {
if (filename && typeof filename === 'string') {
const parts = filename?.split('.');
return parts.length > 1 ? parts.pop() : '';
}
return ''
},
getVideoCover: function (url, successCallback) {
const video = document.createElement('video') // 也可以自己创建video
video.src = url // url地址 url跟 视频流是一样的
video.crossOrigin = 'anonymous' // 解决跨域问题,也就是提示污染资源无法转换视频
video.currentTime = 5 // 第一帧
video.oncanplay = () => {
let canvas = document.createElement('canvas') // 获取 canvas 对象
const ctx = canvas.getContext('2d') // 绘制2d
canvas.width = video.clientWidth ? video.clientWidth : 320 // 获取视频宽度
canvas.height = video.clientHeight ? video.clientHeight : 320 //获取视频高度
// 利用canvas对象方法绘图
ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
// 转换成base64形式
const videoFirstImgSrc = canvas.toDataURL('image/png') // 截取后的视频封面
video.remove()
canvas.remove()
successCallback(videoFirstImgSrc);
}
},
downloadFile: function (filename, url) {
const downloadElement = document.createElement('a')
downloadElement.style.display = 'none'
downloadElement.href = url
downloadElement.download = filename // 下载后文件名
document.body.appendChild(downloadElement)
downloadElement.click() // 点击下载
document.body.removeChild(downloadElement) // 下载完成移除元素
}
,
formatUploadData: function (url) {
if (!url) return undefined;
if (Array.isArray(url)) {
return url.map(function (item) {
return {
id: '_' + CommonUtils.createRandomNumber(),
name: CommonUtils.getUrlFileName(item),
status: 'finished',
url: item,
};
});
} else {
return [
{
id: '_' + CommonUtils.createRandomNumber(),
name: CommonUtils.getUrlFileName(url),
status: 'finished',
url: url,
}
]
}
}
,
replaceUrlParam: function (url, paramName, paramValue) {
var pattern = new RegExp('(' + paramName + '=).*?(&|$)');
if (url.search(pattern) >= 0) {
return url.replace(pattern, '$1' + paramValue + '$2');
}
return url + (url.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue;
}
,
getURLParameter: function (name, url = '') {
var searchParams = new URLSearchParams(url ? url : window.location.search);
if (name) {
return searchParams.get(name);
}
var param = {};
var paramKeys = searchParams.keys();
paramKeys.forEach(function (key) {
param[key] = searchParams.get(key);
})
return param;
}
,
getURLParameters: function (url, name) {
if (!url) return '';
if (url.indexOf('?') === -1) return {};
const searchParams = new URLSearchParams(url.substring(url.indexOf('?')));
const params = {};
for (let param of searchParams.entries()) {
params[param[0]] = param[1];
}
console.log(params, name);
if (name) {
return params[name] || '';
}
return params;
}
,
selectLocalFile: function (accept, multiple, onSuccess) {
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = accept;
fileInput.multiple = multiple;
fileInput.click();
fileInput.oninput = function (ev) {
const files = ev.target.files;
for (let i = 0; i < files.length; i++) {
const file = files[i];
const formData = new FormData();
formData.append('file', file);
onSuccess && onSuccess(formData, file);
}
}
}
,
decryptData: function (encryptedData, key, iv) {
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
var encryptData = CryptoJS.AES.decrypt(encryptedData, key, {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7
});
return encryptData.toString(CryptoJS.enc.Utf8);
}
,
encryptData: function (params, key, iv) {
let data = JSON.stringify(params);
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
let encryptData = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7
});
return encryptData.toString();
}
,
/**
* script加载资源
* @param {*} url 资源url
* @param {*} callback 加载完后的回调
*/
loadScript: function (url, callback) {
const script = document.createElement("script");
script.type = "text/javascript";
// IE兼容
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback && callback();
}
};
} else {
//其他浏览器
script.onload = function () {
callback && callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}
}
;
var AppUtils = {
openModal: function (url, title, height = '750px', width = '900px', attrs = {}) {
window.top.dispatchEvent(
new CustomEvent('OPEN_MODAL', {
detail: {
api: url,
title: title,
height: height,
width: width,
...attrs
}
})
)
}
}
var ColorUtils = {
lightenColor: function (color, amount) {
// 将颜色转换为 HSL 格式
let hslColor = ColorUtils.hexToHSL(color);
// 增加亮度
hslColor.l += amount;
// 将 HSL 颜色转换为 RGB 格式
return ColorUtils.hslToHex(hslColor);
},
hexToHSL: function (hex) {
let r = parseInt(hex.substring(1, 3), 16) / 255;
let g = parseInt(hex.substring(3, 5), 16) / 255;
let b = parseInt(hex.substring(5, 7), 16) / 255;
let max = Math.max(r, g, b);
let min = Math.min(r, g, b);
let h, s, l = (max + min) / 2;
if (max === min) {
h = s = 0; // achromatic
} else {
let d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return {h, s, l};
},
hslToHex: function (hsl) {
var {h, s, l} = hsl;
let r, g, b;
if (s === 0) {
r = g = b = l; // achromatic
} else {
function hue2rgb(p, q, t) {
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1 / 6) return p + (q - p) * 6 * t;
if (t < 1 / 2) return q;
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
return p;
}
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 1 / 3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1 / 3);
}
var toHex = function (x) {
var hex = Math.round(x * 255).toString(16);
return hex.length === 1 ? '0' + hex : hex;
};
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}
};
var OssUtils = {
async ali(file, cid, option, successCallback, progressCallback) {
try {
let name = option.key;
delete option.key;
const client = new OSS(option);
let res = await client.multipartUpload(name, file, {
parallel: 4,
partSize: 1024 * 1024,
progress: (p, cpt, res) => {
progressCallback && progressCallback({percent: p});
},
});
RequestUtils.post('/' + TP_MODULE_NAME + '/common/saveOssUploadFileInfo', {
original_name: file.name,
file_size: file.size,
file_path: name,
cid: cid
}, (res) => {
successCallback && successCallback(res);
});
} catch (e) {
console.log('eeee', e)
}
},
tencent(file, cid, data, successCallback, progressCallback) {
// 取临时密钥示例1:如果通过 qcloud-cos-sts-sdk 获取临时密钥字段的格式。在返回值里取临时密钥信息,上传的文件路径信息
const {credentials = {}, startTime, expiredTime, bucket, region, key} = data;
const {tmpSecretId, tmpSecretKey, sessionToken} = credentials;
const params = {tmpSecretId, tmpSecretKey, sessionToken, bucket, region, key};
const emptyParam = Object.keys(params).find(key => !params[key]);
if (emptyParam) {
throw new Error(`cos 参数错误: ${emptyParam} 不能为空`);
}
// 创建 JS SDK 实例,传入临时密钥参数
// 其他配置项可参考下方 初始化配置项
const cos = new COS({
SecretId: tmpSecretId,
SecretKey: tmpSecretKey,
SecurityToken: sessionToken,
StartTime: startTime,
ExpiredTime: expiredTime,
});
// 上传文件
cos.uploadFile(
{
Bucket: bucket,
Region: region,
Key: key,
Body: file, // 要上传的文件对象。
onProgress(progressData) {
progressCallback && progressCallback(progressData);
}
},
(err, data) => {
if (data.statusCode === 200) {
RequestUtils.post('/' + TP_MODULE_NAME + '/common/saveOssUploadFileInfo', {
original_name: file.name,
file_size: file.size,
file_path: key,
cid: cid
}, (res) => {
successCallback && successCallback(res);
});
} else {
console.log('上传失败', err);
}
}
)
},
upload(file, cid, uploadPlatform, successCallback, progressCallback) {
RequestUtils.post('/' + TP_MODULE_NAME + '/common/getOssTempSecret', {file_name: file.name}, (data) => {
OssUtils[uploadPlatform](file, cid, data, successCallback, progressCallback);
});
}
}