feat(system): 新增文件和图库管理权限配置,优化HTTP错误处理

- 新增 FILE 和 PICTURE 权限常量,支持文件和图库管理模块
- 新增 FILE_MANAGEMENT 和 PICTURE_MANAGEMENT 权限组
- 更新 SYSTEM_ADMIN 权限组,包含所有新增权限
- 优化 HTTP 错误处理,支持异步解析响应体中的具体错误信息
- 新增 413 状态码处理,提供文件大小超限的友好提示
- 改进网络请求错误提示,根据错误类型提供更精准的用户反馈
- 支持取消请求、超时、文件大小限制等场景的错误处理
This commit is contained in:
Leo 2025-07-08 20:30:20 +08:00
parent 162b017b58
commit 0e202ce003
4 changed files with 82 additions and 6 deletions

View File

@ -47,6 +47,23 @@ export const PERMISSIONS = {
SEARCH: 'system:operlog:search', SEARCH: 'system:operlog:search',
DELETE: 'system:operlog:delete', 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 } as const
// 权限类型推断 // 权限类型推断
@ -78,6 +95,23 @@ export const PERMISSION_GROUPS = {
PERMISSIONS.MENU.DELETE, 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: [ SYSTEM_ADMIN: [
...Object.values(PERMISSIONS.USER), ...Object.values(PERMISSIONS.USER),
@ -85,5 +119,7 @@ export const PERMISSION_GROUPS = {
...Object.values(PERMISSIONS.MENU), ...Object.values(PERMISSIONS.MENU),
...Object.values(PERMISSIONS.LOGIN_LOG), ...Object.values(PERMISSIONS.LOGIN_LOG),
...Object.values(PERMISSIONS.OPER_LOG), ...Object.values(PERMISSIONS.OPER_LOG),
...Object.values(PERMISSIONS.FILE),
...Object.values(PERMISSIONS.PICTURE),
], ],
} as const } as const

View File

@ -85,12 +85,27 @@ export function createAlovaInstance(
return handleServiceResult(errorResult, false) return handleServiceResult(errorResult, false)
} }
// 接口请求失败 // 接口请求失败
const errorResult = handleResponseError(response) const errorResult = await handleResponseError(response)
return handleServiceResult(errorResult, false) return handleServiceResult(errorResult, false)
}, },
onError: (error, method) => { onError: (error, _method) => {
const tip = `[${method.type}] - [${method.url}] - ${error.message}` // 根据错误类型提供更友好的提示
coiMsgWarning(tip) 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) => { onComplete: async (_method) => {

View File

@ -23,6 +23,7 @@ export const ERROR_STATUS = {
404: $t('http.404'), 404: $t('http.404'),
405: $t('http.405'), 405: $t('http.405'),
408: $t('http.408'), 408: $t('http.408'),
413: '文件大小超出限制,请选择较小的文件',
500: $t('http.500'), 500: $t('http.500'),
501: $t('http.501'), 501: $t('http.501'),
502: $t('http.502'), 502: $t('http.502'),

View File

@ -14,7 +14,7 @@ type ErrorStatus = keyof typeof ERROR_STATUS
* @param {Response} response * @param {Response} response
* @return {*} * @return {*}
*/ */
export function handleResponseError(response: Response) { export async function handleResponseError(response: Response) {
const error: Service.RequestError = { const error: Service.RequestError = {
errorType: 'Response Error', errorType: 'Response Error',
code: 0, code: 0,
@ -22,7 +22,31 @@ export function handleResponseError(response: Response) {
data: null, data: null,
} }
const errorCode: ErrorStatus = response.status as ErrorStatus 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 }) Object.assign(error, { code: errorCode, message })
showError(error) showError(error)