wo-user-part-uniapp/unitool/index.js

262 lines
9.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// #ifdef H5
// import device from 'current-device' // https://github.com/matthewhudson/current-device
// #endif
module.exports = {
clog(...message) {
console.log(
'【【【【【【【【【【',
getCurrentPages().length > 0 ? getCurrentPages().pop().route : 'pages/Welcome', // 在首页时getApp() 或 getCurrentPages() 有可能获取不到。
...message,
'】】】】】】】】】】】'
)
},
sleep: (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms)),
async request({ method = 'POST', url, header = {}, data = {} }) {
url = this.makeUrl(url)
if (uni.getStorageSync('_passtoken')) {
header._passtoken = uni.getStorageSync('_passtoken')
}
if (method === 'GET') {
// 如果不是 POST 方法,要额外把参数JSON化
for (let key in data) {
data[key] = JSON.stringify(data[key])
}
}
console.log('👇 👇 👇 👇 < Request > 👇 👇 👇 👇 ', { method, url, header, data }, '👆 👆 👆 👆 < /Request > 👆 👆 👆 👆')
let [error, response] = await uni.request({ method, url, header, data })
console.log('⬇️ ⬇️ ⬇️ ⬇️ < Response > ⬇️ ⬇️ ⬇️ ⬇️ ', response, '⬆️ ⬆️ ⬆️ ⬆️ < /Response > ⬆️ ⬆️ ⬆️ ⬆️')
return [error, response]
},
async pickupFile({
mediaType = 'image',
count = 1,
sizeType = ['original', 'compressed'],
sourceType = ['album', 'camera'],
url,
header = {},
formData = {},
name = 'file',
} = {}) {
let filePath
if (mediaType === 'image') {
let [errorChoose, { tempFilePaths, tempFiles } = {}] = await uni.chooseImage({ count, sizeType, sourceType })
filePath = tempFilePaths[0]
} else if (mediaType === 'video') {
let [errorChoose, { tempFilePath }] = await uni.chooseVideo({ sourceType })
filePath = tempFilePath
} else {
return [{ _ERROR: 'UNKNOWN_MEDIATYPE' }, null]
}
if (filePath) {
if (uni.getStorageSync('_passtoken')) {
header._passtoken = uni.getStorageSync('_passtoken')
} else {
return [{ _ERROR: 'USER_OFFLINE', errMsg: 'offline user cannot upload files' }, null]
}
for (let key in formData) {
// multer 不会自动处理 JSON 数据,必须前后端配合处理
formData[key] = JSON.stringify(formData[key])
}
uni.showLoading()
let [errorUpload, response] = await uni.uploadFile({ filePath: filePath, url: this.makeUrl(url), header, formData, name })
uni.hideLoading()
if (response && response.data) {
try {
response.data = JSON.parse(response.data)
} catch (exception) {}
}
return [errorUpload, response]
}
return [{ _ERROR: 'USER_CANCELED' }, null]
},
async uploadFile({ url, name = 'file', formData = {}, header = {} } = {}) {
url = this.makeUrl(url)
if (uni.getStorageSync('_passtoken')) {
header._passtoken = uni.getStorageSync('_passtoken')
} else {
return [{ errMsg: 'offline user cannot upload files' }, null]
}
for (let key in formData) {
// multer 不会自动处理 JSON 数据,必须前后端配合处理
formData[key] = JSON.stringify(formData[key])
}
let [error, response] = await uni.uploadFile({ url, name, formData, header })
if (response && response.data) {
try {
response.data = JSON.parse(response.data)
} catch (exception) {}
}
return [error, response]
},
async pickupFile2Cloud({ mediaType = 'image', count = 1, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'] } = {}) {
let filePath, cloudPath
if (mediaType === 'image') {
let [errorChoose, { tempFilePaths, tempFiles } = {}] = await uni.chooseImage({ count, sizeType, sourceType })
filePath = tempFilePaths[0]
cloudPath = 'cloud.jpg'
// #ifdef H5
cloudPath = tempFiles[0].name
// #endif
} else if (mediaType === 'video') {
let [errorChoose, { tempFilePath, tempFile, duration, size, width, height, name }] = await uni.chooseVideo({ sourceType })
filePath = tempFilePath
cloudPath = 'cloud.mp4'
// #ifdef H5
cloudPath = name
// #endif
} else {
return { _state: 'UNKNOWN_MEDIA_TYPE' }
}
if (filePath) {
uni.showLoading()
const { fileID, requestId } = await uniCloud.uploadFile({
filePath: filePath,
cloudPath: cloudPath,
fileType: mediaType,
onUploadProgress: function (progressEvent) {
console.log(progressEvent)
var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
},
})
uni.hideLoading()
console.log('文件上传结果:', { fileID, requestId })
if (fileID) {
return { _state: 'SUCCESS', fileID, requestId }
}
}
return { _state: 'FAIL' }
},
openUrl(url) {
// #ifdef APP-PLUS
plus.runtime.openURL(url)
// #endif
// #ifdef H5
window.open(url, '_blank')
// #endif
},
getSystemInfo() {
let systemInfo = uni.getSystemInfoSync()
// #ifdef H5
systemInfo.runtime = 'h5'
// if (device.mobile()){
// systemInfo.platform = 'mobile'
// }else if (device.desktop()){
// systemInfo.platform = 'desktop'
// }else if (device.tablet()){
// systemInfo.platform = 'tablet'
// }
if (/MicroMessenger/.test(window.navigator.userAgent)) {
// 微信内置浏览器
systemInfo.browser = 'wechat'
}
// #endif
// #ifdef APP-PLUS || APP-PLUS-NVUE
systemInfo.runtime = 'app'
// 细分成 systemInfo.platform === ios or android
// #endif
// #ifdef MP
systemInfo.runtime = 'mp'
// 细分成 WEIXIN, ...
// #endif
return systemInfo
},
showToast({ type, icon, image, title, duration, ...rest }) {
let pageNow = this.$store ? this : getCurrentPages().pop()
if (pageNow.$refs && pageNow.$refs.toast) {
// 在 ios app 里,虽然能获得 pageNow但是不存在 pageNow.$refs不知为何。android app 没有测试
pageNow.$refs.toast.open({ type, content: title, duration, ...rest })
} else {
// #ifdef APP-PLUS
if (uni.getSystemInfoSync().platform === 'android') {
uni.showToast({ icon: 'none', title, duration, ...rest })
return
}
// #endif
if (!image) {
image = `../static/Common.${type ? type : 'info'}.png`
}
uni.showToast({ icon, image, title, duration, ...rest })
}
},
setBarTitles({ windowTitle, pageTitle } = {}) {
let page = this.$store ? this : getCurrentPages().pop()
uni.setNavigationBarTitle({ title: pageTitle || page.i18nText[page.$store.state.i18n.activeLang].tPageTitle })
// #ifdef H5
document.title = windowTitle || page.$store.getters['i18n/getAppName'] || page.appName // 必须放在 setNavigationBarTitle 之后,否则会被其覆盖掉。
// #endif
if (page.$store._mutations['i18n/setTabbar']) page.$store.commit('i18n/setTabbar') // 必须要在有 tab 的页面里重置才有效果
},
localeText() {
let page = this.$store ? this : getCurrentPages().pop()
return page.i18nText[page.$store.state.i18n.activeLang]
},
formatMoney(value, decimal) {
return Number(value).toFixed(decimal || 2)
},
formatPercent(value, decimal) {
return `${Number(value * 100).toFixed(decimal || 2)}`
},
formatDate(date, format) {
if (!(date instanceof Date)) {
date = new Date(date)
}
if (!date.toJSON()) {
date = new Date()
}
format = format && typeof format === 'string' ? format : 'yyyy-mm-dd HH:MM:SS'
let o = {
'm+': date.getMonth() + 1, //月份
'q+': Math.floor((date.getMonth() + 3) / 3), //季度
'd+': date.getDate(), //日
'H+': date.getHours(), //小时
'M+': date.getMinutes(), //分
'S+': date.getSeconds(), //秒
s: date.getMilliseconds(), //毫秒
}
if (/(y+)/.test(format)) format = format.replace(RegExp.$1, `${date.getFullYear()}`.substr(4 - RegExp.$1.length))
for (var k in o) {
if (new RegExp(`(${k})`).test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length))
}
return format
},
hash(data, { hasher = 'sha256', salt, input = 'utf8', output = 'hex' } = {}) {
if (typeof data !== 'string' && !(data instanceof Buffer) && !(data instanceof DataView)) data = JSON.stringify(data)
if (salt && typeof salt === 'string') data = data + salt
let inputEncoding = input // my.INPUT_LIST.indexOf(option.input)>=0?option.input:my.INPUT // 'utf8', 'ascii' or 'latin1' for string data, default to utf8 if not specified; ignored for Buffer, TypedArray, or DataView.
let outputEncoding = output === 'buf' ? undefined : output // (my.OUTPUT_LIST.indexOf(output)>=0?output:my.OUTPUT) // option.output: 留空=》默认输出hex格式或者手动指定 'buf', hex', 'latin1' or 'base64'
return require('crypto').createHash(hasher).update(data, inputEncoding).digest(outputEncoding)
},
}