UNPKG

leoutil

Version:
319 lines (281 loc) 9.48 kB
/** 获取当前浏览器UA信息 */ function _getUA () { return typeof navigator !== 'undefined' && ((navigator && (navigator.userAgent || navigator.swuserAgent)) || '') } /** 判断当前是否移动端 */ export function isMb () { return /Android|webOS|iPhone|iPod|BlackBerry/i.test(_getUA()) } /** 获取当前是否钉钉H5环境 */ export function isDD () { return /DingTalk/i.test(_getUA()) } /** 通过 名字 + 下标 + 随机串生成的key,用于v-for */ export function generateKey (name = '', index = '') { return `key-${name}-${index}-${new Date().getTime().toString(36)}` } /** * 生成 UUID * @param {Number} len 指定长度 * @param {Number} radix 指定基数 */ export function generateUuid (len, radix) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') var uuid = [] var i = null radix = radix || chars.length if (len) { // Compact form for (i = 0; i < len; i++) { uuid[i] = chars[0 | (Math.random() * radix)] } } else { // rfc4122, version 4 form var r // rfc4122 requires these characters uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-' uuid[14] = '4' // Fill in random data.  At i==19 set the high bits of clock sequence as // per rfc4122, sec. 4.1.5 for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | (Math.random() * 16) uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r] } } } return uuid.join('') } /** 格式化日期 */ export function formatDateTime (timeObj, fmt) { if (!timeObj) return '' var o = { 'M+': timeObj.getMonth() + 1, //月份 'd+': timeObj.getDate(), //日 'h+': timeObj.getHours(), //小时 'm+': timeObj.getMinutes(), //分 's+': timeObj.getSeconds(), //秒 'q+': Math.floor((timeObj.getMonth() + 3) / 3), //季度 S: timeObj.getMilliseconds() //毫秒 } if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (timeObj.getFullYear() + '').substr(4 - RegExp.$1.length)) 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 } /** 时间戳转日期 */ export function timeStamp2Text (timeStamp, format = 'yyyy-MM-dd hh:mm') { if (!timeStamp || typeof timeStamp !== 'number') return '' return formatDateTime(new Date(timeStamp), format) } /** * 轮询程序 * 当条件成立,才执行回调 * 失败 N 次后,执行失败回调 * * @param {String} conditions 成立条件表达式 * @param {Number} interval 间隔多少毫秒, 默认200 * @param {Number} timeout (运行)超时次数, 默认50 * */ export function pollFunction (conditions, interval = 200, timeout = 50) { return new Promise((resolve, reject) => { let num = 0 let t = setInterval(() => { num = num + 1 if (num >= timeout) { reject(`超时,表达式不成立: ${conditions}`) return } if (!conditions) return clearInterval(t) resolve(`表达式成立: ${conditions}`) }, interval) }) } /** 获取当前经纬度 */ export function getLocation (cb, http) { // async navigator.geolocation.getCurrentPosition(res => { // console.log('res', res) const { coords } = res if (typeof cb === 'function') cb(coords) }) } /** * 根据两点间经纬度坐标,计算两点间距离,单位为米 * * @param lng1 起始点经度 * @param lat1 起始点纬度 * @param lng2 终点经度 * @param lat2 终点纬度 * @return 直线距离,以米为单位 */ export function calcLinearDistance (lng1, lat1, lng2, lat2) { const EARTH_RADIUS = 6378137 const rad = d => { return (d * Math.PI) / 180.0 } const radLat1 = rad(lat1) const radLat2 = rad(lat2) const a = radLat1 - radLat2 const b = rad(lng1) - rad(lng2) let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))) s = s * EARTH_RADIUS s = Math.round(s * 10000) / 10000 return s } /** 节流 */ export function throttle (method, delay = 2000, time = 1000) { var timeout, startTime = +new Date() return function () { var context = this, args = arguments, curTime = +new Date() clearTimeout(timeout) // 如果达到了规定的触发时间间隔,触发 handler if (curTime - startTime >= time) { method.apply(context, args) startTime = curTime } else { // 没达到触发间隔,重新设定定时器 timeout = setTimeout(method, delay) } } } /** 强复制 */ export function superCopy (obj) { return JSON.parse(JSON.stringify(obj)) } /** 能复制方法的深拷贝 */ export function deepCopy (obj) { if (!obj) return null const result = Array.isArray(obj) ? [] : {} for (const key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === 'object') { // Copy myself if current value is object result[key] = deepCopy(obj[key]) } else { result[key] = obj[key] } } } return result } /** 提取汉字 */ export function getChinese (strValue) { if (strValue !== null && strValue !== '') { const reg = /[\u4e00-\u9fa5]/g return strValue.match(reg).join('') } else { return '' } } /** * 按字节计算字符串长度 * @param bytes 字节数 * @returns */ export function byteLength (str) { let len = 0 for (let i = 0; i < str.length; i++) { // UTF8编码一个中文按3个字节算(GBK编码一个中文按2个字节) len += str.charCodeAt(i) > 255 ? 3 : 1 // len += str.replace(/[^\x00-\xff]/g, 'xxx').length } return len } /** * 按字节截取字符串 * @param bytes 字节数 * @return s */ export function subStringByBytes (str, bytes) { let len = 0 for (let i = 0; i < str.length; i++) { // UTF8编码一个中文按3个字节算(GBK编码一个中文按2个字节 len += str.charCodeAt(i) > 255 ? 3 : 1 if (len > bytes) { return str.substring(0, i) + '...' } } return str } /** * 指定数组对象排序的比较函数 * @param {Object} property 传入对象属性 * 示例: arr = arr.sort(Util.compare('count')) */ export function compare (property) { return function (obj1, obj2) { const value1 = obj1[property] const value2 = obj2[property] // return value1 - value2 // 升序 return value2 - value1 // 降序 } } /** 跳转去飞书扫码页 */ export function goToLarkLoginPage (appid, state) { const { protocol, host, pathname } = location const redirect_uri = encodeURIComponent(`${protocol}//${host}${pathname}`) let url = `https://open.feishu.cn/open-apis/authen/v1/index?redirect_uri=${redirect_uri}&app_id=${appid}` if (state) url += `&state=${state}` // 子龙给的旧接口 // const url = `https://open.feishu.cn/connect/qrconnect/page/sso/?redirect_uri=${redirect_uri}&app_id=${appid}` // console.log('去飞书', url) location.href = url } export function generateGreeting () { const day = new Date() const hr = day.getHours() let msg = '祝你有个美好的心情!' if (hr >= 0 && hr <= 4) { msg = '深夜了,注意身体哦...' } else if (hr >= 4 && hr < 7) { msg = '清晨好,起得真早呀...' } else if (hr >= 7 && hr < 12) { msg = '今天又是元気满满的一天呢!' } else if (hr >= 12 && hr <= 13) { msg = '午饭时间,别太为难自己的肚子哦!' } else if (hr >= 13 && hr <= 17) { msg = '下午好,记得多喝一杯水哦!' } else if (hr >= 17 && hr <= 18) { msg = '进入傍晚了,不想去散散步吗?' } else if (hr >= 18 && hr <= 19) { msg = '我大概在吃晚饭了,你呢?' } else if (hr >= 19 && hr <= 23) { msg = '辛苦了,大晚上还在加班!' } return msg } /** * 金额处理 * 第一位value是必传的 * 第二位num是保留小数位,默认保留两位小数 */ export function formatMoney (value, num) { num = num > 0 && num <= 20 ? num : 2 value = parseFloat((value + '').replace(/[^\d\.-]/g, '')).toFixed(num) + '' // 将金额转成比如 123.45的字符串 var valueArr = value.split('.')[0].split('').reverse() // 将字符串的数变成数组 const valueFloat = value.split('.')[1] // 取到 小数点后的值 let valueString = '' for (let i = 0; i < valueArr.length; i++) { // 循环 取数值并在每三位加个',' valueString += valueArr[i] + ((i + 1) % 3 == 0 && (i + 1) != valueArr.length ? ',' : '') } const money = valueString.split('').reverse().join('') + '.' + valueFloat // 拼接上小数位 return money } // hex -> rgb export const hexToRgb = (hex) => { return 'rgb(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) + ',' + parseInt('0x' + hex.slice(5, 7)) + ')' } // hex -> rgba export const hexToRgba = (hex, opacity) => { return 'rgba(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) + ',' + parseInt('0x' + hex.slice(5, 7)) + ',' + opacity + ')' } // export function otherAIP() { // return xxx // } // 为了让 import leoutil from 'leoutil' 生效 export default { isDD, formatDateTime, timeStamp2Text, pollFunction, getLocation, calcLinearDistance, throttle, superCopy, deepCopy, generateKey, getChinese, byteLength, subStringByBytes, compare, goToLarkLoginPage, isMb, generateUuid, generateGreeting, formatMoney, hexToRgb, hexToRgba }