fix:: 请求响应码用常量

This commit is contained in:
TsMask
2025-06-07 16:32:04 +08:00
parent c67fbb7998
commit 33b95a6e30
73 changed files with 441 additions and 375 deletions

View File

@@ -2,7 +2,6 @@ package middleware
import (
"fmt"
"strings"
"time"
"github.com/gin-gonic/gin"
@@ -12,6 +11,7 @@ import (
"be.ems/src/framework/ip2region"
"be.ems/src/framework/reqctx"
"be.ems/src/framework/resp"
"be.ems/src/framework/utils/crypto"
)
const (
@@ -39,7 +39,7 @@ type LimitOption struct {
// 参数表示5秒内最多请求10次限制类型为 IP
//
// 使用 USER 时,请在用户身份授权认证校验后使用
// 以便获取登录用户信息,无用户信息时默认为 GLOBAL
// 以便获取登录用户信息,无用户信息时默认为 LIMIT_GLOBAL
func RateLimit(option LimitOption) gin.HandlerFunc {
return func(c *gin.Context) {
// 初始可选参数数据
@@ -55,38 +55,38 @@ func RateLimit(option LimitOption) gin.HandlerFunc {
// 获取执行函数名称
funcName := c.HandlerName()
lastDotIndex := strings.LastIndex(funcName, "/")
funcName = funcName[lastDotIndex+1:]
// 生成限流key
limitKey := constants.CACHE_RATE_LIMIT + ":" + funcName
limitKey := constants.CACHE_RATE_LIMIT + ":" + crypto.MD5(funcName)
// 用户
if option.Type == LIMIT_USER {
loginUser, err := reqctx.LoginUser(c)
if err != nil {
c.JSON(401, resp.CodeMsg(401002, "invalid login user information"))
userId := reqctx.LoginUserToUserID(c)
if userId <= 0 {
c.JSON(401, resp.CodeMsg(resp.CODE_AUTH_INVALID, "invalid login user information"))
c.Abort() // 停止执行后续的处理函数
return
}
limitKey = fmt.Sprintf("%s:%d:%s", constants.CACHE_RATE_LIMIT, loginUser.UserId, funcName)
funcMd5 := crypto.MD5(fmt.Sprintf("%d:%s", userId, funcName))
limitKey = constants.CACHE_RATE_LIMIT + ":" + funcMd5
}
// IP
if option.Type == LIMIT_IP {
clientIP := ip2region.ClientIP(c.ClientIP())
limitKey = constants.CACHE_RATE_LIMIT + ":" + clientIP + ":" + funcName
funcMd5 := crypto.MD5(fmt.Sprintf("%s:%s", clientIP, funcName))
limitKey = constants.CACHE_RATE_LIMIT + ":" + funcMd5
}
// 在Redis查询并记录请求次数
rateCount, err := redis.RateLimit("", limitKey, option.Time, option.Count)
if err != nil {
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.JSON(200, resp.CodeMsg(resp.CODE_RATELIMIT, resp.MSG_RATELIMIT))
c.Abort() // 停止执行后续的处理函数
return
}
rateTime, err := redis.GetExpire("", limitKey)
if err != nil {
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.JSON(200, resp.CodeMsg(resp.CODE_RATELIMIT, resp.MSG_RATELIMIT))
c.Abort() // 停止执行后续的处理函数
return
}
@@ -97,7 +97,7 @@ func RateLimit(option LimitOption) gin.HandlerFunc {
c.Header("X-RateLimit-Reset", fmt.Sprintf("%d", time.Now().Unix()+rateTime)) // 重置时间戳
if rateCount >= option.Count {
c.JSON(200, resp.ErrMsg("access too often, please try again later"))
c.JSON(200, resp.CodeMsg(resp.CODE_RATELIMIT, resp.MSG_RATELIMIT))
c.Abort() // 停止执行后续的处理函数
return
}