2026-08-09 10:43:45 +08:00
|
|
|
|
package log
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"log"
|
|
|
|
|
|
|
2026-08-09 12:41:08 +08:00
|
|
|
|
"bsm/full/module/base/logs/internal/impl"
|
|
|
|
|
|
"bsm/full/module/base/logs/internal/models"
|
2026-08-09 10:43:45 +08:00
|
|
|
|
"git.apinb.com/bsm-sdk/core/errcode"
|
|
|
|
|
|
"git.apinb.com/bsm-sdk/core/infra"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
DefaultPage = 1
|
|
|
|
|
|
DefaultSize = 50
|
2026-09-22 21:15:34 +08:00
|
|
|
|
MaxSize = 200
|
2026-08-09 10:43:45 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
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{})
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-09-22 21:15:34 +08:00
|
|
|
|
// 分页参数归一化:page 至少为 1,size 默认 50 且不超过上限
|
|
|
|
|
|
page := normalizePage(getInt(request, "page"))
|
|
|
|
|
|
sizeInput := getInt(request, "size")
|
|
|
|
|
|
if sizeInput <= 0 {
|
|
|
|
|
|
// 兼容 page_size 写法
|
|
|
|
|
|
sizeInput = getInt(request, "page_size")
|
2026-08-09 10:43:45 +08:00
|
|
|
|
}
|
2026-09-22 21:15:34 +08:00
|
|
|
|
size := normalizeSize(sizeInput)
|
|
|
|
|
|
|
|
|
|
|
|
// 过滤条件统一用安全类型断言取值,键名与查询列保持一致
|
|
|
|
|
|
if opName := getString(request, "op_name"); opName != "" {
|
|
|
|
|
|
tx = tx.Where("op_name like ?", "%"+opName+"%")
|
2026-08-09 10:43:45 +08:00
|
|
|
|
}
|
2026-09-22 21:15:34 +08:00
|
|
|
|
if service := getString(request, "service"); service != "" {
|
|
|
|
|
|
tx = tx.Where("service like ?", "%"+service+"%")
|
2026-08-09 10:43:45 +08:00
|
|
|
|
}
|
2026-09-22 21:15:34 +08:00
|
|
|
|
if opIP := getString(request, "op_ip"); opIP != "" {
|
|
|
|
|
|
tx = tx.Where("op_ip = ?", opIP)
|
2026-08-09 10:43:45 +08:00
|
|
|
|
}
|
2026-09-22 21:15:34 +08:00
|
|
|
|
if level := getInt(request, "level"); level > 0 {
|
|
|
|
|
|
tx = tx.Where("level = ?", level)
|
2026-08-09 10:43:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2026-09-22 21:15:34 +08:00
|
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
|
}
|