chore: remove ~100 debug console.log statements from frontend

Cleaned up verbose debug logging left from development:
- AdvancedChart.tsx: removed ~50 debug logs (time parsing, order fetching, marker creation)
- ChartWithOrders.tsx: removed debug logs and unused klineMinTime/klineMaxTime variables
- ChartWithOrdersSimple.tsx: removed data loading debug logs
- ChartTabs.tsx: removed render/selection debug logs
- ComparisonChart.tsx: removed equity history debug logs
- AITradersPage.tsx: removed 🔥 DEBUG logs from handleSaveEditTrader
- App.tsx: removed mount debug log

Kept legitimate console.error/console.warn for actual error handling.
This commit is contained in:
shinchan-zhai
2026-03-23 09:31:37 +08:00
parent 0f67747b0c
commit 84758e2942
7 changed files with 4 additions and 86 deletions

View File

@@ -57,7 +57,6 @@ function App() {
// Debug log // Debug log
useEffect(() => { useEffect(() => {
console.log('[App] Mounted. Route:', window.location.pathname);
}, []); }, []);
// 从URL路径读取初始页面状态支持刷新保持页面 // 从URL路径读取初始页面状态支持刷新保持页面

View File

@@ -198,23 +198,17 @@ export function AdvancedChart({
if (typeof time === 'number') { if (typeof time === 'number') {
// Determine ms vs seconds: if > 10^12, treat as milliseconds // Determine ms vs seconds: if > 10^12, treat as milliseconds
if (time > 1000000000000) { if (time > 1000000000000) {
const seconds = Math.floor(time / 1000) return Math.floor(time / 1000)
console.log('[AdvancedChart] ✅ Unix timestamp (ms→s):', time, '→', seconds, '(', new Date(time).toISOString(), ')')
return seconds
} }
console.log('[AdvancedChart] ✅ Unix timestamp (s):', time, '(', new Date(time * 1000).toISOString(), ')')
return time return time
} }
const timeStr = String(time) const timeStr = String(time)
console.log('[AdvancedChart] Parsing time string:', timeStr)
// Try standard ISO format // Try standard ISO format
const isoTime = new Date(timeStr).getTime() const isoTime = new Date(timeStr).getTime()
if (!isNaN(isoTime) && isoTime > 0) { if (!isNaN(isoTime) && isoTime > 0) {
const timestamp = Math.floor(isoTime / 1000) return Math.floor(isoTime / 1000)
console.log('[AdvancedChart] ✅ Parsed as ISO:', timeStr, '→', timestamp, '(', new Date(timestamp * 1000).toISOString(), ')')
return timestamp
} }
// Parse custom format "MM-DD HH:mm UTC" (for legacy data) // Parse custom format "MM-DD HH:mm UTC" (for legacy data)
@@ -229,35 +223,27 @@ export function AdvancedChart({
parseInt(hour), parseInt(hour),
parseInt(minute) parseInt(minute)
)) ))
const timestamp = Math.floor(date.getTime() / 1000) return Math.floor(date.getTime() / 1000)
console.log('[AdvancedChart] ✅ Parsed as custom format:', timeStr, '→', timestamp, '(', new Date(timestamp * 1000).toISOString(), ')')
return timestamp
} }
console.error('[AdvancedChart] Failed to parse time:', timeStr) console.warn('[AdvancedChart] Failed to parse time:', timeStr)
return 0 return 0
} }
// Fetch order data // Fetch order data
const fetchOrders = async (traderID: string, symbol: string): Promise<OrderMarker[]> => { const fetchOrders = async (traderID: string, symbol: string): Promise<OrderMarker[]> => {
try { try {
console.log('[AdvancedChart] Fetching orders for trader:', traderID, 'symbol:', symbol)
// Fetch filled orders, up to 200 for more history // Fetch filled orders, up to 200 for more history
const result = await httpClient.get(`/api/orders?trader_id=${traderID}&symbol=${symbol}&status=FILLED&limit=200`) const result = await httpClient.get(`/api/orders?trader_id=${traderID}&symbol=${symbol}&status=FILLED&limit=200`)
console.log('[AdvancedChart] Orders API response:', result)
if (!result.success || !result.data) { if (!result.success || !result.data) {
console.warn('[AdvancedChart] No orders found, result:', result)
return [] return []
} }
const orders = result.data const orders = result.data
console.log('[AdvancedChart] Raw orders data:', orders)
const markers: OrderMarker[] = [] const markers: OrderMarker[] = []
orders.forEach((order: any) => { orders.forEach((order: any) => {
console.log('[AdvancedChart] Processing order:', order)
// Handle field names: support PascalCase and snake_case // Handle field names: support PascalCase and snake_case
const filledAt = order.filled_at || order.FilledAt || order.created_at || order.CreatedAt const filledAt = order.filled_at || order.FilledAt || order.created_at || order.CreatedAt
@@ -295,15 +281,6 @@ export function AdvancedChart({
positionSide = side === 'buy' ? 'long' : 'short' positionSide = side === 'buy' ? 'long' : 'short'
} }
console.log('[AdvancedChart] Order marker:', {
time: timeSeconds,
price: avgPrice,
side: positionSide,
rawSide: side,
action,
orderAction
})
markers.push({ markers.push({
time: timeSeconds, time: timeSeconds,
price: avgPrice, price: avgPrice,
@@ -314,7 +291,6 @@ export function AdvancedChart({
}) })
}) })
console.log('[AdvancedChart] Final markers:', markers)
return markers return markers
} catch (err) { } catch (err) {
console.error('[AdvancedChart] Error fetching orders:', err) console.error('[AdvancedChart] Error fetching orders:', err)
@@ -325,11 +301,8 @@ export function AdvancedChart({
// Fetch exchange open orders (TP/SL) // Fetch exchange open orders (TP/SL)
const fetchOpenOrders = async (traderID: string, symbol: string): Promise<OpenOrder[]> => { const fetchOpenOrders = async (traderID: string, symbol: string): Promise<OpenOrder[]> => {
try { try {
console.log('[AdvancedChart] Fetching open orders for trader:', traderID, 'symbol:', symbol)
const result = await httpClient.get(`/api/open-orders?trader_id=${traderID}&symbol=${symbol}`) const result = await httpClient.get(`/api/open-orders?trader_id=${traderID}&symbol=${symbol}`)
console.log('[AdvancedChart] Open orders API response:', result)
if (!result.success || !result.data) { if (!result.success || !result.data) {
console.warn('[AdvancedChart] No open orders found') console.warn('[AdvancedChart] No open orders found')
return [] return []
@@ -516,7 +489,6 @@ export function AdvancedChart({
const loadData = async (isRefresh = false) => { const loadData = async (isRefresh = false) => {
if (!candlestickSeriesRef.current) return if (!candlestickSeriesRef.current) return
console.log('[AdvancedChart] Loading data for', symbol, interval, isRefresh ? '(refresh)' : '')
// Only show loading on first load, avoid flicker on refresh // Only show loading on first load, avoid flicker on refresh
if (!isRefresh) { if (!isRefresh) {
setLoading(true) setLoading(true)
@@ -526,7 +498,6 @@ export function AdvancedChart({
try { try {
// 1. Fetch kline data // 1. Fetch kline data
const klineData = await fetchKlineData(symbol, interval) const klineData = await fetchKlineData(symbol, interval)
console.log('[AdvancedChart] Loaded', klineData.length, 'klines')
candlestickSeriesRef.current.setData(klineData) candlestickSeriesRef.current.setData(klineData)
// Store volume/quoteVolume data for tooltip // Store volume/quoteVolume data for tooltip
@@ -587,18 +558,14 @@ export function AdvancedChart({
// 4. Fetch and display order markers // 4. Fetch and display order markers
if (traderID && candlestickSeriesRef.current) { if (traderID && candlestickSeriesRef.current) {
console.log('[AdvancedChart] Starting to fetch orders...')
const orders = await fetchOrders(traderID, symbol) const orders = await fetchOrders(traderID, symbol)
console.log('[AdvancedChart] Received orders:', orders)
if (orders.length > 0) { if (orders.length > 0) {
console.log('[AdvancedChart] Creating markers from', orders.length, 'orders')
// Extract sorted kline time array // Extract sorted kline time array
const klineTimes = klineData.map((k: any) => k.time as number) const klineTimes = klineData.map((k: any) => k.time as number)
const klineMinTime = klineTimes[0] || 0 const klineMinTime = klineTimes[0] || 0
const klineMaxTime = klineTimes[klineTimes.length - 1] || 0 const klineMaxTime = klineTimes[klineTimes.length - 1] || 0
console.log('[AdvancedChart] Kline time range:', klineMinTime, '-', klineMaxTime, '(', klineTimes.length, 'candles)')
// Binary search: find the kline candle for the order time // Binary search: find the kline candle for the order time
// Return the largest kline time <= orderTime // Return the largest kline time <= orderTime
@@ -682,10 +649,7 @@ export function AdvancedChart({
// Sort by time (lightweight-charts requires chronological order) // Sort by time (lightweight-charts requires chronological order)
markers.sort((a, b) => (a.time as number) - (b.time as number)) markers.sort((a, b) => (a.time as number) - (b.time as number))
console.log('[AdvancedChart] Valid markers:', markers.length, 'out of', orders.length)
console.log('[AdvancedChart] Setting', markers.length, 'markers on candlestick series')
console.log('[AdvancedChart] Markers data:', JSON.stringify(markers, null, 2))
try { try {
// Store marker data for later toggle use // Store marker data for later toggle use
@@ -701,12 +665,10 @@ export function AdvancedChart({
// First time creating markers // First time creating markers
seriesMarkersRef.current = createSeriesMarkers(candlestickSeriesRef.current, markersToShow) seriesMarkersRef.current = createSeriesMarkers(candlestickSeriesRef.current, markersToShow)
} }
console.log('[AdvancedChart] ✅ Markers updated! Count:', markersToShow.length, 'Visible:', showOrderMarkers)
} catch (err) { } catch (err) {
console.error('[AdvancedChart] ❌ Failed to set markers:', err) console.error('[AdvancedChart] ❌ Failed to set markers:', err)
} }
} else { } else {
console.log('[AdvancedChart] No orders found, clearing markers')
try { try {
if (seriesMarkersRef.current) { if (seriesMarkersRef.current) {
seriesMarkersRef.current.setMarkers([]) seriesMarkersRef.current.setMarkers([])
@@ -715,11 +677,6 @@ export function AdvancedChart({
console.error('[AdvancedChart] Failed to clear markers:', err) console.error('[AdvancedChart] Failed to clear markers:', err)
} }
} }
} else {
console.log('[AdvancedChart] Skipping markers:', {
hasTraderID: !!traderID,
hasSeries: !!candlestickSeriesRef.current
})
} }
// Auto-fit view only on initial load, avoid jitter on refresh // Auto-fit view only on initial load, avoid jitter on refresh
@@ -760,7 +717,6 @@ export function AdvancedChart({
priceLinesRef.current = [] priceLinesRef.current = []
const openOrders = await fetchOpenOrders(traderID, symbol) const openOrders = await fetchOpenOrders(traderID, symbol)
console.log('[AdvancedChart] Open orders for price lines:', openOrders)
if (openOrders.length > 0 && candlestickSeriesRef.current) { if (openOrders.length > 0 && candlestickSeriesRef.current) {
openOrders.forEach(order => { openOrders.forEach(order => {
@@ -804,7 +760,6 @@ export function AdvancedChart({
priceLinesRef.current.push(priceLine) priceLinesRef.current.push(priceLine)
} }
}) })
console.log('[AdvancedChart] ✅ Created', priceLinesRef.current.length, 'price lines for pending orders')
} }
} catch (err) { } catch (err) {
console.error('[AdvancedChart] Error loading open orders:', err) console.error('[AdvancedChart] Error loading open orders:', err)
@@ -830,7 +785,6 @@ export function AdvancedChart({
try { try {
const markersToShow = showOrderMarkers ? currentMarkersDataRef.current : [] const markersToShow = showOrderMarkers ? currentMarkersDataRef.current : []
seriesMarkersRef.current.setMarkers(markersToShow) seriesMarkersRef.current.setMarkers(markersToShow)
console.log('[AdvancedChart] 🔄 Toggled markers visibility:', showOrderMarkers, 'Count:', markersToShow.length)
} catch (err) { } catch (err) {
console.error('[AdvancedChart] ❌ Failed to toggle markers:', err) console.error('[AdvancedChart] ❌ Failed to toggle markers:', err)
} }

View File

@@ -123,7 +123,6 @@ export function ChartTabs({ traderId, selectedSymbol, updateKey, exchangeId }: C
// Auto-switch to kline chart when symbol selected externally // Auto-switch to kline chart when symbol selected externally
useEffect(() => { useEffect(() => {
if (selectedSymbol) { if (selectedSymbol) {
console.log('[ChartTabs] Symbol selected:', selectedSymbol, 'updateKey:', updateKey)
setChartSymbol(selectedSymbol) setChartSymbol(selectedSymbol)
setActiveTab('kline') setActiveTab('kline')
} }
@@ -143,7 +142,6 @@ export function ChartTabs({ traderId, selectedSymbol, updateKey, exchangeId }: C
} }
} }
console.log('[ChartTabs] rendering, activeTab:', activeTab)
return ( return (
<div className={`nofx-glass rounded-lg border border-white/5 relative z-10 w-full flex flex-col transition-all duration-300 ${typeof window !== 'undefined' && window.innerWidth < 768 ? 'h-[500px]' : 'h-[600px]' <div className={`nofx-glass rounded-lg border border-white/5 relative z-10 w-full flex flex-col transition-all duration-300 ${typeof window !== 'undefined' && window.innerWidth < 768 ? 'h-[500px]' : 'h-[600px]'

View File

@@ -69,21 +69,17 @@ export function ChartWithOrders({
// Determine ms vs seconds: if > 10^12, treat as milliseconds // Determine ms vs seconds: if > 10^12, treat as milliseconds
if (time > 1000000000000) { if (time > 1000000000000) {
const seconds = Math.floor(time / 1000) const seconds = Math.floor(time / 1000)
console.log('[ChartWithOrders] ✅ Unix timestamp (ms→s):', time, '→', seconds, '(', new Date(time).toISOString(), ')')
return seconds return seconds
} }
console.log('[ChartWithOrders] ✅ Unix timestamp (s):', time, '(', new Date(time * 1000).toISOString(), ')')
return time return time
} }
const timeStr = String(time) const timeStr = String(time)
console.log('[ChartWithOrders] Parsing time string:', timeStr)
// Try standard ISO format // Try standard ISO format
const isoTime = new Date(timeStr).getTime() const isoTime = new Date(timeStr).getTime()
if (!isNaN(isoTime) && isoTime > 0) { if (!isNaN(isoTime) && isoTime > 0) {
const timestamp = Math.floor(isoTime / 1000) const timestamp = Math.floor(isoTime / 1000)
console.log('[ChartWithOrders] ✅ Parsed as ISO:', timeStr, '→', timestamp, '(', new Date(timestamp * 1000).toISOString(), ')')
return timestamp return timestamp
} }
@@ -100,7 +96,6 @@ export function ChartWithOrders({
parseInt(minute) parseInt(minute)
)) ))
const timestamp = Math.floor(date.getTime() / 1000) const timestamp = Math.floor(date.getTime() / 1000)
console.log('[ChartWithOrders] ✅ Parsed as custom format:', timeStr, '→', timestamp, '(', new Date(timestamp * 1000).toISOString(), ')')
return timestamp return timestamp
} }
@@ -184,7 +179,6 @@ export function ChartWithOrders({
}) })
}) })
console.log(`[ChartWithOrders] Loaded ${markers.length} order markers for ${symbol}`)
return markers return markers
} catch (err) { } catch (err) {
console.error('Error fetching orders:', err) console.error('Error fetching orders:', err)
@@ -199,7 +193,6 @@ export function ChartWithOrders({
return return
} }
console.log('[ChartWithOrders] Initializing chart for', symbol, interval)
try { try {
// Create chart // Create chart
@@ -303,26 +296,19 @@ export function ChartWithOrders({
useEffect(() => { useEffect(() => {
const loadData = async () => { const loadData = async () => {
if (!candlestickSeriesRef.current) { if (!candlestickSeriesRef.current) {
console.log('[ChartWithOrders] Candlestick series not ready yet')
return return
} }
console.log('[ChartWithOrders] Loading data for', symbol, interval, 'trader:', traderID)
setLoading(true) setLoading(true)
setError(null) setError(null)
try { try {
// 1. Fetch kline data // 1. Fetch kline data
console.log('[ChartWithOrders] Fetching kline data...')
const klineData = await fetchKlineData(symbol, interval) const klineData = await fetchKlineData(symbol, interval)
console.log('[ChartWithOrders] Kline data received:', klineData.length, 'candles')
candlestickSeriesRef.current.setData(klineData) candlestickSeriesRef.current.setData(klineData)
// Build kline time set for quick lookup // Build kline time set for quick lookup
const klineTimeSet = new Set(klineData.map(k => k.time as number)) const klineTimeSet = new Set(klineData.map(k => k.time as number))
const klineMinTime = klineData.length > 0 ? klineData[0].time : 0
const klineMaxTime = klineData.length > 0 ? klineData[klineData.length - 1].time : 0
console.log('[ChartWithOrders] Kline time range:', klineMinTime, '-', klineMaxTime, 'candles:', klineData.length)
// Calculate interval in seconds // Calculate interval in seconds
const getIntervalSeconds = (interval: string): number => { const getIntervalSeconds = (interval: string): number => {
@@ -339,16 +325,12 @@ export function ChartWithOrders({
} }
} }
const intervalSeconds = getIntervalSeconds(interval) const intervalSeconds = getIntervalSeconds(interval)
console.log('[ChartWithOrders] Interval:', interval, '=', intervalSeconds, 'seconds')
// 2. Fetch order data and add markers // 2. Fetch order data and add markers
if (traderID) { if (traderID) {
console.log('[ChartWithOrders] Fetching orders for trader:', traderID, 'symbol:', symbol)
const orders = await fetchOrders(traderID, symbol) const orders = await fetchOrders(traderID, symbol)
console.log('[ChartWithOrders] Received orders:', orders.length, 'orders')
if (orders.length === 0) { if (orders.length === 0) {
console.log('[ChartWithOrders] No orders to display')
} }
// Convert orders to chart markers, aligned to kline time // Convert orders to chart markers, aligned to kline time
@@ -385,9 +367,7 @@ export function ChartWithOrders({
}) })
}) })
console.log('[ChartWithOrders] Valid markers (with matching klines):', markers.length, 'out of', orders.length)
console.log('[ChartWithOrders] Setting', markers.length, 'markers on chart')
try { try {
// Using v5 API: createSeriesMarkers // Using v5 API: createSeriesMarkers
@@ -398,7 +378,6 @@ export function ChartWithOrders({
// First time creating markers // First time creating markers
seriesMarkersRef.current = createSeriesMarkers(candlestickSeriesRef.current, markers) seriesMarkersRef.current = createSeriesMarkers(candlestickSeriesRef.current, markers)
} }
console.log('[ChartWithOrders] ✅ Markers set successfully!')
} catch (err) { } catch (err) {
console.error('[ChartWithOrders] ❌ Failed to set markers:', err) console.error('[ChartWithOrders] ❌ Failed to set markers:', err)
} }

View File

@@ -21,7 +21,6 @@ export function ChartWithOrdersSimple({
useEffect(() => { useEffect(() => {
const loadData = async () => { const loadData = async () => {
console.log('[ChartSimple] Loading data for', symbol, interval, 'trader:', traderID)
setLoading(true) setLoading(true)
setError(null) setError(null)
@@ -30,24 +29,20 @@ export function ChartWithOrdersSimple({
const limit = 100 const limit = 100
const klineUrl = `/api/klines?symbol=${symbol}&interval=${interval}&limit=${limit}` const klineUrl = `/api/klines?symbol=${symbol}&interval=${interval}&limit=${limit}`
console.log('[ChartSimple] Fetching klines from our service:', klineUrl)
const klineResult = await httpClient.get(klineUrl) const klineResult = await httpClient.get(klineUrl)
if (!klineResult.success || !klineResult.data) { if (!klineResult.success || !klineResult.data) {
throw new Error('Failed to fetch klines from our service') throw new Error('Failed to fetch klines from our service')
} }
console.log('[ChartSimple] Received klines:', klineResult.data.length)
setKlineCount(klineResult.data.length) setKlineCount(klineResult.data.length)
// 测试获取订单数据 // 测试获取订单数据
if (traderID) { if (traderID) {
const tradesUrl = `/api/trades?trader_id=${traderID}&symbol=${symbol}&limit=100` const tradesUrl = `/api/trades?trader_id=${traderID}&symbol=${symbol}&limit=100`
console.log('[ChartSimple] Fetching trades from:', tradesUrl)
const tradesResult = await httpClient.get(tradesUrl) const tradesResult = await httpClient.get(tradesUrl)
if (tradesResult.success && tradesResult.data) { if (tradesResult.success && tradesResult.data) {
console.log('[ChartSimple] Received trades:', tradesResult.data.length)
setOrderCount(tradesResult.data.length) setOrderCount(tradesResult.data.length)
} else { } else {
console.warn('[ChartSimple] Failed to fetch trades:', tradesResult.message || 'Unknown error', tradesResult) console.warn('[ChartSimple] Failed to fetch trades:', tradesResult.message || 'Unknown error', tradesResult)

View File

@@ -48,10 +48,8 @@ export function ComparisonChart({ traders }: ComparisonChartProps) {
const { data: allTraderHistories, isLoading } = useSWR( const { data: allTraderHistories, isLoading } = useSWR(
traders.length > 0 ? `equity-histories-${tradersKey}-${selectedHours}` : null, traders.length > 0 ? `equity-histories-${tradersKey}-${selectedHours}` : null,
async () => { async () => {
console.log('Fetching equity history with hours:', selectedHours)
const traderIds = traders.map((trader) => trader.trader_id) const traderIds = traders.map((trader) => trader.trader_id)
const batchData = await api.getEquityHistoryBatch(traderIds, selectedHours) const batchData = await api.getEquityHistoryBatch(traderIds, selectedHours)
console.log('Received data points:', Object.values(batchData.histories || {}).map((h: any) => h?.length))
return traders.map((trader) => { return traders.map((trader) => {
const history = batchData.histories?.[trader.trader_id] || [] const history = batchData.histories?.[trader.trader_id] || []

View File

@@ -233,7 +233,6 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
} }
const handleSaveEditTrader = async (data: CreateTraderRequest) => { const handleSaveEditTrader = async (data: CreateTraderRequest) => {
console.log('🔥🔥🔥 handleSaveEditTrader CALLED with data:', data)
if (!editingTrader) return if (!editingTrader) return
try { try {
@@ -261,10 +260,6 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
show_in_competition: data.show_in_competition, show_in_competition: data.show_in_competition,
} }
console.log('🔥 handleSaveEditTrader - data:', data)
console.log('🔥 handleSaveEditTrader - data.strategy_id:', data.strategy_id)
console.log('🔥 handleSaveEditTrader - request:', request)
await api.updateTrader(editingTrader.trader_id, request) await api.updateTrader(editingTrader.trader_id, request)
toast.success(t('aiTradersToast.saved', language)) toast.success(t('aiTradersToast.saved', language))
setShowEditModal(false) setShowEditModal(false)