增加前端格式检查配置

This commit is contained in:
yml2213
2026-06-08 06:40:33 +08:00
parent 79ea3a476c
commit 500f511185
150 changed files with 7254 additions and 4013 deletions
+38 -33
View File
@@ -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
}
},
}
)
+3 -9
View File
@@ -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) {
+5 -7
View File
@@ -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`,