feat(system): 新增文件和图库管理权限配置,优化HTTP错误处理
- 新增 FILE 和 PICTURE 权限常量,支持文件和图库管理模块 - 新增 FILE_MANAGEMENT 和 PICTURE_MANAGEMENT 权限组 - 更新 SYSTEM_ADMIN 权限组,包含所有新增权限 - 优化 HTTP 错误处理,支持异步解析响应体中的具体错误信息 - 新增 413 状态码处理,提供文件大小超限的友好提示 - 改进网络请求错误提示,根据错误类型提供更精准的用户反馈 - 支持取消请求、超时、文件大小限制等场景的错误处理
This commit is contained in:
parent
162b017b58
commit
0e202ce003
@ -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
|
||||||
|
|||||||
@ -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) => {
|
||||||
|
|||||||
@ -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'),
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user