目录:
- 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>
