/** 公共方法类 */ import { getToken } from '@/utils/auth' import config from '@/config/config' /** * 人性化时间显示 * * @param {Object} datetime */ export function formateTime(datetime) { if (datetime == null) return '' datetime = datetime.replace(/-/g, '/') let time = new Date() let outTime = new Date(datetime) if (/^[1-9]\d*$/.test(datetime)) { outTime = new Date(parseInt(datetime) * 1000) } if ( time.getTime() < outTime.getTime() || time.getFullYear() != outTime.getFullYear() ) { return parseTime(outTime, '{y}-{m}-{d} {h}:{i}') } if (time.getMonth() != outTime.getMonth()) { return parseTime(outTime, '{m}-{d} {h}:{i}') } if (time.getDate() != outTime.getDate()) { let day = outTime.getDate() - time.getDate() if (day == -1) { return parseTime(outTime, '昨天 {h}:{i}') } if (day == -2) { return parseTime(outTime, '前天 {h}:{i}') } return parseTime(outTime, '{m}-{d} {h}:{i}') } let diff = time.getTime() - outTime.getTime() if (time.getHours() != outTime.getHours() || diff > 30 * 60 * 1000) { return parseTime(outTime, '{h}:{i}') } let minutes = outTime.getMinutes() - time.getMinutes() if (minutes == 0) { return '刚刚' } minutes = Math.abs(minutes) return `${minutes}分钟前` } /** * 格式化文件大小 * * @param {String} value 文件大小(字节) */ export function formateSize(value) { if (null == value || value == '') { return '0' } let unitArr = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] let index = 0 let srcsize = parseFloat(value) index = Math.floor(Math.log(srcsize) / Math.log(1000)) let size = srcsize / Math.pow(1000, index) size = size.toFixed(2) //保留的小数位数 return size + unitArr[index] } /** * 获取文件后缀名 * * @param {String} fileName */ export function getFileExt(fileName) { let ext = fileName.split('.') ext = ext[ext.length - 1] // 获取文件后缀名 return ext } /** * 根据图片url下载图片 * @param {String} imgsrc * @param {String} name */ export function downloadIamge(imgsrc, name) { //下载图片地址和图片名 let image = new Image() // 解决跨域 Canvas 污染问题 image.setAttribute('crossOrigin', 'anonymous') image.onload = function() { let canvas = document.createElement('canvas') canvas.width = image.width canvas.height = image.height let context = canvas.getContext('2d') context.drawImage(image, 0, 0, image.width, image.height) let url = canvas.toDataURL('image/png') //得到图片的base64编码数据 let a = document.createElement('a') // 生成一个a元素 let event = new MouseEvent('click') // 创建一个单击事件 a.download = name || 'photo' // 设置图片名称 a.href = url // 将生成的URL设置为a.href属性 a.dispatchEvent(event) // 触发a的单击事件 } image.src = imgsrc } /** * 通过图片url获取图片大小 * * @param {String} imgsrc 例如图片名: D8x5f13a53dbc4b9_350x345.png */ export function getImageInfo(imgsrc) { let data = { width: 200, height: 200, } // 实例对象 var img = new Image(); // 赋值图片地址 img.src = imgsrc; // 输出对象信息 console.log('width:' + img.width + ',height:' + img.height); if(img.width!=0&&img.height!=0){ data.width = img.width; data.height = img.height; } return { width: data.width, height: data.height, } } /** * 文件下载方法 * * @param {Number} cr_id */ export function download(cr_id) { let api = config.BASE_API_URL let token = getToken() try { let link = document.createElement('a') link.target = "_blank" link.href = `${api}/api/v1/talk/records/file/download?cr_id=${cr_id}&token=${token}` link.click() } catch (e) {} } /** * 时间格式化方法 * * @param {(Object|string|number)} time * @param {String} cFormat * @returns {String | null} */ export function parseTime(time, cFormat) { return time; if (arguments.length === 0) { return null } let date const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' if (typeof time === 'object') { date = time } else { if (typeof time === 'string' && /^[0-9]+$/.test(time)) { time = parseInt(time) } if (typeof time === 'number' && time.toString().length === 10) { time = time * 1000 } date = new Date(time.replace(/-/g, '/')) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay(), } const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { const value = formatObj[key] // Note: getDay() returns 0 on Sunday if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } return value.toString().padStart(2, '0') }) return time_str } /** * 去除字符串控制 * * @param {String} str */ export function trim(str, type = null) { if (type) { return str.replace(/(^\s*)|(\s*$)/g, '') } else if (type == 'l') { return str.replace(/(^\s*)/g, '') } else { return str.replace(/(\s*$)/g, '') } } /** * 解析url中参数 * * @param {String} url * @returns {Object} */ export function param2Obj(url) { const search = url.split('?')[1] if (!search) return {} return JSON.parse( '{"' + decodeURIComponent(search) .replace(/"/g, '\\"') .replace(/&/g, '","') .replace(/=/g, '":"') .replace(/\+/g, ' ') + '"}' ) } /** * @param {Object} json * @returns {Array} */ export function param(json) { if (!json) return '' return cleanArray( Object.keys(json).map(key => { if (json[key] === undefined) return '' return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) }) ).join('&') } /** * @param {Array} actual * @returns {Array} */ export function cleanArray(actual) { const newArray = [] for (let i = 0; i < actual.length; i++) { if (actual[i]) { newArray.push(actual[i]) } } return newArray } /** * @param {HTMLElement} element * @param {String} className */ export function toggleClass(element, className) { if (!element || !className) { return } let classString = element.className let nameIndex = classString.indexOf(className) if (nameIndex === -1) { classString += '' + className } else { classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length) } element.className = classString } /** * Check if an element has a class * * @param {HTMLElement} elm * @param {String} cls * @returns {Boolean} */ export function hasClass(ele, cls) { return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) } /** * Add class to element * * @param {HTMLElement} elm * @param {String} cls */ export function addClass(ele, cls) { if (!hasClass(ele, cls)) ele.className += ' ' + cls } /** * Remove class from element * * @param {HTMLElement} elm * @param {String} cls */ export function removeClass(ele, cls) { if (hasClass(ele, cls)) { const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') ele.className = ele.className.replace(reg, ' ') } } /** * 通过图片Url获取图片等比例缩放的宽度和高度信息 * * @param {String} src * @param {Number} width */ export function imgZoom(src, width = 200) { const info = getImageInfo(src) if (info.width < width) { return { width: `${info.width}px`, height: `${info.height}px`, } } return { width: width + 'px', height: parseInt(info.height / (info.width / width)) + 'px', } } /** * 获取浏览器光标选中内容 * * @export * @returns */ export function getSelection() { return window.getSelection ? window.getSelection().toString() : document.selection.createRange().text } /** * 剪贴板复制功能 * * @param {String} value 复制内容 * @param {Function} callback 复制成功回调方法 */ export const copyTextToClipboard = (value, callback) => { let textArea = document.createElement('textarea') textArea.style.background = 'transparent' textArea.value = value document.body.appendChild(textArea) textArea.select() try { document.execCommand('copy') if (callback) callback() } catch (err) { alert('Oops, unable to copy') } document.body.removeChild(textArea) } /** * 隐藏用户手机号中间四位 * * @param {String} phone 手机号 */ export function hidePhone(phone) { return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') } /** * 人性化显示时间 * * @param {Object} datetime */ export function beautifyTime(datetime = '') { if (datetime == null) { return '' } datetime = datetime.replace(/-/g, '/') let time = new Date() let outTime = new Date(datetime) if (/^[1-9]\d*$/.test(datetime)) { outTime = new Date(parseInt(datetime) * 1000) } if (time.getTime() < outTime.getTime()) { return parseTime(outTime, '{y}/{m}/{d}') } if (time.getFullYear() != outTime.getFullYear()) { return parseTime(outTime, '{y}/{m}/{d}') } if (time.getMonth() != outTime.getMonth()) { return parseTime(outTime, '{m}/{d}') } if (time.getDate() != outTime.getDate()) { let day = outTime.getDate() - time.getDate() if (day == -1) { return parseTime(outTime, '昨天 {h}:{i}') } if (day == -2) { return parseTime(outTime, '前天 {h}:{i}') } return parseTime(outTime, '{m}-{d}') } if (time.getHours() != outTime.getHours()) { return parseTime(outTime, '{h}:{i}') } let minutes = outTime.getMinutes() - time.getMinutes() if (minutes == 0) { return '刚刚' } minutes = Math.abs(minutes) return `${minutes}分钟前` } export function getSort(fn) { return function(a, b) { let ret = 0 if (fn.call(this, a, b)) { ret = -1 } else if (fn.call(this, b, a)) { ret = 1 } return ret } } /** * 批量排序 * * @param {*} arr */ export function getMutipSort(arr) { return function(a, b) { let tmp let i = 0 do { tmp = arr[i++](a, b) } while (tmp == 0 && i < arr.length) return tmp } } /** * Url 替换超链接 * * @param {String} text 文本 * @param {String} color 超链接颜色 */ export function textReplaceLink(text, color = '#409eff') { let exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi return text.replace( exp, `$1` ) } /** * 防抖 * * @param {*} func * @param {*} wait * @param {*} immediate * @returns */ export function debounce(func, wait, immediate) { let timeout return function() { let context = this let args = arguments if (timeout) clearTimeout(timeout) // timeout 不为null if (immediate) { let callNow = !timeout // 第一次会立即执行,以后只有事件执行后才会再次触发 timeout = setTimeout(function() { timeout = null }, wait) if (callNow) func.apply(context, args) } else { timeout = setTimeout(function() { func.apply(context, args) }, wait) } } }