spring
4 天以前 435881d494e2be4ba5ce8bfccb02d6ef49e07314
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
 * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
 */
 
import errorCode from "./errorCode";
import config from "./config";
 
// 此处第二个参数vm,就是我们在页面使用的this,你可以通过vm获取vuex等操作
const install = (Vue, vm) => {
 
    // 通用请求头设定
    const ajaxHeader = 'x-ajax';
    const sessionIdHeader = 'Authorization';
    const rememberMeHeader = 'x-remember';
 
    // 请求参数默认配置
    Vue.prototype.$u.http.setConfig({
        baseUrl: vm.vuex_config.baseUrl,
        originalData: true,
        // 默认头部,http2约定header名称统一小写 ThinkGem
        header: {
            'x-requested-with': 'XMLHttpRequest'
        }
    });
 
    // 请求拦截,配置Token等参数
    Vue.prototype.$u.http.interceptor.request = (req) => {
 
        if (!req.header) {
            req.header = [];
        }
 
        // 默认指定返回 JSON 数据
        if (!req.header[ajaxHeader]) {
            req.header[ajaxHeader] = 'json';
        }
 
        // 设定传递 Token 认证参数 ThinkGem
        if (!req.header[sessionIdHeader] && vm.vuex_token) {
            req.header[sessionIdHeader] = 'Bearer ' + vm.vuex_token;
        }
        
        // 为节省流量,记住我数据不是每次都发送的,当会话失效后,尝试重试登录 ThinkGem
        if (!req.header[rememberMeHeader] && vm.vuex_remember && req.remember) {
            req.header[rememberMeHeader] = vm.vuex_remember;
            req.remember = false;
        }
        
        //传递APP版本号
        //req.header['APP-VERSION'] = config.appv;
 
        // console.log('request', req);
        return req;
    }
 
    // 响应拦截,判断状态码是否通过
    Vue.prototype.$u.http.interceptor.response = async (res, req) => {
        const status = Number(res.statusCode) || 200
        const message = res.data.msg || errorCode[status] || errorCode['default']
        
        //判断版本
        if ((status == 200 || res.data.code === 1) && message.split("@")[0]=='APP-VERSION')  {
            vm.$u.toast(message.split("@")[1]);
            return    Promise.reject(new Error(message.split("@")[1]))
        }
        //返回用户凭证已过期时,刷新token跳转至应用首页
        if(message=='用户凭证已过期'){
            let currRefreshToken=vm.vuex_refresh_token
            let refreshTokenParam={
                grant_type:'refresh_token',
                refresh_token:currRefreshToken,
                client_id:'pig',
                client_secret:'pig'
            }
            //清空存储信息
            vm.$u.vuex('vuex_token', '')
            vm.$u.vuex('vuex_refresh_token', '')
            vm.$u.vuex('vuex_username', '')
            vm.$u.vuex('vuex_userId', '')
            vm.$u.vuex('vuex_client_id', '')
            vm.$u.vuex('vuex_user', {})
            
            vm.$u.api.refreshToken(refreshTokenParam).then((resAgain) => {
                //存储相关信息
                vm.$u.vuex("vuex_token", resAgain.access_token);
                vm.$u.vuex("vuex_refresh_token", resAgain.refresh_token);
                vm.$u.vuex("vuex_username", resAgain.user_info.username);
                vm.$u.vuex("vuex_userId", resAgain.user_info.id);
                //vm.$u.vuex("vuex_client_id", resAgain.client_id);
                vm.$u.vuex("vuex_user", resAgain.user_info);
            
                setTimeout(() => {
                    uni.reLaunch({
                        url: '/pages/sys/home/index'
                    });
                }, 500);
            
            }).catch(()=>{
                setTimeout(() => {
                    uni.reLaunch({
                        url: '/pages/sys/login/index'
                    });
                }, 500);
            });
            return
        }
        // 后台定义 424 针对令牌过去的特殊响应码
        if (status === 424) {
            vm.$u.toast('令牌过期,请重新登录');
            vm.$u.api.logout().then(res => {
                //清空存储信息
                vm.$u.vuex('vuex_token', '')
                vm.$u.vuex('vuex_refresh_token', '')
                vm.$u.vuex('vuex_username', '')
                vm.$u.vuex('vuex_userId', '')
                vm.$u.vuex('vuex_client_id', '')
                vm.$u.vuex('vuex_user', {})
 
                setTimeout(() => {
                    uni.reLaunch({
                        url: '/pages/sys/login/index'
                    });
                }, 500);
 
            });
            return
        }
 
        if (status !== 200 || res.data.code === 1) {
            vm.$u.toast(message,3500);
            return Promise.reject(new Error(message))
        }
 
        return res.data;
    }
 
    // 封装 get text 请求
    vm.$u.getText = (url, data = {}, header = {}) => {
        return vm.$u.http.request({
            dataType: 'text',
            method: 'GET',
            url,
            header,
            data
        })
    }
 
    // 封装 post json 请求
    vm.$u.postJson = (url, data = {}, header = {}) => {
        header['content-type'] = 'application/json';
        return vm.$u.http.request({
            url,
            method: 'POST',
            header,
            data
        })
    }
 
}
 
export default {
    install
}