上传初始版,功能未经任何测试,仅为基本框架,目前为完全不可用状态
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"d:\项目\dobaochet\backend\config"
|
||||
"d:\项目\dobaochet\backend\models"
|
||||
"d:\项目\dobaochet\backend\utils"
|
||||
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// DB 全局数据库连接
|
||||
var DB *gorm.DB
|
||||
|
||||
// InitDB 初始化数据库连接
|
||||
func InitDB(cfg *config.Config) (*gorm.DB, error) {
|
||||
// 配置GORM日志
|
||||
newLogger := logger.New(
|
||||
log.New(log.Writer(), "\r\n", log.LstdFlags),
|
||||
logger.Config{
|
||||
SlowThreshold: time.Second, // 慢SQL阈值
|
||||
LogLevel: logger.Info, // 日志级别
|
||||
Colorful: true, // 彩色日志
|
||||
},
|
||||
)
|
||||
|
||||
// 连接数据库
|
||||
var err error
|
||||
switch {
|
||||
case len(cfg.Database.DSN) > 6 && cfg.Database.DSN[:6] == "sqlite":
|
||||
// SQLite连接
|
||||
DB, err = gorm.Open(sqlite.Open(cfg.Database.DSN[9:]), &gorm.Config{
|
||||
Logger: newLogger,
|
||||
})
|
||||
default:
|
||||
// 默认使用SQLite
|
||||
DB, err = gorm.Open(sqlite.Open("./chat.db"), &gorm.Config{
|
||||
Logger: newLogger,
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 设置连接池
|
||||
sqlDB, err := DB.DB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sqlDB.SetMaxIdleConns(cfg.Database.MaxIdleConns)
|
||||
sqlDB.SetMaxOpenConns(cfg.Database.MaxOpenConns)
|
||||
sqlDB.SetConnMaxLifetime(time.Hour)
|
||||
|
||||
// 自动迁移模型
|
||||
err = migrateModels()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 初始化数据
|
||||
err = seedData(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return DB, nil
|
||||
}
|
||||
|
||||
// migrateModels 自动迁移模型
|
||||
func migrateModels() error {
|
||||
return DB.AutoMigrate(
|
||||
&models.User{},
|
||||
&models.Quota{},
|
||||
&models.Conversation{},
|
||||
&models.Message{},
|
||||
)
|
||||
}
|
||||
|
||||
// seedData 初始化数据
|
||||
func seedData(cfg *config.Config) error {
|
||||
// 检查是否已有管理员用户
|
||||
var count int64
|
||||
DB.Model(&models.User{}).Where("is_admin = ?", true).Count(&count)
|
||||
|
||||
if count == 0 {
|
||||
// 创建管理员用户
|
||||
password, err := utils.HashPassword("admin123")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
adminUser := models.User{
|
||||
Username: "admin",
|
||||
Email: "admin@example.com",
|
||||
Password: password,
|
||||
IsAdmin: true,
|
||||
IsActive: true,
|
||||
LastLoginAt: time.Now(),
|
||||
Quota: models.Quota{
|
||||
TotalTokens: cfg.Quota.DefaultTotalTokens * 10, // 管理员配额10倍
|
||||
UsedTokens: 0,
|
||||
ResetAt: time.Now().Add(cfg.Quota.ResetInterval),
|
||||
TokenLimit: cfg.Quota.DefaultTokenLimit * 10,
|
||||
},
|
||||
}
|
||||
|
||||
result := DB.Create(&adminUser)
|
||||
if result.Error != nil {
|
||||
return result.Error
|
||||
}
|
||||
|
||||
log.Println("已创建管理员用户: admin / admin123")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetDB 获取数据库连接
|
||||
func GetDB() *gorm.DB {
|
||||
return DB
|
||||
}
|
||||
Reference in New Issue
Block a user