From 0e202ce003dadd63464dbcc3a00a36179ff96a64 Mon Sep 17 00:00:00 2001 From: Leo <98382335+gaoziman@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:30:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(system):=20=E6=96=B0=E5=A2=9E=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=92=8C=E5=9B=BE=E5=BA=93=E7=AE=A1=E7=90=86=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=85=8D=E7=BD=AE=EF=BC=8C=E4=BC=98=E5=8C=96HTTP?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 FILE 和 PICTURE 权限常量,支持文件和图库管理模块 - 新增 FILE_MANAGEMENT 和 PICTURE_MANAGEMENT 权限组 - 更新 SYSTEM_ADMIN 权限组,包含所有新增权限 - 优化 HTTP 错误处理,支持异步解析响应体中的具体错误信息 - 新增 413 状态码处理,提供文件大小超限的友好提示 - 改进网络请求错误提示,根据错误类型提供更精准的用户反馈 - 支持取消请求、超时、文件大小限制等场景的错误处理 --- src/constants/permissions.ts | 36 ++++++++++++++++++++++++++++++++++++ src/service/http/alova.ts | 23 +++++++++++++++++++---- src/service/http/config.ts | 1 + src/service/http/handle.ts | 28 ++++++++++++++++++++++++++-- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/constants/permissions.ts b/src/constants/permissions.ts index 1574ea3..6ee9ca3 100644 --- a/src/constants/permissions.ts +++ b/src/constants/permissions.ts @@ -47,6 +47,23 @@ export const PERMISSIONS = { SEARCH: 'system:operlog:search', DELETE: 'system:operlog:delete', }, + + // 文件管理权限 + FILE: { + LIST: 'system:file:list', + ADD: 'system:file:add', + UPDATE: 'system:file:update', + DELETE: 'system:file:delete', + UPLOAD: 'system:file:upload', + }, + + // 图库管理权限 + PICTURE: { + LIST: 'system:picture:list', + ADD: 'system:sysPicture:add', + UPDATE: 'system:sysPicture:update', + DELETE: 'system:sysPicture:delete', + }, } as const // 权限类型推断 @@ -78,6 +95,23 @@ export const PERMISSION_GROUPS = { PERMISSIONS.MENU.DELETE, ], + // 文件管理相关权限 + FILE_MANAGEMENT: [ + PERMISSIONS.FILE.LIST, + PERMISSIONS.FILE.ADD, + PERMISSIONS.FILE.UPDATE, + PERMISSIONS.FILE.DELETE, + PERMISSIONS.FILE.UPLOAD, + ], + + // 图库管理相关权限 + PICTURE_MANAGEMENT: [ + PERMISSIONS.PICTURE.LIST, + PERMISSIONS.PICTURE.ADD, + PERMISSIONS.PICTURE.UPDATE, + PERMISSIONS.PICTURE.DELETE, + ], + // 系统管理员权限(包含所有权限) SYSTEM_ADMIN: [ ...Object.values(PERMISSIONS.USER), @@ -85,5 +119,7 @@ export const PERMISSION_GROUPS = { ...Object.values(PERMISSIONS.MENU), ...Object.values(PERMISSIONS.LOGIN_LOG), ...Object.values(PERMISSIONS.OPER_LOG), + ...Object.values(PERMISSIONS.FILE), + ...Object.values(PERMISSIONS.PICTURE), ], } as const diff --git a/src/service/http/alova.ts b/src/service/http/alova.ts index a05fd44..055379f 100644 --- a/src/service/http/alova.ts +++ b/src/service/http/alova.ts @@ -85,12 +85,27 @@ export function createAlovaInstance( return handleServiceResult(errorResult, false) } // 接口请求失败 - const errorResult = handleResponseError(response) + const errorResult = await handleResponseError(response) return handleServiceResult(errorResult, false) }, - onError: (error, method) => { - const tip = `[${method.type}] - [${method.url}] - ${error.message}` - coiMsgWarning(tip) + onError: (error, _method) => { + // 根据错误类型提供更友好的提示 + let userMessage = '网络请求失败,请稍后重试' + + if (error.name === 'AbortError') { + userMessage = '请求已取消' + } + else if (error.name === 'TimeoutError') { + userMessage = '请求超时,请检查网络连接' + } + else if (error.message.includes('fetch')) { + userMessage = '网络连接失败,请检查网络状态' + } + else if (error.message.includes('413')) { + userMessage = '文件大小超出限制,请选择较小的文件' + } + + coiMsgWarning(userMessage) }, onComplete: async (_method) => { diff --git a/src/service/http/config.ts b/src/service/http/config.ts index c13dd0f..23d7484 100644 --- a/src/service/http/config.ts +++ b/src/service/http/config.ts @@ -23,6 +23,7 @@ export const ERROR_STATUS = { 404: $t('http.404'), 405: $t('http.405'), 408: $t('http.408'), + 413: '文件大小超出限制,请选择较小的文件', 500: $t('http.500'), 501: $t('http.501'), 502: $t('http.502'), diff --git a/src/service/http/handle.ts b/src/service/http/handle.ts index f0739f9..420f972 100644 --- a/src/service/http/handle.ts +++ b/src/service/http/handle.ts @@ -14,7 +14,7 @@ type ErrorStatus = keyof typeof ERROR_STATUS * @param {Response} response * @return {*} */ -export function handleResponseError(response: Response) { +export async function handleResponseError(response: Response) { const error: Service.RequestError = { errorType: 'Response Error', code: 0, @@ -22,7 +22,31 @@ export function handleResponseError(response: Response) { data: null, } const errorCode: ErrorStatus = response.status as ErrorStatus - const message = ERROR_STATUS[errorCode] || ERROR_STATUS.default + let message = ERROR_STATUS[errorCode] || ERROR_STATUS.default + + // 尝试解析响应体中的具体错误信息 + try { + const responseText = await response.text() + if (responseText) { + try { + const responseData = JSON.parse(responseText) + // 如果后端返回了具体的错误信息,优先使用 + if (responseData && responseData.msg) { + message = responseData.msg + } + else if (responseData && responseData.message) { + message = responseData.message + } + } + catch { + // 如果不是JSON格式,可能是HTML错误页面,使用预定义消息 + } + } + } + catch { + // 读取错误响应失败,使用默认错误消息 + } + Object.assign(error, { code: errorCode, message }) showError(error)