import Validate from './validate.js'; import $store from "@/store/index.js" export default { Validate, log: console.log, // log: () => {}, //格式化时间 formatTime(date, format) { let newFormat = format || 'YY-M-D h:m:s'; let formatNumber = this.formatNumber; let newDate = date || new Date(); if (Object.prototype.toString.call(newDate).slice(8, -1) !== "Date") { newDate = new Date(date); } let week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', '日', '一', '二', '三', '四', '五', '六' ]; return newFormat.replace(/YY|Y|M|D|h|m|s|week|星期/g, function(a) { switch (a) { case 'YY': return newDate.getFullYear(); case 'Y': return (newDate.getFullYear() + '').slice(2); case 'M': return formatNumber(newDate.getMonth() + 1); case 'D': return formatNumber(newDate.getDate()); case 'h': return formatNumber(newDate.getHours()); case 'm': return formatNumber(newDate.getMinutes()); case 's': return formatNumber(newDate.getSeconds()); case '星期': return "星期" + week[newDate.getDay() + 7]; case 'week': return week[newDate.getDay()]; } }) }, // 日期转时间戳 DateToUnix: function(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; }, //格式化数字 formatNumber(n) { n = n.toString(); return n[1] ? n : '0' + n }, // 保留小数 (不四舍五入) formatDecimal(num, decimal) { num = num.toString() let index = num.indexOf('.') if (index !== -1) { num = num.substring(0, decimal + index + 1) } else { num = num.substring(0) } return parseFloat(num).toFixed(decimal) }, // 实时检测输入金额 formatMoney(val) { if (val.slice(0, 1) == "0" && val.slice(1, 2) > 0) { val = val.slice(1, 2); } if (val.slice(0, 1) == ".") { val = '0.'; } if (val == "0.00") { val = '0.0'; } return val.replace(/[^\d\.]|^\./g, '').replace(/\.{2}/g, '.').replace( /^([1-9]\d*|0)(\.\d{1,2})(\.|\d{1})?$/, '$1$2').replace(/^0\d{1}/g, '0') }, toWeiXinString(date) { let str; let newDate = date || new Date(); if (Object.prototype.toString.call(newDate).slice(8, -1) !== "Date") { newDate = new Date(date); } const now = newDate; const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); const beforeYesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2); const monday = new Date(today); monday.setDate(today.getDate() - (today.getDay() ? today.getDay() - 1 : 6)); //注意:date初始化默认是按本地时间初始的,但打印默认却是按GMT时间打印的,也就是说打印出的不是本地现在的时间 //LocaleString的打印也有点问题,"0点"会被打印为"上午12点" if (now.getTime() > today.getTime()) { str = ""; } else if (now.getTime() > yesterday.getTime()) { str = "昨天"; } else if (now.getTime() > beforeYesterday.getTime()) { str = "前天"; } else if (now.getTime() > monday.getTime()) { const week = { "0": "周日", "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六" }; str = week[now.getDay() + ""]; } else { const hour = ["凌晨", "早上", "下午", "晚上"]; const h = now.getHours(); if (h == 12) str = "中午"; else str = hour[parseInt(h / 6)]; str = now.format("MM月dd ") + str; } str += now.format("HH:ss"); return str; }, //返回类型 typeOf(param) { return Object.prototype.toString.call(param).slice(8, -1) }, //判断是否为空 isEmpty(param) { //基本类型为空 let condition1 = param === '' || param === null || param === undefined || param === "NaN"; let condition2; let condition3 //引用类型为空 if (!condition1) { condition2 = this.typeOf(param) === "Object" && Object.keys(param).length < 1; condition3 = this.typeOf(param) === "Array" && param.length < 1; } return condition1 || condition2 || condition3; }, showLoading({ title = "加载中", mask = true } = {}) { uni.showLoading({ title, mask }); }, showToast({ title, icon = "none" } = {}) { uni.showToast({ title, icon, duration: 2000 }); }, hideAll() { uni.hideLoading(); uni.stopPullDownRefresh(); uni.hideNavigationBarLoading(); }, showModal({ title = "提示", content = "没有返回值,检查服务器是否正常" }) { uni.showModal({ title, content, showCancel: false }); }, setNavigationBarColor({ color = '#ffffff', bg }) { uni.setNavigationBarColor({ frontColor: color, backgroundColor: bg, // animation: { // duration: 100, // timingFunc: 'easeIn' // } }) }, getQueryString(name) { let reg = new RegExp("([^?&]*)" + name + "=([^&]*)(&|$)"); let r = window.location.href.match(reg); if (r !== null) return unescape(r[2]); return null }, getHostname(url) { var reg = /^http(s)?:\/\/(.*?)\// // 必须是http开头或者https开头,结尾为'/' var ToReplace = 'Host/' url.replace(reg, ToReplace) url = reg.exec(url)[2]; return url; }, //获取标签上data getDataSet(e) { return e.currentTarget.dataset }, //获表单控件值 getValue(e) { return e.detail.value }, async getNavBarHeight() { var { statusBarHeight, navigationBarHeight } = await uni.getSystemInfoSync() let navBarHeight = statusBarHeight * 1 + 44 // #ifdef MP-BAIDU navBarHeight = statusBarHeight * 1 + navigationBarHeight * 1 // #endif return navBarHeight }, pick(obj, arr) { return arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); }, getUrlToStr(url, params) { let text = url if (params) { text = `${url}?` + Object.keys(params) .filter(key => params[key] || params[key] === 0) // 删除无值的字段,可根据需要进行保留或删除 .map(key => `${key}=${params[key]}`) .toString().replace(/,/g, '&') } return text }, toCheckLogin(param) { let { loginType = 'weixin', userInfo } = $store.state.user let { id: uid = 0, phone = '' } = userInfo let { short_code_status = 0 } = $store.state.config.configInfo let checkLogin = true // #ifdef H5 loginType = 'weixin' // #endif // #ifndef MP-WEIXIN if (!uid || (loginType === 'weixin' && short_code_status && !phone)) { checkLogin = false let pages = getCurrentPages() let { route, options = {} } = pages[pages.length - 1] let routeUrl = this.getUrlToStr(`/${route}`, options) let url = !uid ? `/pages/login` : `/user/pages/phone` $store.commit('updateUserItem', { key: 'loginPage', val: routeUrl }) this.goUrl({ url }) } // #endif if (checkLogin) { this.goUrl(param) } }, goUrl({ url = "", openType = "navigateTo", path = "", query = "" } = {}) { let that = this; if (!url) return; if (this.typeOf(query) == 'Object') { let queryStr = Object.keys(query).map(k => `${k}=${query[k]}`).join('&'); url = `${url}&${queryStr}` } let list = ["navigateTo", "redirectTo", "switchTab", "reLaunch"]; if (list.includes(openType)) { if (openType == 'navigateTo' && getCurrentPages().length > 9) { uni.redirectTo({ url }) } else { uni[openType]({ url }) } } //返回 openType == "navigateBack" && uni.navigateBack({ delta: url }) //跳转小程序 openType == "miniProgram" && uni.navigateToMiniProgram({ appId: url, path }) //打电话 openType == "call" && uni.makePhoneCall({ phoneNumber: url }) // 复制文本 openType == 'copy' && uni.setClipboardData({ data: url, success: function(res) { uni.getClipboardData({ success: function(res) { // #ifdef MP-BAIDU that.showToast({ title: '复制成功' }) // #endif console.log('复制文本成功 ==>', res.data); } }); } }) //跳转网页/播放视频 if (openType == "web" || openType == 'video') { let encode_url = encodeURIComponent(url) uni.navigateTo({ url: `/user/pages/common/${openType}?url=${encode_url}` }) } }, // 刷新上页数据 back() { let pages = getCurrentPages(); //当前页面栈 if (pages.length > 1) { var beforePage = pages[pages.length - 2]; //获取上一个页面实例对象 //触发父页面中的方法change() beforePage.$vm.initRefresh() } }, //获取页面对象,0时为当前页面 getPage(index = 0) { let pages = getCurrentPages(); let page = pages[pages.length - 1 + index] return page.$vm }, // 预览图片 previewImage(param) { let { current, urls } = param; uni.previewImage({ current, urls, }) }, // 根据type获取数据字符串 getItems(o, type = 'id', sign = ',') { let items = []; o = o || []; o.forEach((item) => { items.push(item[type]) }) return items.join(sign); }, // 检查授权 async checkAuth({ type = "userLocation", tip = "" } = {}) { // #ifdef MP-WEIXIN let contentList = { phone: "授权获取手机号", userLocation: "你的地理位置", address: "你的通讯地址", invoiceTitle: "发票抬头", invoice: "获取发票", werun: "微信运动步数", record: "你的录音功能", writePhotosAlbum: "你的保存到相册功能", camera: "摄像头" } tip = tip || `您暂未开启${contentList[type]}的授权,是否开启?` // 声明 let err, result; [err, result] = await uni.getSetting(); //获取配置失败 if (err) { return Promise.reject(err); } //如果已授权 if (result.authSetting[`scope.${type}`]) { return true } // 调用获取权限 [err, result] = await uni.authorize({ scope: `scope.${type}` }) //获取成功 if (!err) { return true } uni.hideLoading() //提示去设置 return new Promise((resove, reject) => { uni.showModal({ content: tip, success(res) { if (res.confirm) { uni.openSetting({ success(result) { if (result.authSetting[`scope.${type}`]) { resove(true) } else { reject() } } }) } else { reject() } } }) }) // #endif }, //深拷贝 deepCopy(o) { let that = this; if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { n[i] = that.deepCopy(o[i]); } return n; } else if (o instanceof Function) { var n = new Function("return " + o.toString())(); return n } else if (o instanceof Object) { var n = {} for (var i in o) { n[i] = that.deepCopy(o[i]); } return n; } else { return o; } }, getOptions(options, comminOptions = {}) { return Object.assign({}, comminOptions, this.formatOptions(options)) }, //获取用户端公共参数 getCommonOptions(options) { return this.pick(options, ["staff_id"]) }, // 微信支付 async pay(pay_list) { let that = this; let param = {} // #ifdef H5 param = that.pick(pay_list, ['appId', 'timeStamp', 'nonceStr', 'package', 'signType', 'paySign' ]) if (typeof WeixinJSBridge != "undefined") { return new Promise((resove, reject) => { WeixinJSBridge.invoke( 'getBrandWCPayRequest', param, function(res) { if (res.err_msg == "get_brand_wcpay_request:ok") { setTimeout(() => { resove(true) }, 1000) } else { that.showToast({ title: `支付失败` }) setTimeout(() => { reject("支付失败") }, 1000) } }) }); } // #endif let { provider = 'wxpay', orderInfo = '' } = pay_list // #ifdef MP-WEIXIN param = that.pick(pay_list, ['nonceStr', 'package', 'signType', 'paySign', 'timeStamp']) // #endif // #ifdef APP-PLUS if (provider == 'wxpay') { orderInfo = that.pick(pay_list, ['appid', 'noncestr', 'package', 'partnerid', 'prepayid', 'timestamp' ]) orderInfo.sign = pay_list.paySign console.log("支付1",orderInfo) orderInfo = JSON.stringify(orderInfo) } param = { provider, orderInfo } console.log("支付2",param) // #endif // #ifndef H5 let [err, res] = await uni.requestPayment(param) if (err) { console.log("=======pay err", err) that.showToast({ title: `支付失败` }) await Promise.reject("支付失败") } else { return true } // #endif }, //小程序自带获取定位 getLocation() { let that = this; return new Promise((resove, reject) => { uni.getLocation({ success: function(res) { resove(res) }, fail: function(e) { console.log(e) reject(e) } }) }) }, //百度地图获取定位 getBmapLocation: function(ak = 'GoI7BxLpfvBEyf1TcMXCloi99Vov7flZ', openLocation = false) { //定位 let that = this; let bmap = require('./bmap-wx.min.js'); let BMap = new bmap.BMapWX({ ak }); return new Promise((resove, reject) => { BMap.regeocoding({ success: function(data) { let addressInfo = data.originalData.result; let { lat, lng } = addressInfo.location; let { formatted_address: address, addressComponent } = addressInfo; let { province, city, district } = addressComponent //只返回需要的数据 let locationInfo = { lat, lng, address, province, city, district, } // console.log(locationInfo, "====util locationInfo"); //成功回调 resove(locationInfo) }, fail: function(res) { //失败返回默认的数据 let locationInfo = { name: '', latitude: 0, longitude: 0, address: '', city: '' } resove(locationInfo) that.hideAll() //失败后的提示 let errMsg = res.errMsg; // #ifdef APP-PLUS let { isIos = false } = $store.state.config.configInfo if (!isIos || openLocation) { if (errMsg.includes("domain")) { uni.showModal({ title: "获取定位失败", content: `请在小程序公众平台添加百度域名api.map.baidu.com`, showCancel: false }) return; } if (errMsg.includes("Referer")) { uni.showModal({ title: "获取定位失败", content: `登录百度开放平台给ak添加白名单`, showCancel: false }) return; } uni.showModal({ title: '提示', content: '获取定位失败,是否授权打开定位', success: (res) => { if (res.confirm) { uni.getSystemInfo({ success: (sys) => { if (sys.platform == 'ios') { plus.runtime .openURL( "app-settings://" ); } else { var main = plus .android .runtimeMainActivity(); var Intent = plus .android .importClass( "android.content.Intent" ); //可能应该直接进入应用列表的权限设置?=> android.settings.APPLICATION_SETTINGS var mIntent = new Intent( 'android.settings.LOCATION_SOURCE_SETTINGS' ); main.startActivity( mIntent); } } }) } } }) } // #endif // #ifndef APP-PLUS if (errMsg.includes("domain")) { uni.showModal({ title: "获取定位失败", content: `请在小程序公众平台添加百度域名api.map.baidu.com`, showCancel: false }) return; } if (errMsg.includes("Referer")) { uni.showModal({ title: "获取定位失败", content: `登录百度开放平台给ak添加白名单`, showCancel: false }) return; } uni.showModal({ title: "地理位置授权", content: "为了更好的为您服务,请开启您手机中的定位授权", confirmText: "去授权", success(res) { if (res.confirm) { uni.openSetting({ success(result) { if (result.authSetting[ `scope.userLocation`]) { resove(true) } else { reject() } } }) } else { uni.showModal({ title: "提示", content: "您取消了授权,是否重新设置【位置信息】权限", confirmText: "去授权", success(res) { if (!res.confirm) return uni.openSetting({ success(result) { if (result.authSetting[ `scope.userLocation` ]) { resove(true) } else { reject() } } }) } }) } } }) // #endif } }) }) }, }