|
@@ -2,13 +2,17 @@ package admin
|
|
|
|
|
|
import (
|
|
import (
|
|
"context"
|
|
"context"
|
|
|
|
+ v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
|
|
|
|
+ adminApi "github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/model"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/model"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/repository"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/repository"
|
|
|
|
+ "math"
|
|
|
|
+ "strings"
|
|
)
|
|
)
|
|
|
|
|
|
type WafLogRepository interface {
|
|
type WafLogRepository interface {
|
|
GetWafLog(ctx context.Context, id int64) (*model.WafLog, error)
|
|
GetWafLog(ctx context.Context, id int64) (*model.WafLog, error)
|
|
- GetWafLogList(ctx context.Context) ([]model.WafLog, error)
|
|
|
|
|
|
+ GetWafLogList(ctx context.Context, req adminApi.SearchWafLogParams) (*v1.PaginatedResponse[model.WafLog], error)
|
|
AddWafLog(ctx context.Context, log *model.WafLog) error
|
|
AddWafLog(ctx context.Context, log *model.WafLog) error
|
|
BatchAddWafLog(ctx context.Context, logs []*model.WafLog) error
|
|
BatchAddWafLog(ctx context.Context, logs []*model.WafLog) error
|
|
}
|
|
}
|
|
@@ -30,9 +34,108 @@ func (r *wafLogRepository) GetWafLog(ctx context.Context, id int64) (*model.WafL
|
|
return &res, r.DBWithName(ctx,"admin").Where("id = ?", id).First(&res).Error
|
|
return &res, r.DBWithName(ctx,"admin").Where("id = ?", id).First(&res).Error
|
|
}
|
|
}
|
|
|
|
|
|
-func (r *wafLogRepository) GetWafLogList(ctx context.Context) ([]model.WafLog, error) {
|
|
|
|
|
|
+func (r *wafLogRepository) GetWafLogList(ctx context.Context, req adminApi.SearchWafLogParams) (*v1.PaginatedResponse[model.WafLog], error) {
|
|
var res []model.WafLog
|
|
var res []model.WafLog
|
|
- return res, r.DBWithName(ctx,"admin").Find(&res).Error
|
|
|
|
|
|
+ var total int64
|
|
|
|
+
|
|
|
|
+ query := r.DBWithName(ctx,"admin").Model(&model.WafLog{})
|
|
|
|
+ if req.RequestIp != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.RequestIp)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("request_ip LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if req.Uid != 0 {
|
|
|
|
+ query = query.Where("uid = ?", req.Uid)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.Api != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.Api)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("api LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.Name != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.Name)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("name LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if req.RuleId != 0 {
|
|
|
|
+ query = query.Where("rule_id = ?", req.RuleId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.HostId != 0 {
|
|
|
|
+ query = query.Where("host_id = ?", req.HostId)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.Api != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.Api)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("api LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.UserAgent != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.UserAgent)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("user_agent LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.ApiName != "" {
|
|
|
|
+ trimmedName := strings.TrimSpace(req.ApiName)
|
|
|
|
+ // 使用 LIKE 进行模糊匹配
|
|
|
|
+ query = query.Where("api_name LIKE CONCAT('%', ?, '%')", trimmedName)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if req.ApiType != "" {
|
|
|
|
+ query = query.Where("api_type = ?", req.ApiType)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if req.Column != "" {
|
|
|
|
+ query = query.Order(req.Column + " " + req.Order)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if err := query.Count(&total).Error; err != nil {
|
|
|
|
+ // 如果连计数都失败了,直接返回错误
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ page := req.Current
|
|
|
|
+ pageSize := req.PageSize
|
|
|
|
+
|
|
|
|
+ if page <= 0 {
|
|
|
|
+ page = 1
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if pageSize <= 0 {
|
|
|
|
+ pageSize = 10 // 默认每页 10 条
|
|
|
|
+ } else if pageSize > 100 {
|
|
|
|
+ pageSize = 100 // 每页最多 100 条
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 计算 offset (偏移量)
|
|
|
|
+ // 例如,第 1 页,offset = (1-1)*10 = 0 (从第0条开始)
|
|
|
|
+ // 第 2 页,offset = (2-1)*10 = 10 (从第10条开始)
|
|
|
|
+ offset := (page - 1) * pageSize
|
|
|
|
+ // 3. 执行最终的查询
|
|
|
|
+ // 在所有条件都添加完毕后,再执行 .Find()
|
|
|
|
+ result := query.Offset(offset).Limit(pageSize).Find(&res)
|
|
|
|
+ if result.Error != nil {
|
|
|
|
+ // 这里的错误可能是数据库连接问题等,而不是“未找到记录”
|
|
|
|
+ return nil, result.Error
|
|
|
|
+ }
|
|
|
|
+ return &v1.PaginatedResponse[model.WafLog]{
|
|
|
|
+ Records: res,
|
|
|
|
+ Page: page,
|
|
|
|
+ PageSize: pageSize,
|
|
|
|
+ Total: total,
|
|
|
|
+ TotalPages: int(math.Ceil(float64(total) / float64(pageSize))),
|
|
|
|
+
|
|
|
|
+ }, nil
|
|
}
|
|
}
|
|
|
|
|
|
func (r *wafLogRepository) AddWafLog(ctx context.Context, log *model.WafLog) error {
|
|
func (r *wafLogRepository) AddWafLog(ctx context.Context, log *model.WafLog) error {
|