人资day5遇见的问题

179 阅读3分钟

在vue中,什么时候需要导出js文件

当js中定义了函数需要被其他模块调用的时候,需要用export导出js,如果只需要执行整页js语句,则不用导出,直接用import 'js文件名' 引入即可

登录路由守卫设置逻辑

在premission中设置路由控制

  • 首先导入路由,因为一会要使用router.beforeEach()//前置路由守卫 import router from '@/router'
  • 然后导入store,一会判断token是否获取到token import store from '@/store'
  • 分析逻辑
 var whiteList=['404','/login']
//---1---.在前置路由守卫中判断是否有token
router.beforeEach(to,from.next){
    if(store.getters.token){
        //---2---.如果有token,说明已经登录,判断访问的页面是否为login页面
        if(to.path === '/login'){
            //(1)如果是login页面,则直接跳转到首页
                next('/')
        }else{
            //(2)如果不是login页面,直接放行
                next()
        }
    }else{
        //---3---.如果没有token,说明没有登录
            if(whiteList.indexOf(to.path)){
            //--(1)--判断访问地址是否在白名单中,白名单提前以数组的方式设置出来(见第一行)
                //--(2)--如果存在于白名单中,则放行
                    next()
            }else{
                //如果不存在于白名单,则跳转到login登陆页面
                next('/login')
            }
    }
}

获取用户信息的逻辑

---1.----首先封装api
//获取用户信息不需要传递信息,但是需要token授权
//考虑到页面许多地方需要使用到token,所以我们在请求拦截器的地方设置携带token的请求头
实现代码:
--(1)--service.interceptors.request.use(config=>{
    //config是请求的配置信息
    if (store.getters.token) {
      // 判断是否有token
      // 注入token
      config.headers["Authorization"] = `Bearer ${store.getters.token}`;
    }
      return config; //这里必须返回的,不然没有配置信息
},error=>{
return Promise.reject(error)
})
//这样我们能在其他地方也不需要专门携带token去做请求了
--(2)--封装api略
---2---为了提高页面性能,我们不要每次登陆页面都访问服务器获取用户信息,如果之前没有获取过用户信息,才获取,判断方法:在vuex的user子模块中添加一个userinfo数组,用于保存用户信息,判断里面是否存在用户id ,如果没有,则请求数据
if(!store.getters.userid){
    store.dispatch('user/getuserinfo')
}

判断token是否过期

效果:当页面刷新或者用户登录的时候,判断token存在的时长,为了安全性,超过指定的时间,就让用户重新登陆

1.在auth.js中用cookie插件做两个方法,一个用于存储生成token并存储到本地的时间戳,一个用于读取这个时间戳,
//如果想存储到cookie中,要先创建一个key
const timeKey = "hrsaas-timestamp-key"; // 设置一个独一无二的key用于标记时间戳
//这个用来获取时间戳
export const getTimeStamp(){
    return Cookies.get(timeKey)
}
//这个用于将当前时间设置为时间戳
export const setTimeStamp(){
    return Cookies.set(timeKey,Date.now())
}
2.在判断是否有token的逻辑中判断时间戳的有效性,即在请求拦截器中判断
(1).首先我们需要设置一个限定时间,单位为毫秒
    const TimeOut=3000
(2).引入方法,设置一个函数,返回值为判断当前时间戳减去获取的时间戳是否大于timeKey
    function checkTimeOut(){
        const currentTIme = getTimeStamp()
        const nowTime = Date.now()
        return (nowTime - currentTime)/1000>TimeOut
    }
 (3)在判断是否存在token的true逻辑中引入上边的函数,如果为true则说明token已经过期了,则让用户重新登录
 if(checkTimeOut()){
     router.push('/login)
     //引入lotOut逻辑函数此处省略
    return Promise.reject(new Error("token超时了"));

     
 }