要解决的问题

平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理。最常见的情况就是“先登录,后使用”。除去打包成APP,无法看到连接外,如果地址栏里直接输入地址就能绕过登录的话,那就忒不安全了。

方案1:自己做一个状态管理

具体的代码,我删掉了,所以这里只陈述一下过程

1. main.js里面,加一个var user = {didLogin:false},并在methods中添加一个方法changeUserAuth(isLogin){ user.didLogin = isLogin; };

2. main.js里面,添加路由beforeEach,通过判断user.didLogin,进行next()或者next({name:'login});

3. 子页面中如果要修改这个状态的话,通过方法进行修改,this.$root.changeUserAuth(true);

方案2:vuex

正规军的做法,就是vuex了,通过他统一对全局变量进行管理。说一下具体的用法

1. 安装

  npm i vuex --save

2. 创建store.js(/ProjectPaht/src/vuex/store.js),并定义types(/ProjectPaht/src/vuex/types.js)

/*  store.js  */

import Vue from 'vue'
import Vuex from 'vuex' import user from './modules/user' //用户 Vue.use(Vuex) export default new Vuex.Store({
modules: {
user,
}
})

/*  types.js  */
// 用户权限
export const USER_INFO_UPDATE = 'USER_INFO_UPDATE';

3. 定义各个模块的数据(user.js)

import * as types from '../types'

const USER_INFO = 'userInfo';

const state = {
// 用户登录信息
userInfo: JSON.parse(localStorage.getItem(USER_INFO) || '{}'),
} const actions = {
/**
* 用户登录
*/
userLogin({commit}, res) {
localStorage.setItem(USER_INFO, JSON.stringify(res));
commit(types.USER_INFO_UPDATE, res);
}, /**
* 退出登录
*/
userLogout({commit}) {
localStorage.removeItem(USER_INFO);
commit(types.USER_INFO_UPDATE, {});
},
} const getters = {
userInfo: state => state.userInfo,
didLogin: state => state.userInfo.userid.length > 0,
} const mutations = {
[types.USER_INFO_UPDATE](state, res) {
state.userInfo = res
},
} export default {
state,
actions,
getters,
mutations
}

3. 更改store数据

<script>
...
import {mapActions} from 'vuex'; export default {
...
methods: {
...mapActions({
userLogin: 'userLogin', //vues/modules/user.js中定义的方法
userLogout: 'userLogout'
}),
// 登录
onPressLogin: function () {
let param = {
username: this.username,
password: this.password,
}
api.POST('api/account/login', param).then(data=> {
let user = {userid:'wzf'}; //data.data; // 更新state
this.userLogin(user); // 页面跳转
this.$router.push({name: 'home'});
});
}
}
}
</script>

页面跳转以后,就会执行到main.js的路由beforeEach中去了

...
import router from './router'
import store from './vuex/store'
import {mapState} from 'vuex' new Vue({
el: '#app',
router,
store,
template: '<App/>',
components: {
App,
},
computed: mapState({
userInfo: ({user}) => user.userInfo, //从user.js中获取信息用于判断是否登录
}),
methods: {
checkAuth: function () {
let {userid = ''} = this.userInfo;
return userid.length > 0; //这里做的比较简单,只是通过userid进行的判断
}
}
}) router.beforeEach((to, from, next) => {
// 如果不是登录页面
if (to.name != 'login') {
   if (!router.app.checkAuth()) {
next({name: 'login'});
return;
}
}
next();
});

最后理一下数据流向

1. 页面通过接口调用接口,完成账号验证;

2. 通过vuex修改store,这里具体起作用的是vuex/modules/user.js;

3. 进行页面跳转,会被router.beforeEach拦截,通过对store的判断,具体完成跳转(到登录、到下个页面)

因为之前用了Redux,所以vuex直接就用上了,没有任何难度。关于vuex的具体用法,还是参照一下官方文档吧 https://vuex.vuejs.org/

  

最新文章

  1. 在mac os下的Apache服务器的cgi中运行python
  2. Python语言初学总结
  3. UVa 11464 Even Parity 偶数矩阵
  4. jquery 改变变量出现值不同步
  5. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例
  6. jdk版本切换
  7. django作业练习
  8. 结构体struct sockaddr_in, struct sockaddr,struct in_addr
  9. Win10下JDK下载与环境变量配置
  10. mongDb安装
  11. Visual Studio 2013版本安装
  12. Flord算法传递闭包
  13. 关于json中转义字符/正斜杠的问题。
  14. 06-jenkins的账号相关的问题
  15. 总结安装matlab踩到的坑
  16. Hibernate抽取BaseDao
  17. sql数据类型转换函数
  18. **python中的类和他的成员
  19. Hadoop(hadoop,HBase)组件import到eclipse
  20. zoj3195倍增lca

热门文章

  1. SVMtrain的参数c和g的优化
  2. 新一代的USB 3.0传输规格
  3. ZebraDatepicker中文显示
  4. 让R与Python共舞
  5. python类的继承和多态
  6. C语言获取输入,按单词输出
  7. django rest_framework中将json输出字符强制为utf-8编码
  8. 【严蔚敏】【数据结构(C语言版)】 求n的阶乘
  9. 二叉排序树实现(C++封装)
  10. html5.2新特性【长期更新】