9433cfb9创建于 2025年12月31日历史提交
/**
 * 使用示例:
 * 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
};