解读vue-element-admin登录逻辑permission.js

解读vue-element-admin登录逻辑permission.js

- vue-element-admin中,permission主要负责全局路由守卫和登录判断,希望通过以下注释说明,帮助大家理解这个文件的逻辑

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' 
import 'nprogress/nprogress.css' 
//auth文件主要依赖js-cookie模块,把getToken,setToken,removeToken设置在这里
import { getToken } from '@/utils/auth' 
//get-page-title文件主要是网站的标题,get-page-title通过依赖setting.js里的title变量修改网站标题
//如果需要更改网站的标题,可以直接到setting.js修改title属性
import getPageTitle from '@/utils/get-page-title'

//NProgress是封装的进度条,基本不用动
NProgress.configure({ showSpinner: false }) 

//路由白名单列表,把路由添加到这个数组,不用登陆也可以访问
const whiteList = ['/login'] 


router.beforeEach(async(to, from, next) => { 
  // 请求路由时进度条开始
  NProgress.start()

  // 设置标题
  document.title = getPageTitle(to.meta.title)

  // 这里的getToken()就是在上面导入的auth.js里的getToken()方法
  const hasToken = getToken()

//如果存在token,即存在已登陆的令牌
  if (hasToken) {
  //如果用户存在令牌的情况请求登录页面,就让用户直接跳转到首页,避免存在重复登录的情况
    if (to.path === '/login') {
      // 直接跳转到首页,当然取决于你的路由重定向到哪里
      next({ path: '/' })
      //一定要关闭进度条
      NProgress.done()
    } else {
      //如果已经有令牌的用户请求的不是登录页,是其他页面
      //就从Vuex里拿到用户的信息,这里也证明用户不是第一次登录了
      const hasGetUserInfo = store.getters.name
      if (hasGetUserInfo) {
      //信息拿到后,用户请求哪就跳转哪
        next()
      } else {
        try {
          // 如果有令牌,但是没有用户信息,证明用户是第一次登录,通过Vuex设置用户信息
          await store.dispatch('user/getInfo')
		//设置好了之后,依然可以请求哪就跳转哪
          next()
        } catch (error) {
          // 如果出错了,把令牌去掉,并让用户重新去到登录页面
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          //关闭进度条
          NProgress.done()
        }
      }
    }
  } else {
    //这里是没有令牌的情况
    //还记得上面的白名单吗,现在起作用了
    //whiteList.indexOf(to.path) !== -1)判断用户请求的路由是否在白名单里
    if (whiteList.indexOf(to.path) !== -1) {
      // 不是-1就证明存在白名单里,不管你有没有令牌,都直接去到白名单路由对应的页面
      next()
    } else {
      // 如果这个页面不在白名单里,直接跳转到登录页面
      next(`/login?redirect=${to.path}`)
      //关闭进度条
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  //每次请求结束后都需要关闭进度条
  NProgress.done()
})

刚开始使用这个框架的时候会有种一层套一层的感觉,希望这个注释能帮助大家理解。

  • 63
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
根据引用\[1\]和引用\[2\]的内容,可以得出以下结论: 1. 实现思路是前端调用登录接口,成功登录后,后端返回当前登录用户所拥有的菜单信息和token等。前端将用户菜单信息动态存储到VUEX中,并在permission.js权限文件中实现动态路由。 2. 具体实现中,后端返回的菜单信息是以JSON格式返回的。这意味着后端返回的数据应该是一个JSON对象,包含了菜单的相关信息。 根据你提供的问题"vue-element-admin登录info访问失败",可能有以下几个原因导致访问失败: 1. 登录接口调用失败:请确保前端调用登录接口的代码正确,并且能够成功发送请求到后端。 2. 后端返回的数据格式错误:请确保后端返回的数据是一个合法的JSON对象,并且包含了菜单的相关信息。 3. 前端存储数据错误:请确保前端将后端返回的菜单信息正确地存储到VUEX中,并且在permission.js权限文件中正确地实现了动态路由。 综上所述,你可以检查以上几个方面的问题,以确定导致"vue-element-admin登录info访问失败"的具体原因,并进行相应的修复。 #### 引用[.reference_title] - *1* *2* [vue-element-admin 动态路由 vue-element-admin 配置 动态路由 vue-element-admin 实现 动态路由 vue-...](https://blog.csdn.net/qq_40739917/article/details/125943971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值