From 0f9978ec6bd109a7573fb12f49315554211a1b0b Mon Sep 17 00:00:00 2001 From: icy Date: Fri, 31 Oct 2025 15:24:18 +0800 Subject: [PATCH] Sync config.json to config.db for manual modify admin_mode and other configs --- config/database.go | 22 ++++++----- main.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++ start.sh | 4 +- 3 files changed, 110 insertions(+), 11 deletions(-) diff --git a/config/database.go b/config/database.go index 87e74b72..20b08d5f 100644 --- a/config/database.go +++ b/config/database.go @@ -209,16 +209,20 @@ func (d *Database) initDefaultData() error { } } - // 初始化系统配置 + // 初始化系统配置 - 创建所有字段,设置默认值,后续由config.json同步更新 systemConfigs := map[string]string{ - "admin_mode": "true", - "api_server_port": "8080", - "use_default_coins": "true", - "coin_pool_api_url": "", - "oi_top_api_url": "", - "max_daily_loss": "10.0", - "max_drawdown": "20.0", - "stop_trading_minutes": "60", + "admin_mode": "true", // 默认开启管理员模式,便于首次使用 + "api_server_port": "8080", // 默认API端口 + "use_default_coins": "true", // 默认使用内置币种列表 + "default_coins": `["BTCUSDT","ETHUSDT","SOLUSDT","BNBUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","HYPEUSDT"]`, // 默认币种列表(JSON格式) + "coin_pool_api_url": "", // 币种池API URL,默认为空 + "oi_top_api_url": "", // 持仓量API URL,默认为空 + "max_daily_loss": "10.0", // 最大日损失百分比 + "max_drawdown": "20.0", // 最大回撤百分比 + "stop_trading_minutes": "60", // 停止交易时间(分钟) + "btc_eth_leverage": "5", // BTC/ETH杠杆倍数 + "altcoin_leverage": "5", // 山寨币杠杆倍数 + "jwt_secret": "", // JWT密钥,默认为空,由config.json或系统生成 } for key, value := range systemConfigs { diff --git a/main.go b/main.go index a9ea34c9..547c0677 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "log" "nofx/api" @@ -15,6 +16,95 @@ import ( "syscall" ) +// LeverageConfig 杠杆配置 +type LeverageConfig struct { + BTCETHLeverage int `json:"btc_eth_leverage"` + AltcoinLeverage int `json:"altcoin_leverage"` +} + +// ConfigFile 配置文件结构,只包含需要同步到数据库的字段 +type ConfigFile struct { + AdminMode bool `json:"admin_mode"` + APIServerPort int `json:"api_server_port"` + UseDefaultCoins bool `json:"use_default_coins"` + DefaultCoins []string `json:"default_coins"` + CoinPoolAPIURL string `json:"coin_pool_api_url"` + OITopAPIURL string `json:"oi_top_api_url"` + MaxDailyLoss float64 `json:"max_daily_loss"` + MaxDrawdown float64 `json:"max_drawdown"` + StopTradingMinutes int `json:"stop_trading_minutes"` + Leverage LeverageConfig `json:"leverage"` + JWTSecret string `json:"jwt_secret"` +} + +// syncConfigToDatabase 从config.json读取配置并同步到数据库 +func syncConfigToDatabase(database *config.Database) error { + // 检查config.json是否存在 + if _, err := os.Stat("config.json"); os.IsNotExist(err) { + log.Printf("📄 config.json不存在,跳过同步") + return nil + } + + // 读取config.json + data, err := os.ReadFile("config.json") + if err != nil { + return fmt.Errorf("读取config.json失败: %w", err) + } + + // 解析JSON + var configFile ConfigFile + if err := json.Unmarshal(data, &configFile); err != nil { + return fmt.Errorf("解析config.json失败: %w", err) + } + + log.Printf("🔄 开始同步config.json到数据库...") + + // 同步各配置项到数据库 + configs := map[string]string{ + "admin_mode": fmt.Sprintf("%t", configFile.AdminMode), + "api_server_port": strconv.Itoa(configFile.APIServerPort), + "use_default_coins": fmt.Sprintf("%t", configFile.UseDefaultCoins), + "coin_pool_api_url": configFile.CoinPoolAPIURL, + "oi_top_api_url": configFile.OITopAPIURL, + "max_daily_loss": fmt.Sprintf("%.1f", configFile.MaxDailyLoss), + "max_drawdown": fmt.Sprintf("%.1f", configFile.MaxDrawdown), + "stop_trading_minutes": strconv.Itoa(configFile.StopTradingMinutes), + } + + // 同步default_coins(转换为JSON字符串存储) + if len(configFile.DefaultCoins) > 0 { + defaultCoinsJSON, err := json.Marshal(configFile.DefaultCoins) + if err == nil { + configs["default_coins"] = string(defaultCoinsJSON) + } + } + + // 同步杠杆配置 + if configFile.Leverage.BTCETHLeverage > 0 { + configs["btc_eth_leverage"] = strconv.Itoa(configFile.Leverage.BTCETHLeverage) + } + if configFile.Leverage.AltcoinLeverage > 0 { + configs["altcoin_leverage"] = strconv.Itoa(configFile.Leverage.AltcoinLeverage) + } + + // 如果JWT密钥不为空,也同步 + if configFile.JWTSecret != "" { + configs["jwt_secret"] = configFile.JWTSecret + } + + // 更新数据库配置 + for key, value := range configs { + if err := database.SetSystemConfig(key, value); err != nil { + log.Printf("⚠️ 更新配置 %s 失败: %v", key, err) + } else { + log.Printf("✓ 同步配置: %s = %s", key, value) + } + } + + log.Printf("✅ config.json同步完成") + return nil +} + func main() { fmt.Println("╔════════════════════════════════════════════════════════════╗") fmt.Println("║ 🤖 AI多模型交易系统 - 支持 DeepSeek & Qwen ║") @@ -34,6 +124,11 @@ func main() { } defer database.Close() + // 同步config.json到数据库 + if err := syncConfigToDatabase(database); err != nil { + log.Printf("⚠️ 同步config.json到数据库失败: %v", err) + } + // 获取系统配置 useDefaultCoinsStr, _ := database.GetSystemConfig("use_default_coins") useDefaultCoins := useDefaultCoinsStr == "true" diff --git a/start.sh b/start.sh index 581495fa..040d4b4d 100755 --- a/start.sh +++ b/start.sh @@ -114,10 +114,10 @@ read_env_vars() { } # ------------------------------------------------------------------------ -# Validation: Database File (trading.db) +# Validation: Database File (config.db) # ------------------------------------------------------------------------ check_database() { - if [ ! -f "trading.db" ]; then + if [ ! -f "config.db" ]; then print_info "数据库文件不存在,系统将在启动时自动创建" else print_success "数据库文件存在"