增加前端格式检查配置
This commit is contained in:
@@ -37,13 +37,14 @@ function logRequest(config: InternalAxiosRequestConfig) {
|
||||
|
||||
function logResponse(response: AxiosResponse) {
|
||||
if (import.meta.env.DEV) {
|
||||
const duration = response.config._startTime
|
||||
? Date.now() - response.config._startTime
|
||||
: 0
|
||||
console.log(`[API Response] ${response.config.method?.toUpperCase()} ${response.config.url} (${duration}ms)`, {
|
||||
status: response.status,
|
||||
data: response.data,
|
||||
})
|
||||
const duration = response.config._startTime ? Date.now() - response.config._startTime : 0
|
||||
console.log(
|
||||
`[API Response] ${response.config.method?.toUpperCase()} ${response.config.url} (${duration}ms)`,
|
||||
{
|
||||
status: response.status,
|
||||
data: response.data,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// 记录性能指标
|
||||
@@ -61,14 +62,15 @@ function logResponse(response: AxiosResponse) {
|
||||
|
||||
function logError(error: AxiosError) {
|
||||
if (import.meta.env.DEV) {
|
||||
const duration = error.config?._startTime
|
||||
? Date.now() - error.config._startTime
|
||||
: 0
|
||||
console.error(`[API Error] ${error.config?.method?.toUpperCase()} ${error.config?.url} (${duration}ms)`, {
|
||||
status: error.response?.status,
|
||||
message: error.message,
|
||||
data: error.response?.data,
|
||||
})
|
||||
const duration = error.config?._startTime ? Date.now() - error.config._startTime : 0
|
||||
console.error(
|
||||
`[API Error] ${error.config?.method?.toUpperCase()} ${error.config?.url} (${duration}ms)`,
|
||||
{
|
||||
status: error.response?.status,
|
||||
message: error.message,
|
||||
data: error.response?.data,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// 记录错误指标
|
||||
@@ -181,29 +183,32 @@ function isRefreshRequest(url = '') {
|
||||
return url.endsWith('/auth/refresh') || url.endsWith('/admin/auth/refresh')
|
||||
}
|
||||
|
||||
apiClient.interceptors.request.use((config) => {
|
||||
const scope = getRequestScope(config.url || '')
|
||||
const token = getAccessToken(scope)
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`
|
||||
apiClient.interceptors.request.use(
|
||||
config => {
|
||||
const scope = getRequestScope(config.url || '')
|
||||
const token = getAccessToken(scope)
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
logRequest(config)
|
||||
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
logError(error)
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
logRequest(config)
|
||||
|
||||
return config
|
||||
}, (error) => {
|
||||
logError(error)
|
||||
return Promise.reject(error)
|
||||
})
|
||||
)
|
||||
|
||||
apiClient.interceptors.response.use(
|
||||
(response) => {
|
||||
response => {
|
||||
// 记录响应日志
|
||||
logResponse(response)
|
||||
return response
|
||||
},
|
||||
async (error) => {
|
||||
async error => {
|
||||
// 记录错误日志
|
||||
logError(error)
|
||||
|
||||
@@ -231,7 +236,7 @@ apiClient.interceptors.response.use(
|
||||
if (state.refreshing) {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
state.pendingRequests.push({ resolve, reject })
|
||||
}).then((newToken) => {
|
||||
}).then(newToken => {
|
||||
originalRequest._retry = true
|
||||
originalRequest.headers.Authorization = `Bearer ${newToken}`
|
||||
return apiClient(originalRequest)
|
||||
@@ -255,5 +260,5 @@ apiClient.interceptors.response.use(
|
||||
} finally {
|
||||
state.refreshing = false
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
@@ -36,11 +36,7 @@ export async function post<T>(
|
||||
/**
|
||||
* PUT 请求
|
||||
*/
|
||||
export async function put<T>(
|
||||
url: string,
|
||||
data?: unknown,
|
||||
config?: AxiosRequestConfig
|
||||
): Promise<T> {
|
||||
export async function put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
||||
return request<T>({ ...config, method: 'PUT', url, data })
|
||||
}
|
||||
|
||||
@@ -91,7 +87,7 @@ export async function requestWithRetry<T>(
|
||||
}
|
||||
|
||||
// 等待后重试
|
||||
await new Promise((resolve) => setTimeout(resolve, retryDelay * (attempt + 1)))
|
||||
await new Promise(resolve => setTimeout(resolve, retryDelay * (attempt + 1)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,9 +106,7 @@ export async function concurrent<T extends readonly unknown[]>(
|
||||
/**
|
||||
* 串行请求 (按顺序执行)
|
||||
*/
|
||||
export async function sequential<T>(
|
||||
requestFns: Array<() => Promise<T>>
|
||||
): Promise<T[]> {
|
||||
export async function sequential<T>(requestFns: Array<() => Promise<T>>): Promise<T[]> {
|
||||
const results: T[] = []
|
||||
|
||||
for (const requestFn of requestFns) {
|
||||
|
||||
@@ -54,7 +54,7 @@ class ApiMonitor {
|
||||
*/
|
||||
getSuccessRate(): number {
|
||||
if (this.metrics.length === 0) return 100
|
||||
const successCount = this.metrics.filter((m) => m.success).length
|
||||
const successCount = this.metrics.filter(m => m.success).length
|
||||
return Math.round((successCount / this.metrics.length) * 100)
|
||||
}
|
||||
|
||||
@@ -62,9 +62,7 @@ class ApiMonitor {
|
||||
* 获取最慢的请求
|
||||
*/
|
||||
getSlowestRequests(count = 5): RequestMetrics[] {
|
||||
return [...this.metrics]
|
||||
.sort((a, b) => b.duration - a.duration)
|
||||
.slice(0, count)
|
||||
return [...this.metrics].sort((a, b) => b.duration - a.duration).slice(0, count)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,7 +71,7 @@ class ApiMonitor {
|
||||
getStatsByUrl(): Record<string, { count: number; avgDuration: number; successRate: number }> {
|
||||
const urlStats: Record<string, RequestMetrics[]> = {}
|
||||
|
||||
this.metrics.forEach((metric) => {
|
||||
this.metrics.forEach(metric => {
|
||||
if (!urlStats[metric.url]) {
|
||||
urlStats[metric.url] = []
|
||||
}
|
||||
@@ -84,7 +82,7 @@ class ApiMonitor {
|
||||
|
||||
Object.entries(urlStats).forEach(([url, metrics]) => {
|
||||
const totalDuration = metrics.reduce((sum, m) => sum + m.duration, 0)
|
||||
const successCount = metrics.filter((m) => m.success).length
|
||||
const successCount = metrics.filter(m => m.success).length
|
||||
|
||||
result[url] = {
|
||||
count: metrics.length,
|
||||
@@ -113,7 +111,7 @@ class ApiMonitor {
|
||||
console.log('成功率:', this.getSuccessRate(), '%')
|
||||
console.log('最慢的 5 个请求:')
|
||||
console.table(
|
||||
this.getSlowestRequests(5).map((m) => ({
|
||||
this.getSlowestRequests(5).map(m => ({
|
||||
方法: m.method,
|
||||
URL: m.url,
|
||||
耗时: `${m.duration}ms`,
|
||||
|
||||
Reference in New Issue
Block a user