yoho-plugin-auth.js
3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* 权限插件
*/
import _ from 'lodash';
import config from 'config';
import axios from 'axios';
import userService from 'user-service';
import iView from 'iview';
import Rsa from 'rsa';
const plugin = {
updateUser(Vue, user, purviews) {
Vue.$store.set(config.storeKeys.user, Rsa.encrypt(user));
Vue.prop('user', user);
Vue.prop('isLogin', true);
Vue.prop('purviews', purviews.deep);
Vue.prop('oriPurviews', purviews.ori);
},
// 权限验证
checkPurview(purviews, to) {
return Promise.resolve();
// let pUrl = `/${_.split(to.name, '.').join('/')}`;
// let pur = _.find(purviews, p => p.menu_url === pUrl);
// if (pur) {
// return Promise.resolve();
// }
// return Promise.reject();
},
initPurview(Vue, user) {
return userService.purviews().then((purviews) => {
this.updateUser(Vue, user, purviews);
});
},
install(Vue) {
Vue.beforeRender((next) => {
let user = Vue.$store.get(config.storeKeys.user);
let isLogin = Vue.$cookie.get('_isLogin');
if (isLogin && user) {
user = Rsa.decrypt(user, Object);
return this.initPurview(Vue, user).then(() => {
next();
});
}
next();
});
// 路由权限控制
Vue.$router.beforeEach((to, from, next) => {
// 无权限控制理由直接pass
let authPass = _.get(_.last(to.matched), 'meta.authPass', false);
if (authPass) {
// 已登录跳转到首页
if (to.name === 'login' && Vue.$isLogin) {
return next('/');
}
return next();
}
// 未登录去登录
if (!Vue.$isLogin) {
return next('/login.html');
}
return this.checkPurview(Vue.$purviews, to).then(() => {
return next();
}, () => {
return next('/401.html');
});
});
Vue.passport = {
local: (username, password) => {
return userService.login(username, password).then((res) => {
if (res.code === 200) {
return this.initPurview(Vue, res.data).then(() => {
return res.data;
});
}
return Promise.reject(res);
});
}
};
Vue.switchShop = shopsId => {
Vue.$cookie.set('_sign', shopsId, {
path: '/'
});
};
Vue.logout = () => {
_.each(config.storeKeys, Vue.$store.remove);
Vue.prop('user', void 0);
Vue.prop('isLogin', void 0);
Vue.prop('purviews', void 0);
axios.post('/logout');
Vue.$router.push('/login.html');
};
axios.defaults.validateStatus = (status) => {
if (status >= 200 && status < 300) {
return true;
}
if (status === 401) {
Vue.logout();
return false;
}
iView.Message.error('接口异常');
return false;
};
}
};
export default plugin;