update pay ui
This commit is contained in:
22
app.py
22
app.py
@@ -12403,7 +12403,21 @@ def get_daily_top_concepts():
|
|||||||
top_concepts = []
|
top_concepts = []
|
||||||
|
|
||||||
for concept in data.get('results', []):
|
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({
|
top_concepts.append({
|
||||||
'concept_id': concept.get('concept_id'),
|
'concept_id': concept.get('concept_id'),
|
||||||
'concept': concept.get('concept'), # 原始字段名
|
'concept': concept.get('concept'), # 原始字段名
|
||||||
@@ -12414,8 +12428,10 @@ def get_daily_top_concepts():
|
|||||||
'match_type': concept.get('match_type'),
|
'match_type': concept.get('match_type'),
|
||||||
'price_info': concept.get('price_info', {}), # 完整的价格信息
|
'price_info': concept.get('price_info', {}), # 完整的价格信息
|
||||||
'change_percent': concept.get('price_info', {}).get('avg_change_pct', 0), # 兼容旧字段
|
'change_percent': concept.get('price_info', {}).get('avg_change_pct', 0), # 兼容旧字段
|
||||||
'happened_times': concept.get('happened_times', []), # 历史触发时间
|
'tags': concept.get('tags', []), # 标签列表
|
||||||
'stocks': concept.get('stocks', []), # 返回完整股票列表
|
'outbreak_dates': concept.get('outbreak_dates', []), # 爆发日期列表
|
||||||
|
'hierarchy': concept.get('hierarchy'), # 层级信息 {lv1, lv2, lv3}
|
||||||
|
'stocks': formatted_stocks, # 返回格式化后的股票列表
|
||||||
'hot_score': concept.get('hot_score')
|
'hot_score': concept.get('hot_score')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ import {
|
|||||||
SkeletonText,
|
SkeletonText,
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import { SearchIcon, CloseIcon, ArrowForwardIcon, TrendingUpIcon, InfoIcon, ChevronRightIcon, CalendarIcon } from '@chakra-ui/icons';
|
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 ConceptStocksModal from '@components/ConceptStocksModal';
|
||||||
import TradeDatePicker from '@components/TradeDatePicker';
|
import TradeDatePicker from '@components/TradeDatePicker';
|
||||||
import { BsGraphUp, BsLightningFill } from 'react-icons/bs';
|
import { BsGraphUp, BsLightningFill } from 'react-icons/bs';
|
||||||
@@ -927,16 +927,65 @@ const StockOverview = () => {
|
|||||||
|
|
||||||
<CardBody pt={12}>
|
<CardBody pt={12}>
|
||||||
<VStack align="start" spacing={3}>
|
<VStack align="start" spacing={3}>
|
||||||
|
{/* 概念名称 */}
|
||||||
<Heading size="md" noOfLines={1} color={textColor}>
|
<Heading size="md" noOfLines={1} color={textColor}>
|
||||||
{concept.concept_name}
|
{concept.concept_name}
|
||||||
</Heading>
|
</Heading>
|
||||||
|
|
||||||
|
{/* 层级信息 */}
|
||||||
|
{concept.hierarchy && (
|
||||||
|
<HStack spacing={1} flexWrap="wrap">
|
||||||
|
<Icon as={FaLayerGroup} boxSize={3} color="gray.400" />
|
||||||
|
<Text fontSize="xs" color="gray.500">
|
||||||
|
{[concept.hierarchy.lv1, concept.hierarchy.lv2, concept.hierarchy.lv3]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(' > ')}
|
||||||
|
</Text>
|
||||||
|
</HStack>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 描述 */}
|
||||||
<Text fontSize="sm" color={subTextColor} noOfLines={2}>
|
<Text fontSize="sm" color={subTextColor} noOfLines={2}>
|
||||||
{concept.description || '暂无描述'}
|
{concept.description || '暂无描述'}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
|
{/* 标签 */}
|
||||||
|
{concept.tags && concept.tags.length > 0 && (
|
||||||
|
<Flex flexWrap="wrap" gap={1}>
|
||||||
|
{concept.tags.slice(0, 4).map((tag, idx) => (
|
||||||
|
<Tag
|
||||||
|
key={idx}
|
||||||
|
size="sm"
|
||||||
|
variant="outline"
|
||||||
|
colorScheme="blue"
|
||||||
|
borderRadius="full"
|
||||||
|
>
|
||||||
|
<Icon as={FaTag} boxSize={2} mr={1} />
|
||||||
|
<TagLabel fontSize="xs">{tag}</TagLabel>
|
||||||
|
</Tag>
|
||||||
|
))}
|
||||||
|
{concept.tags.length > 4 && (
|
||||||
|
<Tag size="sm" variant="ghost" colorScheme="gray">
|
||||||
|
<TagLabel fontSize="xs">+{concept.tags.length - 4}</TagLabel>
|
||||||
|
</Tag>
|
||||||
|
)}
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 爆发日期 */}
|
||||||
|
{concept.outbreak_dates && concept.outbreak_dates.length > 0 && (
|
||||||
|
<HStack spacing={2} fontSize="xs" color="orange.500">
|
||||||
|
<Icon as={FaBolt} />
|
||||||
|
<Text>
|
||||||
|
近期爆发: {concept.outbreak_dates.slice(0, 2).join(', ')}
|
||||||
|
{concept.outbreak_dates.length > 2 && ` 等${concept.outbreak_dates.length}次`}
|
||||||
|
</Text>
|
||||||
|
</HStack>
|
||||||
|
)}
|
||||||
|
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|
||||||
|
{/* 相关股票 */}
|
||||||
<Box
|
<Box
|
||||||
w="100%"
|
w="100%"
|
||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
@@ -957,7 +1006,7 @@ const StockOverview = () => {
|
|||||||
overflow="hidden"
|
overflow="hidden"
|
||||||
maxH="24px"
|
maxH="24px"
|
||||||
>
|
>
|
||||||
{concept.stocks.map((stock, idx) => (
|
{concept.stocks.slice(0, 5).map((stock, idx) => (
|
||||||
<Tag
|
<Tag
|
||||||
key={idx}
|
key={idx}
|
||||||
size="sm"
|
size="sm"
|
||||||
@@ -965,9 +1014,14 @@ const StockOverview = () => {
|
|||||||
variant="subtle"
|
variant="subtle"
|
||||||
flexShrink={0}
|
flexShrink={0}
|
||||||
>
|
>
|
||||||
<TagLabel>{stock.stock_name}</TagLabel>
|
<TagLabel>{stock.stock_name || stock.name}</TagLabel>
|
||||||
</Tag>
|
</Tag>
|
||||||
))}
|
))}
|
||||||
|
{concept.stocks.length > 5 && (
|
||||||
|
<Tag size="sm" variant="ghost" colorScheme="gray" flexShrink={0}>
|
||||||
|
<TagLabel>+{concept.stocks.length - 5}</TagLabel>
|
||||||
|
</Tag>
|
||||||
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
Reference in New Issue
Block a user