package log import ( "log" "bsm/full/module/base/logs/internal/impl" "bsm/full/module/base/logs/internal/models" "git.apinb.com/bsm-sdk/core/errcode" "git.apinb.com/bsm-sdk/core/infra" "github.com/gin-gonic/gin" ) var ( DefaultPage = 1 DefaultSize = 50 MaxSize = 200 ) func LogFetch(c *gin.Context) { var request map[string]any err := c.BindJSON(&request) if err != nil { log.Printf("解析json异常: %v", err) infra.Response.Error(c, errcode.ErrJsonUnmarshal) return } var ( data []any count int64 tx = impl.DBService.Model(&models.LogData{}) ) // 分页参数归一化:page 至少为 1,size 默认 50 且不超过上限 page := normalizePage(getInt(request, "page")) sizeInput := getInt(request, "size") if sizeInput <= 0 { // 兼容 page_size 写法 sizeInput = getInt(request, "page_size") } size := normalizeSize(sizeInput) // 过滤条件统一用安全类型断言取值,键名与查询列保持一致 if opName := getString(request, "op_name"); opName != "" { tx = tx.Where("op_name like ?", "%"+opName+"%") } if service := getString(request, "service"); service != "" { tx = tx.Where("service like ?", "%"+service+"%") } if opIP := getString(request, "op_ip"); opIP != "" { tx = tx.Where("op_ip = ?", opIP) } if level := getInt(request, "level"); level > 0 { tx = tx.Where("level = ?", level) } if err := tx.Count(&count).Limit(size).Offset((page - 1) * size).Find(&data).Error; err != nil { log.Printf("查询异常: %v", err) infra.Response.Error(c, errcode.ErrDB) return } infra.Response.Success(c, map[string]any{ "data": data, "total": count, }) } // getString 安全读取字符串参数,缺失或类型不符时返回空串 func getString(m map[string]any, key string) string { if v, ok := m[key].(string); ok { return v } return "" } // getInt 安全读取整型参数,兼容 JSON 反序列化产生的 float64 func getInt(m map[string]any, key string) int { switch v := m[key].(type) { case int: return v case int64: return int(v) case float64: return int(v) } return 0 } // normalizePage 归一化页码,最小为 DefaultPage func normalizePage(page int) int { if page < DefaultPage { return DefaultPage } return page } // normalizeSize 归一化每页条数:默认 DefaultSize,并限制不超过 MaxSize func normalizeSize(size int) int { if size <= 0 { return DefaultSize } if size > MaxSize { return MaxSize } return size }