Untitled
unknown
plain_text
2 years ago
3.8 kB
3
Indexable
import { message as $message } from 'antd'; import axios, { AxiosRequestConfig } from 'axios'; import { ACCESS_TOKEN_KEY } from '@/enums/cacheEnum'; import { userStore } from '@/stores/user'; import { Storage } from '@/utils/Storage'; // import {ExclamationCircleOutlined} from '@ant-design/icons' export interface RequestOptions { /** 当前接口权限, 不需要鉴权的接口请忽略, 格式:sys:user:add */ permCode?: string; /** 是否直接获取data,而忽略message等 */ isGetDataDirectly?: boolean; /** 请求成功是提示信息 */ successMsg?: string; /** 请求失败是提示信息 */ errorMsg?: string; /** 是否mock数据请求 */ isMock?: boolean; } const UNKNOWN_ERROR = '未知错误,请重试'; /** 真实请求的路径前缀 */ const baseApiUrl = import.meta.env.VITE_BASE_API; /** mock请求路径前缀 */ const baseMockUrl = import.meta.env.VITE_MOCK_API; const service = axios.create({ // baseURL: baseApiUrl, timeout: 6000 }); service.interceptors.request.use( config => { const token = Storage.get(ACCESS_TOKEN_KEY); if (token && config.headers) { // 请求头token信息,请根据实际情况进行修改 config.headers['Authorization'] = token; } return config; }, error => { Promise.reject(error); } ); service.interceptors.response.use( response => { const res = response.data; // if the custom code is not 200, it is judged as an error. if (res.code !== 200) { $message.error(res.message || UNKNOWN_ERROR); // Illegal token if (res.code === 11001 || res.code === 11002) { window.localStorage.clear(); window.location.reload(); // to re-login // Modal.confirm({ // title: '警告', // content: res.message || '账号异常,您可以取消停留在该页上,或重新登录', // okText: '重新登录', // cancelText: '取消', // onOk: () => { // localStorage.clear(); // window.location.reload(); // } // }); } // throw other const error = new Error(res.message || UNKNOWN_ERROR) as Error & { code: any }; error.code = res.code; return Promise.reject(error); } else { return res; } }, error => { // 处理 422 或者 500 的错误异常提示 const errMsg = error?.response?.data?.message ?? UNKNOWN_ERROR; $message.error(errMsg); error.message = errMsg; return Promise.reject(error); } ); export type Response<T = any> = { code: number; message: string; data: T; }; export type BaseResponse<T = any> = Promise<Response<T>>; /** * * @param method - request methods * @param url - request url * @param data - request data or params */ export const request = async <T = any>(config: AxiosRequestConfig, options: RequestOptions = {}): Promise<T> => { try { const { successMsg, errorMsg, permCode, isMock, isGetDataDirectly = true } = options; // 如果当前是需要鉴权的接口 并且没有权限的话 则终止请求发起 if (permCode && !userStore.perms.includes(permCode)) { return $message.error('你没有访问该接口的权限,请联系管理员!'); } const fullUrl = `${(isMock ? baseMockUrl : baseApiUrl) + config.url}`; config.url = fullUrl.replace(/(?<!:)\/{2,}/g, '/'); const res = await service.request(config); successMsg && $message.success(successMsg); errorMsg && $message.error(errorMsg); return isGetDataDirectly ? res.data : res; } catch (error: any) { return Promise.reject(error); } };
Editor is loading...