Files
full/module/base/logs/internal/logic/log/fetch.go
2026-09-22 21:15:34 +08:00

108 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 至少为 1size 默认 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
}