first commit
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package errcode
|
||||
|
||||
// 管理后台业务错误码段位:15000 - 21999(独立进程,与业务服务码值无冲突)
|
||||
//
|
||||
// 细分:
|
||||
// 15000 - 15999 管理员域(登录/账号)
|
||||
// 16000 - 16999 用户管理域
|
||||
// 17000 - 17999 商品域
|
||||
// 18000 - 18999 订单/退款域
|
||||
// 20000 - 20999 内容审核域(穿搭/衣物/分享)
|
||||
// 21000 - 21999 通知域
|
||||
|
||||
// ===== 管理员域(15000 - 15999) =====
|
||||
var (
|
||||
AdminLoginFailed = NewError(15000, "账号或密码错误")
|
||||
AdminDisabled = NewError(15001, "管理员账号已被禁用")
|
||||
AdminNotFound = NewError(15002, "管理员不存在")
|
||||
AdminUsernameExists = NewError(15003, "登录账号已存在")
|
||||
AdminPasswordInvalid = NewError(15004, "密码格式不正确")
|
||||
AdminOldPasswordWrong = NewError(15005, "原密码错误")
|
||||
AdminCannotDeleteSelf = NewError(15006, "不能删除自己")
|
||||
AdminCannotDisableSelf = NewError(15007, "不能禁用自己")
|
||||
AdminCannotModifySuper = NewError(15008, "不能操作超级管理员账号")
|
||||
)
|
||||
|
||||
// ===== 用户管理域(16000 - 16999) =====
|
||||
var (
|
||||
UserNotFound = NewError(16000, "用户不存在")
|
||||
UserQuotaNotFound = NewError(16001, "用户额度记录不存在")
|
||||
UserQuotaInvalid = NewError(16002, "调整后的总配额不能小于已使用量")
|
||||
UserVIPInvalid = NewError(16003, "VIP 参数不合法")
|
||||
UserGrantNotFound = NewError(16004, "额度凭证不存在")
|
||||
)
|
||||
|
||||
// ===== 商品域(17000 - 17999) =====
|
||||
var (
|
||||
GoodsNotFound = NewError(17000, "商品不存在")
|
||||
GoodsCodeExists = NewError(17001, "商品编码已存在")
|
||||
GoodsPriceInvalid = NewError(17002, "商品价格不合法")
|
||||
)
|
||||
|
||||
// ===== 订单/退款域(18000 - 18999) =====
|
||||
var (
|
||||
OrderNotFound = NewError(18000, "订单不存在")
|
||||
RefundNotFound = NewError(18001, "退款单不存在")
|
||||
RefundStatusInvalid = NewError(18002, "当前退款状态不允许该操作")
|
||||
)
|
||||
|
||||
// ===== 内容审核域(20000 - 20999) =====
|
||||
var (
|
||||
OutfitNotFound = NewError(20000, "穿搭不存在")
|
||||
OutfitAuditInvalid = NewError(20001, "当前状态不允许审核")
|
||||
ClothesNotFound = NewError(20002, "衣物不存在")
|
||||
ShareNotFound = NewError(20003, "分享不存在")
|
||||
)
|
||||
|
||||
// ===== 通知域(21000 - 21999) =====
|
||||
var (
|
||||
NotificationSendFailed = NewError(21000, "通知发送失败")
|
||||
)
|
||||
@@ -0,0 +1,43 @@
|
||||
package errcode
|
||||
|
||||
// 公共错误码段位:10000 - 19999
|
||||
//
|
||||
// 细分:
|
||||
// 10000 - 10999 通用 / 参数错误
|
||||
// 11000 - 11999 鉴权 / Token
|
||||
// 12000 - 12999 权限 / 资源
|
||||
// 19000 - 19999 系统级错误(DB、缓存、RPC)
|
||||
|
||||
// 成功
|
||||
var Success = NewError(0, "成功")
|
||||
|
||||
// ===== 通用错误(10000 - 10999) =====
|
||||
var (
|
||||
InvalidParams = NewError(10000, "请求参数错误")
|
||||
NotFound = NewError(10001, "资源不存在")
|
||||
MethodNotAllow = NewError(10002, "请求方法不允许")
|
||||
TooManyRequests = NewError(10003, "请求过于频繁")
|
||||
)
|
||||
|
||||
// ===== 鉴权 / Token(11000 - 11999) =====
|
||||
var (
|
||||
Unauthorized = NewError(11000, "未授权")
|
||||
UnauthorizedTokenError = NewError(11001, "Token 鉴权失败")
|
||||
UnauthorizedTokenTimeout = NewError(11002, "Token 已过期")
|
||||
UnauthorizedTokenGenerate = NewError(11003, "Token 生成失败")
|
||||
UnauthorizedTokenMissing = NewError(11004, "Token 缺失")
|
||||
)
|
||||
|
||||
// ===== 权限(12000 - 12999) =====
|
||||
var (
|
||||
Forbidden = NewError(12000, "无权限访问")
|
||||
)
|
||||
|
||||
// ===== 系统错误(19000 - 19999) =====
|
||||
var (
|
||||
ServerError = NewError(19000, "服务内部错误")
|
||||
DatabaseError = NewError(19001, "数据库错误")
|
||||
CacheError = NewError(19002, "缓存错误")
|
||||
RPCError = NewError(19003, "下游服务调用失败")
|
||||
UnknownError = NewError(19999, "未知错误")
|
||||
)
|
||||
@@ -0,0 +1,77 @@
|
||||
package errcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Error 业务错误
|
||||
type Error struct {
|
||||
code int
|
||||
msg string
|
||||
details []string
|
||||
}
|
||||
|
||||
// codes 用于注册时去重检查
|
||||
var codes = map[int]string{}
|
||||
|
||||
// NewError 注册并创建一个错误码
|
||||
func NewError(code int, msg string) *Error {
|
||||
if _, exists := codes[code]; exists {
|
||||
panic(fmt.Sprintf("error code %d already exists, please change", code))
|
||||
}
|
||||
codes[code] = msg
|
||||
return &Error{code: code, msg: msg}
|
||||
}
|
||||
|
||||
func (e *Error) Error() string {
|
||||
return fmt.Sprintf("error code: %d, msg: %s", e.code, e.msg)
|
||||
}
|
||||
|
||||
func (e *Error) Code() int { return e.code }
|
||||
func (e *Error) Msg() string { return e.msg }
|
||||
func (e *Error) Details() []string { return e.details }
|
||||
|
||||
func (e *Error) Msgf(args ...interface{}) string {
|
||||
return fmt.Sprintf(e.msg, args...)
|
||||
}
|
||||
|
||||
// WithDetails 附加详细信息(返回副本)
|
||||
func (e *Error) WithDetails(details ...string) *Error {
|
||||
newError := *e
|
||||
newError.details = append(newError.details, details...)
|
||||
return &newError
|
||||
}
|
||||
|
||||
// StatusCode 业务码 → HTTP 状态码
|
||||
// 仅对少数特殊错误返回非 200,其余统一 200,由前端按业务 code 处理
|
||||
func (e *Error) StatusCode() int {
|
||||
switch e.code {
|
||||
case Success.Code():
|
||||
return http.StatusOK
|
||||
|
||||
// 鉴权类返回 401,便于前端拦截器统一处理跳转登录
|
||||
case Unauthorized.Code(),
|
||||
UnauthorizedTokenError.Code(),
|
||||
UnauthorizedTokenTimeout.Code(),
|
||||
UnauthorizedTokenMissing.Code():
|
||||
return http.StatusUnauthorized
|
||||
|
||||
// 越权/无权限返回 403,便于网关与审计识别越权事件
|
||||
case Forbidden.Code():
|
||||
return http.StatusForbidden
|
||||
|
||||
// 限流返回 429,便于网关识别限流事件
|
||||
case TooManyRequests.Code():
|
||||
return http.StatusTooManyRequests
|
||||
|
||||
// 系统错误返回 500,便于运维监控告警
|
||||
case ServerError.Code(),
|
||||
DatabaseError.Code(),
|
||||
CacheError.Code(),
|
||||
RPCError.Code(),
|
||||
UnknownError.Code():
|
||||
return http.StatusInternalServerError
|
||||
}
|
||||
return http.StatusOK
|
||||
}
|
||||
Reference in New Issue
Block a user