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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/**
* 全站http配置
*
* axios参数说明
* isSerialize是否开启form表单提交
* isToken是否需要token
*/

import axios from 'axios'
import store from '@/store/';
import router from '@/router/router'
import { serialize } from '@/util/util'
import {getToken,getRoleTitle} from '@/util/auth' // 获取相对应的权限
import {Message} from 'element-ui' // 调用弹窗组件
import website from '@/config/website'; // statusWhiteList 通过此处,获取白名单,默认[400]
import NProgress from 'nprogress' // progress bar vue中的进度条
import 'nprogress/nprogress.css' // progress bar style
import Cookies from 'js-cookie'

axios.defaults.timeout = 20000; // 设置超时时间

// 返回其他状态吗
// 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。
// 如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),
// promise 将被 resolve; 否则,promise 将被 rejecte

axios.defaults.validateStatus = function (status) {
return status >= 200 && status <= 500; // 默认的
};

//跨域请求,允许保存cookie
axios.defaults.withCredentials = true;

// NProgress Configuration
// 通过设置为false关闭加载旋转器。(默认值是ture)
NProgress.configure({
showSpinner: false
});

//HTTPrequest拦截-添加请求拦截器
axios.interceptors.request.use(config => {

NProgress.start() // start progress bar 加载器开始加载

const meta = (config.meta || {}); //

const isToken = meta.isToken === false;

if (getToken() && !isToken) {
config.headers['Admin.Authority.Token.cashloan'] = getToken();
// 'Bearer ' + getToken() // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
}

//headers中配置serialize为true开启序列化 是否开启form表单提交
if (config.methods === 'post' && meta.isSerialize === true) {
config.data =config.data => {
let list = [];
Object.keys(data).forEach(ele => {
list.push(`${ele}=${data[ele]}`)
})
return list.join('&');
};
}

return config

}, error => {
return Promise.reject(error)
});

//HTTPresponse拦截-添加响应拦截器
axios.interceptors.response.use(res => {
NProgress.done(); // 进度条关闭

const status = Number(res.status) || 200; // 返回值必须是200

const statusWhiteList = website.statusWhiteList || []; // 白名单 400

const message = res.data.message || '未知错误'; // 确定的返回值或者是'未知错误'

const code = res.data.code

if (code === 11002) {
Message({
message,
type: "error"
})
}

if (code === 10004) {
Message({
message: "有另一台设备登录",
type: 'error'
})
store.dispatch('FedLogOut').then(() => router.push({
path: '/login'
}));
}

if (code === 10001) {
Message({
message: "请重新登录",
type: 'error'
})
Cookies.set('loading', true)
store.dispatch('FedLogOut').then(() => router.push({
path: '/login'
}));
}

if (code === 10002) {
Message({
dangerouslyUseHTMLString: true,
message: `接口为${res.request.custom.url}</br></br>${getRoleTitle()}没有权限`,
type: 'error'
})
}

if (code === 10003) {
Message({
dangerouslyUseHTMLString: true,
message,
type: 'error'
})
}

if (code === 404) {
Message({
dangerouslyUseHTMLString: true,
message: `接口为${res.request.custom.url}</br></br>${JSON.stringify(res.data)}`,
type: 'error'
})
}

if (code === 400) {

if (res.data.message.includes('/')) {
Message({
dangerouslyUseHTMLString: true,
message: message.split('/')[1],
type: 'error'
})
return
}

Message({
dangerouslyUseHTMLString: true,
message: `${JSON.stringify(res.data)}`,
type: 'error'
})

}

if (code === 500) {
if(!res.data.message.includes("TIMEOUT")){
Message({
dangerouslyUseHTMLString: true,
message:`服务器故障,请稍后重试`,
// message: `接口为${res.request.custom.url}</br></br>${JSON.stringify(res.data)}`,
type: 'error'
})
}
}

//如果在白名单里则自行catch逻辑处理
if (statusWhiteList.includes(status)) return Promise.reject(res);
//如果是401则跳转到登录页面
if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
// 如果请求为非200否者默认统一处理
if (status !== 200) {
Message({
message: message,
type: 'error'
})
return Promise.reject(new Error(message))
}
return res;
}, error => {
NProgress.done();
return Promise.reject(new Error(error));
})

export default axios;