zhoudw
2022-01-10 3755693be0be520deaf92d566f7e5e00d71fdcf5
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
164
165
166
167
168
169
import axios from 'axios'
import store from '@/store/index.js'
import md5 from 'js-md5';
import router from '@/router';
import { Toast } from 'vant';
 
const qs = require('qs');
 
const codeMessage = {
    200: '成功',
    201: '新建或修改成功。',
    202: '进入后台排队。',
    204: '删除数据成功。',
    400: '请求错误',
    401: '用户没有权限。',
    403: '禁止访问',
    // 404: '接口地址不存在。',
    406: '请求的格式不可得。',
    410: '资源被删除',
    422: '创建对象时验证错误。',
    500: '网络错误,请重试',
    502: '网络错误,请重试',
    503: '网络错误,请重试',
    504: '网络错误,请重试'
}
 
// 默认配置
axios.defaults.timeout = 120000
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
 
const request = axios.create({
    baseURL: process.env.PTH_API_ROUTER,
    withCredentials: false
})
 
function mdSign(head, body) {
    let arr = {};
    // 对form提交进行特殊处理 file 字段不加入鉴权
    if (head['Content-Type'] === 'multipart/form-data') {
        arr = {};
        for (const key of body.keys()) {
            if (key !== 'file') arr[key] = body.get(key);
        }
    } else {
        arr = body;
    }
    let sign = ''
    const strArr = Object.entries(arr).map(v => {
        let val = v[1];
        if (typeof val == 'object') {
            val = JSON.stringify(val);
        }
        return val != undefined ? `${v[0]}=${val}&` : ''
    })
    strArr.push(`time=${head.TIME}&`);
    strArr.sort()
    const str = strArr.join('');
    sign = md5(str).toUpperCase();
 
    return sign
}
 
/**
 * 配置请求头
 * @param {*} conf
 */
function confRequestHeader(conf = {}) {
    conf.headers = conf.headers || {}
    conf.headers.TIME = new Date().getTime();
    conf.headers.TOKEN = store.state.token;
    conf.headers.SIGN = mdSign(conf.headers, conf.data || {})
 
    return conf
}
 
/**
 * 响应拦截
 * @param {*} res
 */
function resolve(res) {
    let data = res.data;
    if (typeof res.data == 'string') {
        try {
            data = JSON.parse(res.data)
        } catch (error) {
            return data
        }
    }
    if (data.code == 0 || data.code == 200 || data.result == 0) {
        return data
    }
    if (data.code === 1084 || data.code === 1083 || data.code === 1085) { // 用户未登录/1085在其他设备登录
        localStorage.removeItem("token");
        localStorage.removeItem("userInfo");
        store.commit("set_token", {});
        store.commit("set_user_info", {});
        return Promise.reject(data);
    }
 
    if (!res.config.hideMsg) {
        if (data.code === 701) {
            Toast.fail("验证码错误或已过期")
        } else {
            Toast.fail(data.msg)
        }
    }
    return Promise.reject(data)
}
 
/**
 * 错误拦截,一般为网络错误
 * @param {*} error
 */
function reject(error) {
    let status
    try {
        status = error.response.status
    } catch (err) {
        console.error('=====> response error err: ', error, err);
    }
    if (
        error.code === 'ECONNABORTED' &&
        error.message.indexOf('timeout') !== -1 &&
        error.config && !error.config.hideMsg
    ) {
        Toast.fail("请求超时")
    }
    if (error.config && !error.config.hideMsg) {
        const errortext = codeMessage[status]
        Toast.fail(errortext || '网络错误')
    }
    // 无权限
    if (status === 401) {
        router.replace({
            path: 'login',
            query: {
                redirect: router.currentRoute.fullPath
            }
        })
    }
    return Promise.reject(error);
}
 
/**
 * 请求拦截
 * @param {*} conf
 */
function requistHold(conf) {
    conf = confRequestHeader(conf);
    if (conf.headers['Content-Type'] !== 'multipart/form-data') {
        for (const key in conf.data) {
            if (conf.data.hasOwnProperty(key)) {
                const val = conf.data[key];
                if (typeof val === 'object') {
                    conf.data[key] = JSON.stringify(val);
                }
            }
        }
        conf.data = qs.stringify(conf.data)
    }
    return conf;
}
 
request.interceptors.request.use(requistHold)
request.interceptors.response.use(resolve, reject)
 
export {
    request
}