Vue后台管理项目(登录篇)

1. 逻辑思路

  • 登录
    用户提交登录信息之后,会向服务端发送请求,服务端的返回信息中会有一个token,前端将这个token存在cookie中后,可以保证刷新页面用户登录状态不丢失,这个token还可以用来获取用户的其他信息
  • 权限验证
    通过token,可以获取用户的权限以及权限对应的路由,这样就可以通过router.addRoutes动态挂载这些路由

2. 登录

  1. 登录事件
    点击handleLogin触发vuexactionsLogin派发行为
handleLogin() {
      this.$store
          .dispatch('Login', this.loginForm)
          .then(() => {
            this.$router.push({ path: '/' });
          })
          .catch(() => {
            
          })
    }
  1. store
    然后回到vuex,这里的store.js改成store文件夹
|-- store
  |-- modules
  |-- getters.js
  |-- index.js
  • index.js
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import getters from './getters'

Vue.use(Vuex)
const store = new Vuex.Store({
  modules: {
    user
  },
  getters
})

export default store
  • user.js
    user.js中存储了登录事件所需的事件和数据,handleLogin事件触发的是modulesuser模块的actions

3. request请求封装&请求登录

  1. 在utils/auth.js中封装设置cookie的方法
// 导入 Cookies
import Cookies from 'js-cookie'

// 设置 cookie name
const TokenKey = 'Admin-Token'

// 获取 Admin-Token 的 cookie
export function getToken() {
  return Cookies.get(TokenKey);
}

// setToken 
export function setToken(token) {
  return Cookies.set(TokenKey, token);
}

// 移除 token
export function removeToken() {
  return Cookies.remove(TokenKey)
}
  1. 在utils/request中封装axios请求设置
import axios from 'axios'
import store from '../store'
import { getToken } from '@/utils/auth'

const service = axios.create({
  baseURL: 'http://193.112.153.155:3001',
  timeout: 5000  // 请求超时时间
})
export default service
  1. 在api/login.js中封装登录api请求
import request from '@/utils/request'

export function login(username, password) {
  return request({
    url: '/user/login',
    method: 'post',
    data: {
      username,
      password
    }
  })
}

export function getInfo(token) {
  return request({
    url: '/user/info',
    method: 'get',
    params: { token }
  })
}

export function logout() {
  return request({
    url: '/user/logout',
    method: 'post'
  })
}
  1. 再回到modules/user.js中完成登录的store
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'

const user = {
  state: {
    token: getToken(),
    name: '',
    avatar: '',
    roles: []
  },

  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_NAME: (state, name) => {
      state.name = name
    },
    SET_AVATAR: (state, avatar) => {
      state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    }
  },

  actions: {
    // 登录
    Login({ commit }, userInfo) {
      const username = userInfo.username.trim()
      return new Promise((resolve, reject) => {
        login(username, userInfo.password).then(response => {
          const data = response.data;
          setToken(data.token)
          commit('SET_TOKEN', data.token);
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

    // 获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo(state.token).then(response => {
          const data = response.data
          if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', data.roles)
          } else {
            reject('getInfo: roles must be a non-null array !')
          }
          commit('SET_NAME', data.name)
          commit('SET_AVATAR', data.avatar)
          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    },

    // 登出
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
        logout(state.token).then(() => {
          commit('SET_TOKEN', '')
          commit('SET_ROLES', [])
          removeToken()
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

    // 前端 登出
    FedLogOut({ commit }) {
      return new Promise(resolve => {
        commit('SET_TOKEN', '')
        removeToken()
        resolve()
      })
    }
  }
}

export default user

本文仅供个人学习总结使用
参考:
vue+axios 实现登录拦截权限验证
手摸手,带你用vue撸后台 系列二(登录权限篇)

你可能感兴趣的:(Vue后台管理项目(登录篇))