diff --git a/src/main/java/com/youlai/boot/core/aspect/RepeatSubmitAspect.java b/src/main/java/com/youlai/boot/core/aspect/RepeatSubmitAspect.java index 6c0a0f4e..d2e04468 100644 --- a/src/main/java/com/youlai/boot/core/aspect/RepeatSubmitAspect.java +++ b/src/main/java/com/youlai/boot/core/aspect/RepeatSubmitAspect.java @@ -57,7 +57,7 @@ public class RepeatSubmitAspect { boolean locked = lock.tryLock(0, expire, TimeUnit.SECONDS); if (!locked) { - throw new BusinessException(ResultCode.USER_DUPLICATE_REQUEST); + throw new BusinessException(ResultCode.DUPLICATE_SUBMISSION); } return pjp.proceed(); } diff --git a/src/main/java/com/youlai/boot/core/web/ResultCode.java b/src/main/java/com/youlai/boot/core/web/ResultCode.java index f40f506c..52784d93 100644 --- a/src/main/java/com/youlai/boot/core/web/ResultCode.java +++ b/src/main/java/com/youlai/boot/core/web/ResultCode.java @@ -1,269 +1,128 @@ package com.youlai.boot.core.web; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; - import java.io.Serializable; /** * 响应码枚举 *
- * 参考阿里巴巴开发手册响应码规范 - * 00000 正常 - * A**** 用户端错误 - * B**** 系统执行出错 - * C**** 调用第三方服务出错 + * 参考《阿里巴巴 Java 开发手册》错误码设计建议: + * 00000 表示成功。 + * A**** 表示用户端错误(如参数错误、认证失败等)。 + * B**** 表示当前系统执行出错(如系统超时等)。 + * C**** 表示调用第三方服务出错(如中间件、数据库等外部依赖)。 + *
+ * 错误码位数与号段说明: + * - 错误码为字符串类型,共 5 位:错误产生来源(A/B/C) + 四位数字编号。 + * - 四位数字编号范围 0001~9999,大类之间建议按步长 100 预留号段(如 A0200、A0300、A0400)。 + * - 错误码后三位编号与 HTTP 状态码无关。 + *
+ * 说明: + * - 本项目仅保留实际使用的错误码,并在 A/B/C 各保留少量示例,避免枚举无限膨胀。 + * - 如需扩展业务错误码,建议在对应宏观分类下按场景划分号段并保持全局唯一。 + *
+ * 附表(节选):错误码列表(示例/项目使用项) + *
+ * | 错误码 | 中文描述 | 说明 | + * |-------|----------------------|------------------| + * | 00000 | 成功 | 正常执行后的返回 | + * | A0001 | 用户端错误 | 一级宏观错误码 | + * | A0100 | 用户注册错误 | 二级宏观错误码 | + * | A0101 | 用户未同意隐私协议 | 二级宏观错误码 | + * | A0200 | 用户登录异常 | 二级宏观错误码 | + * | A0201 | 用户账户不存在 | 二级宏观错误码 | + * | A0202 | 用户账户被冻结 | 二级宏观错误码 | + * | A0230 | 访问令牌无效或已过期 | 令牌校验失败 | + * | A0241 | 用户验证码尝试次数超限 | 二级宏观错误码 | + * | A0300 | 访问权限异常 | 二级宏观错误码 | + * | A0301 | 访问未授权 | 二级宏观错误码 | + * | A0400 | 用户请求参数错误 | 二级宏观错误码 | + * | A0410 | 请求必填参数为空 | 二级宏观错误码 | + * | A0500 | 用户请求服务异常 | 二级宏观错误码 | + * | A0502 | 请求并发数超出限制 | 二级宏观错误码 | + * | A0506 | 请勿重复提交 | 二级宏观错误码 | + * | B0001 | 系统执行出错 | 一级宏观错误码 | + * | B0100 | 系统执行超时 | 二级宏观错误码 | + * | C0001 | 调用第三方服务出错 | 一级宏观错误码 | + * | C0113 | 接口不存在 | 二级宏观错误码 | + * | C0300 | 数据库服务出错 | 二级宏观错误码 | + ** * @author Ray.Hao * @since 2020/6/23 **/ -@AllArgsConstructor -@NoArgsConstructor public enum ResultCode implements IResultCode, Serializable { - SUCCESS("00000", "一切ok"), - - /** 一级宏观错误码 */ + SUCCESS("00000", "成功"), + + /** 一级宏观错误码:用户端错误(由客户端输入/认证/权限/请求方式等引起,需客户端配合修正) */ USER_ERROR("A0001", "用户端错误"), + - /** 二级宏观错误码 */ + /** 二级宏观错误码:用户端具体错误(按号段细分,便于定位是注册/登录/令牌/参数/防重等问题) */ + + /** A01xx:用户注册错误 */ USER_REGISTRATION_ERROR("A0100", "用户注册错误"), USER_NOT_AGREE_PRIVACY_AGREEMENT("A0101", "用户未同意隐私协议"), - REGISTRATION_COUNTRY_OR_REGION_RESTRICTED("A0102", "注册国家或地区受限"), - - USERNAME_VERIFICATION_FAILED("A0110", "用户名校验失败"), - USERNAME_ALREADY_EXISTS("A0111", "用户名已存在"), - USERNAME_CONTAINS_SENSITIVE_WORDS("A0112", "用户名包含敏感词"), - USERNAME_CONTAINS_SPECIAL_CHARACTERS("A0113", "用户名包含特殊字符"), - - PASSWORD_VERIFICATION_FAILED("A0120", "密码校验失败"), - PASSWORD_LENGTH_NOT_ENOUGH("A0121", "密码长度不够"), - PASSWORD_STRENGTH_NOT_ENOUGH("A0122", "密码强度不够"), + /** A013x:校验码输入错误 */ VERIFICATION_CODE_INPUT_ERROR("A0130", "校验码输入错误"), - SMS_VERIFICATION_CODE_INPUT_ERROR("A0131", "短信校验码输入错误"), - EMAIL_VERIFICATION_CODE_INPUT_ERROR("A0132", "邮件校验码输入错误"), - VoICE_VERIFICATION_CODE_INPUT_ERROR("A0133", "语音校验码输入错误"), - USER_CERTIFICATE_EXCEPTION("A0140", "用户证件异常"), - USER_CERTIFICATE_TYPE_NOT_SELECTED("A0141", "用户证件类型未选择"), - MAINLAND_ID_NUMBER_VERIFICATION_ILLEGAL("A0142", "大陆身份证编号校验非法"), - - USER_BASIC_INFORMATION_VERIFICATION_FAILED("A0150", "用户基本信息校验失败"), - PHONE_FORMAT_VERIFICATION_FAILED("A0151", "手机格式校验失败"), - ADDRESS_FORMAT_VERIFICATION_FAILED("A0152", "地址格式校验失败"), - EMAIL_FORMAT_VERIFICATION_FAILED("A0153", "邮箱格式校验失败"), - - /** 二级宏观错误码 */ + /** A02xx:用户登录异常 */ USER_LOGIN_EXCEPTION("A0200", "用户登录异常"), - USER_ACCOUNT_FROZEN("A0201", "用户账户被冻结"), - USER_ACCOUNT_ABOLISHED("A0202", "用户账户已作废"), - + ACCOUNT_NOT_FOUND("A0201", "用户账户不存在"), + ACCOUNT_FROZEN("A0202", "用户账户被冻结"), USER_PASSWORD_ERROR("A0210", "用户名或密码错误"), - USER_INPUT_PASSWORD_ERROR_LIMIT_EXCEEDED("A0211", "用户输入密码错误次数超限"), - USER_NOT_EXIST("A0212", "用户不存在"), - - USER_IDENTITY_VERIFICATION_FAILED("A0220", "用户身份校验失败"), - USER_FINGERPRINT_RECOGNITION_FAILED("A0221", "用户指纹识别失败"), - USER_FACE_RECOGNITION_FAILED("A0222", "用户面容识别失败"), - USER_NOT_AUTHORIZED_THIRD_PARTY_LOGIN("A0223", "用户未获得第三方登录授权"), - + /** A023x:令牌无效或已过期 */ ACCESS_TOKEN_INVALID("A0230", "访问令牌无效或已过期"), REFRESH_TOKEN_INVALID("A0231", "刷新令牌无效或已过期"), - - // 验证码错误 + /** A024x:验证码错误 */ USER_VERIFICATION_CODE_ERROR("A0240", "验证码错误"), USER_VERIFICATION_CODE_ATTEMPT_LIMIT_EXCEEDED("A0241", "用户验证码尝试次数超限"), USER_VERIFICATION_CODE_EXPIRED("A0242", "用户验证码过期"), - /** 二级宏观错误码 */ + /** A03xx:访问权限异常 */ ACCESS_PERMISSION_EXCEPTION("A0300", "访问权限异常"), ACCESS_UNAUTHORIZED("A0301", "访问未授权"), - AUTHORIZATION_IN_PROGRESS("A0302", "正在授权中"), - USER_AUTHORIZATION_APPLICATION_REJECTED("A0303", "用户授权申请被拒绝"), - ACCESS_OBJECT_PRIVACY_SETTINGS_BLOCKED("A0310", "因访问对象隐私设置被拦截"), - AUTHORIZATION_EXPIRED("A0311", "授权已过期"), - NO_PERMISSION_TO_USE_API("A0312", "无权限使用 API"), - - USER_ACCESS_BLOCKED("A0320", "用户访问被拦截"), - BLACKLISTED_USER("A0321", "黑名单用户"), - ACCOUNT_FROZEN("A0322", "账号被冻结"), - ILLEGAL_IP_ADDRESS("A0323", "非法 IP 地址"), - GATEWAY_ACCESS_RESTRICTED("A0324", "网关访问受限"), - REGION_BLACKLIST("A0325", "地域黑名单"), - - SERVICE_ARREARS("A0330", "服务已欠费"), - - USER_SIGNATURE_EXCEPTION("A0340", "用户签名异常"), - RSA_SIGNATURE_ERROR("A0341", "RSA 签名错误"), - - /** 二级宏观错误码 */ + /** A04xx:用户请求参数错误 */ USER_REQUEST_PARAMETER_ERROR("A0400", "用户请求参数错误"), - CONTAINS_ILLEGAL_MALICIOUS_REDIRECT_LINK("A0401", "包含非法恶意跳转链接"), INVALID_USER_INPUT("A0402", "无效的用户输入"), - REQUEST_REQUIRED_PARAMETER_IS_EMPTY("A0410", "请求必填参数为空"), - - REQUEST_PARAMETER_VALUE_EXCEEDS_ALLOWED_RANGE("A0420", "请求参数值超出允许的范围"), PARAMETER_FORMAT_MISMATCH("A0421", "参数格式不匹配"), - USER_INPUT_CONTENT_ILLEGAL("A0430", "用户输入内容非法"), - CONTAINS_PROHIBITED_SENSITIVE_WORDS("A0431", "包含违禁敏感词"), - - USER_OPERATION_EXCEPTION("A0440", "用户操作异常"), - - /** 二级宏观错误码 */ + /** A05xx:用户请求服务异常 */ USER_REQUEST_SERVICE_EXCEPTION("A0500", "用户请求服务异常"), - REQUEST_LIMIT_EXCEEDED("A0501", "请求次数超出限制"), REQUEST_CONCURRENCY_LIMIT_EXCEEDED("A0502", "请求并发数超出限制"), - USER_OPERATION_PLEASE_WAIT("A0503", "用户操作请等待"), - WEBSOCKET_CONNECTION_EXCEPTION("A0504", "WebSocket 连接异常"), - WEBSOCKET_CONNECTION_DISCONNECTED("A0505", "WebSocket 连接断开"), - USER_DUPLICATE_REQUEST("A0506", "请求过于频繁,请稍后再试。"), + DUPLICATE_SUBMISSION("A0506", "请勿重复提交"), - /** 二级宏观错误码 */ - USER_RESOURCE_EXCEPTION("A0600", "用户资源异常"), - ACCOUNT_BALANCE_INSUFFICIENT("A0601", "账户余额不足"), - USER_DISK_SPACE_INSUFFICIENT("A0602", "用户磁盘空间不足"), - USER_MEMORY_SPACE_INSUFFICIENT("A0603", "用户内存空间不足"), - USER_OSS_CAPACITY_INSUFFICIENT("A0604", "用户 OSS 容量不足"), - USER_QUOTA_EXHAUSTED("A0605", "用户配额已用光"), - USER_RESOURCE_NOT_FOUND("A0606", "用户资源不存在"), - - /** 二级宏观错误码 */ + /** A07xx:文件处理异常 */ UPLOAD_FILE_EXCEPTION("A0700", "上传文件异常"), - UPLOAD_FILE_TYPE_MISMATCH("A0701", "上传文件类型不匹配"), - UPLOAD_FILE_TOO_LARGE("A0702", "上传文件太大"), - UPLOAD_IMAGE_TOO_LARGE("A0703", "上传图片太大"), - UPLOAD_VIDEO_TOO_LARGE("A0704", "上传视频太大"), - UPLOAD_COMPRESSED_FILE_TOO_LARGE("A0705", "上传压缩文件太大"), - DELETE_FILE_EXCEPTION("A0710", "删除文件异常"), - - /** 二级宏观错误码 */ - USER_CURRENT_VERSION_EXCEPTION("A0800", "用户当前版本异常"), - USER_INSTALLED_VERSION_NOT_MATCH_SYSTEM("A0801", "用户安装版本与系统不匹配"), - USER_INSTALLED_VERSION_TOO_LOW("A0802", "用户安装版本过低"), - USER_INSTALLED_VERSION_TOO_HIGH("A0803", "用户安装版本过高"), - USER_INSTALLED_VERSION_EXPIRED("A0804", "用户安装版本已过期"), - USER_API_REQUEST_VERSION_NOT_MATCH("A0805", "用户 API 请求版本不匹配"), - USER_API_REQUEST_VERSION_TOO_HIGH("A0806", "用户 API 请求版本过高"), - USER_API_REQUEST_VERSION_TOO_LOW("A0807", "用户 API 请求版本过低"), - - /** 二级宏观错误码 */ - USER_PRIVACY_NOT_AUTHORIZED("A0900", "用户隐私未授权"), - USER_PRIVACY_NOT_SIGNED("A0901", "用户隐私未签署"), - USER_CAMERA_NOT_AUTHORIZED("A0903", "用户相机未授权"), - USER_PHOTO_LIBRARY_NOT_AUTHORIZED("A0904", "用户图片库未授权"), - USER_FILE_NOT_AUTHORIZED("A0905", "用户文件未授权"), - USER_LOCATION_INFORMATION_NOT_AUTHORIZED("A0906", "用户位置信息未授权"), - USER_CONTACTS_NOT_AUTHORIZED("A0907", "用户通讯录未授权"), - - /** 二级宏观错误码 */ - USER_DEVICE_EXCEPTION("A1000", "用户设备异常"), - USER_CAMERA_EXCEPTION("A1001", "用户相机异常"), - USER_MICROPHONE_EXCEPTION("A1002", "用户麦克风异常"), - USER_EARPIECE_EXCEPTION("A1003", "用户听筒异常"), - USER_SPEAKER_EXCEPTION("A1004", "用户扬声器异常"), - USER_GPS_POSITIONING_EXCEPTION("A1005", "用户 GPS 定位异常"), - - /** 一级宏观错误码 */ + + /** 一级宏观错误码:系统端错误(服务端内部异常/超时/不可用等,需后端排查修复) */ SYSTEM_ERROR("B0001", "系统执行出错"), - /** 二级宏观错误码 */ + /** 二级宏观错误码:系统端具体错误(按号段细分,便于定位超时/限流/资源耗尽等) */ SYSTEM_EXECUTION_TIMEOUT("B0100", "系统执行超时"), - /** 二级宏观错误码 */ - SYSTEM_DISASTER_RECOVERY_FUNCTION_TRIGGERED("B0200", "系统容灾功能被触发"), - - SYSTEM_RATE_LIMITING("B0210", "系统限流"), - - SYSTEM_FUNCTION_DEGRADATION("B0220", "系统功能降级"), - - /** 二级宏观错误码 */ - SYSTEM_RESOURCE_EXCEPTION("B0300", "系统资源异常"), - SYSTEM_RESOURCE_EXHAUSTED("B0310", "系统资源耗尽"), - SYSTEM_DISK_SPACE_EXHAUSTED("B0311", "系统磁盘空间耗尽"), - SYSTEM_MEMORY_EXHAUSTED("B0312", "系统内存耗尽"), - FILE_HANDLE_EXHAUSTED("B0313", "文件句柄耗尽"), - SYSTEM_CONNECTION_POOL_EXHAUSTED("B0314", "系统连接池耗尽"), - SYSTEM_THREAD_POOL_EXHAUSTED("B0315", "系统线程池耗尽"), - - SYSTEM_RESOURCE_ACCESS_EXCEPTION("B0320", "系统资源访问异常"), - SYSTEM_READ_DISK_FILE_FAILED("B0321", "系统读取磁盘文件失败"), - - - /** 一级宏观错误码 */ + /** 一级宏观错误码:第三方服务错误(外部依赖/中间件/数据库等引起,需检查依赖健康与配置) */ THIRD_PARTY_SERVICE_ERROR("C0001", "调用第三方服务出错"), - /** 二级宏观错误码 */ - MIDDLEWARE_SERVICE_ERROR("C0100", "中间件服务出错"), - - RPC_SERVICE_ERROR("C0110", "RPC 服务出错"), - RPC_SERVICE_NOT_FOUND("C0111", "RPC 服务未找到"), - RPC_SERVICE_NOT_REGISTERED("C0112", "RPC 服务未注册"), + /** 二级宏观错误码:第三方服务具体错误(按号段细分,便于定位是接口不存在/数据库异常等) */ INTERFACE_NOT_EXIST("C0113", "接口不存在"), - - MESSAGE_SERVICE_ERROR("C0120", "消息服务出错"), - MESSAGE_DELIVERY_ERROR("C0121", "消息投递出错"), - MESSAGE_CONSUMPTION_ERROR("C0122", "消息消费出错"), - MESSAGE_SUBSCRIPTION_ERROR("C0123", "消息订阅出错"), - MESSAGE_GROUP_NOT_FOUND("C0124", "消息分组未查到"), - - CACHE_SERVICE_ERROR("C0130", "缓存服务出错"), - KEY_LENGTH_EXCEEDS_LIMIT("C0131", "key 长度超过限制"), - VALUE_LENGTH_EXCEEDS_LIMIT("C0132", "value 长度超过限制"), - STORAGE_CAPACITY_FULL("C0133", "存储容量已满"), - UNSUPPORTED_DATA_FORMAT("C0134", "不支持的数据格式"), - - CONFIGURATION_SERVICE_ERROR("C0140", "配置服务出错"), - - NETWORK_RESOURCE_SERVICE_ERROR("C0150", "网络资源服务出错"), - VPN_SERVICE_ERROR("C0151", "VPN 服务出错"), - CDN_SERVICE_ERROR("C0152", "CDN 服务出错"), - DOMAIN_NAME_RESOLUTION_SERVICE_ERROR("C0153", "域名解析服务出错"), - GATEWAY_SERVICE_ERROR("C0154", "网关服务出错"), - - /** 二级宏观错误码 */ - THIRD_PARTY_SYSTEM_EXECUTION_TIMEOUT("C0200", "第三方系统执行超时"), - - RPC_EXECUTION_TIMEOUT("C0210", "RPC 执行超时"), - - MESSAGE_DELIVERY_TIMEOUT("C0220", "消息投递超时"), - - CACHE_SERVICE_TIMEOUT("C0230", "缓存服务超时"), - - CONFIGURATION_SERVICE_TIMEOUT("C0240", "配置服务超时"), - - DATABASE_SERVICE_TIMEOUT("C0250", "数据库服务超时"), - - /** 二级宏观错误码 */ DATABASE_SERVICE_ERROR("C0300", "数据库服务出错"), - - TABLE_NOT_EXIST("C0311", "表不存在"), - COLUMN_NOT_EXIST("C0312", "列不存在"), DATABASE_EXECUTION_SYNTAX_ERROR("C0313", "数据库执行语法错误"), - - MULTIPLE_SAME_NAME_COLUMNS_IN_MULTI_TABLE_ASSOCIATION("C0321", "多表关联中存在多个相同名称的列"), - - DATABASE_DEADLOCK("C0331", "数据库死锁"), - - PRIMARY_KEY_CONFLICT("C0341", "主键冲突"), INTEGRITY_CONSTRAINT_VIOLATION("C0342", "违反了完整性约束"), + DATABASE_ACCESS_DENIED("C0351", "演示环境已禁用数据库写入功能,请本地部署修改数据库链接或开启Mock模式进行体验"); - DATABASE_ACCESS_DENIED("C0351", "演示环境已禁用数据库写入功能,请本地部署修改数据库链接或开启Mock模式进行体验"), + private final String code; - /** 二级宏观错误码 */ - THIRD_PARTY_DISASTER_RECOVERY_SYSTEM_TRIGGERED("C0400", "第三方容灾系统被触发"), - THIRD_PARTY_SYSTEM_RATE_LIMITING("C0401", "第三方系统限流"), - THIRD_PARTY_FUNCTION_DEGRADATION("C0402", "第三方功能降级"), + private final String msg; - /** 二级宏观错误码 */ - NOTIFICATION_SERVICE_ERROR("C0500", "通知服务出错"), - SMS_REMINDER_SERVICE_FAILED("C0501", "短信提醒服务失败"), - VoICE_REMINDER_SERVICE_FAILED("C0502", "语音提醒服务失败"), - EMAIL_REMINDER_SERVICE_FAILED("C0503", "邮件提醒服务失败"); + ResultCode(String code, String msg) { + this.code = code; + this.msg = msg; + } @Override @@ -276,10 +135,6 @@ public enum ResultCode implements IResultCode, Serializable { return msg; } - private String code; - - private String msg; - @Override public String toString() { return "{" +