使用场景:
- 适用于需要登录才能访问的 uni-app 应用
- 保护需要认证的页面不被未授权用户访问
- 统一处理路由跳转的权限控制
@/utils/cookies.js
下的部分代码内容:
// #ifdef H5
import Cookies from 'js-cookie'
// #endif// ums
const tokenKey = 'user_center_token'export const getUmsToken = () => {// #ifdef H5return Cookies.get(tokenKey)// #endif// #ifdef APP-PLUSreturn plus.navigator.getCookie(tokenKey)// #endif
}
@/store/modules/user.js
下的部分代码内容:
// src/store/user.js
export const useUserStore = defineStore('user',() => {......const setLogOut = _ => {uni.reLaunch({url: '/pages/login/index'})}......return {......setLogOut......}},{// persist: true // 配置持久化......}
)
export function useOutsideUserStore() {return useUserStore(g_store)
}
// 从 cookies 工具中导入获取 UmsToken 的方法
import { getUmsToken } from '@/utils/cookies'// 封装路由跳转拦截器对象
const routeInterceptor = {/*** 路由跳转前的拦截逻辑* @param {Object} args - 路由参数对象* @returns {boolean} - 返回 false 表示拦截跳转,true 表示允许跳转*/invoke(args) {// 从用户 store 中获取设置登出的方法const { setLogOut } = useUserStore()// 检查条件:1. 没有 UmsToken 且 2. 目标路由不是登录页if (!getUmsToken() && !args.url.includes('/pages/login/index')) {// 显示提示 toastuni.showToast({title: '请先登录',icon: 'none' // 不使用图标})// 执行登出操作setLogOut()// 返回 false 拦截路由跳转return false}// 允许路由跳转return true},/*** 路由跳转成功回调(暂未实现具体逻辑)* @param {Object} args - 路由参数*/success(args) {// console.log('routeInterceptor-success', args)// 可在此处添加路由跳转成功后的跟踪逻辑},/*** 路由跳转失败回调(暂未实现具体逻辑)* @param {Error} err - 错误对象*/fail(err) {// console.log('routeInterceptor-fail', err)// 可在此处添加路由跳转失败的异常处理},/*** 路由跳转完成回调(无论成功失败都会触发,暂未实现具体逻辑)* @param {Object} res - 结果对象*/complete(res) {// console.log('routeInterceptor-complete', res)// 可在此处添加路由跳转完成的统一处理}
}// 为四种路由跳转方法添加拦截器
uni.addInterceptor('navigateTo', routeInterceptor) // 添加普通跳转拦截
uni.addInterceptor('redirectTo', routeInterceptor) // 添加重定向跳转拦截
uni.addInterceptor('reLaunch', routeInterceptor) // 添加重新启动应用拦截
uni.addInterceptor('switchTab', routeInterceptor) // 添加切换 Tab 页拦截
在main.js
引入 import './utils/route.js'
注意事项:
- 确保 getUmsToken 方法能正确获取 token
- 登录页路径需要与实际路由配置一致
- 可以根据需要扩展 success/fail/complete 的逻辑
- 在不需要拦截的路由(如公开页面)可以不做特殊处理