## Why 当前项目中错误消息存在**双数据源问题**: 1. `pkg/errors/codes.go` 中定义了 `errorMessages` 映射表 2. 业务代码中 `errors.New(code, "硬编码消息")` 全部传入硬编码消息 结果是: - 映射表的"自动填充"功能(当 message 为空时使用映射表)**从未被使用**(死代码) - 新增错误码时可能忘记更新映射表,导致映射表逐渐腐化 - 长期开发后新人不知道该用哪种方式,造成使用混乱 - 同一错误码在不同地方可能返回不同消息,影响一致性 ## What Changes - **改造 `errors.New()` 函数签名**:优先使用映射表消息,允许可选覆盖 - **添加 `init()` 启动时校验**:确保所有错误码常量都有对应的映射表条目 - **添加 CI 测试**:防止映射表腐化,确保错误码与消息映射完整 - **清理业务代码中的冗余硬编码**:将与映射表一致的消息改为使用默认值 - **保留业务特定消息覆盖能力**:如 "提现申请不存在" 比 "资源未找到" 更清晰的场景 ## Capabilities ### New Capabilities - `error-code-validation`: 错误码与消息映射的编译时/运行时校验机制,确保所有 Code* 常量都有对应的 errorMessages 条目 ### Modified Capabilities 无。此变更不改变现有 spec 的行为要求,仅加固内部实现。 ## Impact ### 代码影响 | 文件/目录 | 影响 | |-----------|------| | `pkg/errors/errors.go` | 改造 `New()` 函数签名,添加 `init()` 校验 | | `pkg/errors/codes.go` | 可能需要补充缺失的映射条目 | | `pkg/errors/codes_test.go` | 添加完整性校验测试 | | `internal/service/**/*.go` | 清理冗余硬编码(约 150+ 处) | | `internal/handler/**/*.go` | 清理冗余硬编码(约 80+ 处) | | `pkg/middleware/*.go` | 清理冗余硬编码(约 15 处) | ### API 影响 无。错误响应格式不变,仅内部消息来源统一。 ### 风险评估 | 风险 | 等级 | 缓解措施 | |------|------|----------| | 消息文案变化影响前端展示 | 低 | 保留业务特定消息覆盖能力 | | 遗漏错误码导致启动失败 | 中 | init() 校验会在启动时立即暴露问题 | | 大规模代码变更引入 bug | 中 | 分阶段实施:先加校验,再清理代码 |