// #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({type='image', count=1, mediaType, sizeType, sourceType, compress=false, url, header={}, formData={}, name='file'}){ // choose and upload file let picked if (type==='image'){ picked = await uni.chooseImage({count, sizeType}) }else if (type==='video'){ picked = await uni.chooseVideo({count, compressed:compress, sourceType}) }else { picked = await uni.chooseMedia({count, mediaType, sizeType, sourceType}) } let [errorChoose, {tempFilePaths, tempFiles}={}] = picked if (!errorChoose){ if (compress && tempFiles[0].size>1048576){ console.log('========= compressing -------') await uni.compressImage({ // compressImage not implemented yet in H5 src:tempFiles[0].path, quality: 50, success: res => { console.log('======= compressed-------') console.log(res) tempFilePaths[0] = res.tempFilePath }, fail: err => { console.log('======= compress failed ====') console.log(err) } }) } 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: tempFilePaths[0], 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] }else{ 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] }, 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) }, }