package model import ( "fmt" "log" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) // DB 全局数据库实例 var DB *gorm.DB // InitDB 连接 PostgreSQL 并自动迁移 func InitDB(dsn string) error { db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Warn), }) if err != nil { return fmt.Errorf("连接 PostgreSQL 失败: %w", err) } if err := db.AutoMigrate( &User{}, &Board{}, &Post{}, &Comment{}, &RefreshToken{}, &Like{}, &Notification{}, ); err != nil { return fmt.Errorf("自动迁移失败: %w", err) } DB = db seedDefaultBoards(db) log.Println("[model] PostgreSQL 数据库初始化完成") return nil } // PingDB 检测数据库连接 func PingDB() error { if DB == nil { return fmt.Errorf("数据库未初始化") } sqlDB, err := DB.DB() if err != nil { return err } return sqlDB.Ping() } // seedDefaultBoards 写入默认板块 func seedDefaultBoards(db *gorm.DB) { defaults := []Board{ {Name: "综合讨论", Description: "什么都可以聊", Icon: "message-circle", SortOrder: 1}, {Name: "技术分享", Description: "分享技术心得与问题", Icon: "code", SortOrder: 2}, {Name: "问答求助", Description: "提问与解答", Icon: "help-circle", SortOrder: 3}, {Name: "闲聊灌水", Description: "轻松闲聊", Icon: "coffee", SortOrder: 4}, } for _, b := range defaults { var count int64 db.Model(&Board{}).Where("name = ?", b.Name).Count(&count) if count == 0 { _ = db.Create(&b).Error } } }