vuex+localStorage实现登陆状态保持


项目根目录package.json中加入依赖,然后cnpm install

目录结构

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import VueResource from 'vue-resource'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import store from './store/store'
Vue.use(ElementUI);
Vue.use(VueResource);
Vue.config.productionTip = false;
Vue.http.get('http://192.168.10.128:8000/api/login').then(response => {});
let djangocookie=getCookie('csrftoken');
Vue.http.headers.common['X-CSRFToken'] = djangocookie;//这里设置请求头
router.beforeEach((to, from, next) => {    //未登陆拦截
if (to.path === '/login') {
    next()
  } else {
    if (!store.state.user ) {
      next({ path: '/login' })
    } else {
      next()
    }
  }
});
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
});
function getCookie(name){  //获取cookie函数
    name = name + "=";
    let start = document.cookie.indexOf(name),
        value = null;
    if(start>-1){
        let end = document.cookie.indexOf(";",start);
        if(end === -1){
            end = document.cookie.length;
        }
        value = document.cookie.substring(start+name.length,end);
    }
    return value;
}

store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default  new Vuex.Store({
  state: JSON.parse(localStorage.getItem('user')) || {},
  mutations: {
    Login(state, user) {
      localStorage.setItem('user', JSON.stringify(user));
      Object.assign(state, user)
    },
    Logout(state) {
      localStorage.removeItem('user');
      Object.keys(state).forEach(k => Vue.delete(state, k))
    }
  },
  actions: {
    login({commit}, user) {
      commit("Login", user)
    },
    logout({commit}) {
      commit("Logout")
    }
  }
})

login.vue

<template>
  <div class="main">
    <div class="login">
    <h1>应用管理系统</h1>
      <div class="inset"  >
  <el-form class="el-form" ref="form" >
      <h2>管理登录</h2>
    <el-form-item label="用户"  prop="name">
        <el-input type="text" auto-complete="off" class=input_text v-model="authInfo.username" placeholder="请输入用户名"></el-input>
    </el-form-item>
    <el-form-item label="密码"  prop="password">
        <el-input type="password"  class=input_text auto-complete="off" v-model="authInfo.password" placeholder="请输入密码"></el-input>
    </el-form-item>
    <el-form-item>
      <div class="sign">
        <!-- 点击进行登录提交 -->
        <el-button  class="submit" type="primary" @click="submit" >登录</el-button>
        <div style="color: red">{{req.msg}}</div>
        <!-- 点击重置表单 -->
    </div>
    </el-form-item>
</el-form>
    </div>
</div>
    </div>
</template>
<script>
  import { mapActions } from 'vuex'
//  import { USER_SIGNIN } from '../store/store'
  import crypto from 'crypto'
  export default {
    data() {
      return {
        DjangoCookie:null,
        books: [],
        authInfo: {
          username: null,
          password: null
        },
        req: {
          msg: null,
        },
        form: {
          user: null
        }
      }
    },
    methods: {
      ...mapActions(["login"]),
      getmd5(pwd) {
        let md5 = crypto.createHash("md5");
        md5.update(pwd);
        let a = md5.digest('hex');
        return a
      },
      submit: function () {
        let pwd = this.authInfo.password;
        this.authInfo.password = this.getmd5(pwd);
        let formData = JSON.stringify(this.authInfo); // 这里才是你的表单数据
        this.$http.post('http://192.168.10.128:8000/api/login', formData).then((response) => {
          // success callback
          this.req.msg = response.data.msg;
          this.req.respCode = response.data['resp_code'];
          if (this.req.respCode === "0000") {
            this.form.user = response.data.username;
            this.$store.dispatch("login", this.form); //将user保存到store
            this.$router.push({path: '/manage'});
          }
        }, (response) => {
//               console.log("error");
          // error callback
        });
      },

    },
  }
  function getCookie(name){  //获取cookie函数
    name = name + "=";
    let start = document.cookie.indexOf(name),
        value = null;
    if(start>-1){
        let end = document.cookie.indexOf(";",start);
        if(end === -1){
            end = document.cookie.length;
        }
        value = document.cookie.substring(start+name.length,end);
    }
    return value;
}
</script>

manage.vue 退出

<template>
  <div>
    <el-menu
      router
      default-active="$route.path"
      class="el-menu-demo"
      mode="horizontal"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b">
      <el-menu-item index="/manage/javamanage">java应用</el-menu-item>
      <el-menu-item index="/manage/jenkinsmanage" >jekins</el-menu-item>
      <el-menu-item index="" class="floatR" @click="loginOut">注销</el-menu-item>
      <el-menu-item  index="" class="floatR">{{user}}</el-menu-item>
    </el-menu>
    <keep-alive>
      <router-view/>
    </keep-alive>
  </div>
</template>

<style>
  .floatR{
    float: right !important;
}
</style>
<script>
  import { mapState } from 'vuex'
  export default {
//    data() {
//      return {
//        activeIndex: '1',
//        activeIndex2: '1'
//      }
    computed: mapState({ user: state => state.user }),
    data(){
    return{
      userName: sessionStorage.userName
    }
  },
  methods:{
    loginOut() {
  this.$confirm('您确定要退出吗?', '退出管理平台', {
   confirmButtonText: '确定',
   cancelButtonText: '取消'
  }).then(() => {
   const info = {
    'user': sessionStorage.getItem('user')
   };
   this.$store.dispatch('logout', info).then(() => {
    this.$router.push({ path: '/login' })
   }).catch(() => {
   })
  }).catch(() => {

  })
 }

  }
  }
</script>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM