因为目前的Vue移动端项目最后会被封装为安卓应用,因此须要一个登陆拦截并保存登陆状态。vue
这里演示的内容是将所需的状态码记录到localStorage内(这里本地保存的状态是“Flag”,若是需使用token的能够考虑将token保存道cookies或者localStroage内),代码内涉及到的“Toast”为我工程内引入的muse-ui的Toast插件。ios
在路由设置的每一个页面路径下增长meta,经过这个字段来判断该路由是否须要登陆权限,isLogin:false表示不须要验证权限便可进入的页面,isLogin:true是须要登陆权限验证才能进入的页面vue-router
1 routes: [ 2 { 3 path: '/', 4 name: 'WelcomePage', 5 component: WelcomePage, 6 meta: { 7 isLogin: false 8 } 9 }, 10 { 11 path: '/Login', 12 name: 'LoginPage', 13 component: LoginPage, 14 meta: { 15 isLogin: false 16 } 17 }, 18 { 19 path: '/Home', 20 name: 'HomePage', 21 component: HomePage, 22 meta: { 23 isLogin: true 24 } 25 }, 26 { 27 path: '/Message', 28 name: 'MessagePage', 29 component: MessagePage, 30 meta: { 31 isLogin: true 32 } 33 }, 34 { 35 path: '/User', 36 name: 'UserPage', 37 component: UserPage, 38 meta: { 39 isLogin: true 40 } 41 } 42 ]
这里我将路由守卫写到了main.js 内,这个根据我的安排也能够放到router的相关文件内,不过须要一些小改动。vuex
利用vue-router提供的钩子函数beforeEach对路由进行判断:axios
1 router.beforeEach((to, from, next) => { 2 let getFlag = localStorage.getItem('Flag') /* 这里是判断用户是否登陆过,由于在用户登陆后会在localStroage内存储Flag=isLogin */ 3 if (getFlag === 'isLogin') { /* 若是存在Flag而且为isLogin意味着用户登陆,这时修改vux内state下isLogin的状态 */ 4 store.state.isLogin = true 5 next() 6 if (!to.meta.isLogin) { /* 若是在有登陆状态的状况下前往不须要权限的路由路径,则断定为退出登陆,进行提示并跳转登陆页 */ 7 Toast.info('退出成功') 8 next({ 9 path: '/Login' 10 }) 11 } 12 } else { 13 if (to.meta.isLogin) { /* 若是没有登陆状态且要去往须要权限的路径时跳转登陆页并进行提示 */ 14 next({ 15 path: '/Login' 16 }) 17 Toast.info('请先登陆') 18 } else { 19 next() 20 } 21 } 22 }) 23 24 router.afterEach(route => { 25 window.scroll(0, 0) 26 })
钩子函数beforeEach方法接收三个参数: to、from、next;cookie
其中next须要注意的是:函数
确保要调用 next 方法,不然钩子就不会被 resolved。ui
“to.meta”中是咱们自定义的数据,其中就包括咱们刚刚定义的isLogin字段,经过这个字段来判断该路由是否须要登陆权限。this
1 import Vue from 'vue' 2 import Vuex from 'vuex' 3 4 Vue.use(Vuex) 5 6 export default new Vuex.Store({ 7 state: { 8 isLogin: false 9 }, 10 getters: { 11 isLogin: state => state.isLogin 12 }, 13 mutations: { 14 userStatus (state, flag) { 15 state.isLogin = flag 16 } 17 }, 18 actions: { 19 setUser ({commit}, flag) { 20 commit('userStatus', flag) 21 } 22 } 23 })
注意标红的内容。spa
登陆:
1 loginBack (res) { 2 let resBack = res.Back 3 let resData = res.Data 4 if (resBack === '1') { 5 this.loginLoading = false 6 let userName = this.userName 7 this.$store.dispatch('setUser', true) 8 localStorage.setItem('Flag', 'isLogin') 9 localStorage.setItem('username', userName) 10 this.$toast.info(resData) 11 this.$router.replace('/Home') 12 } else { 13 this.loginLoading = false 14 this.$toast.error(resData) 15 } 16 }
退出登陆:
1 loginOut () { 2 localStorage.removeItem('Flag') 3 localStorage.removeItem('username') 4 this.$toast.info('退出成功') 5 this.$router.replace('/Login') 6 }
这样基本上能实现登陆权限拦截功能了,实际中若是须要带上token验证的,能够和axios拦截器配合使用。