From 8ff5d35d6df396c692f92d7273b1d353a90499c9 Mon Sep 17 00:00:00 2001 From: ata <17314593+asdxzaaaaa@user.noreply.gitee.com> Date: Fri, 10 Jul 2026 10:05:58 +0000 Subject: [PATCH] Add internal/config/config.go --- internal/config/config.go | 197 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 internal/config/config.go diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..ad7ea2d --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,197 @@ +package config + +import ( + "fmt" + "os" + + "gopkg.in/yaml.v3" +) + +// Config 全局配置根结构 +type Config struct { + Server ServerConfig `yaml:"server"` + Database DatabaseConfig `yaml:"database"` + JWT JWTConfig `yaml:"jwt"` + Upload UploadConfig `yaml:"upload"` + Storage StorageConfig `yaml:"storage"` + SMS SMSConfig `yaml:"sms"` + Wechat WechatConfig `yaml:"wechat"` + AI AIConfig `yaml:"ai"` + CORS CORSConfig `yaml:"cors"` + RateLimit RateLimitConfig `yaml:"rate_limit"` + Env EnvConfig `yaml:"env"` +} + +// ServerConfig 服务配置 +type ServerConfig struct { + Port int `yaml:"port"` + ReadTimeout int `yaml:"read_timeout"` // 读超时(秒) + WriteTimeout int `yaml:"write_timeout"` // 写超时(秒) + IdleTimeout int `yaml:"idle_timeout"` // 空闲超时(秒) + ShutdownTimeout int `yaml:"shutdown_timeout"` // 优雅关机等待(秒) +} + +// DatabaseConfig 数据库配置 +type DatabaseConfig struct { + Driver string `yaml:"driver"` // sqlite | mysql + AutoMigrate bool `yaml:"auto_migrate"` + InitData bool `yaml:"init_data"` + SQLite SQLiteConfig `yaml:"sqlite"` + MySQL MySQLConfig `yaml:"mysql"` + DSN string `yaml:"-"` +} + +// SQLiteConfig SQLite 配置 +type SQLiteConfig struct { + Path string `yaml:"path"` +} + +// MySQLConfig MySQL 配置 +type MySQLConfig struct { + Host string `yaml:"host"` + Port int `yaml:"port"` + Username string `yaml:"username"` + Password string `yaml:"password"` + Database string `yaml:"database"` + Charset string `yaml:"charset"` + MaxIdleConns int `yaml:"max_idle_conns"` + MaxOpenConns int `yaml:"max_open_conns"` +} + +// BuildDSN 根据驱动构建数据源名 +func (c *DatabaseConfig) BuildDSN() { + switch c.Driver { + case "mysql": + c.DSN = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", + c.MySQL.Username, c.MySQL.Password, c.MySQL.Host, c.MySQL.Port, c.MySQL.Database, c.MySQL.Charset) + default: + c.DSN = c.SQLite.Path + } +} + +// JWTConfig JWT 认证配置 +type JWTConfig struct { + Secret string `yaml:"secret"` + ExpireHours int `yaml:"expire_hours"` +} + +// UploadConfig 文件上传配置 +type UploadConfig struct { + Path string `yaml:"path"` + BaseURL string `yaml:"base_url"` + MaxSize int64 `yaml:"max_size"` + AllowedTypes []string `yaml:"allowed_types"` +} + +// StorageConfig 存储配置 +type StorageConfig struct { + Type string `yaml:"type"` // local | minio | cos + Local LocalStorage `yaml:"local"` + MinIO MinIOConfig `yaml:"minio"` + COS COSConfig `yaml:"cos"` +} + +// LocalStorage 本地存储配置 +type LocalStorage struct { + Path string `yaml:"path"` +} + +// MinIOConfig MinIO 配置 +type MinIOConfig struct { + Endpoint string `yaml:"endpoint"` + AccessKey string `yaml:"access_key"` + SecretKey string `yaml:"secret_key"` + Bucket string `yaml:"bucket"` + UseSSL bool `yaml:"use_ssl"` + PublicURL string `yaml:"public_url"` + AutoCreateBucket bool `yaml:"auto_create_bucket"` +} + +// COSConfig 腾讯云 COS 配置 +type COSConfig struct { + SecretID string `yaml:"secret_id"` + SecretKey string `yaml:"secret_key"` + Bucket string `yaml:"bucket"` + Region string `yaml:"region"` + BaseURL string `yaml:"base_url"` +} + +// SMSConfig 短信服务配置 +type SMSConfig struct { + DevMode bool `yaml:"dev_mode"` + Provider string `yaml:"provider"` // mock | aliyun | tencent + CodeExpire int `yaml:"code_expire"` + SendInterval int `yaml:"send_interval"` + Aliyun AliyunSMS `yaml:"aliyun"` + Tencent TencentSMS `yaml:"tencent"` +} + +// AliyunSMS 阿里云短信配置 +type AliyunSMS struct { + AccessKeyID string `yaml:"access_key_id"` + AccessKeySecret string `yaml:"access_key_secret"` + SignName string `yaml:"sign_name"` + TemplateCode string `yaml:"template_code"` +} + +// TencentSMS 腾讯云短信配置 +type TencentSMS struct { + SecretID string `yaml:"secret_id"` + SecretKey string `yaml:"secret_key"` + SignName string `yaml:"sign_name"` + TemplateID string `yaml:"template_id"` + AppID string `yaml:"app_id"` +} + +// WechatConfig 微信配置 +type WechatConfig struct { + AppID string `yaml:"app_id"` + AppSecret string `yaml:"app_secret"` + MchID string `yaml:"mch_id"` + APIKey string `yaml:"api_key"` + NotifyURL string `yaml:"notify_url"` +} + +// AIConfig AI 配置 +type AIConfig struct { + APIKey string `yaml:"api_key"` + APIType string `yaml:"api_type"` // deepseek | openai + Model string `yaml:"model"` +} + +// CORSConfig CORS 跨域配置 +type CORSConfig struct { + AllowedOrigins []string `yaml:"allowed_origins"` +} + +// RateLimitConfig API 限流配置 +type RateLimitConfig struct { + Enabled bool `yaml:"enabled"` + RequestsPerSecond int `yaml:"requests_per_second"` + BurstSize int `yaml:"burst_size"` +} + +// EnvConfig 环境配置 +type EnvConfig struct { + Name string `yaml:"name"` // dev | prod +} + +// AppConfig 全局配置实例 +var AppConfig *Config + +// Load 从指定路径加载配置文件 +func Load(path string) (*Config, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("读取配置文件失败: %w", err) + } + + var cfg Config + if err := yaml.Unmarshal(data, &cfg); err != nil { + return nil, fmt.Errorf("解析配置文件失败: %w", err) + } + + cfg.Database.BuildDSN() + AppConfig = &cfg + return &cfg, nil +}