目錄:
- permission.js 中返回 token
- 登錄是保存token:保存在vuex里、保存在cookie里。
- 路由守衛根據判斷token存不存在,判斷用戶頁面跳轉
//判斷用戶登錄狀態,未登錄跳轉到登錄頁面,以登錄跳轉到首頁
router.beforeEach((to,from,next) => {
//從cookie里獲取token,防止刷新后 token 丟失
store.commit('getToken');
let token = store.state.user.token;
if (!token && to.name !== 'login'){
next({name: 'login'})
}else {
next()
}
});
一、 permission.js 中返回 token
編輯permission.js,獲取返回token值
import Mock from 'mockjs'
export default {
getMenu: config => {
...{
return {
code: 20000,
data: { //data中獲取token值
......,
token: Mock.Random.guid(),
message: '獲取成功'
}
}
} else if ....
}
}
二、登錄是保存token:保存在vuex里、保存在cookie里
這邊我們需要在store目錄下新增一個user.js文件專門存放 用用的 cookie值的。目錄結構如下:
....
-src
-api
...
....
-store
-modules
-tab.js
-user.js //存放用戶的cooke的狀態
-index.js
....
....
編寫user.js文件:
import Cookie from 'js-cookie'
export default {
state: {
token: ''
},
mutations: {
setToken(state, val) {
state.token = val
Cookie.set('token', val)
},
clearToken(state) {
state.token = ''
Cookie.remove('token')
},
getToken(state) {
state.token = Cookie.get('token')
}
},
actions: {}
}
這個時候需要設置一下登錄時候的token
methods: {
login() {
this.$http.post('api/permission/getMenu', this.form).then(res => {
res = res.data;
if(res.code === 20000 ) {
this.$store.commit('clearMenu');//防止二次登錄,先清理cookie
this.$store.commit('setMenu',res.data.menu);
this.$store.commit('setToken',res.data.token); //設置token
this.$store.commit('addMenu',this.$router);
this.$router.push({name: 'home'});
}else{
this.$message.warning(res.data.message)
}
})
}
}
}
這邊需要注意一下,我們再新增user.js的時候,需要在index.js文件中,導出:
....
import tab from './modules/tab.js'
import user from './modules/user.js'
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
tab,
user //導出user
}
})
三、路由守衛根據判斷token存不存在,判斷用戶頁面跳轉
編輯main.js,添加路由守衛
.....
const router = new VueRouter({
routes
});
//判斷用戶登錄狀態,未登錄跳轉到登錄頁面,以登錄跳轉到首頁
router.beforeEach((to,from,next) => {
//從cookie里獲取token,防止刷新后 token 丟失
store.commit('getToken');
let token = store.state.user.token;
if (!token && to.name !== 'login'){
next({name: 'login'})
}else {
next()
}
});
/* eslint-disable no-new */
new Vue({
。。。。
}).$mount('#app');
四、退出登錄
這邊就要在我們的Header.vue中有一個登錄 按鈕,我們綁定事件,編輯 Header.vue
<template>
<header>
<div class="l-content">
....
<el-dropdown-menu slot="dropdown">
... <!--el-dropdown-item沒有給我提供click事件,我們需要加.native觸發原生事件-->
<el-dropdown-item icon="el-icon-switch-button"@click.native="logOut">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</header>
</template>
<script>
import { mapState } from 'vuex'
export default {
....,
methods:{
...,
logOut(){
this.$store.commit('clearToken'); //清楚token
this.$store.commit('clearMenu'); //清楚菜單
location.reload(); //重新加載
}
}
}
</script>
