【VUE】一定时间无操作自动登出

先看效果 

程序目录

这里用到了Vuex,用于更新页面显示的倒计时,当然页面不显示不用也可以。Vuex相关文章前面有介绍,在此就简单描述了

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);
export default new Vuex.Store({
  state:{
    user:{
      second:0, //倒计时用于界面更新用 如果不需要界面更新则不需要使用此数据
    }
  },
  mutations:{
    setSecond(state,second){
      state.user.second=second;
    }
  },
  getters:{
    userSecond(state){
      return state.user.second
    }
  }
})

除此之外主要内容就分为两块:一个是自己写的一个关于登陆登出的loginBll(因为以前是干后端的所以就这么命名了ヽ(ー_ー)ノ),另一块就是路由守卫与一个定时器。

路由守卫

路由守卫写在了main.js中了

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import loginBll from './loginBll'

Vue.config.productionTip = false


Vue.prototype.$store = store;
Vue.prototype.$loginBll = loginBll;
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: {App},
  template: '<App/>',
  mounted() {
    this.$loginBll.init(this.$store);
    //一定时间没有操作退出
    setInterval(() => {
      if (this.$route.path != '/') {
        if (localStorage.getItem('second') > 0) {
          this.$loginBll.secondDiff();
        } else {
          this.$loginBll.logout();
          this.$router.push('/');
        }
      }
    }, 1000)
    //后置路由钩子用于时间内浏览器打开 页面也能正常使用
    this.$router.afterEach((to, from) => {
      let name = localStorage.getItem('name');
      if (to.path != '/' && name) {
        this.$loginBll.restoreSecond();
      }
    })
  }
})
//路由守卫
router.beforeEach((to, from, next) => {
  let name = localStorage.getItem('name');
  if (name == null) {
    if (to.path == '/') {
      next();
    } else {
      next('/');
    }
  } else {
    next();
  }
})

loginBll

为了在此处能控制Vuex中的数值变化,故通过init方法将store传入。

export default {
  store:null,
  allSecond:10,//倒计时总秒数
  init(store){
    this.store=store;
  },
  /***
   * 倒计时减秒
   * @returns 剩余秒数
   */
  secondDiff() {
    if (!this.store){
      console.error('incorrect init')
      return;
    }
    let second = localStorage.getItem('second');
    if (second && second > 0) {
      localStorage.setItem('second', --second)
    }
    this.store.commit('setSecond',second);
  },
  /***
   * 登录
   * @param name 用户名称
   */
  login(name) {
    if (!this.store){
      console.error('incorrect init')
      return;
    }
    localStorage.setItem('name', name);
    this.store.commit('setSecond',this.allSecond);
    localStorage.setItem('second', this.allSecond)

  },
  /***
   *退出登录
   */
  logout() {
    localStorage.removeItem('name');
    localStorage.removeItem('second')
  },
  /***
   * 重新计时
   */
  restoreSecond(){
    if (!this.store){
      console.error('incorrect init')
      return;
    }
    this.store.commit('setSecond',this.allSecond);
    localStorage.setItem('second',this.allSecond);
  }
}

这里为什么用localStorage记录时间与用户名称而不用Vuex直接记录那,因为Vuex在每次刷新页面的时候都会回复原状,这与登陆要求不符,所以使用能够跨浏览器标签并且刷新不会丢失的localStorage来记录用户登陆与计时信息。

 

登录页

<template>
  <div class="login-main">
    <div>
      <input placeholder="name" v-model="name">
    </div>
    <div>
      <input type="password" placeholder="password" v-model="password">
    </div>
    <div>
      <button @click="login">login</button>
    </div>
  </div>
</template>

<script>
    export default {
        name: "Login",
        data() {
            return {
                name: 'admin',
                password: 123
            }
        },
        methods: {
            login() {
                if (this.name == 'admin' && this.password == 123)
                {
                    this.$loginBll.login(this.name);
                }
                this.$router.push('/hello')
            }
        }
    }
</script>

<style scoped>
  .login-main {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -100%);
  }

  .login-main > div {
    margin-top: 10px;
  }
</style>

主页

<template>
  <div class="hello-main">
    倒计时 <strong>--{{$store.getters.userSecond}}秒--</strong>返回登录页
    <div>
      <button @click="doSomeThing">操作</button>
    </div>
  </div>
</template>

<script>
    export default {
        name: 'HelloWorld',
        data() {
            return {}
        },
        methods: {
            doSomeThing() {
              this.$loginBll.restoreSecond();
            }
        }
    }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  .hello-main {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -100%);
    text-align: center;
  }
</style>

 

 

其实这段代码是有bug的,应该但对每个用户单独计数的,现在所有用户都共用一个second,但这里就是一个demo (✪ω✪)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue-element-admin中,登出操作通常是通过调用一个名为logout的方法来实现的。这个方法会执行一系列的操作,包括清除用户的登录状态、清空用户信息、重定向到登录页面等。具体的实现可能会根据项目的需求而有所不同,但通常会涉及到以下几个步骤: 1. 清除用户的登录状态和用户信息:在logout方法中,会调用一些方法来清除用户的登录状态和用户信息,比如清除本地存储中的token、清空vuex中的用户信息等。 2. 重定向到登录页面:在logout方法中,会使用路由的push方法将用户重定向到登录页面,让用户重新登录。 3. 其他操作:根据具体需求,可能还会执行一些其他的操作,比如清除一些缓存数据、取消未完成的请求等。 总的来说,vue-element-admin的登出操作是通过调用logout方法来实现的,这个方法会清除用户的登录状态和用户信息,并将用户重定向到登录页面。具体的实现可能会根据项目的需求而有所不同。 #### 引用[.reference_title] - *1* *2* *3* [(3)vue-element-admin:权限管理(登录登出,动态路由过程讲解)](https://blog.csdn.net/qq_42499670/article/details/119542766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值