【从0到1打造vue element-ui管理后台 】第二十七课 后台管理编写vuex状态管理

221 阅读1分钟

第二十七课 后台管理编写vuex状态管理

一、安装vuex

cnpm i vuex@3.1.3 -S

二、封装对token工具模块

src/utils/usertoken.js

const TOKEN_KEY  = "manager-token";
const USER_KEY = "manager-user";

//获取token
export function getToken(){
    return localStorage.getItem(TOKEN_KEY)
}

//保存token
export function setToken(token){
    return localStorage.setItem(TOKEN_KEY,token)
}

//获取用户信息
export function getUser(){
    return JSON.parse(localStorage.getItem(USER_KEY))
}

//保存用户信息
export function setUser(user){
    return localStorage.setItem(USER_KEY,JSON.stringify(user))
}

//移除用户信息
export function removeToken(){
    localStorage.removeItem('TOKEN_KEY')
    localStorage.removeItem('USER_KEY')
}

三、在store/modules/user.js新建文件

import {getToken,setToken,getUser,setUser,removeToken} from "@/utils/usertoken"

import {login,getUserInfo,logout} from  "@/api/login"

const state = {
    token:null,
    user:null
}

const mutations = {
    SET_TOKEN(state,token){
        state.token = token
    },
    SET_USER(state,user){
        state.user = user
    }
}

const actions = {
    Login({commit},form){
        login(form.username.trim(),form.password.trim()).then(reponse=>{
            const resp = reponse.data
            commit('SET_TOKEN',resp.data.token)
        })
    }
}

export default{
    state,
    mutations,
    actions
}

四、在store/index.js导入

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    user
  }
})

五、修改登录页面

view/login/index.vue

把原来的代码大部分注销,用this.$store.dispatch("Login",this.form)

onSubmitLogin() {
      this.$store.dispatch("Login",this.form).then(response=>{
        if(response.flag){
            this.$router.push("/")
        }else{
          this.$message({
            message:response.message,
            type:"warning"
          })
        }
      })
}

六、完善store/modules/user.js

const actions = {
    Login({commit},form){
        return new Promise((resolve,reject)=>{
            login(form.username.trim(),form.password.trim()).then(reponse=>{
                const resp = reponse.data
                commit('SET_TOKEN',resp.data.token);
                resolve(resp)
            }).catch(error=>{
                reject(error)
            })
        })
    }
}

七、完善permission.js

    const token = store.state.user.token

八、完善store/modules/user.js

const state = {
    token:getToken(),
    user:getUser()
}

GetUserInfo({commit,state}){
        return new Promise((resolve,reject)=>{
            getUserInfo(state.token).then(response=>{
                const respUser = response.data
                commit("SET_USER",respUser.data)
                resolve(respUser)
            })
        }).catch(error=>{
            reject(error)
        })
    }

九、src/permission.js

import router from './router/index.js'
import store from "./store/index.js"
router.beforeEach((to,from,next)=>{
    // const token = localStorage.getItem("manager-user");
    const token = store.state.user.token
    //没有获取到token
    if(!token){
        if(to.path !=='/login'){
            next({path:'/login'})
        }else{
            next()
        }
    }else{
        if(to.path =='/login'){
            next()
        }else{
            const userinfo = localStorage.getItem('manager-user');
            if(userinfo){
                next()
            }else{
                store.dispatch("GetUserInfo").then(response=>{
                    if(response.flag){
                        next()
                    }else{
                        next({path:"/login"})
                    }
                })
                // getUserInfo(token).then(response=>{
                //     const respUser = response.data
                //     if(respUser.flag){
                //         localStorage.setItem('manager-user',JSON.stringify(respUser))
                //         next()
                //     }else{
                //         next({path:'/login'})
                //     }
                // })
            }
        }
    }
})

十、src/store/user.js,编写退出系统的actios

Logout({commit,state}){
        return new Promise((resolve,reject)=>{
            logout(state.token).then(response=>{
                const resp = response.data
                commit("SET_TOKEN","")
                commit("SET_USER",null)
                removeToken()
                resolve(resp)
            }).catch(error=>{
                reject(error)
            })
        })
    }

十一、src/components/AppHeader/index.vue

注销logoutSystem函数中的localStorage.removeItem

logoutSystem(){
             if(response.flag){
              this.$router.push("/login");
            }else{
               this.$message({
                message: resp.message,
                type: "warning",
                duration: 1000,
              });
            }
          })
          this.$message("退出登录");
    },
    
  created() {
    this.userData = this.$store.state.user.user
  }