初始化2

This commit is contained in:
2026-07-10 17:33:33 +08:00
parent b51ee98afa
commit 94f6ecf901
59 changed files with 3893 additions and 980 deletions

View File

@@ -23,8 +23,14 @@ type Config struct {
// BackupConfig 备份工具配置
type BackupConfig struct {
MysqlDumpPath string `mapstructure:"mysqldump_path"` // mysqldump 路径
MysqlPath string `mapstructure:"mysql_path"` // mysql 路径
// MySQL
MysqlDumpPath string `mapstructure:"mysqldump_path"`
MysqlPath string `mapstructure:"mysql_path"`
// PostgreSQL
PgDumpPath string `mapstructure:"pgdump_path"`
PsqlPath string `mapstructure:"psql_path"`
// SQL Server
SqlCmdPath string `mapstructure:"sqlcmd_path"`
}
// ServerConfig 服务器配置
@@ -36,6 +42,7 @@ type ServerConfig struct {
// DatabaseConfig 数据库配置
type DatabaseConfig struct {
Type string `mapstructure:"type"` // 数据库类型: mysql / sqlserver / postgres
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Username string `mapstructure:"username"`
@@ -43,10 +50,22 @@ type DatabaseConfig struct {
DBName string `mapstructure:"dbname"`
}
// DSN 返回数据库连接字符串
// DSN 返回数据库连接字符串(根据类型生成不同格式)
func (d *DatabaseConfig) DSN() string {
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
d.Username, d.Password, d.Host, d.Port, d.DBName)
switch d.Type {
case "sqlserver":
// SQL Server: sqlserver://user:pass@host:port?database=db名
return fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s",
d.Username, d.Password, d.Host, d.Port, d.DBName)
case "postgres":
// PostgreSQL: host=localhost port=5432 user=x password=x dbname=x sslmode=disable
return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable TimeZone=Asia/Shanghai",
d.Host, d.Port, d.Username, d.Password, d.DBName)
default:
// MySQL: user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
d.Username, d.Password, d.Host, d.Port, d.DBName)
}
}
// JWTConfig JWT配置
@@ -65,6 +84,7 @@ type StorageConfig struct {
// Load 加载配置文件
// 配置文件搜索路径: ./config.yaml, ./config/config.yaml
// 支持环境变量覆盖: SERVER_PORT, SERVER_MODE, DB_HOST, DB_PORT, DB_PASSWORD, DB_NAME 等
func Load() (*Config, error) {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
@@ -75,6 +95,7 @@ func Load() (*Config, error) {
// 设置默认值
setDefaults()
// 读取配置文件
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
return nil, fmt.Errorf("读取配置文件失败: %w", err)
@@ -82,6 +103,22 @@ func Load() (*Config, error) {
log.Println("未找到配置文件, 使用默认配置")
}
// 支持环境变量覆盖(优先级: 环境变量 > 配置文件 > 默认值)
viper.SetEnvPrefix("FS")
viper.AutomaticEnv()
// 环境变量映射
viper.BindEnv("server.port", "FS_SERVER_PORT")
viper.BindEnv("server.mode", "FS_SERVER_MODE")
viper.BindEnv("server.public_url", "FS_PUBLIC_URL")
viper.BindEnv("database.type", "FS_DB_TYPE")
viper.BindEnv("database.host", "FS_DB_HOST")
viper.BindEnv("database.port", "FS_DB_PORT")
viper.BindEnv("database.username", "FS_DB_USER")
viper.BindEnv("database.password", "FS_DB_PASSWORD")
viper.BindEnv("database.dbname", "FS_DB_NAME")
viper.BindEnv("jwt.secret", "FS_JWT_SECRET")
AppConfig = &Config{}
if err := viper.Unmarshal(AppConfig); err != nil {
return nil, fmt.Errorf("解析配置失败: %w", err)
@@ -97,6 +134,7 @@ func setDefaults() {
viper.SetDefault("server.mode", "debug")
// 数据库默认配置
viper.SetDefault("database.type", "mysql")
viper.SetDefault("database.host", "127.0.0.1")
viper.SetDefault("database.port", 3306)
viper.SetDefault("database.username", "root")

View File

@@ -7,6 +7,8 @@ import (
"time"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlserver"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
@@ -15,11 +17,22 @@ import (
var DB *gorm.DB
// InitDB 初始化数据库连接
// 支持: mysql / sqlserver / postgres
func InitDB(cfg *DatabaseConfig) error {
dsn := cfg.DSN()
var dialector gorm.Dialector
switch cfg.Type {
case "sqlserver":
dialector = sqlserver.Open(dsn)
case "postgres":
dialector = postgres.Open(dsn)
default:
dialector = mysql.Open(dsn)
}
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
DB, err = gorm.Open(dialector, &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
@@ -37,6 +50,6 @@ func InitDB(cfg *DatabaseConfig) error {
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大存活时间
log.Println("数据库连接成功")
log.Printf("数据库连接成功 [%s]", cfg.Type)
return nil
}