diff --git a/app/static/futures_analysis.html b/app/static/futures_analysis.html index 3abd3d7..72aa3ff 100644 --- a/app/static/futures_analysis.html +++ b/app/static/futures_analysis.html @@ -61,6 +61,10 @@ .toolbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; flex-wrap: wrap; gap: 16px; } + .toolbar-left { display: flex; align-items: center; gap: 16px; flex: 1; } + + .toolbar-actions { display: flex; gap: 10px; } + .search-box { background: #FFFFFF; border: none; @@ -340,7 +344,19 @@
- +
+ +
+ + +
+
diff --git a/app/static/futures_analysis.js b/app/static/futures_analysis.js index cdf84a8..dcd53cb 100644 --- a/app/static/futures_analysis.js +++ b/app/static/futures_analysis.js @@ -249,6 +249,7 @@ async function toggleWatch(symbol, name, event) { const data = await response.json(); if (data.success) { watchedSymbols = watchedSymbols.filter(s => s !== symbol); + showToast('success', '已取消自选', `${symbol} 已从自选列表移除`); } } else { const response = await fetch(`${API_BASE}/watched`, { @@ -259,24 +260,28 @@ async function toggleWatch(symbol, name, event) { const data = await response.json(); if (data.success) { watchedSymbols.push(symbol); + showToast('success', '已添加自选', `${name}(${symbol}) 已添加到自选列表`); } } document.getElementById('count-watched').textContent = watchedSymbols.length; - const activeTab = document.querySelector('.filter-tab.active'); - if (activeTab && activeTab.dataset.category === 'watched') { + // 重新渲染当前视图 + const activePill = document.querySelector('.pill.active'); + const category = activePill ? activePill.dataset.category : 'all'; + if (category === 'watched') { filterByCategory('watched'); } else { renderFuturesGrid(getCurrentFilteredData()); } } catch (error) { console.error('切换自选失败:', error); + showToast('error', '操作失败', '网络错误,请稍后重试'); } } function getCurrentFilteredData() { - const activeTab = document.querySelector('.filter-tab.active'); - const category = activeTab ? activeTab.dataset.category : 'all'; + const activePill = document.querySelector('.pill.active'); + const category = activePill ? activePill.dataset.category : 'all'; return filterDataByCategory(allFuturesData, category); } @@ -500,6 +505,10 @@ function renderFuturesGrid(data) { const resistance = item.resistance ? formatNumber(item.resistance) : '--'; const support = item.support ? formatNumber(item.support) : '--'; + const isWatched = watchedSymbols.includes(item.symbol); + const watchIcon = isWatched ? 'fa-star' : 'fa-star-o'; + const watchClass = isWatched ? 'active' : ''; + return `
@@ -611,8 +620,8 @@ function filterByTrend(trend) { function filterFuturesList(keyword) { keyword = keyword.toLowerCase(); - const activeTab = document.querySelector('.filter-tab.active'); - const category = activeTab ? activeTab.dataset.category : 'all'; + const activePill = document.querySelector('.pill.active'); + const category = activePill ? activePill.dataset.category : 'all'; let filtered = filterDataByCategory(allFuturesData, category);