后端 Go+Gin:认证/CSRF/限流、板块、帖子、评论、点赞、通知、用户资料、置顶推荐;前端 Next.js 16:发帖/编辑/删除、搜索、分页、点赞、通知中心、设置;基础设施 docker-compose 与配置模板;添加 .gitignore 与专有许可证(保留所有权利)
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
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
|
|
}
|
|
}
|
|
}
|