vue路由守卫+登录态管理实例分析


Posted in Javascript onMay 21, 2019

本文实例讲述了vue路由守卫+登录态管理。分享给大家供大家参考,具体如下:

在路由文件需要守卫的path后面加上meta

{path: '/home',component: home,meta:{requireAuth:true}}

在main.js里面加上

//路由守卫
router.beforeEach((to, from, next) => {
 console.log(to);
 console.log(from);
 if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
  if(JSON.parse(localStorage.getItem('islogin'))){ //判断本地是否存在access_token
   next();
  }else {
   next({
    path:'/login'
   })
  }
 }
 else {
  next();
 }
 /*如果本地 存在 token 则 不允许直接跳转到 登录页面*/
 if(to.fullPath == "/login"){
  if(JSON.parse(localStorage.getItem('islogin'))){
   next({
    path:from.fullPath
   });
  }else {
   next();
  }
 }
});

其中islogin是登录态,就是true or false,true表示登录,false表示未登录,存放在localStorage里面,因为localStorage里面只能存字符串,所以存进去的时候需要localStorage.setItem(‘islogin',JSON.stringify(islogin));将islogin变为String类型,取出来的时候需要将islogin转化为Boolean类型,就比如JSON.parse(localStorage.getItem(‘islogin'))这样。

那么还有一个问题,就是islogin登录态的管理,vue不能实时监测localStorage的变化,需要实时监测islogin的变化来在页面显示登录还是已经登录,我用的是vuex+localStorage来管理islogin。展示部分代码

//store.js中
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
 state:{
    //是否登录判断
    islogin:''
 },
 mutations:{
  login:(state,n) => {
    //传入登录状态islogin
    let islogin = JSON.parse(n);
    localStorage.setItem('islogin',JSON.stringify(islogin));
    console.log(islogin);
    state.islogin = islogin;
  }
 }
}

在需要改变登录态的页面只要触发上面这个login方法就可以了

//这里是登录
login() {
    let flag = true;
    this.$store.commit('login',flag);
    this.$router.push("/home");
    console.log("登录成功");
}
//这里是退出登录
exit() {
    let flag = false;
    this.$store.commit('login',flag);
    this.$router.push("/login");
    console.log("退出登录");
}

登录注册部分样式参考的element-ui

登录注册

<template>
    <div class="logReg">
    <!-- 登录 -->
        <div class="login" v-show="flag">
            <div class="login-title">登录</div>
            <el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" label-width="100px" class="login-ruleForm">
             <el-form-item label="账号" prop="count2">
              <el-input type="string" v-model="ruleForm2.count2" placeholder="请输入您的账号"></el-input>
             </el-form-item>
             <el-form-item label="密码" prop="pass2">
              <el-input type="password" v-model="ruleForm2.pass2" autocomplete="off" placeholder="请输入您的密码"></el-input>
             </el-form-item>
             <el-form-item>
              <el-button type="primary" @click="submitForm2('ruleForm2')">提交</el-button>
              <el-button @click="resetForm2('ruleForm2')">重置</el-button>
             </el-form-item>
            </el-form>
            <div @click="register()" class="toregister" >没有账号?<span>立即注册</span></div>
        </div>
        <!-- 注册 -->
        <div class="register" v-show="!flag">
            <div class="register-title">注册</div>
            <el-form :model="ruleForm1" status-icon :rules="rules1" ref="ruleForm1" label-width="100px" class="register-ruleForm">
             <el-form-item label="账号" prop="count1">
              <el-input type="string" v-model="ruleForm1.count1" placeholder="请输入您的账号"></el-input>
             </el-form-item>
             <el-form-item label="密码" prop="pass1">
              <el-input type="password" v-model="ruleForm1.pass1" autocomplete="off" placeholder="请输入您的密码"></el-input>
             </el-form-item>
             <el-form-item label="确认密码" prop="checkPass">
              <el-input type="password" v-model="ruleForm1.checkPass" autocomplete="off" placeholder="请确认您的密码"></el-input>
             </el-form-item>
             <el-form-item>
              <el-button type="primary" @click="submitForm1('ruleForm1')">提交</el-button>
              <el-button @click="resetForm1('ruleForm1')">重置</el-button>
             </el-form-item>
            </el-form>
            <div @click="register()" class="toregister" >已有账号?<span>立即登录</span></div>
        </div>
    </div>
</template>
<script>
    export default{
        name:'logReg',
        data() {
            //登录账号验证
       var validateCount2 = (rule, value, callback) => {
        if (value === '') {
         callback(new Error('请输入账号'));
        } else {
         if (value != "admin") {
             callback(new Error('账号不存在'));
         }
         //向后台请求验证账号是否存在
         callback();
        }
       };
       //登录密码验证
       var validatePass2 = (rule, value, callback) => {
        if (value === '') {
         callback(new Error('请输入密码'));
        } else {
        if (value != "admin") {
             callback(new Error('密码不正确'));
         }
         //向后台验证,也可以不处理
         callback();
        }
       };
       //注册账号验证
       var validateCount1 = (rule, value, callback) => {
        if (value === '') {
         callback(new Error('请输入账号'));
        } else {
         //向后台请求验证账号是否重复
         callback();
        }
       };
       //注册密码验证
       var validatePass1 = (rule, value, callback) => {
        if (value === '') {
         callback(new Error('请输入密码'));
        } else {
         if (this.ruleForm1.checkPass !== '') {
          this.$refs.ruleForm1.validateField('checkPass');
         }
         callback();
        }
       };
       //注册密码确认
       var validatePassCheck = (rule, value, callback) => {
        if (value === '') {
         callback(new Error('请再次输入密码'));
        } else if (value !== this.ruleForm1.pass1) {
         callback(new Error('两次输入密码不一致!'));
        } else {
         callback();
        }
       };
       return {
           flag:true,//登录注册切换
           //登录账号密码
        ruleForm2: {
         pass2: '',
         count2:''
        },
        //登录验证
        rules2: {
         count2: [
          { validator: validateCount2, trigger: 'blur' }
         ],
         pass2:[
             { validator: validatePass2, trigger: 'blur' }
         ]
        },
        ruleForm1: {
         count1: '',
         pass1: '',
         checkPass: ''
        },
        rules1: {
         count1: [
          { validator: validateCount1, trigger: 'blur' }
         ],
         pass1:[
             { validator: validatePass1, trigger: 'blur' }
         ],
         checkPass: [
          { validator: validatePassCheck, trigger: 'blur' }
         ]
        },
       };
      },
      methods: {
          //登录提交
       submitForm2(formName) {
        this.$refs[formName].validate((valid) => {
         if (valid) {
          console.log("提交成功");
          //提交成功之后操作
          let flag = true;
          this.$store.commit("login",flag);
          this.$router.push('/home');
          this.$message({
             message: '恭喜,登录成功',
             type: 'success'
            });
         } else {
          this.$message({
             message: '抱歉,登录失败',
             type: 'warning'
            });
          return false;
         }
        });
       },
       //登录框重置
       resetForm2(formName) {
        this.$refs[formName].resetFields();
       },
       //注册提交
       submitForm1(formName) {
        this.$refs[formName].validate((valid) => {
         if (valid) {
          this.$message({
             message: '恭喜,注册成功,请登录',
             type: 'success'
            });
          this.flag = !this.flag;
         } else {
          this.$message({
             message: '抱歉,注册失败',
             type: 'warning'
            });
          return false;
         }
        });
       },
       //注册框重置
       resetForm1(formName) {
        this.$refs[formName].resetFields();
       },
        //切换登录注册
          register() {
              this.flag = !this.flag;
          }
      },
     }
</script>
<style scoped>
    .el-button--primary {
      color: #fff;
      background-color: rgba(254, 112, 26, 0.8);
      border-color: rgba(254, 112, 26, 0.9);
    }
    .el-button:focus{
      color: #333;
      background-color: rgba(255, 255, 255, 0.1);
      border-color: #dcdfe6;
     }
     .el-button:hover{
        color: rgba(254, 112, 26, 1);
      background-color: rgba(255, 255, 255, 0.1);
      border-color: rgba(254, 112, 26, 0.9);
    }
    .el-button--primary:hover {
      color: #fff;
      background-color: rgba(254, 112, 26, 0.8);
      border-color: rgba(254, 112, 26, 0.9);
    }
    .el-button--primary:focus {
      color: #fff;
      background-color: rgba(254, 112, 26, 0.8);
      border-color: rgba(254, 112, 26, 0.9);
    }
    .register,
    .login{
        margin-top: 100px;
        margin-bottom: 100px;
        padding: 40px 0px 40px 0;
        background-color: #fff;
        width: 600px;
        margin: 100px auto;
        border-radius: 8px;
        box-shadow: 0px 0px 100px rgba(0,0,0,.1);
    }
    .register .register-title,
    .login .login-title{
        font-size: 1.65rem;
      line-height: 60px;
      font-weight: bold;
      white-space: nowrap;
      margin-bottom: 16px;
      color: #555;
/*      color: rgba(254, 112, 26, 0.8);*/
    }
    .register-ruleForm,
    .login-ruleForm{
        width: 500px;
        margin: 0 auto;
        padding: 0px 100px 0px 0;
    }
    .login .toregister{
        cursor: pointer;
    }
    /*注册*/
</style>

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中双叹号(!!)作用示例介绍
Apr 10 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
完全深入学习Bootstrap表单
Nov 28 Javascript
遍历json获得数据的几种方法小结
Jan 21 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
详解react使用react-bootstrap当轮子造车
Aug 15 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
angularjs http与后台交互的实现示例
Dec 21 Javascript
微信小程序云开发使用方法新手初体验
May 16 Javascript
vue实现跨域的方法分析
May 21 #Javascript
vue动态绑定class的几种常用方式小结
May 21 #Javascript
express启用https使用小记
May 21 #Javascript
使用express获取微信小程序二维码小记
May 21 #Javascript
小程序server请求微信服务器超时的解决方法
May 21 #Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 #Javascript
用node.js写一个jenkins发版脚本
May 21 #Javascript
You might like
用php解析html的实现代码
2011/08/08 PHP
如何使用Strace调试工具
2013/06/03 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
python文件操作之目录遍历实例分析
2015/05/20 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
交通专业个人自荐信格式
2013/09/23 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
单位推荐信范文
2015/03/27 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
python实现图片批量压缩
2021/04/24 Python
对PyTorch中inplace字段的全面理解
2021/05/22 Python
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python