diff --git a/internal/models/agent.go b/internal/models/agent.go index 7ee19cf..a213309 100644 --- a/internal/models/agent.go +++ b/internal/models/agent.go @@ -2,8 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // Agent 远程执行代理 @@ -25,7 +23,6 @@ type Agent struct { Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用 CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (Agent) TableName() string { @@ -43,7 +40,6 @@ type AgentToken struct { Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用 CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (AgentToken) TableName() string { diff --git a/internal/models/env.go b/internal/models/env.go index 69d1207..1ec6475 100644 --- a/internal/models/env.go +++ b/internal/models/env.go @@ -2,8 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // EnvironmentVariable represents an environment variable @@ -18,7 +16,7 @@ type EnvironmentVariable struct { UserID string `json:"user_id" gorm:"size:20;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` + } func (EnvironmentVariable) TableName() string { @@ -33,7 +31,6 @@ type Script struct { UserID string `json:"user_id" gorm:"size:20;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (Script) TableName() string { diff --git a/internal/models/language.go b/internal/models/language.go index 1bf2941..ae8599f 100644 --- a/internal/models/language.go +++ b/internal/models/language.go @@ -2,7 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - "gorm.io/gorm" ) type Language struct { @@ -14,7 +13,6 @@ type Language struct { InstalledAt *LocalTime `json:"installed_at"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (Language) TableName() string { diff --git a/internal/models/notify_binding.go b/internal/models/notify_binding.go index 918067f..1ab6ee8 100644 --- a/internal/models/notify_binding.go +++ b/internal/models/notify_binding.go @@ -2,8 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // NotifyBinding 事件绑定表 @@ -16,7 +14,6 @@ type NotifyBinding struct { Extra BigText `json:"extra"` // 额外配置(如是否开启日志推送等,对应 BindingExtra 结构) CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } // BindingExtra 存储在 Extra 字段中的 JSON 配置 diff --git a/internal/models/notify_way.go b/internal/models/notify_way.go index 8d4598c..4565068 100644 --- a/internal/models/notify_way.go +++ b/internal/models/notify_way.go @@ -2,8 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // NotifyWay 消息推送渠道 @@ -15,7 +13,6 @@ type NotifyWay struct { Enabled bool `json:"enabled" gorm:"default:true;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (NotifyWay) TableName() string { diff --git a/internal/models/task.go b/internal/models/task.go index 23f4fcc..39f00b9 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -5,8 +5,6 @@ import ( "encoding/json" "fmt" "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // TaskLanguages 自定义语言配置列表类型,处理 JSON 序列化 @@ -98,7 +96,6 @@ type Task struct { RepoTaskID string `json:"repo_task_id" gorm:"size:20;index"` // 所属的仓库任务 ID CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (Task) TableName() string { diff --git a/internal/models/user.go b/internal/models/user.go index 0cb29a4..6df8976 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -2,8 +2,6 @@ package models import ( "github.com/engigu/baihu-panel/internal/constant" - - "gorm.io/gorm" ) // User represents a system user @@ -16,7 +14,6 @@ type User struct { TokenVersion int `json:"-" gorm:"default:1"` // 用于 JWT 失效校验 CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` - DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } func (User) TableName() string { diff --git a/internal/services/agent_service.go b/internal/services/agent_service.go index f728017..dcc629d 100644 --- a/internal/services/agent_service.go +++ b/internal/services/agent_service.go @@ -220,7 +220,7 @@ func (s *AgentService) Delete(id string) error { return &ServiceError{Message: "该 Agent 下还有关联任务,无法删除"} } - return database.DB.Unscoped().Where("id = ?", id).Delete(&models.Agent{}).Error + return database.DB.Where("id = ?", id).Delete(&models.Agent{}).Error } // GetByID 根据 ID 获取 Agent diff --git a/internal/services/app_log_service.go b/internal/services/app_log_service.go index 76be9df..ca70b1d 100644 --- a/internal/services/app_log_service.go +++ b/internal/services/app_log_service.go @@ -109,7 +109,7 @@ func (s *AppLogService) Clear(category string) error { if category != "" { query = query.Where("category = ?", category) } - return query.Unscoped().Delete(&models.AppLog{}).Error + return query.Delete(&models.AppLog{}).Error } func (s *AppLogService) GetRetentionConfigs() map[string]LogRetentionConfig { @@ -146,7 +146,7 @@ func (s *AppLogService) CleanUp() { if cfg.Days > 0 { deadline := time.Now().AddDate(0, 0, -cfg.Days) - database.DB.Unscoped().Where("category = ? AND created_at < ?", cat, deadline).Delete(&models.AppLog{}) + database.DB.Where("category = ? AND created_at < ?", cat, deadline).Delete(&models.AppLog{}) } if cfg.MaxCount > 0 { @@ -157,7 +157,7 @@ func (s *AppLogService) CleanUp() { var ids []string database.DB.Model(&models.AppLog{}).Where("category = ?", cat).Order("created_at asc").Limit(int(deleteCount)).Pluck("id", &ids) if len(ids) > 0 { - database.DB.Unscoped().Where("id IN ?", ids).Delete(&models.AppLog{}) + database.DB.Where("id IN ?", ids).Delete(&models.AppLog{}) } } } diff --git a/internal/services/backup_service.go b/internal/services/backup_service.go index 48e1821..cdeb221 100644 --- a/internal/services/backup_service.go +++ b/internal/services/backup_service.go @@ -43,30 +43,27 @@ type tableConfig struct { func (s *BackupService) getTableConfigs() []tableConfig { return []tableConfig{ - {"users.json", s.exportTable(&[]models.User{}, true), s.restoreTable(&[]models.User{})}, - {"tasks.json", s.exportTable(&[]models.Task{}, true), s.restoreTable(&[]models.Task{})}, - {"task_logs.json", s.exportTable(&[]models.TaskLog{}, false), s.restoreTable(&[]models.TaskLog{})}, - {"envs.json", s.exportTable(&[]models.EnvironmentVariable{}, true), s.restoreTable(&[]models.EnvironmentVariable{})}, - {"scripts.json", s.exportTable(&[]models.Script{}, true), s.restoreTable(&[]models.Script{})}, + {"users.json", s.exportTable(&[]models.User{}), s.restoreTable(&[]models.User{})}, + {"tasks.json", s.exportTable(&[]models.Task{}), s.restoreTable(&[]models.Task{})}, + {"task_logs.json", s.exportTable(&[]models.TaskLog{}), s.restoreTable(&[]models.TaskLog{})}, + {"envs.json", s.exportTable(&[]models.EnvironmentVariable{}), s.restoreTable(&[]models.EnvironmentVariable{})}, + {"scripts.json", s.exportTable(&[]models.Script{}), s.restoreTable(&[]models.Script{})}, {"settings.json", s.exportSettings, s.restoreSettings}, - {"send_stats.json", s.exportTable(&[]models.SendStats{}, false), s.restoreTable(&[]models.SendStats{})}, + {"send_stats.json", s.exportTable(&[]models.SendStats{}), s.restoreTable(&[]models.SendStats{})}, - {"agents.json", s.exportTable(&[]models.Agent{}, true), s.restoreTable(&[]models.Agent{})}, - {"tokens.json", s.exportTable(&[]models.AgentToken{}, true), s.restoreTable(&[]models.AgentToken{})}, - {"languages.json", s.exportTable(&[]models.Language{}, true), s.restoreTable(&[]models.Language{})}, - {"deps.json", s.exportTable(&[]models.Dependency{}, true), s.restoreTable(&[]models.Dependency{})}, - {"notify_ways.json", s.exportTable(&[]models.NotifyWay{}, true), s.restoreTable(&[]models.NotifyWay{})}, - {"notify_bindings.json", s.exportTable(&[]models.NotifyBinding{}, true), s.restoreTable(&[]models.NotifyBinding{})}, - {"app_logs.json", s.exportTable(&[]models.AppLog{}, false), s.restoreTable(&[]models.AppLog{})}, + {"agents.json", s.exportTable(&[]models.Agent{}), s.restoreTable(&[]models.Agent{})}, + {"tokens.json", s.exportTable(&[]models.AgentToken{}), s.restoreTable(&[]models.AgentToken{})}, + {"languages.json", s.exportTable(&[]models.Language{}), s.restoreTable(&[]models.Language{})}, + {"deps.json", s.exportTable(&[]models.Dependency{}), s.restoreTable(&[]models.Dependency{})}, + {"notify_ways.json", s.exportTable(&[]models.NotifyWay{}), s.restoreTable(&[]models.NotifyWay{})}, + {"notify_bindings.json", s.exportTable(&[]models.NotifyBinding{}), s.restoreTable(&[]models.NotifyBinding{})}, + {"app_logs.json", s.exportTable(&[]models.AppLog{}), s.restoreTable(&[]models.AppLog{})}, } } -func (s *BackupService) exportTable(modelPtr any, unscoped bool) func(io.Writer) error { +func (s *BackupService) exportTable(modelPtr any) func(io.Writer) error { return func(w io.Writer) error { db := database.DB - if unscoped { - db = db.Unscoped() - } if _, err := w.Write([]byte("[\n")); err != nil { return err @@ -222,21 +219,21 @@ func (s *BackupService) Restore(zipPath string) error { // 开启全局事务 err = database.DB.Transaction(func(tx *gorm.DB) error { // 1. 清空现有数据(物理删除) - tx.Unscoped().Where("1=1").Delete(&models.User{}) - tx.Unscoped().Where("1=1").Delete(&models.Task{}) - tx.Unscoped().Where("1=1").Delete(&models.TaskLog{}) - tx.Unscoped().Where("1=1").Delete(&models.EnvironmentVariable{}) - tx.Unscoped().Where("1=1").Delete(&models.Script{}) - tx.Unscoped().Where("section != ?", BackupSection).Delete(&models.Setting{}) - tx.Unscoped().Where("1=1").Delete(&models.SendStats{}) + tx.Where("1=1").Delete(&models.User{}) + tx.Where("1=1").Delete(&models.Task{}) + tx.Where("1=1").Delete(&models.TaskLog{}) + tx.Where("1=1").Delete(&models.EnvironmentVariable{}) + tx.Where("1=1").Delete(&models.Script{}) + tx.Where("section != ?", BackupSection).Delete(&models.Setting{}) + tx.Where("1=1").Delete(&models.SendStats{}) - tx.Unscoped().Where("1=1").Delete(&models.Agent{}) - tx.Unscoped().Where("1=1").Delete(&models.AgentToken{}) - tx.Unscoped().Where("1=1").Delete(&models.Language{}) - tx.Unscoped().Where("1=1").Delete(&models.Dependency{}) - tx.Unscoped().Where("1=1").Delete(&models.NotifyWay{}) - tx.Unscoped().Where("1=1").Delete(&models.NotifyBinding{}) - tx.Unscoped().Where("1=1").Delete(&models.AppLog{}) + tx.Where("1=1").Delete(&models.Agent{}) + tx.Where("1=1").Delete(&models.AgentToken{}) + tx.Where("1=1").Delete(&models.Language{}) + tx.Where("1=1").Delete(&models.Dependency{}) + tx.Where("1=1").Delete(&models.NotifyWay{}) + tx.Where("1=1").Delete(&models.NotifyBinding{}) + tx.Where("1=1").Delete(&models.AppLog{}) // 2. 依次恢复每个表 for _, cfg := range configs { diff --git a/internal/services/notification_service.go b/internal/services/notification_service.go index 9c44c32..55e5aa7 100644 --- a/internal/services/notification_service.go +++ b/internal/services/notification_service.go @@ -131,12 +131,12 @@ func (s *NotificationService) DeleteChannel(id string) error { } // 删除渠道 - if err := database.DB.Unscoped().Where("id = ?", id).Delete(&models.NotifyWay{}).Error; err != nil { + if err := database.DB.Where("id = ?", id).Delete(&models.NotifyWay{}).Error; err != nil { return err } // 同时清理事件绑定中引用此渠道的配置 - if err := database.DB.Unscoped().Where("way_id = ?", id).Delete(&models.NotifyBinding{}).Error; err != nil { + if err := database.DB.Where("way_id = ?", id).Delete(&models.NotifyBinding{}).Error; err != nil { logger.Errorf("[Notify] 清理事件绑定失败: %v", err) } @@ -178,7 +178,7 @@ func (s *NotificationService) BatchSaveBindings(bindingType, dataID string, bind return database.DB.Transaction(func(tx *gorm.DB) error { // 如果指定了 dataID,先清理该对象的所有现有绑定 if dataID != "" { - if err := tx.Unscoped().Where("type = ? AND data_id = ?", bindingType, dataID).Delete(&models.NotifyBinding{}).Error; err != nil { + if err := tx.Where("type = ? AND data_id = ?", bindingType, dataID).Delete(&models.NotifyBinding{}).Error; err != nil { return err } } @@ -198,7 +198,7 @@ func (s *NotificationService) BatchSaveBindings(bindingType, dataID string, bind // DeleteBinding 删除事件绑定 func (s *NotificationService) DeleteBinding(id string) error { - return database.DB.Unscoped().Where("id = ?", id).Delete(&models.NotifyBinding{}).Error + return database.DB.Where("id = ?", id).Delete(&models.NotifyBinding{}).Error } // GetBindingsByEvent 根据事件类型和数据ID获取绑定 diff --git a/internal/services/tasks/task_service.go b/internal/services/tasks/task_service.go index 75a7f78..d8baae0 100644 --- a/internal/services/tasks/task_service.go +++ b/internal/services/tasks/task_service.go @@ -143,7 +143,7 @@ func (ts *TaskService) DeleteTask(id string) bool { // 同时删除关联的通知推送设置 database.DB.Where("type = ? AND data_id = ?", constant.BindingTypeTask, id).Delete(&models.NotifyBinding{}) - result := database.DB.Unscoped().Where("id = ?", id).Delete(&models.Task{}) + result := database.DB.Where("id = ?", id).Delete(&models.Task{}) return result.RowsAffected > 0 } @@ -151,6 +151,6 @@ func (ts *TaskService) BatchDeleteTasks(ids []string) int64 { // 同时删除关联的通知推送设置 database.DB.Where("type = ? AND data_id IN ?", constant.BindingTypeTask, ids).Delete(&models.NotifyBinding{}) - result := database.DB.Unscoped().Where("id IN ?", ids).Delete(&models.Task{}) + result := database.DB.Where("id IN ?", ids).Delete(&models.Task{}) return result.RowsAffected }