Cookie
里,下次用户再向服务端发送请求时能够带着这个Cookie
,这样服务端会验证该Cookie
里的信息,若是找到对应的记录,说明用户经过了身份验证,就把用户请求的数据返回给客户端Session
,须要再服务端按期清理过时的Session
Token
,再把这个Token
发送给客户端Token
之后能够把它存储起来,好比放在Cookie
里或者Local Storage
里Token
Token
,若是验证成功,就向客户端返回请求的数据token
存入本地cookie
中,能够保证每次刷新时用户登陆状态不丢失token
,还能够获取到用户的其余信息点击`handleLogin`触发`vuex`中`actions`的`Login`派发行为
复制代码
handleLogin() {
this.$store
.dispatch('Login', this.loginForm)
.then(() => {
this.$router.push({ path: '/' });
})
.catch(() => {
})
}
复制代码
而后回到vuex
,这里的store.js
改为store
文件夹,分模块管理vuex
javascript
// 文件夹结构
|-- store
|-- modules
|-- getters.js
|-- index.js
复制代码
咱们划分出,app, user 两个模块,在 user 里控制用户的登陆信息,app 中存储应用的状态,如全局loading
或者控制第三方组件的全局大小,如element-ui
中的全局组件size
前端
// index.vue
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
中存储了登陆事件所需的事件和数据,handleLogin
事件触发的是modules
中user
模块的actions
,这里user.js
中的具体方法和state
数据,均是封装过的vue
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)
}
复制代码
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
复制代码
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'
})
}
复制代码
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
复制代码
本文仅供我的学习总结使用 参考:java
手摸手,带你用vue撸后台 系列二(登陆权限篇) )vuex