request.ts
3.68 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
import axios from 'axios'
import { ElMessage } from 'element-plus'
const loginUrl = window.location.href.split('#/')[0] + '#/login'
const service = axios.create({
baseURL: import.meta.env.VITE_API_URL || '', // Use proxy
timeout: 10000
})
service.interceptors.request.use(
(config) => {
const token = localStorage.getItem('hzMgrtoken')
if (token) {
// Assume token is needed in headers, though login doesn't need it.
// Adjust header key as per actual API requirement later (e.g. Authorization or specific key)
config.headers['x-access-token'] = token
}
return config
},
(error) => {
return Promise.reject(error)
}
)
service.interceptors.response.use(
async (response) => {
// 如果是 blob 类型(文件下载)
if (response.config.responseType === 'blob') {
// 检查是否是 JSON 错误响应
if (response.data.type === 'application/json') {
try {
const text = await response.data.text()
const errorData = JSON.parse(text)
// 处理 401 登录失效
if (errorData.code === 401) {
ElMessage.error(errorData.msg || errorData.message || '登录已失效,请重新登录')
// 清除本地存储的 token
localStorage.removeItem('hzMgrtoken')
// 延迟跳转到登录页
setTimeout(() => {
window.location.href = loginUrl
}, 1000)
return Promise.reject(new Error(errorData.msg || errorData.message || '登录已失效'))
}
// 其他错误
ElMessage.error(errorData.msg || errorData.message || '请求失败')
return Promise.reject(new Error(errorData.msg || errorData.message || '请求失败'))
} catch (e) {
// 解析失败,返回原始 blob
return response.data
}
}
// 正常的文件流,直接返回
return response.data
}
const res = response.data
// 处理 401 登录失效
if (res.code === 401) {
ElMessage.error(res.msg || res.message || '登录已失效,请重新登录')
// 清除本地存储的 token
localStorage.removeItem('hzMgrtoken')
//延迟跳转到登录页,让用户看到提示信息
setTimeout(() => {
window.location.href = loginUrl
}, 1500)
return Promise.reject(new Error(res.msg || res.message || '登录已失效'))
}
// Adjust success code check based on actual API response structure
// Typically 200 or 0 indicates success
if (res.code !== 200 && res.code !== 0) {
ElMessage.error(res.msg || res.message || '请求失败')
return Promise.reject(new Error(res.msg || res.message || '请求失败'))
}
return res
},
(error) => {
// 处理 HTTP 401 状态码
if (error.response && error.response.status === 401) {
ElMessage.error('登录已失效,请重新登录')
// 清除本地存储的 token
localStorage.removeItem('hzMgrtoken')
// 延迟跳转到登录页
setTimeout(() => {
window.location.href = loginUrl
}, 1500)
} else {
ElMessage.error(error.message || '请求失败')
}
return Promise.reject(error)
}
)
export default service