单应用项目,可以创建很多独立工具类页面 ,不用登录 初始化的页面
zhangchen
2025-09-12 c573cd85962d0f2ae1dd542f3e10e4097e63091c
ID1766-暂存
1个文件已修改
1个文件已添加
133 ■■■■■ 已修改文件
src/utils/axios.ts 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mobile/bedsideAuxiliaryScreen/components/Login/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/axios.ts
New file
@@ -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
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 {