Files
FT517-WMS/RuoYi-App-master/permission.js
2025-09-11 14:29:56 +08:00

168 lines
5.0 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 '@/utils/auth'
// 登录页面
const loginPage = "/pages/login"
// 首页
const indexPage = "/pages/index"
// 标记是否由navigateBack触发的reLaunch
let isNavigateBackTriggered = false
// 获取当前页面路径
function getCurrentPageUrl() {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
console.log("当前页面",currentPage.route)
console.log("上一层页面", pages[pages.length - 2].route)
return currentPage ? currentPage.route : ''
}
// 页面白名单
const whiteList = [
'/pages/login', '/pages/register', '/pages/common/webview/index','/pages/setting'
]
// 检查地址白名单
function checkWhite(url) {
// 确保url以/开头
const normalizedUrl = url.startsWith('/') ? url : '/' + url
const path = normalizedUrl.split('?')[0]
return whiteList.indexOf(path) !== -1
}
// 页面跳转验证拦截器
let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
list.forEach(item => {
uni.addInterceptor(item, {
invoke(to) {
console.log(`${item} 拦截器被触发,目标页面:`, to.url)
console.log('当前 Token 状态:', getToken() ? '存在' : '不存在')
// 如果是由navigateBack触发的reLaunch,直接放行
if (item === 'reLaunch' && isNavigateBackTriggered) {
console.log('由navigateBack触发的reLaunch,直接放行')
return true
}
if (getToken()) {
console.log('Token 存在,检查是否为登录页面')
if (to.url === loginPage) {
console.log('当前为登录页面,重定向到首页')
uni.reLaunch({ url: "/" })
}
return true
} else {
console.log('Token 不存在,检查是否在白名单中')
if (checkWhite(to.url)) {
console.log('目标页面在白名单中,允许访问')
return true
}
console.log('页面不在白名单中,准备跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
}, 1500)
return false
}
},
fail(err) {
console.error(err)
}
})
})
// 单独处理返回按钮操作
uni.addInterceptor('navigateBack', {
invoke(e) {
console.log('navigateBack 拦截器被触发', e)
console.log('当前 Token 状态:', getToken() ? '存在' : '不存在')
// 获取当前页面栈
const pages = getCurrentPages()
// 检查页面导航栈是否为空
if (pages.length <= 1) {
console.log('页面导航栈为空或只有一个页面,无法正常返回')
// 检查Token状态
if (getToken()) {
console.log('Token存在,跳转到首页')
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
uni.reLaunch({ url: indexPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
} else {
console.log('Token不存在,跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
}, 1500)
}
return false
}
// 页面导航栈不为空,检查Token状态
if (!getToken()) {
const currentPage = getCurrentPageUrl()
console.log('当前页面路径:', currentPage)
// 确保currentPage不为空且有内容
if (currentPage && currentPage.trim() && checkWhite(currentPage)) {
console.log('当前页面在白名单中,允许返回')
return true
}
console.log('Token不存在且页面不在白名单中,准备跳转到登录页')
uni.showToast({
icon: 'none',
title: '登录已过期,请重新登录'
})
// 设置标志,表明当前的reLaunch是由navigateBack触发的
isNavigateBackTriggered = true
setTimeout(() => {
console.log('执行跳转到登录页')
uni.reLaunch({ url: loginPage })
// 重置标志
setTimeout(() => {
isNavigateBackTriggered = false
}, 100)
}, 1500)
return false
}
// Token存在且页面导航栈不为空,允许正常返回
const currentPage = pages[pages.length - 1]
console.log("当前页面:", currentPage.route)
if (pages.length > 1) {
console.log("上一层页面:", pages[pages.length - 2].route)
}
console.log('Token存在,允许正常返回')
return true
},
fail(err) {
console.error('navigateBack 拦截器执行失败:', err)
}
})