单应用项目,可以创建很多独立工具类页面 ,不用登录 初始化的页面
zhangchen
2025-09-12 c573cd85962d0f2ae1dd542f3e10e4097e63091c
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
import axios, {AxiosError, AxiosResponse} from 'axios'
import {useRouter} from 'vue-router'
import Qs from 'qs'
import { useBedsideAuxiliaryScreenStore } from '@/store/bedsideAuxiliaryScreen'
 
const BASE_URL = import.meta.env.VITE_BASIC_API
 
const TIME_OUT = 60 * 2 * 1000
// 正在进行中的请求列表
let reqList: any[] = [] // 如果某个api存在这个数组里,说明该api暂时无法再次请求
 
  /**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
const allowRequest = function (reqList: any[], url: any) {
    for (let i = 0; i < reqList.length; i++) {
      if (reqList[i] === url) {
        reqList.splice(i, 1)
        break
      }
    }
  }
/**
 * 创建axios实例
 */
const instance = axios.create({
    baseURL: BASE_URL,
    timeout: TIME_OUT,
    paramsSerializer: function(params) {//序列化请求参数,避免get请求参数出现&,空格等识别错误的问题
        return Qs.stringify(params, {arrayFormat: 'brackets'})
    },
})
 
const errorHandle = (status: number, error:any): void => {
    // HTTP状态码判断
    switch (status) {
        case 401:
            return alert(`Error Code: ${status}, Message: ${error.msg || '登录失效,请重新登录'}`)
        case 403:
            return alert(`Error Code: ${status}, Message: ${error.msg || '你没有访问权限'}`)
        case 500:
            return alert(`Error Code: ${status}, Message: ${error.msg || '后台错误,请联系管理员'}`)
        case 502:
            return alert(`Error Code: ${status}, Message: ${error.msg || '平台环境异常'}`)
        default:
            alert(`Error Code: ${status}, Message: ${error.msg || '未知错误,请刷新重试'}`)
    }
}
 
// 前置拦截器(发起请求之前的拦截)
instance.interceptors.request.use(
    (response:any) =>{
        if (useBedsideAuxiliaryScreenStore().userInfo?.token) {
            response.headers.common['Authorization'] = 'Bearer '+ `${useBedsideAuxiliaryScreenStore().userInfo?.token}`
        }
        let cancel
        // 设置cancelToken对象
        response.cancelToken = new axios.CancelToken(function(c) {
            cancel = c
        })
        return response
    },
    (error) => Promise.reject(error)
)
 
// 后置拦截器(获取到响应时的拦截)
instance.interceptors.response.use(
 
    (res: AxiosResponse) => {
        // 增加延迟,相同请求不得在短时间内重复发送
        setTimeout(() => {
            allowRequest(reqList, res.config.url)
          }, 1000) // 上一次请求返回后过1s才允许再次请求
        if (String(res.status).indexOf('2') !== 0) {
            return {
                code: res.status,
                message: res.data.message || '请求异常,请刷新重试',
                result: false
            }
        }
        if (res.data.code===200){
            return res.data
        }
        // 返回异常
        else {
            // Toast(res.data.message)
            // 白名单,直接返回不提示
            const whiteList: string[] = ["/patient/hemo/med/record/updateSchemeTool","/patient/hemo/med/monitor/data/prepareAdd"];
            const requestUrl = res.request.responseURL;
            const isInWhiteList = whiteList.some(item => requestUrl.includes(item));
            if(isInWhiteList) return Promise.reject(res.data);
 
            return Promise.reject(res.data)
        }
        // return Promise.reject(instance.interceptors.response)
    },
    (error: AxiosError) => {
        if (axios.isCancel(error)) {
            console.log(error.message);
        } 
        else {
        setTimeout(() => {
            allowRequest(reqList, error.config.url)
            }, 1000) // 请求失败返回后过1s才允许再次请求
        }
        if (error && error.response) {
            // 请求已发出,但是不在2xx的范围
            errorHandle(error.response.status, error.response)
            if (error.response.status===401){
                Dialog.confirm({
                    title: '提示',
                    message:
                        '是否需要退出登录?',
                })
                    .then(() => {
                        Session.clear(); // 清除浏览器全部临时缓存
                        window.location.href = '/'; // 去登录页
                    })
                    .catch(() => {
                        Toast('取消操作')
                    })
            }
            return Promise.reject(error.response)
        }
        Toast('网络请求失败, 请刷新重试')
        return Promise.reject(error)
    }
)
 
export default instance