首页 > 其他分享 >Vue学习:实现用户没有登陆时,访问后自动跳转登录页面

Vue学习:实现用户没有登陆时,访问后自动跳转登录页面

时间:2023-02-22 22:24:18浏览次数:47  
标签:Vue 登录 跳转 auth router import 页面

设计思路

  1. 定义路由的时候配置属性,这里使用needLogin标记访问页面是否需要登录
  2. 设置路由守卫,每个页面在跳转之前都要经过验证,校验用户信息是否存在,不存在跳转到登录页
  3. 用户登录后将用户信息存储在localStorage
  4. 退出登录后,将用户信息清空

 

 代码实现

1、router文件夹的index.js文件中

  • 在router中每个地址在meta属性中配置needLogin熟悉,判断访问页面是否需要登录
  • 404页面放在最后,匹配所有链接,实现输入不存在的地址时自动跳转404页面
import Vue from 'vue'
import Router from 'vue-router'
import LoginCard from "../components/LoginCard";
import Home from "../components/Home";
import ErrorPage from "../components/ErrorPage";

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'LoginCard',
      component: LoginCard,
      meta: {
        needLogin: false
      }
    },
    {
      path: '/loginCard',
      name: 'LoginCard',
      component: LoginCard,
      meta: {
        needLogin: false
      }
    },
    {
      path: '/home',
      name: 'Home',
      component: Home,
      meta: {
        needLogin: true
      }
    }, {
      path: '/*',
      name: 'ErrorPage',
      component: ErrorPage,
      meta:{
        needLogin: false
      }

    }
  ]
})

 

2、在main.js中定义一个路由前置守卫,每次跳转页面进行判断,没有登陆自动挑战登陆界面

import Vue from 'vue'
import App from './App'
import router from './router'
import VueRouter from "vue-router";
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import * as auth from './utils/auth'
import store from './store'
import Vuex from "vuex";

Vue.config.productionTip = false;
Vue.use(ElementUI);
Vue.use(VueRouter);
Vue.use(Vuex)


//这个方法需要放在new Vue之前,不然按F5刷新页面不会调用这个方法
router.beforeEach(function (to, from, next) {
  console.log('是否需要登录才能访问')
  if (to.meta.needLogin) {
    if (auth.getAdminInfo()) {
      console.log(auth.getAdminInfo())
      console.log('有cookie信息')
      next();
    }else {
      console.log('无cookie信息')

      next({
        path:'/loginCard'
      });
    }
  }else{
    next();
  }
})

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

 

3、编写一个存储数据的工具,使用cookie存储用户登录后的信息

import Cookies from 'js-cookie'


const adminInfo = "adminInfo"

//获取用户信息
export function getAdminInfo() {
  const admin = Cookies.get(adminInfo)
  if(admin){
    return JSON.parse(admin)
  }
  return ''
}
//存储用户信息
export function setAdminInfo(admin) {
  return Cookies.set(adminInfo, JSON.stringify(admin))
}
//移除用户信息
export function removeAdminInfo() {

  return Cookies.remove(adminInfo)
}

 

4、写一个登录页面,用户登录后就将数据存储在cookie中

 <template>
  <div>
    <el-form ref="loginForm" :rules="formRules" :model="loginUser" label-width="80px" class="login-box">
      <h3 style="margin-bottom: 50px">欢迎登录</h3>
      <el-form-item label="用户名" prop="username">
        <el-input prefix-icon="el-icon-user" type="text" v-model="loginUser.username"  placeholder="请输入用户名" :maxlength="50" clearable></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input prefix-icon="el-icon-lock" type="password" v-model="loginUser.password"  placeholder="请输入密码" :maxlength="50" clearable>
        </el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">登陆</el-button>
        <el-button icon="" @click="resetForm">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import * as auth from '../utils/auth'
export default {
  name: 'LoginCard',
  data() {
    return {
      loginUser: {
        username: '',
        password: '',
      },
      formRules: {
        //制定表单输入的规则
        username: [{required: true, message: '用户名不能为空', trigger: 'blur'}],
        password: [{required: true, message: '密码不能为空', trigger: 'blur'}]
      }
    }
  },
  methods: {

    onSubmit() {
      //判断表单是否符合规则
      this.$refs['loginForm'].validate((valid) => {
          if (valid) {
            if (this.loginUser.username !== '123456' || this.loginUser.password !== '123456'){
              this.$message({
                message:'账号或密码错误',
                type: 'error',
              });
              return;
            }
            auth.setAdminInfo(this.loginUser);
            this.$router.push({path:'/home'});
          }
        }
      )
    },
    resetForm(){
      this.$refs['loginForm'].resetFields();
    },
  }
}
</script>
<style scoped>
.login-box {
  border: 1px solid #DCDFE6;
  width: 400px;
  margin: 180px auto;
  padding: 35px 35px 15px 35px;
  border-radius: 5px;
}
</style>

 

5、编写一个退出页面,用户退出以后,将用户信息从cookie中去除,跳转到登陆页面

 <template>
  <div>
    <h1>主页面</h1>
    <el-button @click="logout">退出登录</el-button>
  </div>
</template>
<script>
import * as auth from '../utils/auth'

export default {
  name : 'Home',
  data() {
    return {
    };
  },
  methods: {
    logout(){
      auth.removeAdminInfo();
      this.$router.push({path:'/loginCard'});
    }
  },
  mounted() {
  }
}
</script>

 

基本目录结构是这样的

标签:Vue,登录,跳转,auth,router,import,页面
From: https://www.cnblogs.com/davidFB/p/17136608.html

相关文章

  • vue8
    今日内容概要vue3介绍vue3创建项目setup函数ref和reactive计算属性和监听属性生命周期toRefsscriptsetup的作用和lang=tsvue后台管理模板今日内容详细vue3介......
  • vue基础:props配置项、mixin(混入)、插件、elementui使用(重点)、localStorage和sessionS
    目录一、props配置项1、安装依赖2、做一个纯净的vue项目3、自定义属性之props配置项二、mixin(混入)前置操作局部混入全局混入三、插件前置操作自定义指令(了解,不了解没关系)定......
  • vue3介绍-vue3创建项目-setup函数-ref和reactive-计算属性和监听-生命周期-toRefs-scr
    目录vue3介绍-vue3创建项目-setup函数-ref和reactive-计算属性和监听-生命周期-toRefs-scriptsetup的作用和lang=ts-vue后台管理模板昨日内容回顾今日内容概要今日内容详......
  • 前端之Vue day07 混入、插件、elementui、Router、Vuex
    一、Props补充1.父传子在子组件标签上起自定义属性使用数组就不演示了,太简单了2.限制传入的数据类类型使用对象同样,展示过的3.props补充就是套对象,加以限制prop......
  • vue3.x基本使用
    今日内容vue3介绍#1vue项目的版本新项目使用vue3有部分来项目使用2#vue3的变化1.性能的提升 -打包大小减少41% -初次渲染快55%,更新渲染快133%......
  • vue框架08 vue3
    vue3的介绍#vue项目的版本,新项目使用vue3,部分老项目使用vue2#vue3的变化1.性能的提升-打包大小减少41%-初次渲染快55%,更新渲染块133%......
  • vue_day08 vue3基本使用了解
    目录今日内容详细一、vue3介绍二、vue3创建项目1.使用vue-cli2.vite三、setup函数1.scriptsetup的作用和lang=ts四、ref和reactive五、计算属性和监听属性1.计算属性2.......
  • 【Vue Router】019-动态路由 和 学习总结
    1.19动态路由1.19.1概述添加路由到你的路由上通常是通过​​routes​​​,但是在某些情况下,你可能想在应用程序已经运行的时候添加或删除路由。具有可扩展接口(如​​Vue......
  • 【Vue Router】017-扩展 RouterLink*
    1.17扩展RouterLink*1.17.1概述RouterLink组件提供了足够的​​props​​​来满足大多数基本应用程序的需求,但它并未尝试涵盖所有可能的用例,在某些高级情况下,你可能会......
  • 【Vue Router】018-等待导航结果*
    1.18等待导航结果*这个功能还是很有用的!1.18.1概述当使用​​router-link​​​组件时,VueRouter会自动调用​​router.push​​来触发一次导航。虽然大多数链接的预......