feat: 服务器批量导入全栈实现 + SQL审计模型修复 + 审批流程增强

服务器批量导入:
- 后端 BatchCreateServers handler: 逐条校验/查重/GB→MB转换/错误明细
- 前端 CSV 解析器 + IP校验 + 模板下载 + 真实API导入
- 删除孤立占位组件 BatchImport.tsx

SQL审计:
- 修复 TableName 字段与 GORM 接口冲突 → TargetTable
- 补全路由注册 + AutoMigrate + 种子数据

审批流程增强 + 告警/菜单微调

// Logan.Li
This commit is contained in:
attacker committed 2026-06-15 02:12:05 +08:00
1 parent 6545597412
commit 77c33a6fee
16 files changed
+863 -573

No files matched your search

+19
View File
@@ -110,6 +110,7 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
servers.PUT("/:id", serverHandler.UpdateServer)
servers.DELETE("/:id", serverHandler.DeleteServer)
servers.POST("/batch-delete", serverHandler.BatchDeleteServers)
servers.POST("/batch", serverHandler.BatchCreateServers)
}
// 云账号路由
@@ -351,6 +352,24 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config) {
audit.POST("/logs/clear", auditHandler.ClearAuditLogs)
}
// SQL审计路由 // Logan.Li
sqlAuditHandler := handlers.NewSQLAuditHandler(db)
sqlAudit := authorized.Group("/sql-audit")
{
sqlAudit.GET("/records", sqlAuditHandler.ListRecords)
sqlAudit.GET("/records/:id", sqlAuditHandler.GetRecord)
sqlAudit.POST("/analyze", sqlAuditHandler.AnalyzeSQL)
sqlAudit.POST("/records/:id/approve", sqlAuditHandler.ApproveRecord)
sqlAudit.POST("/records/:id/reject", sqlAuditHandler.RejectRecord)
sqlAudit.POST("/records/:id/execute", sqlAuditHandler.ExecuteRecord)
sqlAudit.DELETE("/records/:id", sqlAuditHandler.DeleteRecord)
sqlAudit.GET("/rules", sqlAuditHandler.ListRules)
sqlAudit.POST("/rules", sqlAuditHandler.CreateRule)
sqlAudit.PUT("/rules/:id", sqlAuditHandler.UpdateRule)
sqlAudit.DELETE("/rules/:id", sqlAuditHandler.DeleteRule)
sqlAudit.POST("/rules/:id/toggle", sqlAuditHandler.ToggleRule)
}
// Agent 上报路由(无需 JWT)
agentHandler := handlers.NewAgentHandler(db)
taskHandler := handlers.NewAgentTaskHandler(db)