2023-11-08 21:53:07 +08:00

151 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package database
import (
"log"
"os"
"path"
"sun-panel/lib/cmn"
"sun-panel/models"
"time"
"gorm.io/driver/mysql"
_ "gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
_ "gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
const (
MYSQL = "mysql"
SQLITE = "sqlite"
)
type DbClient interface {
Connect() (db *gorm.DB, err error)
}
type MySQLConfig struct {
Username string
Password string
Host string
Port string
Database string
WaitTimeout int
}
type SQLiteConfig struct {
Filename string
}
func DbInit(dbClient DbClient) (db *gorm.DB, dbErr error) {
db, dbErr = dbClient.Connect()
if dbErr != nil {
return
}
return
}
// Connect mysql连接
func (d *MySQLConfig) Connect() (db *gorm.DB, err error) {
dsn := d.Username + ":" + d.Password + "@tcp(" + d.Host + ":" + d.Port + ")/" + d.Database + "?charset=utf8mb4&parseTime=True&loc=Local"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: GetLogger(),
NamingStrategy: schema.NamingStrategy{
// TablePrefix: "blog_",
SingularTable: true,
},
DisableForeignKeyConstraintWhenMigrating: true,
})
sqlDb, _ := db.DB()
sqlDb.SetMaxIdleConns(10) // SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDb.SetMaxOpenConns(100) // SetMaxOpenConns 设置打开数据库连接的最大数量。
wait_timeout := d.WaitTimeout
sqlDb.SetConnMaxLifetime(time.Duration(wait_timeout * int(time.Second))) // SetConnMaxLifetime 设置了连接可复用的最大时间。
return
}
// Connect sqllite3连接
func (d *SQLiteConfig) Connect() (db *gorm.DB, err error) {
filePath := d.Filename
exists := false
if exists, err = cmn.PathExists(path.Dir(filePath)); err != nil {
return
} else {
// 创建文件夹
if !exists {
if err = os.MkdirAll(path.Dir(filePath), 0666); err != nil {
return
}
}
db, err = gorm.Open(sqlite.Open(filePath), &gorm.Config{
Logger: GetLogger(),
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
}
return
}
// 日志
func GetLogger() logger.Interface {
return logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer日志输出的目标前缀和日志包含的内容——译者注
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Warn, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound记录未找到错误
Colorful: true, // 彩色打印
},
)
}
// 创建数据库
func CreateDatabase(driver string, db *gorm.DB) error {
// mysql特殊处理
if driver == MYSQL {
db = db.Set("gorm:table_options", "ENGINE=InnoDB")
}
// 创建数据表
err := db.AutoMigrate(
&models.User{},
&models.SystemSetting{},
&models.ItemIcon{},
&models.UserConfig{},
&models.File{},
)
return err
}
// 初始化一个用户,一个用户都没有的时候创建一个
func NotFoundAndCreateUser(db *gorm.DB) error {
fUser := models.User{}
if err := db.First(&fUser).Error; err != nil {
if err != gorm.ErrRecordNotFound {
return err
}
username := "admin@sun.cc"
fUser.Mail = username
fUser.Username = username
fUser.Name = username
fUser.Status = 1
fUser.Role = 1
fUser.Password = cmn.PasswordEncryption("12345678")
if errCreate := db.Create(&fUser).Error; errCreate != nil {
return errCreate
}
}
return nil
}