From c56c73899217d7d9b4b94221244b24647a04fc08 Mon Sep 17 00:00:00 2001 From: zhouyonggao <1971162852@qq.com> Date: Mon, 22 Dec 2025 11:09:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E9=AA=8C=E8=AF=81=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=8C=83=E5=9B=B4=E4=B8=8D=E8=B6=85=E8=BF=871?= =?UTF-8?q?=E5=B9=B4=E4=BB=A5=E9=98=B2=E6=AD=A2=E6=9F=A5=E8=AF=A2=E8=B7=A8?= =?UTF-8?q?=E5=BA=A6=E8=BF=87=E5=A4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 validateTimeRange 函数,实现时间范围格式校验和跨度限制 - 支持字符串和浮点数类型的时间输入转换 - 校验时间格式是否为 YYYY-MM-DD HH:mm:ss,确保格式正确 - 确保结束时间晚于开始时间,避免逻辑错误 - 限制时间跨度最大不能超过365天,防止过大数据范围查询 - 在 create 方法中调用验证逻辑,处理相应的错误返回并终止请求处理 --- server/internal/api/exports.go | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/server/internal/api/exports.go b/server/internal/api/exports.go index da99b58..54d04e6 100644 --- a/server/internal/api/exports.go +++ b/server/internal/api/exports.go @@ -3,6 +3,7 @@ package api import ( "database/sql" "encoding/json" + "errors" "fmt" "io" "log" @@ -21,6 +22,55 @@ import ( "time" ) +// validateTimeRange 验证时间范围不超过1年 +func validateTimeRange(startVal, endVal interface{}) error { + var startStr, endStr string + + // 转换start时间 + switch v := startVal.(type) { + case string: + startStr = v + case float64: + startStr = utils.ToString(v) + default: + return errors.New("开始时间格式无效") + } + + // 转换end时间 + switch v := endVal.(type) { + case string: + endStr = v + case float64: + endStr = utils.ToString(v) + default: + return errors.New("结束时间格式无效") + } + + // 解析时间 + layout := "2006-01-02 15:04:05" + startTime, err1 := time.Parse(layout, strings.TrimSpace(startStr)) + endTime, err2 := time.Parse(layout, strings.TrimSpace(endStr)) + + if err1 != nil || err2 != nil { + return errors.New("时间格式错误,应为 YYYY-MM-DD HH:mm:ss") + } + + // 检查结束时间是否晚于开始时间 + if !endTime.After(startTime) { + return errors.New("结束时间必须晚于开始时间") + } + + // 计算时间跨度 + duration := endTime.Sub(startTime) + oneYear := 365 * 24 * time.Hour + + if duration > oneYear { + return fmt.Errorf("时间跨度超过1年限制,当前跨度为 %.1f 天,最多允许 365 天", duration.Hours()/24) + } + + return nil +} + type ExportsAPI struct { Meta *sql.DB Marketing *sql.DB @@ -142,11 +192,21 @@ func (a *ExportsAPI) create(w http.ResponseWriter, r *http.Request) { fail(w, r, http.StatusBadRequest, "create_time_between 需要两个时间值") return } + // 验证时间跨度不超过1年 + if err := validateTimeRange(t[0], t[1]); err != nil { + fail(w, r, http.StatusBadRequest, err.Error()) + return + } case []string: if len(t) != 2 { fail(w, r, http.StatusBadRequest, "create_time_between 需要两个时间值") return } + // 验证时间跨度不超过1年 + if err := validateTimeRange(t[0], t[1]); err != nil { + fail(w, r, http.StatusBadRequest, err.Error()) + return + } default: fail(w, r, http.StatusBadRequest, "create_time_between 格式错误") return