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); }); } }