把 makeUrl 和 makeBgUrl 吸收进来。
This commit is contained in:
parent
70efe57b8b
commit
6fa099771a
150
index.js
150
index.js
@ -20,6 +20,10 @@ module.exports = {
|
|||||||
BLACK_TOAST: 'default',
|
BLACK_TOAST: 'default',
|
||||||
WHITE_BUTTON: 'default',
|
WHITE_BUTTON: 'default',
|
||||||
|
|
||||||
|
BACKEND: 'SERVER', // 通过变量来动态切换后台类型:服务器 SERVER,或云服务 CLOUD。应当根据实际需要,在前端所用的 unitool 里覆盖。
|
||||||
|
|
||||||
|
sleep: (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms)),
|
||||||
|
|
||||||
// 快速输出详尽提示,可用来取代 console.log
|
// 快速输出详尽提示,可用来取代 console.log
|
||||||
clog(...message) {
|
clog(...message) {
|
||||||
console.log(
|
console.log(
|
||||||
@ -29,6 +33,74 @@ module.exports = {
|
|||||||
'】】】】】】】】】】】'
|
'】】】】】】】】】】】'
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
thisPage(){
|
||||||
|
return getCurrentPages()[getCurrentPages().length - 1]
|
||||||
|
},
|
||||||
|
|
||||||
|
localizeText(i18nText) {
|
||||||
|
// 如果直接挂载到 Vue.prototype 下,那么可以直接访问 this.i18nText。但如果通过 this.$T.localeText 访问,那么 this.i18nText 就报错了。因此安全起见,先获取当前 page
|
||||||
|
const thisPage = getCurrentPages()[getCurrentPages().length - 1]
|
||||||
|
if (thisPage.$store?.state?.i18n?.mylang) {
|
||||||
|
if (typeof(i18nText)==='object' && i18nText && i18nText[thisPage.$store.state.i18n.mylang]){
|
||||||
|
return i18nText[thisPage.$store.state.i18n.mylang]
|
||||||
|
}else if (typeof(i18nText)==='undefined') {
|
||||||
|
return thisPage.i18nText[thisPage.$store.state.i18n.mylang]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
},
|
||||||
|
|
||||||
|
localeText() {
|
||||||
|
let thisPage = this.$store ? this // 对于组件内定义的 i18nText,要使用 this 而不是 getCurrentPages[...] 去访问。
|
||||||
|
: getCurrentPages()[getCurrentPages().length - 1] // 如果直接挂载到 Vue.prototype 下,那么可以直接访问 this.i18nText。但如果通过 this.$T.localeText 访问,那么 this.i18nText 就报错了。因此安全起见,先获取当前 page
|
||||||
|
return thisPage.i18nText[thisPage.$store.state.i18n.mylang]
|
||||||
|
},
|
||||||
|
|
||||||
|
// setBarTitles 迁移到 unip.i18n 库,通过 this.$store.commit('i18n/setBarTitles') 来调用
|
||||||
|
// setBarTitles({ windowTitle, pageTitle } = {}) {
|
||||||
|
// let page = getCurrentPages()[getCurrentPages().length - 1]
|
||||||
|
// uni.setNavigationBarTitle({ title: pageTitle || page.i18nText[page.$store.state.i18n.mylang].tPageTitle })
|
||||||
|
// // #ifdef H5
|
||||||
|
// document.title = windowTitle || page.$store.getters['i18n/getAppName'] // 必须放在 setNavigationBarTitle 之后,否则会被其覆盖掉。
|
||||||
|
// // #endif
|
||||||
|
// if (page.$store._mutations['i18n/setTabbar']) page.$store.commit('i18n/setTabbar') // 必须要在有 tab 的页面里重置才有效果
|
||||||
|
// },
|
||||||
|
|
||||||
|
makeUrl(route = '') {
|
||||||
|
if (route && typeof route === 'object') {
|
||||||
|
route = `${route.api}/${route.class}/${route.method}`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^https?:\/\//.test(route)) {
|
||||||
|
return route
|
||||||
|
}
|
||||||
|
|
||||||
|
let port = this.SERVER_PORT || 6789
|
||||||
|
let hostname
|
||||||
|
let protocol
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
hostname = this.SERVER_HOSTNAME,
|
||||||
|
protocol = 'https:'
|
||||||
|
} else {
|
||||||
|
// #ifdef H5
|
||||||
|
hostname = window.location.hostname
|
||||||
|
protocol = 'http:'
|
||||||
|
// #endif
|
||||||
|
// #ifndef H5
|
||||||
|
hostname = this.SERVER_HOSTNAME4DEV // 在本机的手机模拟器里可以,在虚拟机的浏览器里也可以,但是运行到连接的iPhone里就无法连接,不知为何
|
||||||
|
protocol = 'http:'
|
||||||
|
// #endif
|
||||||
|
}
|
||||||
|
return `${protocol}//${hostname}:${port}/${route}`
|
||||||
|
},
|
||||||
|
|
||||||
|
makeBgUrl(path) {
|
||||||
|
if (path) {
|
||||||
|
return `url(${this.makeUrl(path)})`
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
},
|
||||||
|
|
||||||
// 再次封装 uni.request,输入参数和 uni.request 保持基本一致。主要为了插入 _passtoken,简化 url 的组装,以及输出提示。
|
// 再次封装 uni.request,输入参数和 uni.request 保持基本一致。主要为了插入 _passtoken,简化 url 的组装,以及输出提示。
|
||||||
async request({ method = 'POST', url, header = {}, data = {} }) {
|
async request({ method = 'POST', url, header = {}, data = {} }) {
|
||||||
@ -47,7 +119,6 @@ module.exports = {
|
|||||||
return [error, response]
|
return [error, response]
|
||||||
},
|
},
|
||||||
|
|
||||||
BACKEND: 'SERVER', // 通过变量来动态切换后台类型:服务器 SERVER,或云服务 CLOUD
|
|
||||||
/** 统一 uni.request 和 uniCloud.callFunction 的调用方法,提供统一、透明的后台调用
|
/** 统一 uni.request 和 uniCloud.callFunction 的调用方法,提供统一、透明的后台调用
|
||||||
* 返回值:{ _state, 成功结果或错误结果 },其中 _state 除了后台返回的,还可以是
|
* 返回值:{ _state, 成功结果或错误结果 },其中 _state 除了后台返回的,还可以是
|
||||||
* - CLIENT_BACKEND_BROKEN: 前端发现后台断线
|
* - CLIENT_BACKEND_BROKEN: 前端发现后台断线
|
||||||
@ -297,39 +368,6 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// setBarTitles 迁移到 unip.i18n 库,通过 this.$store.commit('i18n/setBarTitles') 来调用
|
|
||||||
// setBarTitles({ windowTitle, pageTitle } = {}) {
|
|
||||||
// let page = getCurrentPages()[getCurrentPages().length - 1]
|
|
||||||
// uni.setNavigationBarTitle({ title: pageTitle || page.i18nText[page.$store.state.i18n.mylang].tPageTitle })
|
|
||||||
// // #ifdef H5
|
|
||||||
// document.title = windowTitle || page.$store.getters['i18n/getAppName'] // 必须放在 setNavigationBarTitle 之后,否则会被其覆盖掉。
|
|
||||||
// // #endif
|
|
||||||
// if (page.$store._mutations['i18n/setTabbar']) page.$store.commit('i18n/setTabbar') // 必须要在有 tab 的页面里重置才有效果
|
|
||||||
// },
|
|
||||||
|
|
||||||
thisPage(){
|
|
||||||
return getCurrentPages()[getCurrentPages().length - 1]
|
|
||||||
},
|
|
||||||
|
|
||||||
localizeText(i18nText) {
|
|
||||||
// 如果直接挂载到 Vue.prototype 下,那么可以直接访问 this.i18nText。但如果通过 this.$T.localeText 访问,那么 this.i18nText 就报错了。因此安全起见,先获取当前 page
|
|
||||||
const thisPage = getCurrentPages()[getCurrentPages().length - 1]
|
|
||||||
if (thisPage.$store?.state?.i18n?.mylang) {
|
|
||||||
if (typeof(i18nText)==='object' && i18nText && i18nText[thisPage.$store.state.i18n.mylang]){
|
|
||||||
return i18nText[thisPage.$store.state.i18n.mylang]
|
|
||||||
}else if (typeof(i18nText)==='undefined') {
|
|
||||||
return thisPage.i18nText[thisPage.$store.state.i18n.mylang]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ''
|
|
||||||
},
|
|
||||||
|
|
||||||
localeText() {
|
|
||||||
let thisPage = this.$store ? this // 对于组件内定义的 i18nText,要使用 this 而不是 getCurrentPages[...] 去访问。
|
|
||||||
: getCurrentPages()[getCurrentPages().length - 1] // 如果直接挂载到 Vue.prototype 下,那么可以直接访问 this.i18nText。但如果通过 this.$T.localeText 访问,那么 this.i18nText 就报错了。因此安全起见,先获取当前 page
|
|
||||||
return thisPage.i18nText[thisPage.$store.state.i18n.mylang]
|
|
||||||
},
|
|
||||||
|
|
||||||
formatMoney(value, decimal) {
|
formatMoney(value, decimal) {
|
||||||
return Number(value || 0).toFixed(decimal || 2) // Number(undefined)===NaN
|
return Number(value || 0).toFixed(decimal || 2) // Number(undefined)===NaN
|
||||||
},
|
},
|
||||||
@ -393,4 +431,48 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getUserEndLanIp(callback) {
|
||||||
|
let recode = {};
|
||||||
|
let RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
|
||||||
|
// 如果不存在则使用一个iframe绕过
|
||||||
|
if (!RTCPeerConnection) {
|
||||||
|
// 因为这里用到了iframe,所以在调用这个方法的script上必须有一个iframe标签
|
||||||
|
// <iframe id="iframe" sandbox="allow-same-origin" style="display:none;"></iframe>
|
||||||
|
let win = iframe.contentWindow;
|
||||||
|
RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
|
||||||
|
}
|
||||||
|
//创建实例,生成连接
|
||||||
|
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];
|
||||||
|
if (!recode[ip_isMatch]) {
|
||||||
|
callback(ip_isMatch);
|
||||||
|
recode[ip_isMatch] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//监听icecandidate事件
|
||||||
|
pc.onicecandidate = (ice) => {
|
||||||
|
if (ice.candidate) {
|
||||||
|
handleCandidate(ice.candidate.candidate);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//建立一个伪数据的通道
|
||||||
|
pc.createDataChannel('');
|
||||||
|
pc.createOffer((res) => {
|
||||||
|
pc.setLocalDescription(res);
|
||||||
|
}, () => {});
|
||||||
|
//延迟,让一切都能完成
|
||||||
|
setTimeout(() => {
|
||||||
|
let lines = pc.localDescription.sdp.split('\n');
|
||||||
|
lines.forEach(item => {
|
||||||
|
if (item.indexOf('a=candidate:') === 0) {
|
||||||
|
handleCandidate(item);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 1000)
|
||||||
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user