vue登陆登出指南

作者: AkiraSun | 来源:发表于2017-09-13 11:25 被阅读643次

    最近接手的B端项目选择了vue来做,此项目使用element ui Message等为组件 望周知

    需求

    登陆成功后跳转至首页
    首页不能手动跳转至登陆页
    登陆后跳转至目标页面

    此次B端SPA项目把ak存在localstorage中
    1.登陆的跳转利用全局钩子router.beforeEach

    //router.js
    router.beforeEach((to, from, next) => {
      // 若userkey不存在并且前往页面不是登陆页面,进入登陆
      // 若userkey存在并且前往登陆页面,进入主页
      const userKey = localStorage.getItem('userKey')
      if (!userKey && to.path !== '/login') {
        next({
          path: '/login',
          query: { redirect: to.fullPath }
        })
      } else if (userKey && to.path === '/login') {
        next({ path: '/' })
      } else {
        next()
      }
    })
    

    上面使用了query带上目标参数
    例子:#/login?redirect=%2Fapp
    在登陆提交处还得对redirect参数进行处理

    //若验证成功跳转
     var redirect = decodeURIComponent(this.$route.query.redirect || '/')
              self.$router.push({
                //  你需要接受路由的参数再跳转
                path: redirect
              })
    

    需求

    若ak失效后发送请求时弹出失效弹出框返回到登陆页面

    以下做了个简单的例子若请求返回的参数带0则登陆失效

    // respone拦截器
    axios.interceptors.response.use(
      response => {
        console.log(response)
        const data = response.data
        if (data.status === 0) {
          MessageBox.alert('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
            confirmButtonText: '确定',
            type: 'warning'
          }).then(() => {
            localStorage.clear()
            router.replace({
              path: '/login'
            })
            return
          }).catch(() => {
            localStorage.clear()
            router.replace({
              path: '/login'
            })
          })
        } else {
          return response
        }
      },
      error => {
        if (error && error.response) {
          switch (error.response.status) {
            case 400:
              error.message = '请求错误'
              break
            case 401:
              error.message = '未授权,请登录'
              break
            case 403:
              error.message = '拒绝访问'
              break
            case 404:
              error.message = (process.env.NODE_ENV === 'production' ? `请求地址出错` : `请求地址出错: ${error.response.config.url}`)
              break
            case 408:
              error.message = '请求超时'
              break
            case 500:
              error.message = '服务器内部错误'
              break
            case 501:
              error.message = '服务未实现'
              break
            case 502:
              error.message = '网关错误'
              break
            case 503:
              error.message = '服务不可用'
              break
            case 504:
              error.message = '网关超时'
              break
            case 505:
              error.message = 'HTTP版本不受支持'
              break
            default:
          }
          Message({
            message: error.message,
            type: 'error',
            duration: 5 * 1000
          })
        }
        return Promise.reject(error)
      }
    )
    

    需求

    手动登出

     loginOut() {
          var self = this
          this.$confirm('您确定要退出吗?', '退出管理平台', {
            confirmButtonText: '确定',
            cancelButtonText: '取消'
          }).then(() => {
            const info = {
              'userkey': localStorage.getItem('userKey')
            }
            self.$store.dispatch('LogOut', info).then(() => {
              self.$router.push({ path: '/login' })
            }).catch(() => {
            })
          }).catch(() => {
    
          })
        }
    

    简单的登陆登出结束啦~欢迎提isssue~

    相关文章

      网友评论

      • 有很多妹妹的人a:请问一下你那个MessageBox怎么实现的,没有Dom的环境下,不是很明白,是要自己create吗
        L_93c5:@有很多妹妹的人a 那个就是element-ui库中的一个组件。你搜索下去官网看看就知道了

      本文标题:vue登陆登出指南

      本文链接:https://www.haomeiwen.com/subject/qalksxtx.html