diff --git a/config.toml b/config.toml index 27e658d..2ccca92 100644 --- a/config.toml +++ b/config.toml @@ -5,7 +5,7 @@ Mode = "debug" Driver = "local" [Storage.Local] -Path="./storage" +Path = "./storage" [Storage.AwsS3] Bucket = "bucket" @@ -16,7 +16,7 @@ SecretID = "" SecretKey = "" BaseURL = "" Path = "" -S3ForcePathStyle = false +S3ForcePathStyle = false [Storage.AliYunOSS] Bucket = "bucket" @@ -27,7 +27,6 @@ AccessKeySecret = "" BaseURL = "" Path = "" - [Http] Static = "./dist" Https = false @@ -36,23 +35,24 @@ HttpKey = "" Port = 8088 [Http.Captcha] -KeyLong= 6 -Width= 240 -Height= 80 -OpenCaptcha= 0 -OpenCaptchaTimeout= 3600 +KeyLong = 6 +Width = 240 +Height = 80 +OpenCaptcha = 0 +OpenCaptchaTimeout = 3600 [Http.JWT] -SigningKey="f3a0ed18-3eea-4bc9-b440-d56c3bb77bd8" -ExpiresTime= "168h" # 7 days -BufferTime= "24h" -Issuer="AtomFramework" +SigningKey = "f3a0ed18-3eea-4bc9-b440-d56c3bb77bd8" +ExpiresTime = "168h" # 7 days +BufferTime = "24h" +Issuer = "AtomFramework" [Http.Cors] # 跨域配置 # 需要配合 server/initialize/router.go#L32 使用 # 放行模式: Allow-all, 放行全部; whitelist, 白名单模式, 来自白名单内域名的请求添加 cors 头; strict-whitelist 严格白名单模式, 白名单外的请求一律拒绝 -Mode="strict-whitelist" +Mode = "strict-whitelist" + [[Http.Cors.Whitelist]] AllowOrigin = "example1.com" AllowHeaders = "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id" @@ -75,12 +75,11 @@ Level = "debug" Prefix = "[github.com/flipped-aurora/gin-vue-admin/server]" Format = "console" Director = "log" -EncodeLevel= "LowercaseColorLevelEncoder" -StacktraceKey= "stacktrace" -MaxAge= 0 -ShowLine= true -LogInConsole= true - +EncodeLevel = "LowercaseColorLevelEncoder" +StacktraceKey = "stacktrace" +MaxAge = 0 +ShowLine = true +LogInConsole = true [Database] Driver = "mysql" @@ -91,6 +90,11 @@ Port = 3306 Database = "demos" Username = "root" Password = "root" +Prefix="" +Singular = false +MaxIdleConns = 10 +MaxOpenConns = 200 +Engine = "InnoDB" [Database.Redis] Host = "localhost" diff --git a/providers/config/section_database.go b/providers/config/section_database.go index 1d54f66..7a2cc85 100755 --- a/providers/config/section_database.go +++ b/providers/config/section_database.go @@ -14,11 +14,32 @@ type Database struct { // MySQL database config type MySQL struct { - Host string - Port uint - Database string - Username string - Password string + Host string + Port uint + Database string + Username string + Password string + Prefix string // 表前缀 + Singular bool //是否开启全局禁用复数,true表示开启 + MaxIdleConns int // 空闲中的最大连接数 + MaxOpenConns int // 打开到数据库的最大连接数 + Engine string //数据库引擎,默认InnoDB +} + +func (m *MySQL) CreateDatabaseSql() string { + return fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;", m.Database) +} +func (m *MySQL) EmptyDsn() string { + dsnTpl := "%s@tcp(%s:%d)/" + + authString := func() string { + if len(m.Password) > 0 { + return m.Username + ":" + m.Password + } + return m.Username + } + + return fmt.Sprintf(dsnTpl, authString(), m.Host, m.Port) } // DSN connection dsn @@ -45,6 +66,12 @@ type PostgreSQL struct { TimeZone string } +func (m *PostgreSQL) EmptyDsn() string { + dsnTpl := "host=%s user=%s password=%s port=%s dbname=postgres sslmode=disable TimeZone=Asia/Shanghai" + + return fmt.Sprintf(dsnTpl, m.Host, m.User, m.Password, m.Port) +} + // DSN connection dsn func (m *PostgreSQL) DSN() string { dsnTpl := "host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=%s" diff --git a/providers/database/mysql.go b/providers/database/mysql.go index b5e4740..84e7880 100644 --- a/providers/database/mysql.go +++ b/providers/database/mysql.go @@ -4,10 +4,12 @@ import ( "atom/container" "atom/providers/config" "database/sql" + "fmt" "log" "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/schema" ) func init() { @@ -17,14 +19,62 @@ func init() { } func NewDatabase(config *config.Config) (*gorm.DB, error) { - sqlDB, err := sql.Open("mysql", config.Database.MySQL.DSN()) + mysqlConfig := mysql.Config{ + DSN: config.Database.MySQL.DSN(), // DSN data source name + DefaultStringSize: 191, // string 类型字段的默认长度 + SkipInitializeWithVersion: false, // 根据版本自动配置 + } + + gormConfig := gorm.Config{ + NamingStrategy: schema.NamingStrategy{ + TablePrefix: config.Database.MySQL.Prefix, + SingularTable: config.Database.MySQL.Singular, + }, + DisableForeignKeyConstraintWhenMigrating: true, + } + + // TODO: config logger + // _default := logger.New(NewWriter(log.New(os.Stdout, "\r\n", log.LstdFlags)), logger.Config{ + // SlowThreshold: 200 * time.Millisecond, + // LogLevel: logger.Warn, + // Colorful: true, + // }) + // config.Logger = _default.LogMode(logger.Warn) + + db, err := gorm.Open(mysql.New(mysqlConfig), &gormConfig) if err != nil { return nil, err } - gormDB, err := gorm.Open(mysql.New(mysql.Config{ - Conn: sqlDB, - }), &gorm.Config{}) + // config instance + db.InstanceSet("gorm:table_options", "ENGINE="+config.Database.MySQL.Engine) - return gormDB, err + sqlDB, _ := db.DB() + sqlDB.SetMaxIdleConns(config.Database.MySQL.MaxIdleConns) + sqlDB.SetMaxOpenConns(config.Database.MySQL.MaxOpenConns) + + if err := createDatabase(config.Database.MySQL.EmptyDsn(), "mysql", config.Database.MySQL.CreateDatabaseSql()); err != nil { + return nil, err + } + + return db, err +} + +// createDatabase 创建数据库( EnsureDB() 中调用 ) +func createDatabase(dsn string, driver string, createSql string) error { + db, err := sql.Open(driver, dsn) + if err != nil { + return err + } + defer func(db *sql.DB) { + err = db.Close() + if err != nil { + fmt.Println(err) + } + }(db) + if err = db.Ping(); err != nil { + return err + } + _, err = db.Exec(createSql) + return err }