修改配置文件单例模式
This commit is contained in:
@@ -2,92 +2,90 @@ package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// Config 结构体定义了应用程序的所有配置项
|
||||
type Config struct {
|
||||
// 数据库配置
|
||||
DB struct {
|
||||
Host string `yaml:"host"` // 数据库主机地址
|
||||
Port string `yaml:"port"` // 数据库端口
|
||||
User string `yaml:"user"` // 数据库用户名
|
||||
Password string `yaml:"password"` // 数据库密码
|
||||
Name string `yaml:"name"` // 数据库名称
|
||||
Host string `yaml:"host"`
|
||||
Port string `yaml:"port"`
|
||||
User string `yaml:"user"`
|
||||
Password string `yaml:"password"`
|
||||
Name string `yaml:"name"`
|
||||
} `yaml:"db"`
|
||||
|
||||
Redis struct {
|
||||
Host string `yaml:"host"` // Redis主机地址
|
||||
Port string `yaml:"port"` // Redis端口
|
||||
Password string `yaml:"password"` // Redis密码
|
||||
DB string `yaml:"db"` // Redis数据库索引
|
||||
Host string `yaml:"host"`
|
||||
Port string `yaml:"port"`
|
||||
Password string `yaml:"password"`
|
||||
DB string `yaml:"db"`
|
||||
} `yaml:"redis"`
|
||||
|
||||
// 服务器配置
|
||||
Server struct {
|
||||
Port string `yaml:"port"` // 服务器监听端口
|
||||
Mode string `yaml:"mode"` // 运行模式
|
||||
Port string `yaml:"port"`
|
||||
Mode string `yaml:"mode"`
|
||||
} `yaml:"server"`
|
||||
|
||||
Jwt struct {
|
||||
Secret string `yaml:"secret"` // JWT 密钥
|
||||
Expire string `yaml:"expire"` // JWT 过期时间(单位:小时)
|
||||
Secret string `yaml:"secret"`
|
||||
Expire string `yaml:"expire"`
|
||||
} `yaml:"jwt"`
|
||||
|
||||
// mmdb 配置
|
||||
Mmdb struct {
|
||||
Path string `yaml:"path"` // mmdb 文件路径
|
||||
Path string `yaml:"path"`
|
||||
} `yaml:"mmdb"`
|
||||
|
||||
// 日志配置
|
||||
Log struct {
|
||||
Path string `yaml:"path"` // 日志目录路径
|
||||
Path string `yaml:"path"`
|
||||
} `yaml:"log"`
|
||||
}
|
||||
|
||||
// LoadConfig 加载并返回应用程序配置
|
||||
var (
|
||||
configInstance *Config
|
||||
configOnce sync.Once
|
||||
)
|
||||
|
||||
// LoadConfig 加载并返回应用程序配置(单例模式,只加载一次)
|
||||
func LoadConfig() *Config {
|
||||
// 首先尝试从配置文件加载
|
||||
if cfg := loadConfigFromFile(); cfg != nil {
|
||||
return cfg
|
||||
}
|
||||
configOnce.Do(func() {
|
||||
if cfg := loadConfigFromFile(); cfg != nil {
|
||||
configInstance = cfg
|
||||
return
|
||||
}
|
||||
|
||||
// 如果没有配置文件,则使用环境变量或默认值
|
||||
cfg := &Config{}
|
||||
cfg := &Config{}
|
||||
|
||||
// 数据库配置
|
||||
cfg.DB.Host = getEnv("DB_HOST", "localhost")
|
||||
cfg.DB.Port = getEnv("DB_PORT", "3306")
|
||||
cfg.DB.User = getEnv("DB_USER", "root")
|
||||
cfg.DB.Password = getEnv("DB_PASSWORD", "123456")
|
||||
cfg.DB.Name = getEnv("DB_NAME", "quincy")
|
||||
cfg.DB.Host = getEnv("DB_HOST", "localhost")
|
||||
cfg.DB.Port = getEnv("DB_PORT", "3306")
|
||||
cfg.DB.User = getEnv("DB_USER", "root")
|
||||
cfg.DB.Password = getEnv("DB_PASSWORD", "123456")
|
||||
cfg.DB.Name = getEnv("DB_NAME", "quincy")
|
||||
|
||||
// Redis 配置
|
||||
cfg.Redis.Host = getEnv("REDIS_HOST", "localhost")
|
||||
cfg.Redis.Port = getEnv("REDIS_PORT", "6379")
|
||||
cfg.Redis.Password = getEnv("REDIS_PASSWORD", "")
|
||||
cfg.Redis.DB = getEnv("REDIS_DB", "0")
|
||||
cfg.Redis.Host = getEnv("REDIS_HOST", "localhost")
|
||||
cfg.Redis.Port = getEnv("REDIS_PORT", "6379")
|
||||
cfg.Redis.Password = getEnv("REDIS_PASSWORD", "")
|
||||
cfg.Redis.DB = getEnv("REDIS_DB", "0")
|
||||
|
||||
// 服务器配置
|
||||
cfg.Server.Port = getEnv("SERVER_PORT", "8080")
|
||||
cfg.Server.Mode = getEnv("SERVER_MODE", "debug")
|
||||
cfg.Server.Port = getEnv("SERVER_PORT", "8080")
|
||||
cfg.Server.Mode = getEnv("SERVER_MODE", "debug")
|
||||
|
||||
// Jwt 配置
|
||||
cfg.Jwt.Secret = getEnv("JWT_SECRET", "your-secret-key")
|
||||
cfg.Jwt.Expire = getEnv("JWT_EXPIRE", "24")
|
||||
cfg.Jwt.Secret = getEnv("JWT_SECRET", "your-secret-key")
|
||||
cfg.Jwt.Expire = getEnv("JWT_EXPIRE", "24")
|
||||
|
||||
// mmdb 配置
|
||||
cfg.Mmdb.Path = getEnv("MMDB_PATH", "./GeoLite2-City.mmdb")
|
||||
cfg.Mmdb.Path = getEnv("MMDB_PATH", "./GeoLite2-City.mmdb")
|
||||
|
||||
cfg.Log.Path = getEnv("LOG_DIR", "./")
|
||||
cfg.Log.Path = getEnv("LOG_DIR", "./")
|
||||
|
||||
return cfg
|
||||
configInstance = cfg
|
||||
})
|
||||
|
||||
return configInstance
|
||||
}
|
||||
|
||||
// loadConfigFromFile 从配置文件加载配置
|
||||
func loadConfigFromFile() *Config {
|
||||
// 尝试加载 yaml 配置文件
|
||||
if data, err := os.ReadFile("/home/app/quincy/default.yaml"); err == nil {
|
||||
cfg := &Config{}
|
||||
if err := yaml.Unmarshal(data, cfg); err == nil {
|
||||
@@ -97,7 +95,6 @@ func loadConfigFromFile() *Config {
|
||||
return nil
|
||||
}
|
||||
|
||||
// getEnv 获取环境变量,如果不存在则返回默认值
|
||||
func getEnv(key, defaultValue string) string {
|
||||
value := os.Getenv(key)
|
||||
if value == "" {
|
||||
|
||||
@@ -2226,7 +2226,7 @@ const docTemplate = `{
|
||||
"securityDefinitions": {
|
||||
"ApiKeyAuth": {
|
||||
"type": "apiKey",
|
||||
"name": "X-Access-Token",
|
||||
"name": "Authorization",
|
||||
"in": "header"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2220,7 +2220,7 @@
|
||||
"securityDefinitions": {
|
||||
"ApiKeyAuth": {
|
||||
"type": "apiKey",
|
||||
"name": "X-Access-Token",
|
||||
"name": "Authorization",
|
||||
"in": "header"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1395,6 +1395,6 @@ paths:
|
||||
securityDefinitions:
|
||||
ApiKeyAuth:
|
||||
in: header
|
||||
name: X-Access-Token
|
||||
name: Authorization
|
||||
type: apiKey
|
||||
swagger: "2.0"
|
||||
|
||||
2
main.go
2
main.go
@@ -23,7 +23,7 @@ import (
|
||||
// @BasePath /quin
|
||||
// @securityDefinitions.apikey ApiKeyAuth
|
||||
// @in header
|
||||
// @name X-Access-Token
|
||||
// @name Authorization
|
||||
func main() {
|
||||
//===================================加载配置====================================
|
||||
cfg := config.LoadConfig()
|
||||
|
||||
@@ -26,9 +26,9 @@ func RequestResponseLogger() gin.HandlerFunc {
|
||||
|
||||
// 获取请求头信息
|
||||
var headers string
|
||||
Token := ctx.GetHeader("X-Access-Token")
|
||||
_ = ctx.GetHeader("Authorization")
|
||||
|
||||
headers = fmt.Sprintf("X-Access-Token: %s; ", Token)
|
||||
//headers = fmt.Sprintf("Authorization: %s; ", Token)
|
||||
|
||||
// 记录开始时间
|
||||
startTime := time.Now()
|
||||
|
||||
@@ -20,7 +20,6 @@ type Claims struct {
|
||||
|
||||
// GenerateToken 生成 JWT token
|
||||
func GenerateToken(userID int, username, sessionCode string, roleCode int) (string, error) {
|
||||
// 从配置文件或其他地方获取密钥,这里先使用硬编码的密钥
|
||||
cfg := config.LoadConfig()
|
||||
|
||||
secretKey := []byte(cfg.Jwt.Secret)
|
||||
@@ -32,7 +31,6 @@ func GenerateToken(userID int, username, sessionCode string, roleCode int) (stri
|
||||
|
||||
expirationTime := time.Now().Add(time.Duration(expireHours) * time.Hour)
|
||||
|
||||
// 创建 JWT 声明
|
||||
claims := &Claims{
|
||||
UserID: userID,
|
||||
Username: username,
|
||||
@@ -45,18 +43,18 @@ func GenerateToken(userID int, username, sessionCode string, roleCode int) (stri
|
||||
},
|
||||
}
|
||||
|
||||
// 创建 token
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
|
||||
// 签名并获取完整的 token 字符串
|
||||
return token.SignedString(secretKey)
|
||||
}
|
||||
|
||||
// ParseToken 解析 JWT token
|
||||
func ParseToken(tokenString string) (*Claims, error) {
|
||||
secretKey := []byte("hcq")
|
||||
|
||||
// 解析 token
|
||||
func ParseToken(tokenString string) (*Claims, error) {
|
||||
cfg := config.LoadConfig()
|
||||
|
||||
secretKey := []byte(cfg.Jwt.Secret)
|
||||
|
||||
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
return nil, errors.New("unexpected signing method")
|
||||
@@ -68,7 +66,6 @@ func ParseToken(tokenString string) (*Claims, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 验证并返回 claims
|
||||
if claims, ok := token.Claims.(*Claims); ok && token.Valid {
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user