import { pinyin } from 'pinyin-pro'; import crypto from 'crypto-js'; /** * @desc 获取当天日期 格式yyyy-MM-dd HH:mm:ss */ export const getFullNowDate = () => { const date = new Date(); const day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); const month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; const year = date.getFullYear(); const hour = date.getHours() < 10 ? '0' + String(date.getHours()) : date.getHours(); const minue = date.getMinutes() < 10 ? '0' + String(date.getMinutes()) : date.getMinutes(); const second = date.getSeconds() < 10 ? '0' + String(date.getSeconds()) : date.getSeconds(); return year + '-' + month + '-' + day + ' ' + hour + ':' + minue + ':' + second; }; /** * @desc 获取当天日期 格式yyyy-MM-dd HH:mm */ export const getNowDateYMDms = () => { const date = new Date(); const day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); const month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; const year = date.getFullYear(); const hour = date.getHours() < 10 ? '0' + String(date.getHours()) : date.getHours(); const minue = date.getMinutes() < 10 ? '0' + String(date.getMinutes()) : date.getMinutes(); const second = date.getSeconds() < 10 ? '0' + String(date.getSeconds()) : date.getSeconds(); return year + '-' + month + '-' + day + ' ' + hour + ':' + minue; }; /** * @desc 获取当天日期 格式yyyy-MM-dd */ export const getNowDate = () => { const date = new Date(); const day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); const month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; const year = date.getFullYear(); return year + '-' + month + '-' + day; }; // 获取下一天日期 格式yyyy年MM月dd日 export const getNextDate = () => { const date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); // 检查是否是本月的最后一天 if (new Date(year, month, 0).getDate() === day) { // 如果是月份的最后一天 if (month === 12) { // 如果是12月,则变为下一年的1月 year += 1; month = 1; } else { // 否则,月份+1 month += 1; } day = 1; // 下一个月的第一天 } else { day += 1; // 否则,日期+1 } month = month < 10 ? '0' + month : month; day = day < 10 ? '0' + day : day; // console.log(year + "-" + month + "-" + day); return year + '-' + month + '-' + day; }; /** * @desc 將Date日期根據分隔符輸出 * @param data 日期date格式 * @param split 日期分隔符 */ export const returnDateBySplit = (data, split) => { const date = new Date(data); const day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); const month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; const year = date.getFullYear(); return [year, month, day].join(split); }; /** * @desc 根据日期返回MM月dd日 */ export const returnDateForMonthDay = (data) => { const date = new Date(data); const day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); const month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; return month + '月' + day + '日'; }; /** * @desc 将输入的时间戳返回其对应的format格式 */ export const formatTimestamp = (remainingMs) => { const days = Math.floor(remainingMs / (1000 * 60 * 60 * 24)); const hours = Math.floor((remainingMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((remainingMs % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((remainingMs % (1000 * 60)) / 1000); return `${days > 0 ? days + '天' : ''}${hours > 0 ? hours + '时' : ''}${minutes > 0 ? minutes + '分' : ''}${ seconds > 0 || (days === 0 && hours === 0 && minutes === 0) ? seconds + '秒' : '' }`; }; /** * @desc 根据count-down组件倒计时change方法返回format */ export const setCountDownFormat = (count) => { const days = count.days; const hours = count.hours; const minutes = count.minutes; const seconds = count.seconds; return `${days > 0 ? days + '天' : ''}${hours > 0 ? hours + '时' : ''}${minutes > 0 ? minutes + '分' : ''}${ seconds > 0 || (days === 0 && hours === 0 && minutes === 0) ? seconds + '秒' : '' }`; }; /** * @desc 去除字符串两头指定符号 */ export const trimChars = (str, charToTrim) => { // 使用正则表达式,g标志表示全局匹配,以去除所有两端的字符 const regex = new RegExp(`^[${charToTrim}]+|[${charToTrim}]+$`, 'g'); return str.replace(regex, ''); }; // 计算日期为周几 export const getWeek = (dateString) => { const date = new Date(dateString); const weekDay = ['週日', '週一', '週二', '週三', '週四', '週五', '週六']; return weekDay[date.getDay()]; }; /** * @desc 获取当月从当日到末日的日期 */ export const getDayNum = () => { let date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; let today = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); let yearMonthDay = ''; let dayList = []; // 当月剩余天数(包括当天) let days = new Date(year, month, today); // 当月总天数 let allDays = new Date(year, month, 0); // 返回日期 for (var i = days.getDate(); i <= allDays.getDate(); i++) { yearMonthDay = year + '/' + month + '/' + i; dayList.push(yearMonthDay); } return dayList; }; /** * * @param {*} obj 需拷貝的對象 * @param {*} deep 深拷貝為true,默認false * @returns */ export function useClone(obj, deep = false) { // 处理非对象或null的情况 if (obj === null || typeof obj !== 'object') { return obj; } // 处理深拷贝 if (deep) { // 使用递归和WeakMap处理循环引用 const seen = new WeakMap(); function deepClone(x) { // 处理循环引用 if (seen.has(x)) { return seen.get(x); } // 处理基本类型和函数 if (typeof x !== 'object' || x === null || typeof x === 'function' || typeof x === 'symbol') { return x; } // 初始化拷贝对象 let copy; if (Array.isArray(x)) { copy = []; } else { copy = {}; } // 存储拷贝对象和原始对象的映射关系 seen.set(x, copy); // 递归拷贝每个属性 for (const key in x) { if (x.hasOwnProperty(key)) { copy[key] = deepClone(x[key]); } } return copy; } return deepClone(obj); } // 处理浅拷贝 const shallowCopy = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { shallowCopy[key] = obj[key]; } } return shallowCopy; } /** * @desc 重新生成新的日期list */ export const changeDateList = (limit) => { // 比如今天是2023-03-17,将今天及之后44天日期都push进list // 获取今日日期 let date = new Date(); let year = date.getFullYear(); let month = date.getMonth() + 1 < 10 ? '0' + String(date.getMonth() + 1) : date.getMonth() + 1; let day = date.getDate() < 10 ? '0' + String(date.getDate()) : date.getDate(); // 定义新数组 let dayList = []; // 当月今天是第days日 let days = new Date(year + '-' + month + '-' + day); // 当月总天数 let allDays = new Date(year, month, 0); let yearMonthDay = ''; // 返回当月剩余日期 if (allDays.getDate() - day === 0) { // 当月最后一天 days = allDays; } for (var i = days.getDate(); i <= allDays.getDate(); i++) { yearMonthDay = year + '/' + month + '/' + (i < 10 ? '0' + i : i); dayList.push(yearMonthDay); } // 计算之间日期 while (dayList.length < limit) { let remainderDays = ''; if (Number(month) + 1 > 12) { month = 1; year += 1; } else { month = Number(month) + 1; } remainderDays = new Date(Number(year), Number(month), 0).getDate(); for (var i = 1; i <= remainderDays; i++) { let cuptMonth = Number(month) < 10 ? '0' + Number(month) : Number(month); let cuptDay = i < 10 ? '0' + i : i; yearMonthDay = year + '/' + cuptMonth + '/' + cuptDay; dayList.push(yearMonthDay); if (dayList.length === limit) { break; } } } return dayList; }; /** * @desc 比较两个日期时间大小 返回較大的日期 * @param {string} firTime 时间一 * @param {string} secTime 时间二 * @returns {string} 时间 */ export const compareDateToLarge = (firTime, secTime) => { if (!firTime || !secTime) return getNowDate(); let firTimeStamp = new Date(firTime).getTime(); let secTimeStamp = new Date(secTime).getTime(); let diffTimeStamp = firTimeStamp - secTimeStamp; let returnDate = ''; if (diffTimeStamp < 0) { // 今天日期 - 当前日期 小于0 ,表示当前日期有效 returnDate = secTime; } else { // 今天日期 - 当前日期 大于等于0 ,表示当前日期无效 returnDate = firTime; } return returnDate; }; /** * @desc 日期转时间戳 * @value date 需要转换成时间戳的日期 * @return timeStamp 时间戳 */ export const transferDateToTimestamp = (date) => { return new Date(date).getTime(); }; /** * @desc 指定日期是否在指定小时内 * @value date1 round * @return false 在24小时内 true超过24小时 */ export const computedDateInRound = (date1, round) => { let time1 = transferDateToTimestamp(date1); let time2 = time1 + round * 60 * 60 * 1000; let roundStamp = round * 60 * 60 * 1000; let nowTimeStamp = transferDateToTimestamp(getFullNowDate()); let diffTime = nowTimeStamp - time2; // 大于0,表示过期 if (diffTime > 0) { return true; } else { return false; } }; /** * 先对content执行trim 去掉左右两边的空格 取出code中的所有数字 执行md5(所有数字+','+content)= mdCode 返回字符串:code+'-'+mdCode * @param {*} code * @param {*} content */ export const createV = (code, content) => { const nums = code.trim().match(/[0-9]/g).join(''); const deText = crypto.MD5(`${nums},${content}`).toString(); return `${code.trim()}-${deText}`; }; /** * @desc 时间戳转日期 * @return yyyy-MM-dd */ export const operaTimeStamp = (time) => { var date = new Date(time); var Y = date.getFullYear() + '-'; var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); return Y + M + D; }; /** * @desc 时间戳转日期 * @return yyyy-MM-dd */ export const operaFullTimeStamp = (time) => { var date = new Date(time); var Y = date.getFullYear() + '-'; var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); var H = date.getHours() < 10 ? '0' + date.getHours() : date.getHours(); var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(); var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); return Y + M + D + ' ' + H + ':' + m + ':' + s; }; /** * @description 格式化时间 * @param {String|Number} dateTime 需要格式化的时间戳 * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd * @returns {string} 返回格式化后的字符串 */ export const timeFormat = (dateTime = null, formatStr = 'yyyy-mm-dd') => { let date; // 若传入时间为假值,则取当前时间 if (!dateTime) { date = new Date(); } // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容) else if (/^\d{10}$/.test(dateTime.toString().trim())) { date = new Date(dateTime * 1000); } // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容 else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) { date = new Date(Number(dateTime)); } // 其他都认为符合 RFC 2822 规范 else { // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间 date = new Date(typeof dateTime === 'string' ? dateTime.replace(/-/g, '/') : dateTime); } const timeSource = { y: date.getFullYear().toString(), // 年 m: (date.getMonth() + 1).toString().padStart(2, '0'), // 月 d: date.getDate().toString().padStart(2, '0'), // 日 h: date.getHours().toString().padStart(2, '0'), // 时 M: date.getMinutes().toString().padStart(2, '0'), // 分 s: date.getSeconds().toString().padStart(2, '0'), // 秒 // 有其他格式化字符需求可以继续添加,必须转化成字符串 }; for (const key in timeSource) { const [ret] = new RegExp(`${key}+`).exec(formatStr) || []; if (ret) { // 年可能只需展示两位 const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0; formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex)); } } return formatStr; }; /** * @desc 判断是否为空 */ export const isEmpty = (value) => { switch (typeof value) { case 'undefined': return true; case 'string': if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true; break; case 'boolean': if (!value) return true; break; case 'number': if (value === 0 || isNaN(value)) return true; break; case 'object': if (value === null || value.length === 0) return true; for (const i in value) { return false; } return true; } return false; }; /** @desc 获取用户定位 */ export const getUserLocation = () => { return new Promise((resolve, reject) => { const location = { latitude: 0, longitude: 0, }; uni.getLocation({ isHighAccuracy: true, altitude: true, type: 'gcj02', success(res) { location.latitude = res.latitude; location.longitude = res.longitude; resolve(location); }, fail() { resolve(location); }, }); }); }; /** @desc 计算两个坐标之间的经纬度差值 */ export const getGreatCircleDistance = (lat1, lng1, lat2, lng2) => { let EARTH_RADIUS = 6378137.0; //单位m let PI = Math.PI; function getRad(d) { return (d * PI) / 180.0; } let radLat1 = getRad(lat1); let radLat2 = getRad(lat2); let a = radLat1 - radLat2; let b = getRad(lng1) - getRad(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.0; return s; }; /** @desc 计算两个坐标之间的经纬度差值 */ export const getDistance = (lat1, lon1, lat2, lon2) => { const R = 6378137; // 地球半径,单位米 const phi1 = (lat1 * Math.PI) / 180; // 纬度1,弧度制 const phi2 = (lat2 * Math.PI) / 180; // 纬度2,弧度制 const phiDelta = ((lat2 - lat1) * Math.PI) / 180; // 两点纬度差,弧度制 const lambdaDelta = ((lon2 - lon1) * Math.PI) / 180; // 两点经度差,弧度制 const a = Math.sin(phiDelta / 2) * Math.sin(phiDelta / 2) + Math.cos(phi1) * Math.cos(phi2) * Math.sin( lambdaDelta / 2) * Math.sin(lambdaDelta / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = R * c; return distance; }; /** * @desc 计算两个坐标间距离,单位米、千米 * @param coord1 坐标1 * @param coord2 坐标2 */ export const calculateDistance = (coord1, coord2) => { const cord1 = coord1.split(','); const cord2 = coord2.split(','); const cordObj1 = { lat: cord1[0], lng: cord1[1], }; const cordObj2 = { lat: cord2[0], lng: cord2[1], }; const earthRadius = 6371000; // Earth radius in meters const lat1 = (cordObj1.lat * Math.PI) / 180; // Convert to radians const lat2 = (cordObj2.lat * Math.PI) / 180; const deltaLat = ((cordObj2.lat - cordObj1.lat) * Math.PI) / 180; const deltaLon = ((cordObj2.lng - cordObj1.lng) * Math.PI) / 180; const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin( deltaLon / 2) * Math.sin(deltaLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = earthRadius * c; return Number(distance) >= 1000 ? (Number(distance) * 0.001).toFixed(1) + 'km' : Number(distance).toFixed(1) + 'm'; // 使用示例 // const cordObj1 = { lat: 52.2296756, lng: 21.0122287 }; // const cordObj2 = { lat: 41.8919300, lng: 12.5113300 }; // console.log(calculateDistance(cordObj1, cordObj2)); // 输出将以米为单位的距离 }; /** @desc 获取小程序菜单按钮布局信息 平台差异:H5没有此方法,wx、zfb可以获取右上角胶囊按钮的样式 */ export const getMenuButtonBounding = () => { const menuStyle = uni.getMenuButtonBoundingClientRect(); return menuStyle; }; /** @desc 同步获取设备信息 @return device:运行应用的设备,如iphone、huawei @return os:设备的操作系统,如 ios、andriod、windows、mac、linux @return rom:基于操作系统的定制,Android系统特有概念,如miui、鸿蒙 @return host:运行应用的宿主程序,即OS和应用之间的运行环境,如浏览器、微信等小程序宿主、集成uniMPSDK的App。uni-app直接开发的app没有host概念 @return uni:uni-app框架相关的信息,如uni-app框架的编译器版本、运行时版本 @return app:开发者的应用相关的信息,如应用名称、版本 */ export const getSystemInfo = () => { let res = uni.getSystemInfoSync(); return res; }; /** * @desc 计算顶部bar高度 */ export const getSafeTopHeight = () => { let res = uni.getSystemInfoSync(); // #ifdef MP-WEIXIN return 44 + res.statusBarHeight; // #endif // #ifndef MP-WEIXIN return res.statusBarHeight; // #endif }; /** * @desc 获取底部安全距离高度 */ export const getSafeAreaBottom = () => { const { safeAreaInsets, osName } = uni.getSystemInfoSync(); return osName == 'ios' ? safeAreaInsets.bottom : 0; }; /** * @desc 计算系统可用安全高度,适配iOS和Android */ export const getSystemSafeArea = () => { // 获取系统信息 const systemInfo = uni.getSystemInfoSync(); // 基础高度信息 var windowHeight = systemInfo.windowHeight; const statusBarHeight = systemInfo.statusBarHeight || 0; // iOS设备 // if (systemInfo.osName === 'ios') { // return windowHeight; // } // // Android设备 // else { // // const titleBarHeight = systemInfo.titleBarHeight || 0; // // return windowHeight - statusBarHeight - titleBarHeight; // return windowHeight; // } return windowHeight; }; /** * @desc H5获取url携带的参数 */ export const getUrlParams = () => { const params = {}; const url = window.location.href; // 解析URL并获取查询参数部分 var queryParams = url.indexOf('?') !== -1 ? url.split('?')[1] : ''; if (queryParams) { queryParams.split('&').forEach(function(param) { var keyValuePair = param.split('='); if (keyValuePair.length > 1) { var key = decodeURIComponent(keyValuePair[0]); var value = decodeURIComponent(keyValuePair[1] || ''); params[key] = value; } }); } return params; }; // 定义一个函数,用于将单个字符串的首字母大写 export const capitalizeFirstLetter = (str) => { return str.charAt(0).toUpperCase() + str.slice(1); }; /** * @desc 中文转拼音 * @value chineseName 中文名 * @return [xing,ming] */ export const chineseToPinyin = (chineseName) => { const pinyinArray = pinyin(chineseName, { toneType: 'none', type: 'array', }); let [xin, ...min] = pinyinArray.map((item) => capitalizeFirstLetter(item)); return [xin, min.join('')]; }; /** * 字符串的转拼音 * @param {string} chineseName 中文名 * @returns {Array} [xing,ming] */ export const chineseNameToPinyin = (chineseName) => { const pinyinArray = pinyin(chineseName, { toneType: 'none', type: 'array', }); let [xin, ...min] = pinyinArray; return [xin, min.join('')]; }; /** * @desc svg图片转base64 */ export const imgUrl = (url) => { return `data:image/svg+xml;base64,${encodeURIComponent(url)}`; }; /** * @desc 检查字符串是否包含中文 */ export const checkChinese = (str) => { var pattern = new RegExp('[\u4E00-\u9FA5]+'); var patternNum = new RegExp('[0-9]+'); if (pattern.test(str)) { return true; } if (patternNum.test(str)) { return true; } return false; }; /** * @desc 根据输入的日期返回当前日期是否还在此日期范围内,是返回true * @param nowDate 当前日期 * @param limit 限定日期 * @return true 在限定日期范围内 */ export const checkDateUseful = (nowDate, limit) => { let limitDate = transferDateToTimestamp(limit); let useDate = transferDateToTimestamp(nowDate); if (useDate <= limitDate) { return true; } else { return false; } }; /** * @desc 去重 * @param {Array} arrays */ export const removeRepeat = (arrays) => { const uniqueArray = Array.from(new Set(arrays)); return uniqueArray; }; /** * @desc 合并一维数组内所有值 * @param {Array} arrays */ export const combineArrays1 = (arrays) => { // 使用 reduce 方法来合并所有的一维数组 const combinedArray = arrays.reduce((acc, currentArray) => acc.concat(currentArray), []); return combinedArray; }; /** * @desc 合并两个一维数组 * @param {Array} arr1 * @param {Array} arr2 */ export const combineArrays2 = (arr1, arr2) => { let result = []; // 遍历第一个数组 for (let i = 0; i < arr1.length; i++) { // 遍历第二个数组 for (let j = 0; j < arr2.length; j++) { // 组合成一个新的数组 let combination = [arr1[i], arr2[j]].join('/'); result.push(combination); } } return result; }; /** * @desc 校验手机号规格 86大陆、853,852香港澳门 * */ export const checkTelPhone = (areaCode, mobile) => { console.log(areaCode, mobile); if (!areaCode || typeof areaCode === 'object') return false; if (!mobile || typeof mobile === 'object') return false; var preg = ''; switch (areaCode) { case '86': preg = /^1[3-9][0-9]{9}$/; break; case '853': preg = /^6[0-9]{7}$/; break; case '852': preg = /^[9|8|7|6|5|4][0-9]{7}$/; break; default: preg = /^[0-9]{7,11}$/; break; } if (!preg.test(mobile)) { return false; } return true; }; /** * @desc 检查证电子邮件是否合法 */ export const checkEmail = (userEmail) => { if (userEmail == '' || userEmail == null) { return false; } // @符号前面的部分可以包含字母、数字、下划线、减号、点号、百分号、连接符(_、-),要求没有特殊字符。@符号后面的部分必须为字母、数字、点(.)组成的域名,顶级域名至少两个字符,最多为6个字符。 var mailreg = /^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}(\.[a-zA-Z]{2,6})?)$/; // var mailreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; if (!mailreg.test(userEmail)) { return false; } return true; }; /** * 防抖函数 * @param {Function} fn 需要防抖的函数 * @param {number} delay 间隔时间 * @param {boolean} immediate 是否立即执行 * @returns {number} delay */ export function debounce(fn, delay, immediate = false) { // 1.定义一个定时器, 保存上一次的定时器 let timer = null; let isInvoke = false; // 是否激活了立即执行 // 2.真正执行的函数 const _debounce = function(...args) { // 取消上一次的定时器 if (timer) clearTimeout(timer); // 判断是否需要立即执行 if (immediate && !isInvoke) { fn.apply(this, args); isInvoke = true; // 已经立即执行, 阻止下次触发的立即执行 } else { // 延迟执行 timer = setTimeout(() => { // 外部传入的真正要执行的函数 fn.apply(this, args); isInvoke = false; // 将isInvoke初始化 }, delay); } }; // 封装取消功能 _debounce.cancel = function() { if (timer) clearTimeout(timer); timer = null; isInvoke = false; }; return _debounce; } /** * @description 节流 * @param { Number } interval ms * @param { Boolean } [immediate=false] 是否立即执行 */ export const throttle = (fn, interval, immediate = true) => { let startTime = 0 const _throttle = function(...args) { const nowTime = new Date().getTime() if (!immediate && startTime === 0) { startTime = nowTime } const waitTime = interval - (nowTime - startTime) if (waitTime <= 0) { fn.apply(this, args) startTime = nowTime } } return _throttle } export const paylogo = [{ platform: 'wx', logo: '/static/icon/wxpay.png', leftImg: 'https://static.panyou.com/assets/miniWeb/weixin.png', }, { platform: 'cnwx', logo: '/static/icon/wxpay.png', leftImg: 'https://static.panyou.com/assets/miniWeb/weixin.png', }, { platform: 'zfb', logo: '/static/icon/zfbpay.png', leftImg: 'https://static.panyou.com/assets/miniWeb/zhifubao.png', }, { platform: 'baidu', logo: '/static/icon/zfbpay.png', leftImg: 'https://static.panyou.com/assets/miniWeb/zhifubao.png', }, { platform: 'hkzfb', logo: '/static/icon/zfbpay.png', leftImg: 'https://static.panyou.com/assets/miniWeb/zhifubao.png', }, { platform: 'xyk', logo: '/static/icon/visapay.png', leftImg: '', }, ]; export const areaCodeOptions = [{ value: '86', label: '+86', }, { value: '852', label: '+852', }, { value: '853', label: '+853', }, { value: '886', label: '+886', }, { value: '65', label: '+65', }, { value: '60', label: '+60', }, ]; export const sex = [{ label: '男', name: '1', }, { label: '女', name: '2', }, ]; export const platformMap = [{ map: 'mp-weixin', key: 'wx', }, { map: 'mp-alipay', key: 'zfb', }, { map: 'mp-baidu', key: 'baidu', }, { map: 'web', key: 'h5', }, { map: 'android', key: 'androidApp', }, { map: 'ios', key: 'iosApp', }, ]; export const operaMineList = [{ // icon: '/static/icon/kefu.svg', note: '點擊聯系線上客服', path: '/pages/customer/index', badge: {}, }, { // icon: '/static/icon/feedback.svg', note: '意見反饋', path: '/pages/feedback/index', badge: {}, }, { // icon: '/static/icon/shezhi.svg', note: '設置', path: '/pages/setting/index', badge: {}, }, ]; export const customerList = [{ name: '點擊聯系線上客服', type: 'contact', // icon: '/static/icon/kefu.svg', value: '', }, { name: '港澳:00852-21210200', type: 'phone', // icon: '/static/icon/telephone.svg', value: '00852-21210200', }, { name: '國內:4008-652-651', type: 'phone', // icon: '/static/icon/telephone.svg', value: '4008-652-651', }, ]; export const createIdSelector = (id, type = 'single') => { return new Promise((resolve) => { const query = uni.createSelectorQuery(); query .select(id) .boundingClientRect() .exec(([res]) => { resolve(res); }); }); }; /** * @description: 封装toast * @param {*} title * @param {*} icon * @param {*} duration * @return {*} * @author: ljx */ export const showToast = (title, icon = 'none', duration = 2000) => { uni.showToast({ title, icon, duration, }); }; export const showLoadingToast = () => { return uni.showLoading({ mask: true, }); }; export const closeToast = () => { uni.hideToast(); uni.hideLoading(); }; /** * 拨打电话 */ export const telPhone = (phoneNumber) => { let phone = ''; phoneNumber.split(' ').map((item, index) => { if (index != 0) { phone += item; } }); uni.makePhoneCall({ phoneNumber: phone, }); }; /** * 地图导航 */ export const toMap = (l, r, n, a) => { uni.openLocation({ latitude: Number(l), longitude: Number(r), name: n, address: a ? a : '', success: () => {}, }); };