2. utils
let debounceTimer = null let throttleTimer = null export default { toHHmmss (data) { var s var hours = parseInt((data % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) var minutes = parseInt((data % (1000 * 60 * 60)) / (1000 * 60)) var seconds = parseInt((data % (1000 * 60)) / 1000) s = (hours < 10 ? ('0' + hours) : hours) + ':' + (minutes < 10 ? ('0' + minutes) : minutes) + ':' + (seconds < 10 ? ('0' + seconds) : seconds) return s }, isJSON (str) { if (typeof (str) === 'string') { try { var obj = JSON.parse(str) if (typeof (obj) === 'object' && obj) { return true } else { return false } } catch (e) { return false } } }, compareDate (t1, t2) { var date = new Date() // var dangqian=date.toLocaleTimeString('chinese',{hour12:false}) // var dq=dangqian.split(":"); var a = t1.split(':') var b = t2.split(':') // var dqdq=date.setHours(dq[0],dq[1]); var aa = date.setHours(a[0], a[1]) var bb = date.setHours(b[0], b[1]) return aa < bb }, getQueryString (name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') var r = window.location.search.substr(1).match(reg) if (r != null) { return decodeURI(r[2]) } else { return null } }, getBrowserEngine () { const userAgent = navigator.userAgent // 取得浏览器的userAgent字符串 if ( userAgent.indexOf('Trident') !== -1 || userAgent.indexOf('MSIE') !== -1 || userAgent.indexOf('Edge') > -1 ) { // 表示使用的是IE的内核 return 'IE' } else if (userAgent.indexOf('Firefox') !== -1) { return 'Firefox' } else if (userAgent.indexOf('Chrome') !== -1) { return 'Chrome' } else if (userAgent.indexOf('Safari') !== -1) { return 'Safari' } }, // 检查对象类型 typeOf (obj) { const toString = Object.prototype.toString const map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object' } return map[toString.call(obj)] }, // 对象深拷贝 deepCopy (data) { const t = this.typeOf(data) let o if (t === 'array') { o = [] } else if (t === 'object') { o = {} } else { return data } if (t === 'array') { for (let i = 0; i < data.length; i++) { o.push(this.deepCopy(data[i])) } } else if (t === 'object') { for (let i in data) { o[i] = this.deepCopy(data[i]) } } return o }, /** * 验证字符串是否为空 * * @param {String} str 字符串值 * @returns true false */ strIsEmpty (val) { if (val === undefined || val === null || val === 'null' || val === '') { return true } return false }, // 去空格 removeSpace (str) { return str.replace(/\s*/g, '') }, /** * 获取当前时间 * 格式YYYY-MM-DD */ getDate () { var date = new Date() var seperator1 = '-' var year = date.getFullYear() var month = date.getMonth() + 1 var strDate = date.getDate() if (month >= 1 && month <= 9) { month = '0' + month } if (strDate >= 0 && strDate <= 9) { strDate = '0' + strDate } var currentdate = year + seperator1 + month + seperator1 + strDate return currentdate }, // 将分钟数转换为日+小时+分钟 remindTime (t) { let d = Math.floor(t / 1440) let h = Math.floor((t % 1440) / 60) let m = (t % 1440) % 60 let ds = d > 0 ? d + '天' : '' let hs = h > 0 ? h + '小时' : '' let ms = m > 0 ? m + '分钟' : '0分钟' return ds + hs + ms }, /** * 校验上传文档文件后缀类型pdf,doc,docx * * @param {String} filename 文件名字 * @param {String} types 文件类型集合 * @returns true false */ checkcontractdocFileSuffix (filename, types) { // 再对文件名进行截取,以取得后缀名 var three = filename.split('.') // 获取截取的最后一个字符串,即为后缀名 var last = three[three.length - 1] // 添加需要判断的后缀名类型 var tp = types // 'pdf,doc,docx' // 返回符合条件的后缀名在字符串中的位置 var rs = tp.indexOf(last) // 如果返回的结果大于或等于0,说明包含允许上传的文件类型 if (rs >= 0) { return true } else { return false } }, /** * @return {string} 数值保留两位小数 * @param {*} point 待处理值 withPercent 是否带% * @description 转换百分数保留两位小数带或不带% */ toPercent (point, withPercent) { let str = '' if (withPercent) { str = Number(point * 100) str += '%' } else { str = Number(point).toFixed(2) } return str }, /** * @return {string} 返回处理后的字符串 * @param {*} str 被截取字符串 length超过长度截取 * @description 字符串长度过长时截取显示 */ stringSubStr (str, length) { let newStr = '' if (str !== '' && str !== null && str.length > length) { newStr = `${str.substring(0, length)}...` } else { newStr = str === null ? '' : str } return newStr }, /** * @return {string} 返回处理后的和 * @param {*} num1 num2 * @description 自定义加法运算 */ // addNum (num1, num2) { let sq1 = '' let sq2 = '' let m = '' try { sq1 = num1.toString().split('.')[1].length } catch (e) { sq1 = 0 } try { sq2 = num2.toString().split('.')[1].length } catch (e) { sq2 = 0 } m = Math.pow(10, Math.max(sq1, sq2)) let result = (Number(num1) * m + Number(num2) * m) / m // if (result.toString().indexOf('.') > -1) { // if (result.toString().substring(result.toString().indexOf('.')).length > 1) { // result = result.toFixed(2) // } // } result = result.toFixed(2) return result }, /** * @return {string} 转义过后字符串 * @param {*} obj 引用数据类型 * @description 转义中文,或者对象、数组,不带JSON.stringfly() */ enCodeRouter (obj) { const encodeReserveRE = /[!'()*]/g const encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16) } const commaRE = /%2C/g return encodeURIComponent(obj) .replace(encodeReserveRE, encodeReserveReplacer) .replace(commaRE, ',') }, /** * @return {string} * @param {*} obj 引用数据类型 * @description 校验文件类型是否是图片 */ checkImageSuffix (filename) { // 再对文件名进行截取,以取得后缀名 var three = filename.split('.') // 获取截取的最后一个字符串,即为后缀名 var last = three[three.length - 1] // 添加需要判断的后缀名类型 var tp = 'bmp,jpg,jpeg,png,gif,BMP,JPG,JPEG,PNG,GIF' // 返回符合条件的后缀名在字符串中的位置 var rs = tp.indexOf(last.toLocaleLowerCase()) // 如果返回的结果大于或等于0,说明包含允许上传的文件类型 if (rs >= 0) { return true } else { return false } }, /** ** 减法函数,用来得到精确的减法结果 ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。 ** 调用:accSub(arg1,arg2) ** 返回值:arg1减去arg2的精确结果 * */ accSub (arg1, arg2) { let r1 let r2 let m let n try { r1 = arg1.toString().split('.')[1].length } catch (e) { r1 = 0 } try { r2 = arg2.toString().split('.')[1].length } catch (e) { r2 = 0 } m = Math.pow(10, Math.max(r1, r2)) // last modify by deeka //动态控制精度长度 n = r1 >= r2 ? r1 : r2 return ((arg1 * m - arg2 * m) / m).toFixed(n) }, // 1.获取当前月份的第一天 getCurrentMonthFirstDay () { var date = new Date() date.setDate(1) var month = parseInt(date.getMonth() + 1) var day = date.getDate() if (month < 10) { month = '0' + month } if (day < 10) { day = '0' + day } return date.getFullYear() + '-' + month + '-' + day }, // 2.获取当前月份的最后一天 getCurrentMonthLastDay () { var date = new Date() var currentMonth = date.getMonth() var nextMonth = ++currentMonth var nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1) var oneDay = 1000 * 60 * 60 * 24 var lastTime = new Date(nextMonthFirstDay - oneDay) var month = parseInt(lastTime.getMonth() + 1) var day = lastTime.getDate() if (month < 10) { month = '0' + month } if (day < 10) { day = '0' + day } return date.getFullYear() + '-' + month + '-' + day }, /** * 获取年月日 * * @param {String} dateStr 时间毫秒数 * @returns 格式化后的时间 */ getYearMonthDay (dateStr) { if (!dateStr) return '' return this.formatDate(dateStr, 'yyyy-MM-dd') }, /** * 格式化时间 * * @param {String} dateStr 时间毫秒数 * @returns 格式化后的时间 */ formatDate (dateStr, format) { if (!dateStr) return '' var date = new Date(parseInt(dateStr)) return date.pattern(format) }, // 安全乘法 accMul (a, b) { var c = 0 var d = a.toString() var e = b.toString() try { c += d.split('.')[1].length } catch (f) { } try { c += e.split('.')[1].length } catch (f) { } return Number(d.replace('.', '')) * Number(e.replace('.', '')) / Math.pow(10, c) }, // 安全除法 accDiv (a, b) { var c var d var e = 0 var f = 0 try { e = a.toString().split('.')[1].length } catch (g) { } try { f = b.toString().split('.')[1].length } catch (g) { } c = Number(a.toString().replace('.', '')) d = Number(b.toString().replace('.', '')) return this.accMul(c / d, Math.pow(10, f - e)) }, timestamp (timestamp) { var d = new Date(timestamp) // 根据时间戳生成的时间对象 var date = (d.getFullYear()) + '-' + (d.getMonth() + 1) + '-' + (d.getDate()) + ' ' + (d.getHours()) + ':' + (d.getMinutes()) + ':' + (d.getSeconds()) return date }, // debounce防抖,接受一个函数和延迟执行的时间作为参数,多次操作后仅执行最后一次操作 debounce (fn, delay = 1500) { clearTimeout(debounceTimer) // 维护一个 timer debounceTimer = setTimeout(function () { fn() clearTimeout(debounceTimer) }, delay) }, // throttle节流,多次操作后,仅在既定时间后执行第一次操作 throttle (func, delay = 1500) { if (!throttleTimer) { throttleTimer = setTimeout(function () { func() throttleTimer = null clearTimeout(throttleTimer) }, delay) } } } /** * 对Date的扩展,将 Date 转化为指定格式的String * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) * eg: * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423 * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04 * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04 * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04 * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 */ // eslint-disable-next-line no-extend-native Date.prototype.pattern = function (fmt) { var o = { 'M+': this.getMonth() + 1, // 月份 'd+': this.getDate(), // 日 'h+': this.getHours() % 12 === 0 ? 12 : this.getHours() % 12, // 小时 'H+': this.getHours(), // 小时 'm+': this.getMinutes(), // 分 's+': this.getSeconds(), // 秒 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度 S: this.getMilliseconds() // 毫秒 } var week = { '0': '\u65e5', '1': '\u4e00', '2': '\u4e8c', '3': '\u4e09', '4': '\u56db', '5': '\u4e94', '6': '\u516d' } if (/(y+)/.test(fmt)) { fmt = fmt.replace( RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length) ) } if (/(E+)/.test(fmt)) { fmt = fmt.replace( RegExp.$1, (RegExp.$1.length > 1 ? RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468' : '') + week[this.getDay() + ''] ) } for (var k in o) { if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace( RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) ) } } return fmt }