From c573cd85962d0f2ae1dd542f3e10e4097e63091c Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期五, 12 九月 2025 11:42:18 +0800
Subject: [PATCH] ID1766-暂存

---
 src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue |    1 
 src/utils/axios.ts                                                 |  132 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 133 insertions(+), 0 deletions(-)

diff --git a/src/utils/axios.ts b/src/utils/axios.ts
new file mode 100644
index 0000000..2a102d7
--- /dev/null
+++ b/src/utils/axios.ts
@@ -0,0 +1,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
diff --git a/src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue b/src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue
index 27dc92f..697cd71 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue
@@ -90,6 +90,7 @@
               await bedsideAuxiliaryScreenStore.logout(bedsideAuxiliaryScreenStore.deviceCode);
               handleCancel();
               ElMessage.success('退出登录成功')
+              handleCancel();
             } catch (error) {
               ElMessage.success('退出登录失败')
             } finally {

--
Gitblit v1.8.0