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.
462 lines
9.5 KiB
462 lines
9.5 KiB
/**
|
|
* 函数 - 页面导航
|
|
*/
|
|
// #ifndef VUE3
|
|
var config;
|
|
try {
|
|
config = require('@/app.config.js');
|
|
if (typeof config.default === "object") {
|
|
config = config.default;
|
|
}
|
|
} catch (e) {
|
|
config = {};
|
|
}
|
|
// #endif
|
|
|
|
// #ifdef VUE3
|
|
import config from '@/app.config.js'
|
|
// #endif
|
|
|
|
|
|
var util = {};
|
|
var lastNavigate = {
|
|
url: "",
|
|
time: 0
|
|
};
|
|
/**
|
|
* 保留当前页面,跳转到应用内的某个页面,使用vk.navigateBack可以返回到原页面。
|
|
* vk.navigateTo(url);
|
|
*/
|
|
util.navigateTo = function(obj) {
|
|
let vk = uni.vk;
|
|
if (typeof obj == "string") {
|
|
let url = obj;
|
|
obj = {
|
|
url: url
|
|
};
|
|
} else if (typeof obj == "undefined") {
|
|
obj = {};
|
|
}
|
|
if (!obj.url) {
|
|
vk.toast("url不能为空!");
|
|
return false;
|
|
}
|
|
let time = Date.now();
|
|
if (lastNavigate.url === obj.url && (time - lastNavigate.time) < 200) {
|
|
return false;
|
|
}
|
|
lastNavigate = { url: obj.url, time };
|
|
util.checkNeedLogin({
|
|
url: obj.url,
|
|
success: function(res) {
|
|
if (res.needLogin) {
|
|
obj.url = vk.pubfn.getPageFullPath(obj.url);
|
|
vk.navigate.setOriginalPage(obj);
|
|
obj.url = config.login.url;
|
|
// login拦截器开始-----------------------------------------------------------
|
|
let { interceptor = {} } = config;
|
|
if (typeof interceptor.login === "function") {
|
|
let key = interceptor.login({
|
|
vk,
|
|
params: obj,
|
|
res: {
|
|
...res,
|
|
code: 30204,
|
|
msg: "本地token校验未通过"
|
|
}
|
|
});
|
|
if (typeof key === "undefined" || key !== true) return false;
|
|
}
|
|
// login拦截器结束-----------------------------------------------------------
|
|
} else {
|
|
vk.navigate.setOriginalPage(null);
|
|
}
|
|
util._navigateTo(obj);
|
|
}
|
|
});
|
|
};
|
|
util._navigateTo = function(obj) {
|
|
let { interceptor = {} } = config;
|
|
if (typeof interceptor.navigateTo === "function") {
|
|
let vk = uni.vk;
|
|
obj.pagePath = vk.pubfn.getPageFullPath(obj.url);
|
|
let key = interceptor.navigateTo({
|
|
...obj,
|
|
vk
|
|
});
|
|
if (typeof key == "boolean" && key === false) return false;
|
|
}
|
|
let {
|
|
url,
|
|
animationType = "pop-in",
|
|
animationDuration = 300,
|
|
events,
|
|
mode = "navigateTo"
|
|
} = obj;
|
|
// 此处写法仅为支持vue3,vue3不支持uni[apiName]的形式调用
|
|
let navigateFn;
|
|
if (mode === "navigateTo") {
|
|
navigateFn = uni.navigateTo;
|
|
} else if (mode === "redirectTo") {
|
|
navigateFn = uni.redirectTo;
|
|
} else if (mode === "reLaunch") {
|
|
navigateFn = uni.reLaunch;
|
|
} else if (mode === "switchTab") {
|
|
navigateFn = uni.switchTab;
|
|
} else {
|
|
navigateFn = uni.navigateTo;
|
|
}
|
|
// 此处写法仅为支持vue3,vue3不支持uni[apiName]的形式调用
|
|
navigateFn({
|
|
url: url,
|
|
animationType: animationType,
|
|
animationDuration: animationDuration,
|
|
events: events, // 参考 https://uniapp.dcloud.io/api/router?id=navigateto
|
|
success: function(res) {
|
|
if (typeof obj.success == "function") obj.success(res);
|
|
},
|
|
fail: function(err) {
|
|
if (err.errMsg.indexOf("not found") > -1) {
|
|
let vk = uni.vk;
|
|
let errUrl = vk.pubfn.getPageFullPath(url);
|
|
vk.toast(`页面 ${errUrl} 不存在`, "none");
|
|
console.error(err);
|
|
return false;
|
|
}
|
|
uni.switchTab({
|
|
url: url,
|
|
success: obj.success,
|
|
fail: function() {
|
|
uni.redirectTo({
|
|
url: url,
|
|
success: obj.success,
|
|
fail: function(err) {
|
|
console.error(err);
|
|
if (typeof obj.fail == "function") obj.fail(err);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
complete: function(res) {
|
|
if (typeof obj.complete == "function") obj.complete(res);
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 关闭当前页面,跳转到应用内的某个页面。
|
|
* vk.redirectTo(url);
|
|
*/
|
|
util.redirectTo = function(obj) {
|
|
obj = util.paramsInit(obj);
|
|
obj.mode = "redirectTo";
|
|
util.navigateTo(obj);
|
|
};
|
|
|
|
/**
|
|
* 关闭所有页面,打开到应用内的某个页面。
|
|
* vk.reLaunch(url);
|
|
*/
|
|
util.reLaunch = function(obj) {
|
|
obj = util.paramsInit(obj);
|
|
obj.mode = "reLaunch";
|
|
util.navigateTo(obj);
|
|
};
|
|
|
|
/**
|
|
* 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
|
|
* vk.switchTab(url);
|
|
*/
|
|
util.switchTab = function(obj) {
|
|
obj = util.paramsInit(obj);
|
|
obj.mode = "switchTab";
|
|
util.navigateTo(obj);
|
|
};
|
|
/**
|
|
* 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。
|
|
* vk.navigateBack();
|
|
*/
|
|
util.navigateBack = function(obj) {
|
|
let vk = uni.vk;
|
|
if (typeof obj == "number") {
|
|
let delta = obj;
|
|
obj = {
|
|
delta: delta
|
|
};
|
|
} else if (typeof obj == "undefined") {
|
|
obj = {};
|
|
}
|
|
let {
|
|
delta = 1,
|
|
animationType = "pop-out",
|
|
animationDuration = 300
|
|
} = obj;
|
|
uni.navigateBack({
|
|
delta: delta,
|
|
animationType: animationType,
|
|
animationDuration: animationDuration,
|
|
success: function() {
|
|
if (typeof obj.success == "function") obj.success();
|
|
},
|
|
fail: function(res) {
|
|
console.error(res);
|
|
if (typeof obj.fail == "function") obj.fail();
|
|
},
|
|
complete: function() {
|
|
if (typeof obj.complete == "function") obj.complete();
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* 跳转到登录前的页面
|
|
* vk.navigate.originalTo();
|
|
*/
|
|
util.originalTo = function() {
|
|
let vk = uni.vk;
|
|
let originalPage = vk.navigate.getOriginalPage();
|
|
vk.navigate.setOriginalPage(null);
|
|
util.redirectTo(originalPage);
|
|
};
|
|
|
|
/**
|
|
* 获取登录前的页面
|
|
* vk.navigate.getOriginalPage();
|
|
*/
|
|
util.getOriginalPage = function() {
|
|
if (typeof uni.vk.getVuex === "function") {
|
|
// 有安装vuex则使用vuex
|
|
return uni.vk.getVuex('$app.originalPage');
|
|
} else {
|
|
// 未安装则使用本地缓存
|
|
return uni.vk.getStorageSync('vk.navigate.originalPage');
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 设置登录前的页面
|
|
* vk.navigate.setOriginalPage(originalPage);
|
|
*/
|
|
util.setOriginalPage = function(originalPage) {
|
|
uni.vk.navigate.originalPage = originalPage; // 兼容老版本
|
|
if (typeof uni.vk.getVuex === "function") {
|
|
// 有安装vuex则使用vuex
|
|
return uni.vk.setVuex('$app.originalPage', originalPage);
|
|
} else {
|
|
// 未安装则使用本地缓存
|
|
return uni.vk.setStorageSync('vk.navigate.originalPage', originalPage);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* 跳转到首页
|
|
* vk.navigateToHome();
|
|
*/
|
|
util.navigateToHome = function(obj = {}) {
|
|
let vk = uni.vk;
|
|
let {
|
|
mode = "reLaunch"
|
|
} = obj;
|
|
vk[mode](config.index.url);
|
|
};
|
|
|
|
/**
|
|
* 跳转到登录页
|
|
* vk.navigateToLogin();
|
|
*/
|
|
util.navigateToLogin = function(obj = {}) {
|
|
let vk = uni.vk;
|
|
let {
|
|
mode = "reLaunch"
|
|
} = obj;
|
|
vk[mode](config.login.url);
|
|
};
|
|
|
|
/**
|
|
* 检测是否满足条件(内部方法)
|
|
util.checkWildcardTest({
|
|
url:url,
|
|
pagesRule:config.checkTokenPages,
|
|
success:function(res){
|
|
if(res.success){
|
|
|
|
}
|
|
}
|
|
})
|
|
*/
|
|
util.checkWildcardTest = function(obj) {
|
|
let vk = uni.vk;
|
|
let {
|
|
url,
|
|
pagesRule
|
|
} = obj;
|
|
// ../ 转成绝对路径
|
|
url = vk.pubfn.getPageFullPath(url);
|
|
let key = false;
|
|
if (vk.pubfn.isNotNull(pagesRule)) {
|
|
let { mode = 0, list = [] } = pagesRule;
|
|
if (mode > 0) {
|
|
let regExpKey = false;
|
|
let path = util.getPagePath(url);
|
|
for (let i = 0; i < list.length; i++) {
|
|
let pageRegExp = list[i];
|
|
regExpKey = vk.pubfn.wildcardTest(path, pageRegExp);
|
|
if (regExpKey) {
|
|
break;
|
|
}
|
|
}
|
|
if (mode === 1 && regExpKey) {
|
|
key = true;
|
|
} else if (mode === 2 && !regExpKey) {
|
|
key = true;
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
url,
|
|
key
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
* 检测是否需要登录(内部方法)
|
|
util.checkNeedLogin({
|
|
url:url,
|
|
success:function(res){
|
|
if(res.needLogin){
|
|
|
|
}
|
|
}
|
|
})
|
|
*/
|
|
util.checkNeedLogin = function(obj) {
|
|
let vk = uni.vk;
|
|
let { url, success } = obj;
|
|
let needLogin = false; // 用户是否需要重新登录
|
|
let pageNeedLogin = false; // 该页面是否需要登录才能访问
|
|
let pagesRule = config.checkTokenPages;
|
|
if (pagesRule) {
|
|
let res = util.checkWildcardTest({
|
|
url,
|
|
pagesRule
|
|
});
|
|
pageNeedLogin = res.key;
|
|
if (pageNeedLogin) {
|
|
// 本地判断token有效期(联网会浪费性能)
|
|
if (!vk.checkToken()) {
|
|
needLogin = true;
|
|
}
|
|
}
|
|
}
|
|
success({
|
|
url,
|
|
needLogin,
|
|
pageNeedLogin
|
|
});
|
|
};
|
|
|
|
|
|
// 获取?前面的地址
|
|
util.getPagePath = function(url) {
|
|
let pathIndex = url.indexOf("?");
|
|
let path = url;
|
|
if (pathIndex > -1) {
|
|
path = path.substring(0, pathIndex);
|
|
}
|
|
return path;
|
|
};
|
|
|
|
util.paramsInit = function(obj) {
|
|
let vk = uni.vk;
|
|
if (typeof obj == "string") {
|
|
let url = obj;
|
|
obj = {
|
|
url: url
|
|
};
|
|
} else if (typeof obj == "undefined") {
|
|
obj = {};
|
|
}
|
|
if (!obj.url) {
|
|
vk.toast("url不能为空!");
|
|
return false;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 跳转到小程序
|
|
vk.navigateToMiniProgram({
|
|
appId: 'appId',
|
|
path: 'pages/index/index',
|
|
extraData:{
|
|
//发送数据携带的参数
|
|
},
|
|
success(res) {
|
|
// 打开成功
|
|
|
|
}
|
|
})
|
|
*/
|
|
util.navigateToMiniProgram = function(obj) {
|
|
let vk = uni.vk;
|
|
// #ifdef H5
|
|
vk.toast("不支持打开小程序", "none");
|
|
// #endif
|
|
|
|
// #ifndef H5
|
|
uni.navigateToMiniProgram(obj);
|
|
// #endif
|
|
};
|
|
|
|
|
|
/**
|
|
* 检测是否可以分享(内部方法)
|
|
util.checkAllowShare({
|
|
url:url,
|
|
});
|
|
*/
|
|
util.checkAllowShare = function(obj) {
|
|
let vk = uni.vk;
|
|
let { url, success } = obj;
|
|
let pagesRule = config.checkSharePages || {};
|
|
if (pagesRule && pagesRule.mode > 0) {
|
|
let res = util.checkWildcardTest({
|
|
url,
|
|
pagesRule
|
|
});
|
|
// #ifdef MP
|
|
let menus = pagesRule.menus || ['shareAppMessage', 'shareTimeline'];
|
|
if (res.key) {
|
|
//console.log("允许分享");
|
|
uni.showShareMenu({
|
|
withShareTicket: false,
|
|
menus
|
|
});
|
|
} else {
|
|
//console.log("禁止分享");
|
|
uni.hideShareMenu({
|
|
menus
|
|
})
|
|
}
|
|
// #endif
|
|
}
|
|
};
|
|
|
|
util.$emit = function(...obj) {
|
|
return uni.$emit(...obj);
|
|
};
|
|
util.$on = function(...obj) {
|
|
return uni.$on(...obj);
|
|
};
|
|
util.$once = function(...obj) {
|
|
return uni.$once(...obj);
|
|
};
|
|
util.$off = function(...obj) {
|
|
return uni.$off(...obj);
|
|
};
|
|
|
|
export default util;
|