Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"nofx/config"
"nofx/crypto"
"nofx/decision"
"nofx/hook"
"nofx/manager"
"nofx/trader"
"strconv"
Expand Down Expand Up @@ -204,6 +205,17 @@ func (s *Server) handleGetSystemConfig(c *gin.Context) {

// handleGetServerIP 获取服务器IP地址(用于白名单配置)
func (s *Server) handleGetServerIP(c *gin.Context) {

// 首先尝试从Hook获取用户专用IP
userIP := hook.HookExec[hook.IpResult](hook.GETIP, c.GetString("user_id"))
if userIP != nil && userIP.Error() == nil {
c.JSON(http.StatusOK, gin.H{
"public_ip": userIP.GetResult(),
"message": "请将此IP地址添加到白名单中",
})
return
}

// 尝试通过第三方API获取公网IP
publicIP := getPublicIPFromAPI()

Expand Down Expand Up @@ -392,8 +404,8 @@ type SafeModelConfig struct {
Name string `json:"name"`
Provider string `json:"provider"`
Enabled bool `json:"enabled"`
CustomAPIURL string `json:"customApiUrl"` // 自定义API URL(通常不敏感)
CustomModelName string `json:"customModelName"` // 自定义模型名(不敏感)
CustomAPIURL string `json:"customApiUrl"` // 自定义API URL(通常不敏感)
CustomModelName string `json:"customModelName"` // 自定义模型名(不敏感)
}

type ExchangeConfig struct {
Expand All @@ -414,8 +426,8 @@ type SafeExchangeConfig struct {
Enabled bool `json:"enabled"`
Testnet bool `json:"testnet,omitempty"`
HyperliquidWalletAddr string `json:"hyperliquidWalletAddr"` // Hyperliquid钱包地址(不敏感)
AsterUser string `json:"asterUser"` // Aster用户名(不敏感)
AsterSigner string `json:"asterSigner"` // Aster签名者(不敏感)
AsterUser string `json:"asterUser"` // Aster用户名(不敏感)
AsterSigner string `json:"asterSigner"` // Aster签名者(不敏感)
}

type UpdateModelConfigRequest struct {
Expand Down Expand Up @@ -543,7 +555,7 @@ func (s *Server) handleCreateTrader(c *gin.Context) {

switch req.ExchangeID {
case "binance":
tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey)
tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey, userID)
case "hyperliquid":
tempTrader, createErr = trader.NewHyperliquidTrader(
exchangeCfg.APIKey, // private key
Expand Down Expand Up @@ -904,7 +916,7 @@ func (s *Server) handleSyncBalance(c *gin.Context) {

switch traderConfig.ExchangeID {
case "binance":
tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey)
tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey, userID)
case "hyperliquid":
tempTrader, createErr = trader.NewHyperliquidTrader(
exchangeCfg.APIKey,
Expand Down Expand Up @@ -1638,7 +1650,6 @@ func (s *Server) authMiddleware() gin.HandlerFunc {
}
}


// handleLogout 将当前token加入黑名单
func (s *Server) handleLogout(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
Expand Down
23 changes: 12 additions & 11 deletions bootstrap/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"sort"
"sync"
"time"
"log"
)

// Priority 初始化优先级常量
Expand Down Expand Up @@ -68,7 +69,7 @@ func RunWithPolicy(ctx *Context, defaultPolicy ErrorPolicy) error {
hooksMu.Unlock()

if len(hooksCopy) == 0 {
logger.Log.Warnf("⚠️ 没有注册任何初始化钩子")
log.Printf("⚠️ 没有注册任何初始化钩子")
return nil
}

Expand All @@ -77,7 +78,7 @@ func RunWithPolicy(ctx *Context, defaultPolicy ErrorPolicy) error {
return hooksCopy[i].Priority < hooksCopy[j].Priority
})

logger.Log.Infof("🔄 开始初始化 %d 个模块...", len(hooksCopy))
log.Printf("🔄 开始初始化 %d 个模块...", len(hooksCopy))
startTime := time.Now()

var errors []error
Expand All @@ -87,13 +88,13 @@ func RunWithPolicy(ctx *Context, defaultPolicy ErrorPolicy) error {
for i, hook := range hooksCopy {
// 检查是否启用
if hook.Enabled != nil && !hook.Enabled(ctx) {
logger.Log.Infof(" [%d/%d] 跳过: %s (条件未满足)",
log.Printf(" [%d/%d] 跳过: %s (条件未满足)",
i+1, len(hooksCopy), hook.Name)
skippedCount++
continue
}

logger.Log.Infof(" [%d/%d] 初始化: %s (优先级: %d)",
log.Printf(" [%d/%d] 初始化: %s (优先级: %d)",
i+1, len(hooksCopy), hook.Name, hook.Priority)

hookStart := time.Now()
Expand All @@ -111,16 +112,16 @@ func RunWithPolicy(ctx *Context, defaultPolicy ErrorPolicy) error {

switch policy {
case FailFast:
logger.Log.Errorf(" ❌ 失败: %s (耗时: %v)", hook.Name, elapsed)
log.Printf(" ❌ 失败: %s (耗时: %v)", hook.Name, elapsed)
return errMsg
case ContinueOnError:
logger.Log.Errorf(" ❌ 失败: %s (耗时: %v) - 继续执行", hook.Name, elapsed)
log.Printf(" ❌ 失败: %s (耗时: %v) - 继续执行", hook.Name, elapsed)
errors = append(errors, errMsg)
case WarnOnError:
logger.Log.Warnf(" ⚠️ 警告: %s (耗时: %v) - %v", hook.Name, elapsed, err)
log.Printf(" ⚠️ 警告: %s (耗时: %v) - %v", hook.Name, elapsed, err)
}
} else {
logger.Log.Infof(" ✓ 完成: %s (耗时: %v)", hook.Name, elapsed)
log.Printf(" ✓ 完成: %s (耗时: %v)", hook.Name, elapsed)
successCount++
}
}
Expand All @@ -131,15 +132,15 @@ func RunWithPolicy(ctx *Context, defaultPolicy ErrorPolicy) error {
if len(errors) > 0 {
logger.Log.Warnf("⚠️ 初始化完成,但有 %d 个模块失败 (总耗时: %v)",
len(errors), totalElapsed)
logger.Log.Infof("📊 统计: 成功=%d, 失败=%d, 跳过=%d",
log.Printf("📊 统计: 成功=%d, 失败=%d, 跳过=%d",
successCount, len(errors), skippedCount)

// 返回合并的错误
return fmt.Errorf("以下模块初始化失败: %v", errors)
}

logger.Log.Infof("✅ 所有模块初始化完成 (总耗时: %v)", totalElapsed)
logger.Log.Infof("📊 统计: 成功=%d, 跳过=%d", successCount, skippedCount)
log.Printf("✅ 所有模块初始化完成 (总耗时: %v)", totalElapsed)
log.Printf("📊 统计: 成功=%d, 跳过=%d", successCount, skippedCount)
return nil
}

Expand Down
Loading
Loading