88 lines
1.9 KiB
JavaScript
88 lines
1.9 KiB
JavaScript
/**
|
||
* 路由守卫模块
|
||
* 拦截页面跳转,未登录时自动重定向到登录页
|
||
*/
|
||
|
||
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)
|
||
}
|