From 8d2962ebce89af27b545d322bcf0e7b6a20fad9c Mon Sep 17 00:00:00 2001 From: Luk Lu Date: Sat, 2 Apr 2022 19:48:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E7=94=A8=E6=88=B7=E5=8F=AF=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=87=BA=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- usertool.js | 106 ++++++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/usertool.js b/usertool.js index a8e1b0c..8236dc0 100644 --- a/usertool.js +++ b/usertool.js @@ -12,11 +12,9 @@ export default { BLACK_TOAST: 'default', WHITE_BUTTON: 'default', - // internal consts used by unitool - RESPONSIVE_TABBAR_AUTOHIDE: false, - RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD: 768.768, - RESPONSIVE_TABBAR_ALWAYSHIDE: false, - BACKEND: 'SERVER', // 通过变量来动态切换后台类型:服务器 SERVER 或云服务 UNICLOUD. 应当根据实际需要,在前端所用的 unitool 里覆盖。 + // [todo] 能否把这些默认值放到 export 以外? + RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD_DEFAULT: 0, + BACKEND_DEFAULT: 'SERVER', // 服务器 SERVER 或云服务 UNICLOUD thisPage() { return this.constructor.name==='VueComponent' ? this // 对于组件内定义的 i18nText,要使用 this 来获得组建内的 i18nText,而不是 getCurrentPages[...] 去访问全局页面的 i18nText。 @@ -26,32 +24,24 @@ export default { // 输出命令行提示,可用来取代 console.log/info/warn/error cclog(...args) { - if (process.env.NODE_ENV === 'development') { - const pageName = this.thisPage()?.route || 'VueApp' - console.log('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:blue', ...args) - } + const pageName = this.thisPage()?.route || 'VueApp' + console.log('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:blue', ...args) }, ccinfo(...args) { - if (process.env.NODE_ENV === 'development') { - const pageName = this.thisPage()?.route || 'VueApp' - console.info('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:green', ...args) - } + const pageName = this.thisPage()?.route || 'VueApp' + console.info('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:green', ...args) }, ccwarn(...args) { - if (process.env.NODE_ENV === 'development') { - const pageName = this.thisPage().route || 'VueApp' - console.warn('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:orange', ...args) - } + const pageName = this.thisPage().route || 'VueApp' + console.warn('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:orange', ...args) }, ccerr(...args) { - if (process.env.NODE_ENV === 'development') { - const pageName = this.thisPage()?.route || 'App' - console.error('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:red', ...args) - } + const pageName = this.thisPage()?.route || 'VueApp' + console.error('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:red', ...args) }, ccdebug(...args) { if (process.env.NODE_ENV === 'development') { - const pageName = this.thisPage()?.route || 'App' + const pageName = this.thisPage()?.route || 'VueApp' console.debug('%c '+JSON.stringify({time:new Date().toJSON(), page:pageName}), 'color:cyan', ...args) } }, @@ -68,7 +58,9 @@ export default { return this.i18nText?.[getApp().$store.state.i18n.mylang] || {} }, - setBarTitles ({ windowTitle, pageTitle, pagesJson=wo?.pagesJson } = {}) { + setBarTitles ({ windowTitle, pageTitle, + pagesJson=this.pagesJson || wo?.pagesJson } = {} + ) { const mylang = getApp().$store.state.i18n.mylang const pageNow = getCurrentPages()[getCurrentPages().length - 1] @@ -103,18 +95,19 @@ export default { // #ifdef H5 if (uni.getSystemInfoSync().model==='PC') { - if (this.RESPONSIVE_TABBAR_AUTOHIDE) { - if (window.screen.width > this.RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD) { + const envi = this.envi || wo?.envi || {} + if (envi.ResponsiveTabbar==='AUTOHIDE') { + if (window.screen.width > (envi.ResponsiveTabbarAutohideWidthThreshold || this.RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD_DEFAULT)) { uni.hideTabBar() } uni.onWindowResize(({size})=>{ - if (size.windowWidth > this.RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD) { + if (size.windowWidth > (envi.ResponsiveTabbarAutohideWidthThreshold || this.RESPONSIVE_TABBAR_AUTOHIDE_WIDTH_THRESHOLD_DEFAULT)) { uni.hideTabBar() }else{ uni.showTabBar() } }) - }else if (this.RESPONSIVE_TABBAR_ALWAYSHIDE) { + }else if (envi.ResponsiveTabbar==='ALWAYSHIDE') { uni.hideTabBar() } } @@ -122,6 +115,7 @@ export default { }, makeServerUrl(route = '') { + const envi = this.envi || wo?.envi || {} if (typeof route !== 'string') route = '' // 防止 route 为 null, undefined 等由于后台数据库默认值而造成的异常。 route = route.replace('\\', '/') @@ -129,25 +123,25 @@ export default { return route } - let port = this.SERVER_PORT + let port = envi.ServerPort // #ifdef H5 || window.location.port // #endif let hostname let protocol if (process.env.NODE_ENV === 'production') { - hostname = this.SERVER_HOSTNAME + hostname = envi.ServerHostname // #ifdef H5 || window.location.hostname // #endif - protocol = this.SERVER_PROTOCOL || 'https' + protocol = envi.ServerProtocol || 'https' } else { hostname = - this.SERVER_HOSTNAME_DEV // 在本机的手机模拟器里可以,在虚拟机的浏览器里也可以,但是运行到连接的iPhone里就无法连接,不知为何 + envi.ServerHostnameDev // 在本机的手机模拟器里可以,在虚拟机的浏览器里也可以,但是运行到连接的iPhone里就无法连接,不知为何 // #ifdef H5 || window.location.hostname // #endif - protocol = this.SERVER_PROTOCOL_DEV || 'http' + protocol = envi.ServerProtocolDev || 'http' } return `${protocol}://${hostname}:${port}/${route.replace(/^\//, '')}` }, @@ -159,13 +153,27 @@ export default { return '' }, + StartPageForAll ({envi=this.envi || wo?.envi || {}} = {}) { + uni.switchTab({ url: envi?.StartPageForAll }) + }, + relaunchForOnline ({envi=this.envi || wo?.envi || {}} = {}) { + process.env.NODE_ENV === 'production' && wo.ss.User.onlineUser.uuid && uni.reLaunch({ url: envi?.StartPageForOnline }) + }, + relaunchForOffline ({envi=this.envi || wo?.envi || {}} ={}) { + process.env.NODE_ENV === 'production' && ! wo.ss.User.onlineUser.uuid && uni.reLaunch({ url: envi?.StartPageForOffline }) + }, + /** 统一 uni.request 和 uniCloud.callFunction 的调用方法,提供统一、透明的后台调用 * 返回值:{ _state, 成功结果或错误结果 },其中 _state 除了后台返回的,还可以是 * - CLIENT_BACKEND_BROKEN: 前端发现后台断线 * - CLIENT_BACKEND_TIMEOUT: 前端发现后台超时 * - CLINET_BACKEND_EXCEPTION: 前端发现后台异常 **/ - async callBackend({ backend = this.BACKEND, httpMethod = 'POST', apiVersion = 'api', apiWho, apiTodo, apiWhat = {} }) { + async callBackend({ + backend = this.envi?.Backend || wo?.envi?.Backend || this.BACKEND_DEFAULT, + httpMethod = 'POST', + apiVersion = 'api', apiWho, apiTodo, apiWhat = {} + }) { const thisRoute = this.thisPage()?.route || 'VueApp' // 立刻保存 this.thisPage().route,因为在调用后台后,可能已切换到了其他页面。 const startTime = new Date().toJSON() let result = {} @@ -352,7 +360,7 @@ export default { }, async pickupFile({ - backend = this.BACKEND, + backend = this.envi?.Backend || wo?.envi?.Backend || this.BACKEND_DEFAULT, mediaType = 'image', count = 1, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'], maxDuration, url, header = {}, formData = {}, name = 'file', }) { @@ -482,43 +490,43 @@ export default { }, getUserEndLanIp(callback) { - let recode = {}; - let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; + let recode = {} + let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection // 如果不存在则使用一个iframe绕过 if (!RTCPeerConnection) { // 因为这里用到了iframe,所以在调用这个方法的script上必须有一个iframe标签 // - let win = iframe.contentWindow; - RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection; + let win = iframe.contentWindow + RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection } //创建实例,生成连接 - let pc = new RTCPeerConnection(); + let pc = new RTCPeerConnection() // 匹配字符串中符合ip地址的字段 function handleCandidate(candidate) { - let ip_regexp = /([0-9]{1,3}(\.[0-9]{1,3}){3}|([a-f0-9]{1,4}((:[a-f0-9]{1,4}){7}|:+[a-f0-9]{1,4}){6}))/; - let ip_isMatch = candidate.match(ip_regexp)[1]; + let ip_regexp = /([0-9]{1,3}(\.[0-9]{1,3}){3}|([a-f0-9]{1,4}((:[a-f0-9]{1,4}){7}|:+[a-f0-9]{1,4}){6}))/ + let ip_isMatch = candidate.match(ip_regexp)[1] if (!recode[ip_isMatch]) { - callback(ip_isMatch); - recode[ip_isMatch] = true; + callback(ip_isMatch) + recode[ip_isMatch] = true } } //监听icecandidate事件 pc.onicecandidate = (ice) => { if (ice.candidate) { - handleCandidate(ice.candidate.candidate); + handleCandidate(ice.candidate.candidate) } }; //建立一个伪数据的通道 - pc.createDataChannel(''); + pc.createDataChannel('') pc.createOffer((res) => { - pc.setLocalDescription(res); - }, () => {}); + pc.setLocalDescription(res) + }, () => {}) //延迟,让一切都能完成 setTimeout(() => { - let lines = pc.localDescription.sdp.split('\n'); + let lines = pc.localDescription.sdp.split('\n') lines.forEach(item => { if (item.indexOf('a=candidate:') === 0) { - handleCandidate(item); + handleCandidate(item) } }) }, 1000)