From c060ce211126cf5c8fe71ff6cce7f12836c7a11b Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Mon, 8 Dec 2025 14:54:35 +0800 Subject: [PATCH] update pay ui --- app.py | 22 ++++++++++-- src/views/StockOverview/index.js | 60 ++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index 56bc3250..617f508e 100755 --- a/app.py +++ b/app.py @@ -12403,7 +12403,21 @@ def get_daily_top_concepts(): top_concepts = [] for concept in data.get('results', []): - # 保持与 /concept-api/search 相同的字段结构 + # 处理 stocks 字段:兼容 {name, code} 和 {stock_name, stock_code} 两种格式 + raw_stocks = concept.get('stocks', []) + formatted_stocks = [] + for stock in raw_stocks: + # 优先使用 stock_name,其次使用 name + stock_name = stock.get('stock_name') or stock.get('name', '') + stock_code = stock.get('stock_code') or stock.get('code', '') + formatted_stocks.append({ + 'stock_name': stock_name, + 'stock_code': stock_code, + 'name': stock_name, # 兼容旧格式 + 'code': stock_code # 兼容旧格式 + }) + + # 保持与 /concept-api/search 相同的字段结构,并添加新字段 top_concepts.append({ 'concept_id': concept.get('concept_id'), 'concept': concept.get('concept'), # 原始字段名 @@ -12414,8 +12428,10 @@ def get_daily_top_concepts(): 'match_type': concept.get('match_type'), 'price_info': concept.get('price_info', {}), # 完整的价格信息 'change_percent': concept.get('price_info', {}).get('avg_change_pct', 0), # 兼容旧字段 - 'happened_times': concept.get('happened_times', []), # 历史触发时间 - 'stocks': concept.get('stocks', []), # 返回完整股票列表 + 'tags': concept.get('tags', []), # 标签列表 + 'outbreak_dates': concept.get('outbreak_dates', []), # 爆发日期列表 + 'hierarchy': concept.get('hierarchy'), # 层级信息 {lv1, lv2, lv3} + 'stocks': formatted_stocks, # 返回格式化后的股票列表 'hot_score': concept.get('hot_score') }) diff --git a/src/views/StockOverview/index.js b/src/views/StockOverview/index.js index 818093a3..e98686b1 100644 --- a/src/views/StockOverview/index.js +++ b/src/views/StockOverview/index.js @@ -50,7 +50,7 @@ import { SkeletonText, } from '@chakra-ui/react'; import { SearchIcon, CloseIcon, ArrowForwardIcon, TrendingUpIcon, InfoIcon, ChevronRightIcon, CalendarIcon } from '@chakra-ui/icons'; -import { FaChartLine, FaFire, FaRocket, FaBrain, FaCalendarAlt, FaChevronRight, FaArrowUp, FaArrowDown, FaChartBar } from 'react-icons/fa'; +import { FaChartLine, FaFire, FaRocket, FaBrain, FaCalendarAlt, FaChevronRight, FaArrowUp, FaArrowDown, FaChartBar, FaTag, FaLayerGroup, FaBolt } from 'react-icons/fa'; import ConceptStocksModal from '@components/ConceptStocksModal'; import TradeDatePicker from '@components/TradeDatePicker'; import { BsGraphUp, BsLightningFill } from 'react-icons/bs'; @@ -927,16 +927,65 @@ const StockOverview = () => { + {/* 概念名称 */} {concept.concept_name} + {/* 层级信息 */} + {concept.hierarchy && ( + + + + {[concept.hierarchy.lv1, concept.hierarchy.lv2, concept.hierarchy.lv3] + .filter(Boolean) + .join(' > ')} + + + )} + + {/* 描述 */} {concept.description || '暂无描述'} + {/* 标签 */} + {concept.tags && concept.tags.length > 0 && ( + + {concept.tags.slice(0, 4).map((tag, idx) => ( + + + {tag} + + ))} + {concept.tags.length > 4 && ( + + +{concept.tags.length - 4} + + )} + + )} + + {/* 爆发日期 */} + {concept.outbreak_dates && concept.outbreak_dates.length > 0 && ( + + + + 近期爆发: {concept.outbreak_dates.slice(0, 2).join(', ')} + {concept.outbreak_dates.length > 2 && ` 等${concept.outbreak_dates.length}次`} + + + )} + + {/* 相关股票 */} { overflow="hidden" maxH="24px" > - {concept.stocks.map((stock, idx) => ( + {concept.stocks.slice(0, 5).map((stock, idx) => ( { variant="subtle" flexShrink={0} > - {stock.stock_name} + {stock.stock_name || stock.name} ))} + {concept.stocks.length > 5 && ( + + +{concept.stocks.length - 5} + + )} )}