import {Dialog} from "tdesign-mobile-vue"; import {useRequest} from "@/utils/request"; /** * 路由拦截器配置 * @param {Array} whiteList - 不需要登录就可以访问的页面路径列表 */ export const setupRouterInterceptor = (whiteList = []) => { // 添加各种导航方法的拦截器 addNavigationInterceptors(whiteList) } /** * 添加所有导航方法的拦截器 * @param {Array} whiteList - 白名单页面列表 */ function addNavigationInterceptors(whiteList) { // 页面跳转拦截 uni.addInterceptor('navigateTo', { invoke: (args) => routeInterceptor(args, whiteList) }) // 页面重定向拦截 uni.addInterceptor('redirectTo', { invoke: (args) => routeInterceptor(args, whiteList) }) // 页面重启动拦截 uni.addInterceptor('reLaunch', { invoke: (args) => routeInterceptor(args, whiteList) }) // Tab切换拦截 uni.addInterceptor('switchTab', { invoke: (args) => routeInterceptor(args, whiteList) }) } /** * 路由拦截处理函数 * @param {Object} args - 导航参数 * @param {Array} whiteList - 白名单页面列表 * @returns {Object|boolean} - 继续导航或阻止导航 */ async function routeInterceptor(args, whiteList) { // 获取目标路径 const token = uni.getStorageSync('token') const targetUrl = args.url let isInWhiteList = targetUrl === '/' if (!isInWhiteList) { // 检查目标路径是否在白名单中 isInWhiteList = whiteList.some(path => { return targetUrl.startsWith(path) || targetUrl === path }) } console.log('路由拦截检查:', {url: targetUrl, isInWhiteList, hasToken: !!token}) // 如果不在白名单且未登录,则跳转到登录页 if (!isInWhiteList) { if (token) { // 获取用户信息 const {user} = getApp().globalData if (user == null) { const {code, data, msg} = await useRequest().get('/client/auth/info') if (code === 0) { getApp().globalData.user = data return args } } return args } else { console.log('拦截导航,跳转到登录页') // 保存用户尝试访问的页面,以便登录后跳回 try { uni.setStorageSync('REDIRECT_URL', targetUrl) } catch (e) { } Dialog.confirm({ title: '提示', content: '您尚未登录,是否前往登录页面?', cancelBtn: '取消', confirmBtn: '确认', onConfirm: () => { uni.navigateTo({ url: '/pages/login/index' }) }, onCancel: () => { console.log('取消登录') } }) // 阻止原导航 return false } } // 继续原导航 return args } /** * 获取白名单页面配置 * @returns {Array} 默认白名单页面列表 */ export const getDefaultWhiteList = () => { return [ '/pages/index/index', '/pages/login/index' ] }