实现未登录跳转回login页

问题:未登陆直接输入url:地址进入网站
vue项目实例:
一,设置router
1.首先配置路由
/src/router/index.js文件

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
 routes: [
  {
   path: '/',// 登录
   name: 'Login',
   component: resolve => require(['@/PACS/pages/Login'],resolve)
  },{
   path: '/home',
   name: 'Home',
   meta: {
    requireAuth: true, // 判断是否需要登录
   },
   component: resolve => require(['@/PACS/pages/Home'],resolve)
  } 
  ]
})
 ## 增加了字段 requireAuth 用来判断该路由是否需要登录

2.通过导航守卫钩子beforeEach进行登陆验证,另外这里如果用户登录成功之后,token会默认放在vuex中的getters中,所以在导航守卫中判断对应getters是否存在,如果存在,证明用户已登录,允许用户进入该路由。否则就跳转登陆页,登陆成功后直接跳转到该页面

// 路由判断登录 根据路由配置文件的参数
// 路由判断登录 根据路由配置文件的参数
router.beforeEach((to, from, next) => {
 if (to.matched.some(record => record.meta.requireAuth)){ // 判断该路由是否需要登录权限
  console.log('需要登录');
  if (!store.getters.getToken) { // 判断当前的token是否存在 ; 登录存入的token
   next({
    path: '/',
    query: {redirect: to.fullPath} // 将跳转的路由path作为参数,登录成功后跳转到该路由
   })
  }  else {
        let redirect='';
        //如果有参数,或导致to.path相同路径时,但不相等
        if(from.query.redirect){
           if(from.query.redirect.includes('?')){
              redirect=from.query.redirect.split('?')[0]
           }else{
              redirect=from.query.redirect;
           }
           if(to.path===redirect){   //防止无限循环
             next();
           }else{
                 next({path:from.query.redirect}); //跳转到目的路由
           }
        }
  }
 } else {
  next();
 }
});


遍历to.matched数组,是为了保正匹配到的所有路由信息,;所以只要给较高一级 的路由配置requiresAuth即可,其下的所有子路由不必添加

二,存储token
用户通过网页表单提交用户名和密码,后台根据提交的数据生成token,前端调用vuex的changeLogin方法将后台返回的token数据保存到localstorage中,并更新store中state的Authorization。

login.vue

<template>
    <div class="login-wrap">
        <div class="ms-login">
            <el-form :model="loginForm" :rules="rules" ref="loginForm" label-width="0px" class="ms-content">
                <el-form-item prop="loginName">
                    <el-input v-model="loginForm.loginName" placeholder="用户名">
                        <el-button slot="prepend" icon="icon-d-wo1"></el-button>
                    </el-input>
                </el-form-item>
 
                <el-form-item prop="password">
                    <el-input type="password"  v-model="loginForm.password" placeholder="密码">
                        <el-button slot="prepend" icon="icon-d-yuechi1"></el-button>
                    </el-input>
                </el-form-item>
 
                <div class="login-btn">
                    <el-button type="primary" @click="login">登录</el-button>
                </div>
            </el-form>
        </div>
    </div>
</template>
 
<script>
    import axios from 'axios'
    import { mapMutations } from 'vuex';
    export default {
        data: function(){
            return {
                loginForm: {
                    loginName: '',
                    password: ''
                },
                userToken:'',
                rules: {
                    loginName: [
                        { required: true, message: '请输入用户名', trigger: 'blur' }
                    ],
                    password: [
                        { required: true, message: '请输入密码', trigger: 'blur' }
                    ]
                }
            }
        },
        methods: {
            ...mapMutations(['changeLogin']),
            login(){
                if(this.loginForm.loginName === '' || this.loginForm.password === ''){
                    alert('账号或密码不能为空');
                }else{
                    axios({
                        method: 'post',
                        url: '/admin/login',
                        params:{
                            loginName: this.loginForm.loginName,
                            password: this.loginForm.password   
                        },
                        headers:{
                            'Content-type':'application/x-www-form-urlencoded'
                        }
                    }).then(res=>{
                        console.log(res.data);
                        this.$router.push('/home');
                       
                        this.userToken = window.btoa(res.data.data.token); //使用base64加密
                        
                        //将用户token保存到vuex中
                        this.changeLogin({Authorization: this.userToken });
                            
                    }).catch(error=>{
                        console.log(error)
                    })
                }
            }
        }
    }
</script>

store/index.js

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 
const store = new Vuex.Store({
 
  state: {
    // 存储token
    Authorization: localStorage.getItem('Authorization') ? localStorage.getItem('Authorization') : ''
  },
 
  mutations: {
    // 修改token,并将token存入localStorage
    changeLogin (state, user) {  //这里的state对应上面状态state
      state.Authorization = user.Authorization;
      localStorage.setItem('Authorization', user.Authorization);
    }
  },
  getters:{
    getToken:state=>{
    return state.Authorization
    }
  }
});
 
export default store
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值