/** * 工具类 * */ import xss from 'xss' import store from '@/store' // 轻提示 export function toast(text, cb = false) { if (!text) return // #ifdef APP-PLUS plus.nativeUI.closeToast() plus.nativeUI.toast(`
${text}
`, { type: 'richtext', duration: 'short', align: 'center', verticalAlign: 'bottom', richTextStyle: { align: 'bottom', }, }) cb && cb() // #endif // #ifndef APP-PLUS uni.hideToast() uni.showToast({ icon: 'none', title: text, duration: 2000, position: 'bottom', success() { cb && cb() }, }) // #endif } // 上级页面 export function parentPage(delta = 2) { const pages = getCurrentPages() const parentPage = pages[pages.length - delta] return parentPage ? parentPage.$vm : null } // 去除 HTML 标签 export function safeHTML(source) { return xss(source, { whiteList: {}, // 白名单为空,表示过滤所有标签 stripIgnoreTag: true, // 过滤所有非白名单标签的HTML stripIgnoreTagBody: ['script'], // script标签较特殊,需要过滤标签中间的内容 }) } // 格式大数字 export function safeNum(num, max = 1e6 - 1, str = '100万+') { return Number(num) > max ? str : num } // 格式化时间 export function time(timeStamp, pattern = 'YYYY-MM-DD') { return this.$dayjs.unix(timeStamp).format(pattern) } // 补零 export function addZero(val) { val = Number(val) if (val < 10) return `0${val}` return val.toString() } // 修复时间戳长度 export function fixTime(timeStamp) { if (timeStamp.toString().length === 10) { timeStamp = timeStamp * 1000 } return timeStamp } // 获取时间对象 export function timeObj(timeStamp) { const date = new Date(fixTime(timeStamp)) return !isNaN(date) ? { year: date.getFullYear(), month: addZero(date.getMonth() + 1), day: addZero(date.getDate()), hour: addZero(date.getHours()), minute: addZero(date.getMinutes()), } : {} } // 个性化时间 export function beforeTime(timeStamp) { if (!timeStamp) return '刚刚' timeStamp = fixTime(timeStamp) // const nTime = timeObj(Date.now()) // const yTime = timeObj(Date.now() - 3600 * 24 * 1000) // const time = timeObj(timeStamp) // const nTimeStr = [nTime.year, nTime.month, nTime.day].join('') // const yTimeStr = [yTime.year, yTime.month, yTime.day].join('') // const timeStr = [time.year, time.month, time.day].join('') // // 同一天 // if (timeStr === nTimeStr) { // return `${time.hour}:${time.minute}` // } // // 昨天 // if (timeStr === yTimeStr) { // return `昨天 ${time.hour}:${time.minute}` // } // // 其他时间 // return `${time.year}-${time.month}-${time.day} ${time.hour}:${time.minute}` const oTime = (Date.now() - timeStamp) / 1000 // 小于1分钟 if (oTime < 60) { return '刚刚' } // 小于1小时 if (oTime < 3600) { return `${Math.floor(oTime / 60)}分钟前` } // 小于24小时 if (oTime < 24 * 3600) { return `${Math.floor(oTime / 3600)}小时前` } // 小于30天 if (oTime <= 24 * 3600 * 30) { return `${Math.floor(oTime / (24 * 3600))}天前` } // 大于30天 if (oTime > 24 * 3600 * 30) { const time = timeObj(timeStamp) return `${time.year}-${time.month}-${time.day}` } } // 函数节流防抖 export function throttle(event, time) { let pre = 0 let timer = null return function (...args) { if (Date.now() - pre > time) { clearTimeout(timer) timer = null pre = Date.now() event.apply(this, args) } else if (!timer) { timer = setTimeout(() => { event.apply(this, args) }, time) } } } // 转换秒为分钟 export function sec2minute(sec) { return [parseInt((sec / 60) % 60), parseInt(sec % 60)] .join(':') .replace(/\b(\d)\b/g, '0$1') } // 预览图片 export function previewImage(index, images, preview = true) { if (!preview) return uni.previewImage({ current: index ? index : 0, urls: images, }) } // 调起支付选项 export function showPayment(cb = () => {}) { const payType = [ { id: 1, name: '微信', }, { id: 2, name: '支付宝', }, ] if (uni.getSystemInfoSync().platform === 'ios') { payType.unshift({ id: 99, name: '应用内购', }) } uni.showActionSheet({ title: '请选择支付方式', itemList: this._.values(this._.mapValues(payType, 'name')), success: s => cb(payType[s.tapIndex].id), }) } // 发起支付 export function payment(params, cb = () => {}) { const type = this._.isNumber(params.type) ? { 97: 'vcoinspay', 98: 'balancepay', 99: 'appleiap', 1: 'wxpay', 2: 'alipay', }[params.type] : params.type const requestPayment = (provider, orderInfo) => { uni.getProvider({ service: 'payment', success: r => { if (!r.provider.includes(provider)) { toast('无效的支付方式') return cb() } toast('正在发起支付...') uni.requestPayment({ provider, orderInfo, success: res => { console.log('支付成功', res) res && cb(res) }, fail: err => { console.log('支付失败', err) toast('支付失败') cb() }, }) }, fail: err => { console.log('支付发起失败', err) toast('支付发起失败') cb() }, }) } if (!type) { toast('无效的支付方式') return cb() } // 苹果应用内支付 if (type === 'appleiap') { return requestPayment(type, { quantity: 1, productid: 'test123', // todo,内购产品id,在苹果开发者中心配置 username: `${this.userinfo?.member_id}|${this.userinfo?.nickname}`, manualFinishTransaction: false, }) } // 微信、支付宝 this.$api .post(`/${type}`, { attach: params.attach, order_sn: params.order_sn }) .then(r => { if (r) { if (['balancepay', 'vcoinspay'].includes(type)) { return cb(r) } if (r.state === 1) { requestPayment(type, r.datas) } } else { cb() } }) } // TIM 方法操作 export function timEmit(method, payload) { // #ifdef APP-PLUS if (!store.state.timReady) { toast('操作失败,请重新登录') store.commit('removeUserInfo') return uni.reLaunch({ url: '/pages/login/login' }) } // #endif // #ifndef APP-PLUS toast('注意!请勿在非APP平台使用TIM') // #endif return this.$tim[method](payload) } // 检测权限 export async function checkPermission(android, ios) { const { platform } = uni.getSystemInfoSync() let allowed if (platform === 'android') { allowed = (await this.$permission.requestAndroidPermission( `android.permission.${android}` )) === 1 } if (platform === 'ios') { allowed = this.$permission.judgeIosPermission(ios) } return allowed }