request.ts 3.63 KB
import axios from 'axios'
import { ElMessage } from 'element-plus'

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 = '/login'
                        // }, 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 = '/login'
            // }, 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 = '/login'
            }, 1500)
        } else {
            ElMessage.error(error.message || '请求失败')
        }

        return Promise.reject(error)
    }
)

export default service