mi-assessment/uniapp/utils/routeGuard.js
2026-03-19 05:48:36 +08:00

88 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 路由守卫模块
* 拦截页面跳转,未登录时自动重定向到登录页
*/
import { getToken } from './storage.js'
/**
* 不需要登录即可访问的页面白名单
* 包含TabBar 页面、登录页、协议页
*/
const WHITE_LIST = [
'pages/index/index',
'pages/team/index',
'pages/mine/index',
'pages/login/index',
'pages/agreement/user/index',
'pages/agreement/privacy/index'
]
/**
* 从跳转 url 中提取页面路径(去掉前导 / 和查询参数)
* @param {string} url - 跳转地址
* @returns {string} 页面路径
*/
function extractPath(url) {
if (!url) return ''
// 去掉前导 /
let path = url.startsWith('/') ? url.substring(1) : url
// 去掉查询参数
const queryIndex = path.indexOf('?')
if (queryIndex > -1) {
path = path.substring(0, queryIndex)
}
return path
}
/**
* 判断页面是否在白名单中
* @param {string} path - 页面路径
* @returns {boolean}
*/
function isWhiteListed(path) {
return WHITE_LIST.includes(path)
}
/**
* 创建拦截器回调
* @returns {Object} 拦截器配置
*/
function createInterceptor() {
return {
invoke(args) {
const path = extractPath(args.url)
// 白名单页面直接放行
if (isWhiteListed(path)) {
return args
}
// 已登录放行
const token = getToken()
if (token) {
return args
}
// 未登录,重定向到登录页,携带原目标地址
const redirectUrl = encodeURIComponent(args.url)
uni.navigateTo({
url: `/pages/login/index?redirect=${redirectUrl}`
})
// 返回 false 阻止原始跳转
return false
}
}
}
/**
* 初始化路由守卫
* 拦截 navigateTo 和 redirectTo
*/
export function setupRouteGuard() {
const interceptor = createInterceptor()
uni.addInterceptor('navigateTo', interceptor)
uni.addInterceptor('redirectTo', interceptor)
}