diff --git a/api/server.go b/api/server.go index c758da3d..b3f67f11 100644 --- a/api/server.go +++ b/api/server.go @@ -1448,7 +1448,15 @@ func (s *Server) handleLatestDecisions(c *gin.Context) { return } - records, err := trader.GetDecisionLogger().GetLatestRecords(5) + // 从 query 参数读取 limit,默认 5,最大 50 + limit := 5 + if limitStr := c.Query("limit"); limitStr != "" { + if l, err := strconv.Atoi(limitStr); err == nil && l > 0 && l <= 50 { + limit = l + } + } + + records, err := trader.GetDecisionLogger().GetLatestRecords(limit) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": fmt.Sprintf("获取决策日志失败: %v", err), diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index a9390ea8..a2f948ce 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -261,12 +261,21 @@ export const api = { return res.json() }, - // 获取最新决策(支持trader_id) - async getLatestDecisions(traderId?: string): Promise { - const url = traderId - ? `${API_BASE}/decisions/latest?trader_id=${traderId}` - : `${API_BASE}/decisions/latest` - const res = await httpClient.get(url, getAuthHeaders()) + // 获取最新决策(支持trader_id和limit参数) + async getLatestDecisions( + traderId?: string, + limit: number = 5 + ): Promise { + const params = new URLSearchParams() + if (traderId) { + params.append('trader_id', traderId) + } + params.append('limit', limit.toString()) + + const res = await httpClient.get( + `${API_BASE}/decisions/latest?${params}`, + getAuthHeaders() + ) if (!res.ok) throw new Error('获取最新决策失败') return res.json() }, diff --git a/web/src/pages/TraderDashboard.tsx b/web/src/pages/TraderDashboard.tsx index 9a0a3cc4..65dfe0e6 100644 --- a/web/src/pages/TraderDashboard.tsx +++ b/web/src/pages/TraderDashboard.tsx @@ -54,6 +54,18 @@ export default function TraderDashboard() { ) const [lastUpdate, setLastUpdate] = useState('--:--:--') + // 决策记录数量选择(从 localStorage 读取,默认 5) + const [decisionLimit, setDecisionLimit] = useState(() => { + const saved = localStorage.getItem('decisionLimit') + return saved ? parseInt(saved, 10) : 5 + }) + + // 当 limit 变化时保存到 localStorage + const handleLimitChange = (newLimit: number) => { + setDecisionLimit(newLimit) + localStorage.setItem('decisionLimit', newLimit.toString()) + } + // 获取trader列表(仅在用户登录时) const { data: traders, error: tradersError } = useSWR( user && token ? 'traders' : null, @@ -111,8 +123,10 @@ export default function TraderDashboard() { ) const { data: decisions } = useSWR( - selectedTraderId ? `decisions/latest-${selectedTraderId}` : null, - () => api.getLatestDecisions(selectedTraderId), + selectedTraderId + ? `decisions/latest-${selectedTraderId}-${decisionLimit}` + : null, + () => api.getLatestDecisions(selectedTraderId, decisionLimit), { refreshInterval: 30000, revalidateOnFocus: false, @@ -570,27 +584,54 @@ export default function TraderDashboard() { style={{ animationDelay: '0.2s' }} >
-
- +
+
+ +
+
+

+ {t('recentDecisions', language)} +

+ {decisions && decisions.length > 0 && ( +
+ {t('lastCycles', language, { count: decisions.length })} +
+ )} +
-
-

- {t('recentDecisions', language)} -

- {decisions && decisions.length > 0 && ( -
- {t('lastCycles', language, { count: decisions.length })} -
- )} + + {/* 显示数量选择器 */} +
+ + {language === 'zh' ? '显示' : 'Show'}: + + + + {language === 'zh' ? '条' : ''} +