Files
admin 086c5c6573 perf: 性能优化与错误修复
- 修复 N+1 查询: users/devices/agents 批量 GROUP BY 替代循环查询
- 添加分页: cards/finance/agents/devices API
- Redis 初始化根据安装配置 redis.enabled 决定是否连接
- 修复 DefaultVal 解析错误: 使用 sql.NullString 处理 NULL 值
- Dashboard 优化: 替换 ECharts 世界地图为 Chart.js 环形饼图
- 适配前端 cards 页面新 API 响应格式
- 添加数据库索引优化查询性能
- 实现可配置的数据清理定时任务
2026-05-06 19:19:02 +08:00

90 lines
2.1 KiB
Go

package config
import (
"log"
"os"
"github.com/spf13/viper"
)
var dataDir = "/app/data"
func Init() {
if dir := os.Getenv("DATA_DIR"); dir != "" {
dataDir = dir
}
if _, err := os.Stat(dataDir); os.IsNotExist(err) {
os.MkdirAll(dataDir, 0755)
}
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(dataDir)
viper.AddConfigPath(".")
viper.AddConfigPath("./config")
setDefaults()
if err := viper.ReadInConfig(); err != nil {
log.Printf("Warning: Config file not found, using defaults: %v", err)
}
viper.AutomaticEnv()
}
func GetDataDir() string {
return dataDir
}
// setDefaults 设置默认配置值
func setDefaults() {
// 应用配置
viper.SetDefault("app.name", "verification-platform")
viper.SetDefault("app.env", "development")
viper.SetDefault("app.port", "8080")
viper.SetDefault("app.jwt_secret", "your-secret-key")
viper.SetDefault("app.jwt_expire", "24h")
// 数据库配置
viper.SetDefault("database.type", "auto")
viper.SetDefault("database.host", "localhost")
viper.SetDefault("database.port", "3306")
viper.SetDefault("database.name", "verification_platform")
viper.SetDefault("database.username", "root")
viper.SetDefault("database.password", "")
viper.SetDefault("database.charset", "utf8mb4")
viper.SetDefault("database.max_idle_conns", "10")
viper.SetDefault("database.max_open_conns", "100")
// Redis配置
viper.SetDefault("redis.enabled", false)
viper.SetDefault("redis.host", "localhost")
viper.SetDefault("redis.port", "6379")
viper.SetDefault("redis.password", "")
viper.SetDefault("redis.db", "0")
// 日志配置
viper.SetDefault("log.level", "info")
viper.SetDefault("log.format", "json")
}
// GetString 获取字符串配置
func GetString(key string) string {
return viper.GetString(key)
}
// GetInt 获取整数配置
func GetInt(key string) int {
return viper.GetInt(key)
}
// GetBool 获取布尔配置
func GetBool(key string) bool {
return viper.GetBool(key)
}
// GetStringSlice 获取字符串切片配置
func GetStringSlice(key string) []string {
return viper.GetStringSlice(key)
}