Просмотр исходного кода

feat(admin): 新增 Waf管理功能

- 添加 WafManageRepository、WafManageService 和 WafManageHandler
- 实现 Waf 管理列表的查询功能
- 集成 Waf 管理相关路由
- 优化数据库查询性能,添加分页和过滤功能
fusu 2 дней назад
Родитель
Сommit
ba007b8c58

+ 26 - 0
api/v1/admin/wagManage.go

@@ -0,0 +1,26 @@
+package admin
+
+import "time"
+
+type WafManageList struct {
+	Id       int64  `json:"id" form:"id" gorm:"column:id;"`
+	HostId   int64  `json:"hostId" form:"hostId" gorm:"column:host_id;"`
+	Uid      int64  `json:"uid" form:"uid" gorm:"column:uid;"`
+	Username string `json:"username" form:"username"`
+	Name     string `json:"name" form:"name" gorm:"column:name;"`
+	ExpiredAt time.Time `json:"expiredAt" form:"expiredAt" gorm:"column:expired_at;"`
+	Current  int	`form:"current" json:"current" default:"1"`
+	PageSize int	`form:"pageSize" json:"pageSize" default:"10"`
+	Column   string `form:"column" json:"column" default:"id"`
+	Order    string `form:"order" json:"order" default:"desc"`
+}
+
+type WafManageListRes struct {
+	Id       int64  `json:"id" form:"id" gorm:"column:id;"`
+	HostId   int64  `json:"hostId" form:"hostId" gorm:"column:host_id;"`
+	Uid      int64  `json:"uid" form:"uid" gorm:"column:uid;"`
+	Username string `json:"username" form:"username"`
+	Name     string `json:"name" form:"name" gorm:"column:name;"`
+	ExpiredAt int64 `json:"expiredAt" form:"expiredAt" gorm:"column:expired_at;"`
+	NextDueDate int64 `json:"nextDueDate" form:"nextDueDate" gorm:"column:nextduedate"`
+}

+ 3 - 0
cmd/server/wire/wire.go

@@ -62,6 +62,7 @@ var repositorySet = wire.NewSet(
 	flexCdnRep.NewCcIpListRepository,
 	adminRep.NewLogRepository,
 	adminRep.NewWafLogRepository,
+	adminRep.NewWafManageRepository,
 
 )
 
@@ -105,6 +106,7 @@ var serviceSet = wire.NewSet(
 	admin.NewLogService,
 	admin.NewWafLogService,
 	admin.NewWafLogDataCleanService,
+	admin.NewWafManageService,
 )
 
 var handlerSet = wire.NewSet(
@@ -131,6 +133,7 @@ var handlerSet = wire.NewSet(
 	wafHandler.NewCdnLogHandler,
 	adminHandler.NewLogHandler,
 	adminHandler.NewWafLogHandler,
+	adminHandler.NewWafManageHandler,
 )
 
 

+ 7 - 4
cmd/server/wire/wire_gen.go

@@ -120,7 +120,10 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 	adminLogService := admin2.NewLogService(serviceService, adminLogRepository)
 	logHandler := admin3.NewLogHandler(handlerHandler, adminLogService)
 	wafLogHandler := admin3.NewWafLogHandler(handlerHandler, wafLogService)
-	httpServer := server.NewHTTPServer(logger, viperViper, jwtJWT, syncedEnforcer, limiterLimiter, handlerFunc, userHandler, gameShieldHandler, gameShieldBackendHandler, webForwardingHandler, tcpforwardingHandler, udpForWardingHandler, globalLimitHandler, adminHandler, gatewayIpAdminHandler, allowAndDenyIpHandler, ccHandler, logService, ccIpListHandler, cdnLogHandler, logHandler, wafLogHandler)
+	wafManageRepository := admin.NewWafManageRepository(repositoryRepository)
+	wafManageService := admin2.NewWafManageService(serviceService, wafManageRepository)
+	wafManageHandler := admin3.NewWafManageHandler(handlerHandler, wafManageService)
+	httpServer := server.NewHTTPServer(logger, viperViper, jwtJWT, syncedEnforcer, limiterLimiter, handlerFunc, userHandler, gameShieldHandler, gameShieldBackendHandler, webForwardingHandler, tcpforwardingHandler, udpForWardingHandler, globalLimitHandler, adminHandler, gatewayIpAdminHandler, allowAndDenyIpHandler, ccHandler, logService, ccIpListHandler, cdnLogHandler, logHandler, wafLogHandler, wafManageHandler)
 	appApp := newApp(httpServer)
 	return appApp, func() {
 		cleanup()
@@ -129,11 +132,11 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 
 // wire.go:
 
-var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, admin.NewAdminRepository, admin.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, waf.NewWebForwardingRepository, waf.NewTcpforwardingRepository, waf.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, waf.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, flexCdn.NewCdnRepository, waf.NewAllowAndDenyIpRepository, flexCdn.NewProxyRepository, flexCdn.NewCcRepository, repository.NewExpiredRepository, repository.NewLogRepository, waf.NewGatewayipRepository, admin.NewGatewayIpAdminRepository, flexCdn.NewCcIpListRepository, admin.NewLogRepository, admin.NewWafLogRepository)
+var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, admin.NewAdminRepository, admin.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, waf.NewWebForwardingRepository, waf.NewTcpforwardingRepository, waf.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, waf.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, flexCdn.NewCdnRepository, waf.NewAllowAndDenyIpRepository, flexCdn.NewProxyRepository, flexCdn.NewCcRepository, repository.NewExpiredRepository, repository.NewLogRepository, waf.NewGatewayipRepository, admin.NewGatewayIpAdminRepository, flexCdn.NewCcIpListRepository, admin.NewLogRepository, admin.NewWafLogRepository, admin.NewWafManageRepository)
 
-var serviceSet = wire.NewSet(service.NewService, admin2.NewUserService, admin2.NewGatewayIpAdminService, admin2.NewAdminService, gameShield.NewGameShieldService, service.NewAoDunService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, waf2.NewWebForwardingService, waf2.NewTcpforwardingService, waf2.NewUdpForWardingService, service.NewGameShieldUserIpService, gameShield.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, waf2.NewGlobalLimitService, service.NewGatewayGroupService, waf2.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, flexCdn2.NewCdnService, waf2.NewAllowAndDenyIpService, flexCdn2.NewProxyService, flexCdn2.NewSslCertService, flexCdn2.NewWebsocketService, waf2.NewCcService, service.NewLogService, waf2.NewGatewayipService, waf2.NewCcIpListService, waf2.NewCdnLogService, waf2.NewBuildAudunService, waf2.NewZzybgpService, admin2.NewLogService, admin2.NewWafLogService, admin2.NewWafLogDataCleanService)
+var serviceSet = wire.NewSet(service.NewService, admin2.NewUserService, admin2.NewGatewayIpAdminService, admin2.NewAdminService, gameShield.NewGameShieldService, service.NewAoDunService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, waf2.NewWebForwardingService, waf2.NewTcpforwardingService, waf2.NewUdpForWardingService, service.NewGameShieldUserIpService, gameShield.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, waf2.NewGlobalLimitService, service.NewGatewayGroupService, waf2.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, flexCdn2.NewCdnService, waf2.NewAllowAndDenyIpService, flexCdn2.NewProxyService, flexCdn2.NewSslCertService, flexCdn2.NewWebsocketService, waf2.NewCcService, service.NewLogService, waf2.NewGatewayipService, waf2.NewCcIpListService, waf2.NewCdnLogService, waf2.NewBuildAudunService, waf2.NewZzybgpService, admin2.NewLogService, admin2.NewWafLogService, admin2.NewWafLogDataCleanService, admin2.NewWafManageService)
 
-var handlerSet = wire.NewSet(handler.NewHandler, admin3.NewUserHandler, admin3.NewAdminHandler, admin3.NewGatewayIpAdminHandler, handler.NewGameShieldHandler, handler.NewGameShieldPublicIpHandler, waf3.NewWebForwardingHandler, waf3.NewTcpforwardingHandler, waf3.NewUdpForWardingHandler, handler.NewGameShieldUserIpHandler, handler.NewGameShieldBackendHandler, handler.NewGameShieldSdkIpHandler, handler.NewHostHandler, waf3.NewGlobalLimitHandler, handler.NewGatewayGroupHandler, handler.NewGateWayGroupIpHandler, waf3.NewAllowAndDenyIpHandler, waf3.NewCcHandler, waf3.NewGatewayipHandler, waf3.NewCcIpListHandler, waf3.NewCdnLogHandler, admin3.NewLogHandler, admin3.NewWafLogHandler)
+var handlerSet = wire.NewSet(handler.NewHandler, admin3.NewUserHandler, admin3.NewAdminHandler, admin3.NewGatewayIpAdminHandler, handler.NewGameShieldHandler, handler.NewGameShieldPublicIpHandler, waf3.NewWebForwardingHandler, waf3.NewTcpforwardingHandler, waf3.NewUdpForWardingHandler, handler.NewGameShieldUserIpHandler, handler.NewGameShieldBackendHandler, handler.NewGameShieldSdkIpHandler, handler.NewHostHandler, waf3.NewGlobalLimitHandler, handler.NewGatewayGroupHandler, handler.NewGateWayGroupIpHandler, waf3.NewAllowAndDenyIpHandler, waf3.NewCcHandler, waf3.NewGatewayipHandler, waf3.NewCcIpListHandler, waf3.NewCdnLogHandler, admin3.NewLogHandler, admin3.NewWafLogHandler, admin3.NewWafManageHandler)
 
 // 限流器依赖集
 var limiterSet = wire.NewSet(limiter.NewLimiter, middleware.NewRateLimitMiddleware)

+ 41 - 0
internal/handler/admin/wafmanage.go

@@ -0,0 +1,41 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	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/handler"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service/admin"
+	"github.com/mcuadros/go-defaults"
+	"net/http"
+)
+
+type WafManageHandler struct {
+	*handler.Handler
+	wafManageService admin.WafManageService
+}
+
+func NewWafManageHandler(
+    handler *handler.Handler,
+    wafManageService admin.WafManageService,
+) *WafManageHandler {
+	return &WafManageHandler{
+		Handler:      handler,
+		wafManageService: wafManageService,
+	}
+}
+
+func (h *WafManageHandler) GetWafManageList(ctx *gin.Context) {
+	var req adminApi.WafManageList
+	if err := ctx.ShouldBind(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
+		return
+	}
+	defaults.SetDefaults(&req)
+	res, err := h.wafManageService.GetWafManageList(ctx,req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
+		return
+	}
+	v1.HandleSuccess(ctx, res)
+}

+ 99 - 0
internal/repository/admin/wafmanage.go

@@ -0,0 +1,99 @@
+package admin
+
+import (
+    "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/repository"
+	"math"
+	"strings"
+)
+
+type WafManageRepository interface {
+	GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error)
+}
+
+func NewWafManageRepository(
+	repository *repository.Repository,
+) WafManageRepository {
+	return &wafManageRepository{
+		Repository: repository,
+	}
+}
+
+type wafManageRepository struct {
+	*repository.Repository
+}
+
+func (r *wafManageRepository) GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error) {
+	var res []adminApi.WafManageListRes
+	var total int64
+
+	query := r.DB(ctx).Model(&model.GlobalLimit{}).Table("shd_waf as waf")
+
+	query = query.Joins("left join shd_clients as user on user.id = waf.uid")
+	query = query.Joins("left join shd_host as host on host.id = waf.host_id")
+	query = query.Where("waf.state = ?", 1)
+
+	if req.Id > 0 {
+		query = query.Where("waf.uid = ?", req.Id)
+	}
+
+	if req.Name != "" {
+		trimmedName := strings.TrimSpace(req.Name)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("waf.name LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+	if req.HostId > 0 {
+		query = query.Where("waf.host_id = ?", req.HostId)
+	}
+
+	if req.Username != "" {
+		trimmedName := strings.TrimSpace(req.Username)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("user.username LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+	if !req.ExpiredAt.IsZero() {
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("waf.expired_at <= ?", req.ExpiredAt)
+	}
+
+	if req.Column != "" && req.Order != "" {
+		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
+	} else if pageSize > 100 {
+		pageSize = 100
+	}
+
+	offset := (page - 1) * pageSize
+	result := query.Offset(offset).Limit(pageSize).Find(&res)
+	if result.Error != nil {
+		return nil, result.Error
+	}
+	return &v1.PaginatedResponse[adminApi.WafManageListRes]{
+		Records: res,
+		Page: page,
+		PageSize: pageSize,
+		Total: total,
+		TotalPages: int(math.Ceil(float64(total) / float64(pageSize))),
+	}, nil
+
+}

+ 3 - 0
internal/server/http.go

@@ -42,6 +42,7 @@ func NewHTTPServer(
 	cdnLogHandler *waf.CdnLogHandler,
 	logHandler *admin.LogHandler,
 	wafLogHandler *admin.WafLogHandler,
+	wafManageHandler *admin.WafManageHandler,
 ) *http.Server {
 	gin.SetMode(gin.DebugMode)
 	s := http.NewServer(
@@ -196,6 +197,8 @@ func NewHTTPServer(
 			strictAuthRouter.GET("admin/wafLog/getList", wafLogHandler.GetWafLogList)
 			strictAuthRouter.POST("admin/wafLog/export", wafLogHandler.ExportWafLog)
 			strictAuthRouter.GET("admin/wafLog/getApiDescriptions", wafLogHandler.GetApiDescriptions)
+
+			strictAuthRouter.GET("/admin/wafManage/getList", wafManageHandler.GetWafManageList)
 		}
 	}
 

+ 31 - 0
internal/service/admin/wafmanage.go

@@ -0,0 +1,31 @@
+package admin
+
+import (
+	"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/repository/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service"
+)
+
+type WafManageService interface {
+	GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error)
+}
+func NewWafManageService(
+    service *service.Service,
+    wafManageRepository admin.WafManageRepository,
+) WafManageService {
+	return &wafManageService{
+		Service:        service,
+		wafManageRepository: wafManageRepository,
+	}
+}
+
+type wafManageService struct {
+	*service.Service
+	wafManageRepository admin.WafManageRepository
+}
+
+func (s *wafManageService) GetWafManageList(ctx context.Context,req adminApi.WafManageList) (*v1.PaginatedResponse[adminApi.WafManageListRes], error) {
+	return s.wafManageRepository.GetWafManageList(ctx, req)
+}