/// 服务端业务错误码常量。 /// /// envelope 结构:`{retCode: String, retMsg: String, retData: T?}`(key map: code/msg/data) /// 错误码格式:`A04XX` = 客户端错 / `A05XX` = 服务端错 / `99999` = 兜底 / `00000` = 成功 abstract class ResponseCode { /// 成功 static const String success = '00000'; /// 兜底请求失败 static const String generic = '99999'; /// 服务端 500 类 static const String serverError = 'A0500'; static const String systemError = 'A0501'; /// 客户端 400 类 static const String paramError = 'A0400'; static const String paramMissing = 'A0402'; static const String resourceNotFound = 'A0404'; /// 鉴权过期 → 跳登录 static const String unauthorized = 'A0401'; /// Token 类业务码(占位 — 待后端确认实际值后改这里一处)。 // TODO: 后端确认后更新 tokenExpired / tokenInvalid 实际字符串值 static const String tokenExpired = 'TOKEN_EXPIRED'; static const String tokenInvalid = 'TOKEN_INVALID'; /// 仅 token 类业务码才允许 TokenRefreshInterceptor 触发 refresh。 static bool isTokenRefreshable(String? code) => code == unauthorized || code == tokenExpired || code == tokenInvalid; static bool isSuccess(String? code) => code == success; static bool isUnauthorized(String? code) => code == unauthorized; /// 用户友好的错误提示。 static String friendlyMessage(String? code, String fallback) { return switch (code) { success => '', unauthorized => '登录已过期,请重新登录', paramError => '请求参数有误,请稍候重试', paramMissing => '请求参数不完整,请稍候重试', resourceNotFound => '请求的资源不存在', serverError || systemError => '服务器开小差啦,请稍候重试', generic => '请求失败', _ => fallback, }; } }