diff --git a/src/pages/vimp/apis/client/vimp-client.ts b/src/pages/vimp/apis/client/vimp-client.ts index 1ec7176..b7159e2 100644 --- a/src/pages/vimp/apis/client/vimp-client.ts +++ b/src/pages/vimp/apis/client/vimp-client.ts @@ -1,9 +1,59 @@ -import type { AxiosError, AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; -import axios from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; +import axios, { isAxiosError } from 'axios'; import type { VimpResponse, VimpResult } from '../../types'; +import { useUserStore } from '@/stores'; +import { getAppEnvConfig } from '@/utils'; +import router from '@/router'; + +export interface VimpRequestOptions extends CreateAxiosDefaults { + requestInterceptor?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise; + responseInterceptor?: (resp: AxiosResponse) => AxiosResponse | Promise; + responseErrorInterceptor?: (error: any) => any; +} + +export const createVimpClient = (config?: VimpRequestOptions) => { + const defaultRequestInterceptor = (config: InternalAxiosRequestConfig) => config; + const defaultResponseInterceptor = (response: AxiosResponse) => response; + const defaultResponseErrorInterceptor = (error: any) => { + if (isAxiosError(error)) { + if (error.status === 401) { + // 处理 401 错误 + } + if (error.status === 404) { + // 处理 404 错误 + } + } + return Promise.reject(error); + }; + + const requestInterceptor = config?.requestInterceptor ?? defaultRequestInterceptor; + const responseInterceptor = config?.responseInterceptor ?? defaultResponseInterceptor; + const responseErrorInterceptor = config?.responseErrorInterceptor ?? defaultResponseErrorInterceptor; -export const createVimpClient = (config?: CreateAxiosDefaults) => { const instance = axios.create(config); + instance.interceptors.request.use(requestInterceptor); + instance.interceptors.response.use(responseInterceptor, responseErrorInterceptor); + + const vimpGet = (url: string, options?: AxiosRequestConfig & { retRaw?: boolean }): Promise> => { + const { retRaw, ...reqConfig } = options ?? {}; + return new Promise((resolve) => { + instance + .get(url, { + ...reqConfig, + }) + .then((res) => { + if (retRaw) { + resolve([null, res.data as T, null]); + } else { + const resData = res.data as VimpResult; + resolve([null, resData.data, resData]); + } + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; const vimpPost = (url: string, data?: AxiosRequestConfig['data'], options?: Partial> & { retRaw?: boolean; upload?: boolean }): Promise> => { const { retRaw, upload, ...reqConfig } = options ?? {}; @@ -24,9 +74,40 @@ export const createVimpClient = (config?: CreateAxiosDefaults) => { }); }; + const httpPut = (url: string, data?: AxiosRequestConfig['data'], options?: Partial>): Promise> => { + const reqConfig = options ?? {}; + return new Promise((resolve) => { + instance + .put>(url, data, { ...reqConfig }) + .then((res) => { + resolve([null, res.data.data, res.data]); + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; + + const httpDelete = (url: string, idList: string[], options?: Partial>): Promise> => { + const reqConfig = options ?? {}; + return new Promise((resolve) => { + instance + .delete>(url, { ...reqConfig, data: idList }) + .then((res) => { + resolve([null, res.data.data, res.data]); + }) + .catch((err) => { + resolve([err as AxiosError, null, null]); + }); + }); + }; + return { instance, + get: vimpGet, post: vimpPost, + put: httpPut, + delete: httpDelete, }; }; @@ -42,4 +123,30 @@ export const unwrapVimpResponse = (resp: VimpResponse) => { export const vimpClient = createVimpClient({ baseURL: `/vimp/api/client`, + requestInterceptor: (config) => { + const userStore = useUserStore(); + const { lampAuthorization, lampClientId, lampClientSecret } = getAppEnvConfig(); + const newAuthorization = window.btoa(`${lampClientId}:${lampClientSecret}`); + const authorization = lampAuthorization.trim() !== '' ? lampAuthorization : newAuthorization; + config.headers.set('accept-language', 'zh-CN,zh;q=0.9'); + config.headers.set('accept', 'application/json, text/plain, */*'); + config.headers.set('Applicationid', ''); + config.headers.set('Tenantid', '1'); + config.headers.set('Authorization', authorization); + config.headers.set('token', userStore.userLoginResult?.token ?? ''); + return config; + }, + responseInterceptor: (response) => { + return response; + }, + responseErrorInterceptor: (error) => { + const err = error as AxiosError; + if (err.response?.status === 401) { + window.$message.error('登录超时,请重新登录'); + const userStore = useUserStore(); + userStore.resetStore(); + router.push({ path: '/login' }); + } + return Promise.reject(error); + }, });