diff --git a/openspec/changes/add-package-management-system/design.md b/openspec/changes/add-package-management-system/design.md index 979084b..bdd2729 100644 --- a/openspec/changes/add-package-management-system/design.md +++ b/openspec/changes/add-package-management-system/design.md @@ -309,7 +309,7 @@ API Status (2) -> CommonStatus.DISABLED (0) - **网络错误**:axios 拦截器统一捕获,显示通用错误提示 - **401 未认证**:自动跳转到登录页面 - **403 无权限**:显示权限不足提示,不跳转 -- **400 业务错误**:根据错误信息显示具体提示(ElMessage.error) +- **400 业务错误**:根据错误信息显示具体提示() - **表单验证错误**:在表单字段下显示错误提示 **错误提示方式**: diff --git a/src/api/BaseService.ts b/src/api/BaseService.ts index 5a414b1..233c7d3 100644 --- a/src/api/BaseService.ts +++ b/src/api/BaseService.ts @@ -101,9 +101,14 @@ export class BaseService { * 获取单个资源 * @param url 请求URL * @param params 请求参数 + * @param config 额外配置 */ - protected static getOne(url: string, params?: Record): Promise> { - return this.get>(url, params) + protected static getOne( + url: string, + params?: Record, + config?: Record + ): Promise> { + return this.get>(url, params, config) } /** diff --git a/src/api/modules/asset.ts b/src/api/modules/asset.ts index 7f3eff8..b28c6ea 100644 --- a/src/api/modules/asset.ts +++ b/src/api/modules/asset.ts @@ -38,7 +38,13 @@ export class AssetService extends BaseService { */ static getRealtimeStatus(identifier: string): Promise> { return this.getOne( - `/api/admin/assets/${identifier}/realtime-status` + `/api/admin/assets/${identifier}/realtime-status`, + undefined, + { + requestOptions: { + show404Error: false // 404时不显示错误提示 + } + } ) } @@ -67,7 +73,12 @@ export class AssetService extends BaseService { ): Promise> { return this.get>( `/api/admin/assets/${identifier}/packages`, - params + params, + { + requestOptions: { + show404Error: false // 404时不显示错误提示 + } + } ) } @@ -79,7 +90,13 @@ export class AssetService extends BaseService { */ static getCurrentPackage(identifier: string): Promise> { return this.getOne( - `/api/admin/assets/${identifier}/current-package` + `/api/admin/assets/${identifier}/current-package`, + undefined, + { + requestOptions: { + show404Error: false // 404时不显示错误提示 + } + } ) } @@ -128,7 +145,11 @@ export class AssetService extends BaseService { * @param identifier 资产标识符(ICCID 或 VirtualNo) */ static getAssetWallet(identifier: string): Promise> { - return this.getOne(`/api/admin/assets/${identifier}/wallet`) + return this.getOne(`/api/admin/assets/${identifier}/wallet`, undefined, { + requestOptions: { + show404Error: false // 404时不显示错误提示 + } + }) } /** diff --git a/src/components/business/CardOperationDialog.vue b/src/components/business/CardOperationDialog.vue index 1e39173..4b718ac 100644 --- a/src/components/business/CardOperationDialog.vue +++ b/src/components/business/CardOperationDialog.vue @@ -184,7 +184,7 @@ selectOptions.value = options } catch (error) { console.error('远程搜索失败:', error) - ElMessage.error('搜索失败,请重试') + console.log('搜索失败,请重试') } finally { selectLoading.value = false } diff --git a/src/components/business/CodeGeneratorButton.vue b/src/components/business/CodeGeneratorButton.vue index a428f6d..7dd884b 100644 --- a/src/components/business/CodeGeneratorButton.vue +++ b/src/components/business/CodeGeneratorButton.vue @@ -52,7 +52,7 @@ code = generateEnterpriseCode() break default: - ElMessage.error('未知的编码类型') + console.log('未知的编码类型') return } diff --git a/src/components/business/CustomerAccountDialog.vue b/src/components/business/CustomerAccountDialog.vue index 00dde8c..83fb505 100644 --- a/src/components/business/CustomerAccountDialog.vue +++ b/src/components/business/CustomerAccountDialog.vue @@ -244,7 +244,7 @@ } } catch (error) { console.error(error) - ElMessage.error('获取客户账号列表失败') + console.log('获取客户账号列表失败') } finally { loading.value = false } diff --git a/src/components/business/ImportDialog.vue b/src/components/business/ImportDialog.vue index c4ac645..df83163 100644 --- a/src/components/business/ImportDialog.vue +++ b/src/components/business/ImportDialog.vue @@ -198,13 +198,13 @@ }) if (!isValidType) { - ElMessage.error(`只能上传 ${acceptText.value} 格式的文件`) + console.log(`只能上传 ${acceptText.value} 格式的文件`) return false } const isLtSize = file.size / 1024 / 1024 < props.maxSize if (!isLtSize) { - ElMessage.error(`文件大小不能超过 ${props.maxSize}MB`) + console.log(`文件大小不能超过 ${props.maxSize}MB`) return false } @@ -222,7 +222,7 @@ const handleUploadError = () => { uploading.value = false - ElMessage.error('导入失败') + console.log('导入失败') } const handleConfirm = async () => { diff --git a/src/components/core/forms/ArtWangEditor.vue b/src/components/core/forms/ArtWangEditor.vue index e2b4ee8..fa08517 100644 --- a/src/components/core/forms/ArtWangEditor.vue +++ b/src/components/core/forms/ArtWangEditor.vue @@ -68,7 +68,7 @@ // 上传错误,或者触发 timeout 超时 onError(file: File, err: any, res: any) { console.log(`上传出错`, err, res) - ElMessage.error('图片上传失败') + console.log('图片上传失败') } // 注意:返回格式需要按照指定格式返回,才能显示图片 // 上传成功的返回格式: diff --git a/src/components/core/layouts/art-screen-lock/index.vue b/src/components/core/layouts/art-screen-lock/index.vue index 674e527..9a79772 100644 --- a/src/components/core/layouts/art-screen-lock/index.vue +++ b/src/components/core/layouts/art-screen-lock/index.vue @@ -330,7 +330,7 @@ console.error('更新store失败:', error) } } else { - ElMessage.error(t('lockScreen.pwdError')) + console.log(t('lockScreen.pwdError')) } } else { console.error('表单验证失败:', fields) diff --git a/src/composables/useAgentManagement.ts b/src/composables/useAgentManagement.ts index 3eb42a2..531a7b5 100644 --- a/src/composables/useAgentManagement.ts +++ b/src/composables/useAgentManagement.ts @@ -38,7 +38,7 @@ export function useAgentManagement() { setTotal(res.data.total) } catch (error) { console.error('获取代理商列表失败:', error) - ElMessage.error('获取代理商列表失败') + console.log('获取代理商列表失败') } finally { loading.value = false } @@ -54,7 +54,7 @@ export function useAgentManagement() { treeData.value = res.data } catch (error) { console.error('获取代理商树失败:', error) - ElMessage.error('获取代理商树失败') + console.log('获取代理商树失败') } finally { loading.value = false } @@ -71,7 +71,7 @@ export function useAgentManagement() { return res.data } catch (error) { console.error('获取代理商详情失败:', error) - ElMessage.error('获取代理商详情失败') + console.log('获取代理商详情失败') return null } finally { loading.value = false @@ -90,7 +90,7 @@ export function useAgentManagement() { return true } catch (error) { console.error('创建失败:', error) - ElMessage.error('创建失败') + console.log('创建失败') return false } finally { loading.value = false @@ -110,7 +110,7 @@ export function useAgentManagement() { return true } catch (error) { console.error('更新失败:', error) - ElMessage.error('更新失败') + console.log('更新失败') return false } finally { loading.value = false @@ -130,7 +130,7 @@ export function useAgentManagement() { return true } catch (error) { console.error('状态更新失败:', error) - ElMessage.error('状态更新失败') + console.log('状态更新失败') return false } finally { loading.value = false @@ -148,7 +148,7 @@ export function useAgentManagement() { return res.data } catch (error) { console.error('获取下级代理失败:', error) - ElMessage.error('获取下级代理失败') + console.log('获取下级代理失败') return [] } finally { loading.value = false diff --git a/src/composables/useCardManagement.ts b/src/composables/useCardManagement.ts index 3ec96e3..3539a6c 100644 --- a/src/composables/useCardManagement.ts +++ b/src/composables/useCardManagement.ts @@ -40,7 +40,7 @@ export function useCardManagement() { setTotal(res.data.total) } catch (error) { console.error('获取网卡列表失败:', error) - ElMessage.error('获取网卡列表失败') + console.log('获取网卡列表失败') } finally { loading.value = false } @@ -57,7 +57,7 @@ export function useCardManagement() { return res.data } catch (error) { console.error('获取单卡信息失败:', error) - ElMessage.error('获取单卡信息失败') + console.log('获取单卡信息失败') return null } finally { loading.value = false @@ -76,7 +76,7 @@ export function useCardManagement() { return true } catch (error) { console.error('操作失败:', error) - ElMessage.error('操作失败') + console.log('操作失败') return false } finally { loading.value = false @@ -96,7 +96,7 @@ export function useCardManagement() { return true } catch (error) { console.error('停机失败:', error) - ElMessage.error('停机失败') + console.log('停机失败') return false } finally { loading.value = false @@ -116,7 +116,7 @@ export function useCardManagement() { return true } catch (error) { console.error('复机失败:', error) - ElMessage.error('复机失败') + console.log('复机失败') return false } finally { loading.value = false @@ -136,7 +136,7 @@ export function useCardManagement() { return true } catch (error) { console.error('导入失败:', error) - ElMessage.error('导入失败') + console.log('导入失败') return false } finally { loading.value = false diff --git a/src/composables/useLogin.ts b/src/composables/useLogin.ts index cfb7054..f64b9af 100644 --- a/src/composables/useLogin.ts +++ b/src/composables/useLogin.ts @@ -133,7 +133,7 @@ export function useLogin() { const loginResult = mockLogin(formData.username, formData.password) if (!loginResult) { - ElMessage.error(t('login.error.invalidCredentials')) + console.log(t('login.error.invalidCredentials')) return } @@ -144,7 +144,7 @@ export function useLogin() { const userInfo = mockGetUserInfo(loginResult.access_token) if (!userInfo) { - ElMessage.error(t('login.error.getUserInfoFailed')) + console.log(t('login.error.getUserInfoFailed')) return } @@ -175,19 +175,19 @@ export function useLogin() { // 检查响应状态 if (response.code !== ApiStatus.success) { - ElMessage.error(response.msg || t('login.error.invalidCredentials')) + console.log(response.msg || t('login.error.invalidCredentials')) return } // 检查返回数据 if (!response.data || !response.data.access_token) { - ElMessage.error(t('login.error.loginFailed')) + console.log(t('login.error.loginFailed')) return } // 检查用户类型 - 禁止企业账号登录 if (response.data.user && response.data.user.user_type === 4) { - ElMessage.error('企业账号无法登录后台管理系统') + console.log('企业账号无法登录后台管理系统') return } @@ -199,7 +199,7 @@ export function useLogin() { userStore.setUserInfo(response.data.user) userStore.setLoginStatus(true) } else { - ElMessage.error(t('login.error.getUserInfoFailed')) + console.log(t('login.error.getUserInfoFailed')) return } diff --git a/src/types/api/request.ts b/src/types/api/request.ts index 8de2236..ee8c175 100644 --- a/src/types/api/request.ts +++ b/src/types/api/request.ts @@ -27,6 +27,8 @@ export interface RequestOptions { ignoreCancelToken?: boolean // 是否携带token withToken?: boolean + // 是否显示404错误提示(默认false,即默认不显示404错误) + show404Error?: boolean } // 请求方法类型 diff --git a/src/utils/http/index.ts b/src/utils/http/index.ts index 3eb13a3..2f5bf35 100644 --- a/src/utils/http/index.ts +++ b/src/utils/http/index.ts @@ -212,13 +212,34 @@ function processRequestConfig(config: ExtendedRequestConfig): AxiosRequestConfig } // 处理错误消息 -function handleErrorMessage(error: any, mode: ErrorMessageMode = 'message') { +function handleErrorMessage( + error: any, + mode: ErrorMessageMode = 'message', + show404Error: boolean = true +) { if (mode === 'none') return - // 优先使用响应中的 msg 字段 - const errorMessage = error.response?.data?.msg || error.message - const message = errorMessage || '请求超时或服务器异常!' + const backendMessage = error.response?.data?.msg + const httpStatus = error.response?.status + // 如果是404错误,且未配置显示404错误,则不显示任何提示 + if (httpStatus === 404 && !show404Error) { + return + } + + // 如果后端返回了错误信息,使用后端信息 + if (backendMessage) { + if (mode === 'modal') { + // TODO: 可以使用 ElMessageBox 显示模态框 + ElMessage.error(backendMessage) + } else { + ElMessage.error(backendMessage) + } + return + } + + // 其他错误显示通用提示 + const message = '请求超时或服务器异常!' if (mode === 'modal') { // TODO: 可以使用 ElMessageBox 显示模态框 ElMessage.error(message) @@ -251,7 +272,10 @@ async function request(config: ExtendedRequestConfig): Promise { if (axios.isAxiosError(e)) { // 默认显示错误消息,除非明确设置为 'none' const errorMode = config.requestOptions?.errorMessageMode || 'message' - handleErrorMessage(e, errorMode) + const show404Error = config.requestOptions?.show404Error !== undefined + ? config.requestOptions.show404Error + : true + handleErrorMessage(e, errorMode, show404Error) } return Promise.reject(e) } @@ -279,14 +303,6 @@ const api = { } } -// 退出登录(调用接口) -const logOut = () => { - ElMessage.error('登录已过期,请重新登录') - setTimeout(() => { - useUserStore().logOut() - }, 1000) -} - // 仅清理本地状态(不调用接口)- 用于401等情况 const clearLocalStateAndRedirect = () => { ElMessage.error('登录已过期,请重新登录') diff --git a/src/views/asset-management/asset-information/components/AssetSearchCard.vue b/src/views/asset-management/asset-information/components/AssetSearchCard.vue index 07893ad..9cfb77c 100644 --- a/src/views/asset-management/asset-information/components/AssetSearchCard.vue +++ b/src/views/asset-management/asset-information/components/AssetSearchCard.vue @@ -40,6 +40,7 @@