31ea370cea
- 修复 JWTConfig 缺少 mapstructure tag 导致 access_expire_min 解析为 0, token 签发即过期,所有 API 请求返回 401 - 全部 config struct 补齐 mapstructure tag(secret/dsn/hmac_secret 等) - 模型层从 hotel/HotelID 统一重命名为 shop/ShopID - 删除旧 migrations(001-004),新增 001_init 综合迁移文件 - 更新 schema.sql、testutil、handler/service/model 相关引用 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package config
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type Config struct {
|
|
Server ServerConfig
|
|
Database DatabaseConfig
|
|
JWT JWTConfig
|
|
License LicenseConfig
|
|
}
|
|
|
|
type ServerConfig struct {
|
|
Port string `mapstructure:"port"`
|
|
Mode string `mapstructure:"mode"` // debug | release
|
|
}
|
|
|
|
type DatabaseConfig struct {
|
|
DSN string `mapstructure:"dsn"`
|
|
}
|
|
|
|
type JWTConfig struct {
|
|
Secret string `mapstructure:"secret"`
|
|
AccessExpireMin int `mapstructure:"access_expire_min"` // Access Token 有效分钟数
|
|
RefreshExpireH int `mapstructure:"refresh_expire_h"` // Refresh Token 有效小时数
|
|
}
|
|
|
|
type LicenseConfig struct {
|
|
HMACSecret string `mapstructure:"hmac_secret"` // 许可证签名密钥
|
|
}
|
|
|
|
var C Config
|
|
|
|
func Load() {
|
|
viper.SetConfigName("config")
|
|
viper.SetConfigType("yaml")
|
|
viper.AddConfigPath(".")
|
|
viper.AddConfigPath("./config")
|
|
|
|
// 环境变量覆盖(生产部署时使用)
|
|
viper.AutomaticEnv()
|
|
|
|
// 默认值
|
|
viper.SetDefault("server.port", "8080")
|
|
viper.SetDefault("server.mode", "debug")
|
|
viper.SetDefault("jwt.access_expire_min", 60)
|
|
viper.SetDefault("jwt.refresh_expire_h", 168) // 7天
|
|
|
|
if err := viper.ReadInConfig(); err != nil {
|
|
log.Println("[config] no config file found, using defaults and env vars")
|
|
}
|
|
|
|
if err := viper.Unmarshal(&C); err != nil {
|
|
log.Fatalf("[config] failed to unmarshal config: %v", err)
|
|
}
|
|
}
|