package config import ( "fmt" "os" "path/filepath" "github.com/spf13/viper" ) // Config 全局配置结构 type Config struct { Server ServerConfig `mapstructure:"server"` Database DatabaseConfig `mapstructure:"database"` Storage StorageConfig `mapstructure:"storage"` Admin AdminConfig `mapstructure:"admin"` JWT JWTConfig `mapstructure:"jwt"` Log LogConfig `mapstructure:"log"` } type ServerConfig struct { Port string `mapstructure:"port"` Mode string `mapstructure:"mode"` // debug / release / test Domain string `mapstructure:"domain"` // 生产环境域名 } type DatabaseConfig struct { Driver string `mapstructure:"driver"` Source string `mapstructure:"source"` } type StorageConfig struct { Root string `mapstructure:"root"` // 文件存储根目录 Backups string `mapstructure:"backups"` // 备份目录 } type AdminConfig struct { Username string `mapstructure:"username"` Password string `mapstructure:"password"` Email string `mapstructure:"email"` Role string `mapstructure:"role"` } type JWTConfig struct { Secret string `mapstructure:"secret"` Expire string `mapstructure:"expire"` // 如 24h } type LogConfig struct { Level string `mapstructure:"level"` // debug/info/warn/error Dir string `mapstructure:"dir"` // 日志文件目录,为空则仅输出到控制台 MaxDays int `mapstructure:"max_days"` // 日志保留天数 } var cfg *Config // Load 加载配置文件,不存在时使用默认值并生成示例配置 func Load(path string) (*Config, error) { v := viper.New() setDefaults(v) // 设置环境变量前缀 v.SetEnvPrefix("FSS") v.AutomaticEnv() if path == "" { path = "config.yaml" } // 尝试加载配置文件 if _, err := os.Stat(path); err == nil { v.SetConfigFile(path) if err := v.ReadInConfig(); err != nil { return nil, fmt.Errorf("读取配置文件失败: %w", err) } } else { // 配置文件不存在时生成一份默认配置 _ = v.SafeWriteConfigAs(path) } c := &Config{} if err := v.Unmarshal(c); err != nil { return nil, fmt.Errorf("解析配置失败: %w", err) } cfg = c return c, nil } func setDefaults(v *viper.Viper) { v.SetDefault("server.port", "8100") v.SetDefault("server.mode", "debug") v.SetDefault("server.domain", "https://file.yunzer.cn") v.SetDefault("database.driver", "sqlite") v.SetDefault("database.source", "./storage/data.db") v.SetDefault("storage.root", "./storage/files") v.SetDefault("storage.backups", "./storage/backups") v.SetDefault("admin.username", "admin") v.SetDefault("admin.password", "admin123") v.SetDefault("admin.email", "admin@example.com") v.SetDefault("admin.role", "super_admin") v.SetDefault("jwt.secret", "please-change-this-secret-key") v.SetDefault("jwt.expire", "24h") v.SetDefault("log.level", "info") v.SetDefault("log.dir", "./storage/logs") v.SetDefault("log.max_days", 7) } // Get 获取全局配置 func Get() *Config { if cfg == nil { c, _ := Load("") cfg = c } return cfg } // EnsureDirs 确保所有存储相关目录存在 func (c *Config) EnsureDirs() error { dirs := []string{ filepath.Dir(c.Database.Source), c.Storage.Root, c.Storage.Backups, c.Log.Dir, } for _, d := range dirs { if d == "" { continue } if err := os.MkdirAll(d, 0o755); err != nil { return fmt.Errorf("创建目录 %s 失败: %w", d, err) } } return nil }