Files
web_template/internal/config/config.go
2026-09-09 02:39:57 +08:00

205 lines
5.7 KiB
Go

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"`
WechatWebhook WechatWebhookConfig `yaml:"wechat_webhook"`
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"`
}
// WechatWebhookConfig 企业微信群机器人Webhook配置
type WechatWebhookConfig struct {
Enabled bool `yaml:"enabled"`
URL string `yaml:"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
}