/**
* 使用示例:
* import {loginNavigateToInterceptor,loginSwitchTabInterceptor} from '@/utils/interceptor/checkAuth.uts'
*
onLoad(()=>{
uni.addInterceptor('switchTab', loginSwitchTabInterceptor)
uni.addInterceptor('navigateTo', loginNavigateToInterceptor)
})
onUnload(() => {
uni.removeInterceptor('navigateTo');
uni.removeInterceptor('switchTab');
});
*/
import { userState, setPreLoginRoute } from '@/store/user-store.uts' // 导入userState和单独的set方法
// 导航锁:防止重复导航导致报错
import { lock,getCurrentPagePath,getPureUrl} from '@/utils/common/lock-common.uts'
import {
VITE_APP_USER_LOGIN_PAGE,
VITE_APP_USER_REGISTER_PAGE,
VITE_APP_USER_RESET_PASSWROD_PAGE,
VITE_APP_USER_HELP_PAGE,
VITE_APP_TABBAR_HOME_PAGE,
VITE_APP_USER_BIND_PHONE_PAGE,
VITE_APP_USER_WECHAT_AUTH_PAGE,
VITE_APP_AGREEMENT_PAGE,
VITE_APP_PRIVACY_PAGE
} from '@/config/page-setting.uts'
// 登录页路径(统一维护)
const LOGIN_PAGE_URL = VITE_APP_USER_LOGIN_PAGE;
const LOGIN_PAGE_ROUTE = LOGIN_PAGE_URL.replace(/^\//, ''); // 去掉开头/,匹配页面route格式
// 无需登录的路由白名单
const NO_LOGIN_WHITE_LIST = [
//首页
'/',
VITE_APP_TABBAR_HOME_PAGE,
//登录
VITE_APP_USER_LOGIN_PAGE,
//注册
VITE_APP_USER_REGISTER_PAGE,
//重置密码
VITE_APP_USER_RESET_PASSWROD_PAGE,
//帮助
VITE_APP_USER_HELP_PAGE,
//绑定手机
VITE_APP_USER_BIND_PHONE_PAGE,
//微信授权
VITE_APP_USER_WECHAT_AUTH_PAGE,
VITE_APP_AGREEMENT_PAGE,
VITE_APP_PRIVACY_PAGE
];
/**
* navigateTo 登录拦截器(
*/
const loginNavigateToInterceptor = {
invoke: function (options: NavigateToOptions) {
if (!options.url) return; // 避免空url导致的异常
// 白名单判断
if (NO_LOGIN_WHITE_LIST.includes(getPureUrl(options.url))) return;
//console.log('拦截 navigateTo 接口传入参数为:', options);
// 放行条件:已登录 / 已在登录页 / 正在导航中
if (userState.token || getCurrentPagePath() === LOGIN_PAGE_ROUTE || lock.isNavigating) {
return;
}
// 未登录:记录原跳转目标(调用单独的setPreLoginRoute方法)
setPreLoginRoute(options.url, 'navigateTo');
lock.isNavigating = true;
uni.showToast({
title: '请先登录',
icon: 'none',
duration: 1500
});
// 异步跳转避免同步导航冲突
setTimeout(() => {
uni.navigateTo({
url: LOGIN_PAGE_URL,
complete: () => {
lock.isNavigating = false; // 释放导航锁
}
});
}, 500);
//兜底
setTimeout(()=>{
if(lock.isNavigating){
lock.isNavigating = false
}
},1000)
// 返回false阻止原navigateTo执行,消除取消报错
return false;
},
// 其余success/fail/complete逻辑不变...
} as AddInterceptorOptions;
/**
* switchTab 登录拦截器(适配你的userState)
*/
const loginSwitchTabInterceptor = {
invoke: function (options: SwitchTabOptions) {
if (!options.url) return; // 避免空url导致的异常
// 白名单判断
if (NO_LOGIN_WHITE_LIST.includes(getPureUrl(options.url))) return;
//console.log('拦截 switchTab 接口传入参数为:', options);
// 放行条件:已登录 / 已在登录页 / 正在导航中
if (userState.token || getCurrentPagePath() === LOGIN_PAGE_ROUTE || lock.isSwitching) {
return;
}
// 未登录:记录原跳转目标(调用单独的setPreLoginRoute方法)
setPreLoginRoute(options.url, 'switchTab');
lock.isSwitching = true;
uni.showToast({
title: '请先登录',
icon: 'none',
duration: 1500
});
// 异步跳转避免同步冲突
setTimeout(() => {
uni.navigateTo({
url: LOGIN_PAGE_URL,
complete: () => {
lock.isSwitching = false; // 释放导航锁
}
});
}, 500);
//兜底
setTimeout(()=>{
if(lock.isSwitching){
lock.isSwitching = false
}
},1000)
// 返回false阻止原switchTab执行,消除"no-tabBar page"报错
return false;
},
// 其余success/fail/complete逻辑不变...
} as AddInterceptorOptions;
export {
loginNavigateToInterceptor,
loginSwitchTabInterceptor
};