123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- /**
- * 该文件可自行根据业务逻辑进行调整
- */
- import type { HttpResponse } from '@vben/request';
- import { useAppConfig } from '@vben/hooks';
- import { preferences } from '@vben/preferences';
- import {
- authenticateResponseInterceptor,
- errorMessageResponseInterceptor,
- RequestClient,
- } from '@vben/request';
- import { useAccessStore } from '@vben/stores';
- import { message } from 'ant-design-vue';
- import { useAuthStore } from '#/store';
- import { refreshTokenApi } from './core';
- const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
- function createRequestClient(baseURL: string) {
- const client = new RequestClient({
- baseURL,
- });
- /**
- * 重新认证逻辑
- */
- async function doReAuthenticate() {
- console.warn('Access token or refresh token is invalid or expired. ');
- const accessStore = useAccessStore();
- const authStore = useAuthStore();
- accessStore.setAccessToken(null);
- if (
- preferences.app.loginExpiredMode === 'modal' &&
- accessStore.isAccessChecked
- ) {
- accessStore.setLoginExpired(true);
- } else {
- await authStore.logout();
- }
- }
- /**
- * 刷新token逻辑
- */
- async function doRefreshToken() {
- const accessStore = useAccessStore();
- const resp = await refreshTokenApi();
- const newToken = resp.data;
- accessStore.setAccessToken(newToken);
- return newToken;
- }
- function formatToken(token: null | string) {
- return token ? `Bearer ${token}` : null;
- }
- // 请求头处理
- client.addRequestInterceptor({
- fulfilled: async (config) => {
- const accessStore = useAccessStore();
- config.headers.Authorization = formatToken(accessStore.accessToken);
- config.headers['Accept-Language'] = preferences.app.locale;
- return config;
- },
- });
- // response数据解构
- client.addResponseInterceptor<HttpResponse>({
- fulfilled: (response) => {
- const { data: responseData, status } = response;
- const { code, data, message: msg } = responseData;
- if (status >= 200 && status < 400 && code === 0) {
- return data;
- }
- throw new Error(`Error ${status}: ${msg}`);
- },
- });
- // token过期的处理
- client.addResponseInterceptor(
- authenticateResponseInterceptor({
- client,
- doReAuthenticate,
- doRefreshToken,
- enableRefreshToken: preferences.app.enableRefreshToken,
- formatToken,
- }),
- );
- // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里
- client.addResponseInterceptor(
- errorMessageResponseInterceptor((msg: string, _error) => {
- // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg
- message.error(msg);
- }),
- );
- return client;
- }
- export const requestClient = createRequestClient(apiURL);
- export const baseRequestClient = new RequestClient({ baseURL: apiURL });
|