perf: 前端配置Element Plus按需引入,优化Axios错误拦截提示

This commit is contained in:
yml
2026-05-25 02:23:20 +08:00
parent 7d74c0c146
commit 4ebb90870a
5 changed files with 64 additions and 5 deletions
+21 -1
View File
@@ -1,4 +1,11 @@
import axios, { type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'
import { ElMessage } from 'element-plus'
declare module 'axios' {
export interface AxiosRequestConfig {
silent?: boolean
}
}
import {
clearAuthStorage,
@@ -30,7 +37,10 @@ type RefreshState = {
pendingRequests: RetryRequest[]
}
type RetriableRequestConfig = InternalAxiosRequestConfig & { _retry?: boolean }
type RetriableRequestConfig = InternalAxiosRequestConfig & {
_retry?: boolean
silent?: boolean
}
const refreshStates: Record<AuthScope, RefreshState> = {
user: {
@@ -103,6 +113,10 @@ apiClient.interceptors.response.use(
async (error) => {
const originalRequest = error.config as RetriableRequestConfig | undefined
if (!originalRequest || error?.response?.status !== 401 || originalRequest._retry) {
if (originalRequest && !originalRequest.silent) {
const msg = error.response?.data?.message || error.message || '网络连接异常,请稍后重试'
ElMessage.error(msg)
}
return Promise.reject(error)
}
@@ -110,6 +124,9 @@ apiClient.interceptors.response.use(
const scope = getRequestScope(requestUrl)
if (isRefreshRequest(requestUrl)) {
redirectToLogin(scope)
if (originalRequest && !originalRequest.silent) {
ElMessage.error('登录已失效,请重新登录')
}
return Promise.reject(error)
}
@@ -134,6 +151,9 @@ apiClient.interceptors.response.use(
} catch (refreshError) {
rejectPendingRequests(scope, refreshError)
redirectToLogin(scope)
if (originalRequest && !originalRequest.silent) {
ElMessage.error('会话已过期,请重新登录')
}
return Promise.reject(refreshError)
} finally {
state.refreshing = false
+3 -3
View File
@@ -1,8 +1,8 @@
import "element-plus/dist/index.css";
import "element-plus/theme-chalk/el-message.css";
import "element-plus/theme-chalk/el-message-box.css";
import "vant/lib/index.css";
import "./styles/base.css";
import ElementPlus from "element-plus";
import { createPinia } from "pinia";
import { createApp } from "vue";
@@ -14,7 +14,7 @@ import { useSessionStore } from "./stores/session";
const app = createApp(App);
const pinia = createPinia();
app.use(pinia).use(router).use(ElementPlus);
app.use(pinia).use(router);
window.addEventListener("auth-storage-changed", () => {
useSessionStore(pinia).syncFromStorage();