/* eslint-disable no-useless-escape */
|
/* eslint-disable camelcase */
|
/**
|
* Created by jiachenpan on 16/11/18.
|
*/
|
|
/** 获取最大 z-index 的值 */
|
// import {
|
// PopupManager
|
// } from 'element-ui/lib/utils/popup'
|
|
/**
|
* 时间操作
|
* @param
|
*/
|
/** 时间戳转date */
|
import moment from 'moment'
|
import { ResouceUrl } from '@/utils/baseconfig'
|
|
export function parseTime (time, cFormat) {
|
if (arguments.length === 0) {
|
return null
|
}
|
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
|
let date
|
if (typeof time === 'object') {
|
date = time
|
} else {
|
if (('' + time).length === 10) time = parseInt(time) * 1000
|
date = new Date(time)
|
}
|
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(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
let value = formatObj[key]
|
// Note: getDay() returns 0 on Sunday
|
if (key === 'a') {
|
return ['日', '一', '二', '三', '四', '五', '六'][value]
|
}
|
if (result.length > 0 && value < 10) {
|
value = '0' + value
|
}
|
return value || 0
|
})
|
return time_str
|
}
|
|
export function formatTime (time, option) {
|
time = +time * 1000
|
const d = new Date(time)
|
const now = Date.now()
|
|
const diff = (now - d) / 1000
|
|
if (diff < 30) {
|
return '刚刚'
|
} else if (diff < 3600) {
|
// less 1 hour
|
return Math.ceil(diff / 60) + '分钟前'
|
} else if (diff < 3600 * 24) {
|
return Math.ceil(diff / 3600) + '小时前'
|
} else if (diff < 3600 * 24 * 2) {
|
return '1天前'
|
}
|
if (option) {
|
return parseTime(time, option)
|
} else {
|
return (
|
d.getMonth() +
|
1 +
|
'月' +
|
d.getDate() +
|
'日' +
|
d.getHours() +
|
'时' +
|
d.getMinutes() +
|
'分'
|
)
|
}
|
}
|
|
export function isExternal (path) {
|
return /^(https?:|mailto:|tel:)/.test(path)
|
}
|
|
/** 压缩文件
|
* quality压缩百分比 0.3
|
*/
|
export function compressImage (file, quality, callback) {
|
// quality 设置为0.3
|
quality = quality || 0.3
|
const reader = new FileReader()
|
reader.onload = function (event) {
|
var result = event.target.result
|
if (file.size > 204800 && file.type !== 'image/gif' && quality < 1) { // 大于200Kb
|
const img = new Image()
|
img.src = result
|
img.onload = function () {
|
// 如果图片大于四百万像素,计算压缩比并将大小压至400万以下
|
var width = img.width
|
var height = img.height
|
|
var ratio
|
if ((ratio = width * height / 4000000) > 1) {
|
ratio = Math.sqrt(ratio)
|
width /= ratio
|
height /= ratio
|
} else {
|
ratio = 1
|
}
|
var canvas = document.createElement('canvas')
|
canvas.width = width
|
canvas.height = height
|
// 铺底色
|
var ctx = canvas.getContext('2d')
|
ctx.fillStyle = '#fff'
|
ctx.fillRect(0, 0, canvas.width, canvas.height)
|
// 如果图片像素大于100万则使用瓦片绘制
|
var count
|
if ((count = width * height / 1000000) > 1) {
|
count = ~~(Math.sqrt(count) + 1)
|
// 计算要分成多少块瓦片
|
// 计算每块瓦片的宽和高
|
var nw = ~~(width / count)
|
var nh = ~~(height / count)
|
var tCanvas = document.createElement('canvas')
|
tCanvas.width = nw
|
tCanvas.height = nh
|
for (var i = 0; i < count; i++) {
|
for (var j = 0; j < count; j++) {
|
var tctx = tCanvas.getContext('2d')
|
tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh)
|
|
ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh)
|
}
|
}
|
tCanvas.width = tCanvas.height = 0
|
} else {
|
ctx.drawImage(img, 0, 0, width, height)
|
}
|
// 进行最小压缩
|
var ndata = canvas.toDataURL('image/jpeg', quality)
|
canvas.width = canvas.height = 0
|
callback(ndata)
|
}
|
} else { // 小于200K不需要压缩 直接返回
|
callback(result)
|
}
|
}
|
reader.readAsDataURL(file)
|
}
|
|
/** 根据date URL 创建blob 用于上传 */
|
export function createBlob (result) {
|
var arr = result.split(',')
|
var mime = arr[0].match(/:(.*?)/)[1]
|
var bstr = atob(arr[1])
|
var n = bstr.length
|
var u8arr = new Uint8Array(n)
|
while (n--) {
|
u8arr[n] = bstr.charCodeAt(n)
|
}
|
return new Blob([u8arr], {
|
type: mime
|
})
|
}
|
|
/** 获取file大小的名称 */
|
export function fileSize (size) {
|
var size_int = size
|
if (typeof size === 'string' && size.constructor === String) {
|
size_int = parseInt(size)
|
}
|
var formatSize
|
if (parseInt(size_int / 1024 / 1024) > 0) {
|
formatSize = (size_int / 1024 / 1024).toFixed(2) + 'MB'
|
} else if (parseInt(size_int / 1024) > 0) {
|
formatSize = (size_int / 1024).toFixed(2) + 'kB'
|
} else {
|
formatSize = size_int + 'Byte'
|
}
|
return formatSize
|
}
|
export function getMaxIndex () {
|
let arr = [...document.getElementsByTagName('div')].map(e => +window.getComputedStyle(e).zIndex || 0)
|
return arr.length ? Math.max(...arr) + 1 : 0
|
// return PopupManager.nextZIndex()
|
}
|
|
/** 深拷贝 */
|
export function objDeepCopy (source) {
|
if (typeof source === 'object') {
|
var sourceCopy = source instanceof Array ? [] : {}
|
for (var item in source) {
|
if (!source[item]) {
|
sourceCopy[item] = source[item]
|
} else {
|
sourceCopy[item] = typeof source[item] === 'object' ? objDeepCopy(source[item]) : source[item]
|
}
|
}
|
return sourceCopy
|
}
|
return source
|
}
|
/** 获取文件类型图标 */
|
export function getTypeIcon (file) {
|
console.log(file)
|
if (file.indexOf('image') !== -1) {
|
return require('@/assets/img/file_img.png')
|
} else if (file.indexOf('audio') !== -1 || file.indexOf('video') !== -1) {
|
return require('@/assets/img/file_video.png')
|
} else {
|
var index = file.lastIndexOf('.')
|
var ext = file.substr(index + 1)
|
if (arrayContain(['xlsx', 'xls', 'XLSX', 'XLS'], ext)) {
|
return require('@/assets/img/file_excle.png')
|
} else if (arrayContain(['doc', 'docx', 'DOC', 'DOCX'], ext)) {
|
return require('@/assets/img/file_word.png')
|
} else if (arrayContain(['rar', 'zip'], ext)) {
|
return require('@/assets/img/file_zip.png')
|
} else if (ext === 'pdf') {
|
return require('@/assets/img/file_pdf.png')
|
} else if (ext === 'ppt' || ext === 'pptx') {
|
return require('@/assets/img/file_ppt.png')
|
} else if (arrayContain(['txt', 'text'], ext)) {
|
return require('@/assets/img/file_txt.png')
|
}
|
}
|
return require('@/assets/img/file_unknown.png')
|
}
|
|
/** 获取文件类型图标 */
|
export function getFileTypeIcon (file) {
|
console.log(file)
|
if (file.type.indexOf('image') !== -1) {
|
return require('@/assets/img/file_img.png')
|
} else if (file.type.indexOf('audio') !== -1 || file.type.indexOf('video') !== -1) {
|
return require('@/assets/img/file_video.png')
|
} else {
|
var index = file.name.lastIndexOf('.')
|
var ext = file.name.substr(index + 1)
|
if (arrayContain(['xlsx', 'xls', 'XLSX', 'XLS'], ext)) {
|
return require('@/assets/img/file_excle.png')
|
} else if (arrayContain(['doc', 'docx', 'DOC', 'DOCX'], ext)) {
|
return require('@/assets/img/file_word.png')
|
} else if (arrayContain(['rar', 'zip'], ext)) {
|
return require('@/assets/img/file_zip.png')
|
} else if (ext === 'pdf') {
|
return require('@/assets/img/file_pdf.png')
|
} else if (ext === 'ppt' || ext === 'pptx') {
|
return require('@/assets/img/file_ppt.png')
|
} else if (arrayContain(['txt', 'text'], ext)) {
|
return require('@/assets/img/file_txt.png')
|
}
|
}
|
return require('@/assets/img/file_unknown.png')
|
}
|
|
export function getFileTypeIconWithSuffix (ext) {
|
if (arrayContain(['jpg', 'png', 'gif'], ext)) {
|
return require('@/assets/img/file_img.png')
|
} else if (arrayContain(['mp4', 'mp3', 'avi'], ext)) {
|
return require('@/assets/img/file_excle.png')
|
} else if (arrayContain(['xlsx', 'xls', 'XLSX', 'XLS'], ext)) {
|
return require('@/assets/img/file_excle.png')
|
} else if (arrayContain(['doc', 'docx', 'DOC', 'DOCX'], ext)) {
|
return require('@/assets/img/file_word.png')
|
} else if (arrayContain(['rar', 'zip'], ext)) {
|
return require('@/assets/img/file_zip.png')
|
} else if (ext === 'pdf') {
|
return require('@/assets/img/file_pdf.png')
|
} else if (ext === 'ppt' || ext === 'pptx') {
|
return require('@/assets/img/file_ppt.png')
|
} else if (arrayContain(['txt', 'text'], ext)) {
|
return require('@/assets/img/file_txt.png')
|
}
|
return require('@/assets/img/file_unknown.png')
|
}
|
|
function arrayContain (array, string) {
|
return array.some((item) => {
|
return item === string
|
})
|
}
|
|
/** 判断输入的是number */
|
export function regexIsNumber (nubmer) {
|
var regex = /^[0-9]+.?[0-9]*/
|
if (!regex.test(nubmer)) {
|
return false
|
}
|
return true
|
}
|
|
/** 判断输入的是crm数字 数字的整数部分须少于12位,小数部分须少于4位 */
|
export function regexIsCRMNumber (nubmer) {
|
var regex = /^([-+]?\d{1,12})(\.\d{0,4})?$/
|
if (!regex.test(nubmer)) {
|
return false
|
}
|
return true
|
}
|
|
/** 判断输入的是货币 货币的整数部分须少于10位,小数部分须少于2位 */
|
export function regexIsCRMMoneyNumber (nubmer) {
|
var regex = /^([-+]?\d{1,10})(\.\d{0,2})?$/
|
if (!regex.test(nubmer)) {
|
return false
|
}
|
return true
|
}
|
|
/** 判断输入的是电话 */
|
export function regexIsCRMMobile (mobile) {
|
var regex = /^(\+?0?\d{2,4}\-?)?\d{6,11}$/
|
if (!regex.test(mobile)) {
|
return false
|
}
|
return true
|
}
|
|
/** 判断输入的是邮箱 */
|
export function regexIsCRMEmail (email) {
|
var regex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/
|
if (!regex.test(email)) {
|
return false
|
}
|
return true
|
}
|
|
export function getDateFromTimestamp (time) {
|
var times = 0
|
if (time.length === 13) {
|
times = parseInt(time)
|
} else {
|
times = parseInt(time) * 1000
|
}
|
return new Date(times) // 如果date为13位不需要乘1000
|
}
|
|
/**
|
*
|
* @param {*} timestamp 时间戳
|
* @param {*} format 格式化
|
*/
|
export function timestampToFormatTime (timestamp, format) {
|
if (timestamp && timestamp.toString().length >= 10) {
|
return moment(getDateFromTimestamp(timestamp.toString())).format(format)
|
}
|
return ''
|
}
|
/**
|
*
|
* @param {*} format 格式化字符串
|
*/
|
export function formatTimeToTimestamp (format) {
|
if (format && format.length > 0) {
|
var timeValue = moment(format)
|
.valueOf()
|
.toString()
|
return timeValue.length > 10 ? timeValue.substr(0, 10) : timeValue
|
}
|
return ''
|
}
|
|
/** image 下载 */
|
/**
|
*
|
* @param {*} data url
|
* @param {*} filename 名称
|
*/
|
export function downloadImage (data, filename) {
|
var httpindex = data.indexOf('http')
|
if (httpindex === 0) {
|
const image = new Image()
|
// 解决跨域 canvas 污染问题
|
image.setAttribute('crossOrigin', 'anonymous')
|
image.onload = function () {
|
const canvas = document.createElement('canvas')
|
canvas.width = image.width
|
canvas.height = image.height
|
const context = canvas.getContext('2d')
|
context.drawImage(image, 0, 0, image.width, image.height)
|
const dataURL = canvas.toDataURL('image/png')
|
// 生成一个 a 标签
|
const a = document.createElement('a')
|
// 创建一个点击事件
|
const event = new MouseEvent('click')
|
// 将 a 的 download 属性设置为我们想要下载的图片的名称,若 name 不存在则使用'图片'作为默认名称
|
a.download = filename || '图片'
|
// 将生成的 URL 设置为 a.href 属性
|
var blob = dataURLtoBlob(dataURL)
|
a.href = URL.createObjectURL(blob)
|
// 触发 a 的点击事件
|
a.dispatchEvent(event)
|
}
|
image.src = data
|
} else {
|
// 生成一个 a 标签
|
const a = document.createElement('a')
|
// 创建一个点击事件
|
const event = new MouseEvent('click')
|
// 将 a 的 download 属性设置为我们想要下载的图片的名称,若 name 不存在则使用'图片'作为默认名称
|
a.download = filename || '图片'
|
// 将生成的 URL 设置为 a.href 属性
|
a.href = data
|
// 触发 a 的点击事件
|
a.dispatchEvent(event)
|
}
|
}
|
/**
|
* path 和 name
|
*/
|
export function downloadFile (data) {
|
var a = document.createElement('a')
|
a.href = ResouceUrl + data.path
|
a.download = data.name ? data.name : '文件'
|
a.target = '_black'
|
document.body.appendChild(a)
|
a.click()
|
document.body.removeChild(a)
|
}
|
|
export function dataURLtoBlob (dataurl) {
|
// eslint-disable-next-line one-var
|
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 Blob([u8arr], {
|
type: mime
|
})
|
}
|
|
export function getBase64Image (img) {
|
var canvas = document.createElement('canvas')
|
canvas.width = img.width
|
canvas.height = img.height
|
var ctx = canvas.getContext('2d')
|
ctx.drawImage(img, 0, 0, img.width, img.height)
|
var ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase()
|
var dataURL = canvas.toDataURL('image/' + ext)
|
return dataURL
|
}
|
|
// 获取绑定参数
|
export function guid () {
|
function S4 () {
|
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
|
}
|
return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4())
|
}
|
|
/**
|
* 金额格式化 增加千分符
|
* @param {*} val
|
*/
|
export function moneyFormat (val) {
|
if (!val) return '0.00'
|
const i = Math.floor(val)
|
const d = val.split('.')[1] || '00'
|
return i.toLocaleString('en-US') + '.' + d
|
}
|
|
/**
|
* 下载excel
|
*/
|
export function downloadExcelWithResData (res) {
|
let fileName = res.headers['content-disposition'].split('filename=')[1]
|
if (!fileName) {
|
fileName = res.headers['content-disposition'].split('UTF-8\'\'')[1]
|
}
|
fileName = fileName ? fileName.replace(/\"/g, '') : 'file.xlsx'
|
fileName = decodeURI(fileName) || ''
|
downloadFileWithBuffer(res.data, fileName, 'application/vnd.ms-excel;charset=utf-8')
|
}
|
|
export function downloadFileWithBuffer (data, name, type) {
|
var blob = new Blob([data], {
|
type: type || ''
|
})
|
var downloadElement = document.createElement('a')
|
var href = window.URL.createObjectURL(blob) // 创建下载的链接
|
downloadElement.href = href
|
downloadElement.download = name // 下载后文件名
|
document.body.appendChild(downloadElement)
|
downloadElement.click() // 点击下载
|
document.body.removeChild(downloadElement) // 下载完成移除元素
|
window.URL.revokeObjectURL(href) // 释放掉blob对象
|
}
|