master
2022-03-23 0da9c6652870390cd07bc90211aefe095445baf6
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
import axios from "axios";
import store from "/@/store";
import { isDev } from "/@/config/env";
import { href, storage } from "/@/cool/utils";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { ElMessage } from "element-plus";
 
axios.defaults.timeout = 30000;
axios.defaults.withCredentials = true;
 
NProgress.configure({
  showSpinner: false
});
 
// 请求队列
let requests: Array<Function> = [];
 
// Token 是否刷新中
let isRefreshing = false;
 
// 忽略规则
const ignore = {
  NProgress: ["/sys/info/record"],
  token: ["/login", "/captcha"]
};
 
// Request
axios.interceptors.request.use(
  (config: any) => {
    const token = store.getters.token || "";
 
    if (config.url) {
      if (!ignore.token.some((e) => config.url.includes(e))) {
        config.headers["Authorization"] = token;
      }
 
      if (!ignore.NProgress.some((e) => config.url.includes(e))) {
        NProgress.start();
      }
    }
 
    // 请求信息
    if (isDev) {
      console.log("config:", config);
      console.group(config.url);
      console.log("method:", config.method);
      console.table("data:", config.method == "get" ? config.params : config.data);
      console.groupEnd();
    }
 
    // 验证 token
    if (token) {
      if (config.url.includes("refreshToken")) {
        return config;
      }
 
      // 判断 token 是否过期
      if (storage.isExpired("token")) {
        // 判断 refreshToken 是否过期
        if (storage.isExpired("refreshToken")) {
          store.dispatch("userRemove");
          return href("/login");
        }
 
        // 是否在刷新中
        if (!isRefreshing) {
          isRefreshing = true;
 
          store.dispatch("refreshToken").then((token: string) => {
            requests.forEach((cb) => cb(token));
            requests = [];
            isRefreshing = false;
          });
        }
 
        return new Promise((resolve) => {
          // 继续请求
          requests.push((token: string) => {
            // 重新设置 token
            config.headers["Authorization"] = token;
            resolve(config);
          });
        });
      }
    }
 
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
 
// Response
axios.interceptors.response.use(
  (res) => {
    NProgress.done();
    const { code, data, message } = res.data;
 
    if (!res.data) {
      return res;
    }
 
    switch (code) {
      case 1000:
        return data;
      default:
        return Promise.reject(message);
    }
  },
  async (error) => {
    NProgress.done();
 
    if (error.response) {
      const { status, config } = error.response;
 
      switch (status) {
        case 401:
          await store.dispatch("userRemove");
          href("/login");
          break;
 
        case 403:
          if (isDev) {
            ElMessage.error(`${config.url} 无权限访问!!`);
          } else {
            href("/403");
          }
          break;
 
        case 404:
          break;
 
        case 500:
          if (!isDev) {
            href("/500");
          }
          break;
 
        case 502:
          if (isDev) {
            ElMessage.error(`${config.url} 服务异常!!`);
          } else {
            href("/502");
          }
          break;
 
        default:
          console.error(status, config.url);
      }
    }
 
    return Promise.reject(error.message);
  }
);
 
export default axios;