Files
lingji-work-fe/src/api/index.ts
2025-09-19 11:52:14 +08:00

117 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios';
import { message } from 'ant-design-vue';
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { handleUserLogout, goUserLogin } from '@/utils/user';
import { useEnterpriseStore } from '@/stores/modules/enterprise';
import { glsWithCatch } from '@/utils/stroage';
import pinia from '@/stores';
const contentType = 'application/json';
const requestTimeout = 30000;
enum HttpStatusCode {
Success = 200,
BadRequest = 400, // 请求参数错误
Unauthorized = 401, // token 无效或过期
NotFound = 404,
InternalServerError = 500,
}
//* 导出Request类可以用来自定义传递配置来创建实例
export class Request {
//* axios 实例
private instance: AxiosInstance;
//* 基础配置
private baseConfig: AxiosRequestConfig = {
baseURL: `${import.meta.env.VITE_API_URL}`,
timeout: requestTimeout,
headers: {
'Content-Type': contentType,
},
};
public constructor(config: AxiosRequestConfig) {
this.instance = axios.create(Object.assign(this.baseConfig, config));
this.instance.interceptors.request.use(
(config: AxiosRequestConfig) => {
const store = useEnterpriseStore(pinia);
const token = glsWithCatch('accessToken');
config.headers!.Authorization = token;
if (store.enterpriseInfo) {
config.headers!['enterprise-id'] = store.enterpriseInfo.id;
}
return config;
},
(err: any) => {
return Promise.reject(err);
},
);
this.instance.interceptors.response.use(
(res: AxiosResponse) => {
const { data, status } = res;
switch (status) {
case HttpStatusCode.Success:
if (data.code !== HttpStatusCode.Success) {
message.error(data.message);
}
return data;
default:
return Promise.reject(data);
}
},
(err: any) => {
const { response } = err;
const status = response?.status;
let errMessage = response?.data?.message ?? err.message;
switch (status) {
case HttpStatusCode.InternalServerError:
errMessage = '系统繁忙,请稍后再试或联系管理员。';
break;
case HttpStatusCode.NotFound:
errMessage = '接口不存在';
break;
case HttpStatusCode.Unauthorized:
handleUserLogout();
break;
}
message.error(errMessage);
return Promise.reject(err.response);
},
);
}
//* 定义请求方法
public request<T = any>(config: AxiosRequestConfig): Promise<T> {
return this.instance.request(config);
}
public get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
return this.instance.get(url, { params, ...config });
}
public post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
return this.instance.post(url, data, config);
}
public put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
return this.instance.put(url, data, config);
}
public delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
return this.instance.delete(url, config);
}
public patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
return this.instance.patch(url, data, config);
}
}
//* 默认导出Request实例
export default new Request({});