// import Config from './baseConfig.js' // // import store from '@/store/index.js' // // import JSEncrypt from 'jsencrypt' // import Http from './http.js' export default { /** * 页面跳转 * @param {string} to 跳转链接 /pages/index/index * @param {Object} param 参数 {key : value, ...} * @param {string} mode 模式 */ redirectTo(to, param, mode) { let url = to; // console.log({"$store":store.state.$store.tabbarList.list}) let tabbarList = ['/pages/index/index', '/pages/orderList/orderList', '/pages/mine/mine'] for (let i = 0; i < tabbarList.length; i++) { if (to.indexOf(tabbarList[i]) != -1) { uni.switchTab({ url: url }) return; } } // // #ifdef H5 // window.history.pushState(null, null, url); // // #endif if (param != undefined) { Object.keys(param).forEach(function(key) { if (url.indexOf('?') != -1) { url += "&" + key + "=" + param[key]; } else { url += "?" + key + "=" + param[key]; } }); } switch (mode) { case 'tabbar': // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 uni.switchTab({ url: url }) break; case 'redirectTo': // 关闭当前页面,跳转到应用内的某个页面。 uni.redirectTo({ url: url }); break; case 'reLaunch': // 关闭所有页面,打开到应用内的某个页面。 uni.reLaunch({ url: url }); break; default: // 保留当前页面,跳转到应用内的某个页面 uni.navigateTo({ url: url }); } }, /** * 图片路径转换 * @param {String} img_path 图片地址 * @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small */ // img(img_path, params) { // var path = ""; // if (img_path && img_path != undefined && img_path != "") { // if (params && img_path != this.getDefaultImage().default_goods_img) { // // 过滤默认图 // let arr = img_path.split("."); // let suffix = arr[arr.length - 1]; // arr.pop(); // arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size; // arr.push(suffix); // img_path = arr.join("."); // } // if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) { // path = Config.imgDomain + "/" + img_path; // } else { // path = img_path; // } // } // return path; // }, /** * 时间戳转日期格式 * @param {Object} timeStamp */ timeStampTurnTime(timeStamp, type = "") { if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) { var date = new Date(); date.setTime(timeStamp * 1000); var y = date.getFullYear(); var m = date.getMonth() + 1; m = m < 10 ? ('0' + m) : m; var d = date.getDate(); d = d < 10 ? ('0' + d) : d; var h = date.getHours(); h = h < 10 ? ('0' + h) : h; var minute = date.getMinutes(); var second = date.getSeconds(); minute = minute < 10 ? ('0' + minute) : minute; second = second < 10 ? ('0' + second) : second; if (type) { return y + '-' + m + '-' + d; } else { return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; } } else { return ""; } }, /** * 日期格式转时间戳 * @param {Object} timeStamp */ timeTurnTimeStamp(string) { var f = string.split(' ', 2); var d = (f[0] ? f[0] : '').split('-', 3); var t = (f[1] ? f[1] : '').split(':', 3); return (new Date( parseInt(d[0], 10) || null, (parseInt(d[1], 10) || 1) - 1, parseInt(d[2], 10) || null, parseInt(t[0], 10) || null, parseInt(t[1], 10) || null, parseInt(t[2], 10) || null )).getTime() / 1000; }, minutesBetweenDates(date1, date2) { let dateOne = new Date(date1) const oneMinute = 60 * 1000; // 1分钟的毫秒数 const difference = Math.abs(date2.getTime() - dateOne.getTime()); // 计算两个日期的毫秒差 return Math.floor(difference / oneMinute); // 将差异转换为分钟并向下取整 }, formatDate(dat, type, addNum) { if (!dat) { return '-' } let date = new Date(dat) if (addNum) { date = new Date(date.setDate(date.getDate() + addNum)); } const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); if (type) { return type=='riqi' ? `${month}-${day}`: `${year}-${month}-${day} ${hours}:${minutes}`; } return `${year}-${month}-${day}`; }, /** * 倒计时 * @param {Object} seconds 秒 */ countDown(seconds) { let [day, hour, minute, second] = [0, 0, 0, 0] if (seconds > 0) { day = Math.floor(seconds / (60 * 60 * 24)) hour = Math.floor(seconds / (60 * 60)) - (day * 24) minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60) second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60) } if (day < 10) { day = '0' + day } if (hour < 10) { hour = '0' + hour } if (minute < 10) { minute = '0' + minute } if (second < 10) { second = '0' + second } return { d: day, h: hour, i: minute, s: second }; }, /** * 数值去重 * @param {Array} arr 数组 * @param {string} field 字段 */ unique(arr, field) { const res = new Map(); return arr.filter((a) => !res.has(a[field]) && res.set(a[field], 1)); }, /** * 判断值是否在数组中 * @param {Object} elem * @param {Object} arr * @param {Object} i */ inArray: function(elem, arr) { return arr == null ? -1 : arr.indexOf(elem); }, /** * 获取某天日期 * @param {Object} day */ getDay: function(day) { var today = new Date(); var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day; today.setTime(targetday_milliseconds); const doHandleMonth = function(month) { var m = month; if (month.toString().length == 1) { m = "0" + month; } return m } var tYear = today.getFullYear(); var tMonth = today.getMonth(); var tDate = today.getDate(); var tWeek = today.getDay(); var time = parseInt(today.getTime() / 1000); tMonth = doHandleMonth(tMonth + 1); tDate = doHandleMonth(tDate); const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] return { 't': time, 'y': tYear, 'm': tMonth, 'd': tDate, 'w': week[tWeek] }; }, /** * 图片选择加上传 * @param number num * @param {Object} params * @param {Object} callback * @param string url * return array */ upload: function(num, params, callback, url) { // #ifdef H5 var app_type = this.isWeiXin() ? 'wechat' : 'h5'; var app_type_name = this.isWeiXin() ? '微信公众号' : 'H5'; // #endif // #ifdef APP-PLUS var app_type = 'app'; var app_type_name = 'APP'; // #endif // #ifdef MP-WEIXIN var app_type = 'weapp'; var app_type_name = '微信小程序'; // #endif // #ifdef MP-ALIPAY var app_type = 'aliapp'; var app_type_name = '支付宝小程序'; // #endif // #ifdef MP-BAIDU var app_type = 'baiduapp'; var app_type_name = '百度小程序'; // #endif // #ifdef MP-TOUTIAO var app_type = 'MP-TOUTIAO'; var app_type_name = '头条小程序'; // #endif // #ifdef MP-QQ var app_type = 'MP-QQ'; var app_type_name = 'QQ小程序'; // #endif var data = { token: uni.getStorageSync('token'), app_type: app_type, app_type_name: app_type_name } data = Object.assign(data, params); // 请求参数加密 // if (Config.apiSecurity) { // let jsencrypt = new JSEncrypt(); // jsencrypt.setPublicKey(Config.publicKey); // let encrypt = encodeURIComponent(jsencrypt.encryptLong(JSON.stringify(data))); // data = { // encrypt // }; // } var imgs_num = num; var _self = this; uni.chooseImage({ count: imgs_num, sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], //从相册或者拍照 success: async function(res) { const tempFilePaths = res.tempFilePaths; var _data = data; var imgs = []; for (var i = 0; i < tempFilePaths.length; i++) { var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path, url); imgs.push(path); } typeof callback == 'function' && callback(imgs); } }); }, uploadVideo: function(num, params, callback, url) { // #ifdef H5 var app_type = this.isWeiXin() ? 'wechat' : 'h5'; var app_type_name = this.isWeiXin() ? '微信公众号' : 'H5'; // #endif // #ifdef APP-PLUS var app_type = 'app'; var app_type_name = 'APP'; // #endif // #ifdef MP-WEIXIN var app_type = 'weapp'; var app_type_name = '微信小程序'; // #endif // #ifdef MP-ALIPAY var app_type = 'aliapp'; var app_type_name = '支付宝小程序'; // #endif // #ifdef MP-BAIDU var app_type = 'baiduapp'; var app_type_name = '百度小程序'; // #endif // #ifdef MP-TOUTIAO var app_type = 'MP-TOUTIAO'; var app_type_name = '头条小程序'; // #endif // #ifdef MP-QQ var app_type = 'MP-QQ'; var app_type_name = 'QQ小程序'; // #endif var data = { token: uni.getStorageSync('token'), app_type: app_type, app_type_name: app_type_name } data = Object.assign(data, params); // 请求参数加密 // if (Config.apiSecurity) { // let jsencrypt = new JSEncrypt(); // jsencrypt.setPublicKey(Config.publicKey); // let encrypt = encodeURIComponent(jsencrypt.encryptLong(JSON.stringify(data))); // data = { // encrypt // }; // } var imgs_num = num; var _self = this; uni.chooseVideo({ count: imgs_num, success: async function(res) { let totalTime = res.duration const tempFilePath = res.tempFilePath; console.log(tempFilePath) var _data = data; uni.showLoading({ title: "上传中" }) var path = await _self.upload_file_server(tempFilePath, _data, params.path, url); console.log(path) // path.totalTime = totalTime typeof callback == 'function' && callback(path); } }) }, //上传 // upload_file_server(tempFilePath, data, path, url = "") { // if (url) { // var uploadUrl = Config.baseUrl + url // } else { // // if(path=='upload_img'||path=='upload_video'){ // // var uploadUrl = Config.baseUrl + '/api/works/' + path // // }else{ // // var uploadUrl = Config.baseUrl + '/api/upload/' + path // // } // var uploadUrl = Config.baseUrl + '/api/upload/' + path // } // return new Promise((resolve, reject) => { // uni.uploadFile({ // url: uploadUrl, // filePath: tempFilePath, // name: 'file', // formData: data, // success: function(res) { // var path_str = JSON.parse(res.data); // if (path_str.code >= 0) { // if (path == 'upload_video') { // resolve(path_str.data); // } else { // resolve(path_str.data.src); // } // } else { // reject("error"); // } // } // }); // }); // }, /** * 复制 * @param {Object} message * @param {Object} callback */ copy(value, callback) { // #ifdef H5 var oInput = document.createElement('input'); //创建一个隐藏input(重要!) oInput.value = value; //赋值 document.body.appendChild(oInput); oInput.select(); // 选择对象 document.execCommand("Copy"); // 执行浏览器复制命令 oInput.className = 'oInput'; oInput.style.display = 'none'; uni.hideKeyboard(); this.showToast({ title: '复制成功' }); typeof callback == 'function' && callback(); // #endif // #ifdef MP || APP-PLUS uni.setClipboardData({ data: value, success: () => { typeof callback == 'function' && callback(); } }); // #endif }, /** * 是否是微信浏览器 */ isWeiXin() { // #ifndef H5 return false; // #endif var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } }, /** * 显示消息提示框 * @param {Object} params 参数 */ showToast(params = {}) { params.title = params.title || ""; params.icon = params.icon || "none"; params.position = params.position || 'bottom'; params.duration = 1500; uni.showToast(params); }, /** * 检测苹果X以上的手机 */ isIPhoneX() { let res = uni.getSystemInfoSync(); if (res.model.search('iPhone X') != -1) { return true; } return false; }, //判断安卓还是iOS isAndroid() { let platform = uni.getSystemInfoSync().platform if (platform == 'ios') { return false; } else if (platform == 'android') { return true; } }, /** * 深度拷贝对象 * @param {Object} obj */ deepClone(obj) { const isObject = function(obj) { return typeof obj == 'object'; } if (!isObject(obj)) { throw new Error('obj 不是一个对象!') } //判断传进来的是对象还是数组 let isArray = Array.isArray(obj) let cloneObj = isArray ? [] : {} //通过for...in来拷贝 for (let key in obj) { cloneObj[key] = isObject(obj[key]) ? this.deepClone(obj[key]) : obj[key] } return cloneObj }, refreshBottomNav() { var bottomNav = uni.getStorageSync("bottom_nav"); bottomNav = JSON.parse(bottomNav); for (var i = 0; i < bottomNav.list.length; i++) { var item = bottomNav.list[i]; var obj = { index: i }; obj.text = item.title; obj.iconPath = this.img(item.iconPath); obj.selectedIconPath = this.img(item.selectedIconPath); if (bottomNav.type == 1) { // 图文 } else if (bottomNav.type == 2) { // 图片 } else if (bottomNav.type == 3) { // 文字 } uni.setTabBarItem(obj); } }, /** * 自定义模板的跳转链接 * @param {Object} link */ // diyRedirectTo(link, method) { // if (link == null || link == '' || !link.wap_url) return; // if (link.wap_url.indexOf('http') != -1) { // this.$util.redirectTo('/otherpages/webview/webview', { // link: encodeURIComponent(link.wap_url) // }); // } else { // var params = link.site_id ? { // site_id: link.site_id // } : {}; // this.redirectTo(link.wap_url); // } // }, /** * 获取默认图 * @param {Object} link */ getDefaultImage() { let defaultImg = uni.getStorageSync('default_img'); if (defaultImg) { defaultImg = JSON.parse(defaultImg); defaultImg.default_goods_img = this.img(defaultImg.default_goods_img); defaultImg.default_headimg = this.img(defaultImg.default_headimg); defaultImg.default_shop_img = this.img(defaultImg.default_shop_img); defaultImg.default_category_img = this.img(defaultImg.default_category_img); defaultImg.default_city_img = this.img(defaultImg.default_city_img); defaultImg.default_supply_img = this.img(defaultImg.default_supply_img); defaultImg.default_store_img = this.img(defaultImg.default_store_img); defaultImg.default_brand_img = this.img(defaultImg.default_brand_img); return defaultImg; } else { return { default_goods_img: '', default_headimg: '', default_shop_img: '', default_category_img: '', default_city_img: '', default_supply_img: '', default_store_img: '', default_brand_img: '' }; } }, /** * 判断手机是否为iphoneX系列 */ uniappIsIPhoneX() { let isIphoneX = false; let systemInfo = uni.getSystemInfoSync(); // #ifdef MP if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model .search( 'iPhone12') != -1 || systemInfo.model .search( 'iPhone13') != -1 || systemInfo.model .search( 'iPhone14') != -1) { isIphoneX = true; } // #endif // #ifdef H5 var u = navigator.userAgent; var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 if (isIOS) { if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) { isIphoneX = true; } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) { isIphoneX = true; } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) { isIphoneX = true; } } // #endif return isIphoneX; }, /** * 判断手机是否为iphone11系列 */ uniappIsIPhone11() { let isIphone11 = false; let systemInfo = uni.getSystemInfoSync(); // #ifdef MP if (systemInfo.model.search('iPhone 11') != -1) { isIphone11 = true; } // #endif return isIphone11; }, /** * 判断当前页面栈是否存在,如果存在,则返回该页面栈,否则跳转到该页面 * @param {Object} url */ jumpPage(url) { let jump = true; let arr = getCurrentPages().reverse(); for (let i = 0; i < arr.length; i++) { if (url.indexOf(arr[i].route) != -1) { jump = false; uni.navigateBack({ delta: i }); break; } } if (jump) { this.$util.diyRedirectTo(url); } }, /** * 计算两个经纬度之间的距离 * @param {Object} lat1 * @param {Object} lng1 * @param {Object} lat2 * @param {Object} lng2 */ getDistance(lat1, lng1, lat2, lng2) { var radLat1 = lat1 * Math.PI / 180.0; var radLat2 = lat2 * Math.PI / 180.0; var a = radLat1 - radLat2; var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; var 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 * 6378.137; // EARTH_RADIUS; s = Math.round(s * 10000) / 10000; return s; }, // #ifdef H5 /** * 判断该浏览器是否为safaria浏览器 */ isSafari() { let res = uni.getSystemInfoSync(); var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 && ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 && ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1) { return true; } else { return false; } }, // #endif goBack(backUrl = '/pages/index/index/index') { if (getCurrentPages().length == 1) { this.redirectTo(backUrl); } else { uni.navigateBack(); } }, /** * 转换数字,保留f位 * @param {Object} e * @param {Object} f */ numberFixed(e, f) { if (!f) { f = 0; } return Number(e).toFixed(f); }, /** * 获取url参数 * @param {Object} callback */ getUrlCode(callback) { var url = location.search; var theRequest = new Object(); if (url.indexOf('?') != -1) { var str = url.substr(1); var strs = str.split('&'); for (var i = 0; i < strs.length; i++) { theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1]; } } typeof callback == 'function' && callback(theRequest); }, /** * 路径转base64 * @param {Object} string */ pathToBase64(path) { if (/^data:/.test(path)) return path return new Promise((resolve, reject) => { // #ifdef H5 let image = new Image(); image.setAttribute("crossOrigin", 'Anonymous'); image.onload = function() { let canvas = document.createElement('canvas'); canvas.width = this.naturalWidth; canvas.height = this.naturalHeight; canvas.getContext('2d').drawImage(image, 0, 0); let result = canvas.toDataURL('image/png') resolve(result); canvas.height = canvas.width = 0 } image.src = path + '?v=' + Math.random() image.onerror = (error) => { reject(error); }; // #endif // #ifdef MP if (uni.canIUse('getFileSystemManager')) { uni.getFileSystemManager().readFile({ filePath: path, encoding: 'base64', success: (res) => { resolve('data:image/png;base64,' + res.data) }, fail: (error) => { reject(error) } }) } // #endif // #ifdef APP-PLUS plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => { entry.file((file) => { const fileReader = new plus.io.FileReader() fileReader.onload = (data) => { resolve(data.target.result) } fileReader.onerror = (error) => { reject(error) } fileReader.readAsDataURL(file) }, reject) }, reject) // #endif }) }, roundToTwo(num) { if (isNaN(num)) { return 0 } return Math.round((num + Number.EPSILON) * 100) / 100; }, /** * @method 函数防抖 * @desc 短时间内多次触发同一事件,只执行最后一次,或者只执行最开始的一次,中间的不执行。 * @param func 目标函数 * @param wait 延迟执行毫秒数 * @param immediate true - 立即执行, false - 延迟执行 */ debounce(func, wait = 1000, immediate = true) { let timer; return function() { let context = this, args = arguments; if (timer) clearTimeout(timer); if (immediate) { let callNow = !timer; timer = setTimeout(() => { timer = null; }, wait); if (callNow) func.apply(context, args); } else { timer = setTimeout(() => { func.apply(context, args); }, wait) } } }, /** * @method 函数节流 * @desc 指连续触发事件,但是在 n 秒内只执行一次函数。即 2n 秒内执行 2 次... 。会稀释函数的执行频率。 * @param func 函数 * @param wait 延迟执行毫秒数 * @param type 1 在时间段开始的时候触发 2 在时间段结束的时候触发 */ throttle(func, wait = 1000, type = 1) { let previous = 0; let timeout; return function() { let context = this; let args = arguments; if (type === 1) { let now = Date.now(); if (now - previous > wait) { func.apply(context, args); previous = now; } } else if (type === 2) { if (!timeout) { timeout = setTimeout(() => { timeout = null; func.apply(context, args) }, wait) } } } }, checkFileExtensions(str) { const extensions = ['pdf', 'doc', 'docx', 'xls', 'xlsx']; return extensions.some(extension => str.includes(extension)); }, previewWechat(urlPdf) { uni.showLoading({ title: '正在加载中..' }) uni.downloadFile({ url: urlPdf, success: function(res) { var filePath = res.tempFilePath; const index = urlPdf.lastIndexOf("."); const suffix = urlPdf.substring(index + 1); uni.openDocument({ fileType: suffix, filePath: filePath, showMenu: true, success: function(res) { console.log('打开文档成功'); uni.hideLoading() }, }); }, complete: function(r) { uni.hideLoading() } }); }, //生成时间戳+随机数 // 生成时间戳+随机数的函数 generateTimestampWithRandom(filename) { // 获取当前日期和时间 const now = new Date(); // 获取年份,确保为四位数 const year = now.getFullYear(); // 获取月份,确保为两位数 const month = String(now.getMonth() + 1).padStart(2, '0'); // 获取日期,确保为两位数 const day = String(now.getDate()).padStart(2, '0'); // 获取小时,确保为两位数 const hours = String(now.getHours()).padStart(2, '0'); // 获取分钟,确保为两位数 const minutes = String(now.getMinutes()).padStart(2, '0'); // 获取秒数,确保为两位数 const seconds = String(now.getSeconds()).padStart(2, '0'); // 拼接时间戳 const timestamp = `${year}${month}${day}${hours}${minutes}${seconds}`; // 生成一个 0 到 9999 之间的随机数,并格式化为四位数 const randomNumber = String(Math.floor(Math.random() * 10000)).padStart(4, '0'); // 拼接时间戳和随机数 return `cylsg/${timestamp}_${randomNumber}` + filename.match(/\.[^.]+$/); }, getFileExtensionWithDotRegex(filename) { const match = filename.match(/\.[^.]+$/); return match ? match[0] : ''; }, isEmpty(value) { return ( value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0) || (typeof value === 'object' &&!Array.isArray(value) && Object.keys(value).length === 0) ); }, removeEmptyValuesRecursive(obj) { const newObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; if (!this.isEmpty(value)) { if (typeof value === 'object' &&!Array.isArray(value)) { newObj[key] = removeEmptyValuesRecursive(value); } else { newObj[key] = value; } } } } return newObj; } }