You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

297 lines
7.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 工具类
*
*/
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(`<div style="font-size:14px">${text}</div>`, {
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
}