refactor: Community 目录结构重组 + 修复导入路径 + 添加 Mock 数据

## 目录重构
- DynamicNewsCard/ → DynamicNews/(含 layouts/, hooks/ 子目录)
- EventCard 原子组件 → EventCard/atoms/
- EventDetailModal 独立目录化
- HotEvents 独立目录化(含 CSS)
- SearchFilters 独立目录化(CompactSearchBox, TradingTimeFilter)

## 导入路径修复
- EventCard/*.js: 统一使用 @constants/, @utils/, @components/ 别名
- atoms/*.js: 修复移动后的相对路径问题
- DynamicNewsCard.js: 更新 contexts, store, constants 导入
- EventHeaderInfo.js, CompactMetaBar.js: 修复 EventFollowButton 导入

## Mock Handler 添加
- /api/events/:eventId/expectation-score - 事件超预期得分
- /api/index/:indexCode/realtime - 指数实时行情

## 警告修复
- CitationMark.js: overlayInnerStyle → styles (Antd 5.x)
- CitedContent.js: 移除不支持的 jsx 属性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-09 13:16:43 +08:00
parent aac031f17c
commit 44fcef5eae
47 changed files with 409 additions and 76 deletions

View File

@@ -0,0 +1,97 @@
// src/views/Community/components/HotEvents/HotEventsSection.js
// 热点事件区域组件
import React, { useState } from 'react';
import {
Card,
CardHeader,
CardBody,
Heading,
Badge,
Box,
useColorModeValue
} from '@chakra-ui/react';
import HotEvents from './HotEvents';
import { PROFESSIONAL_COLORS } from '@constants/professionalTheme';
/**
* 热点事件区域组件
* @param {Array} events - 热点事件列表
* @param {Function} onEventClick - 事件点击追踪回调
*/
const HotEventsSection = ({ events, onEventClick }) => {
const cardBg = PROFESSIONAL_COLORS.background.card;
const borderColor = PROFESSIONAL_COLORS.border.default;
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
// 处理页码变化
const handlePageChange = (page, total) => {
setCurrentPage(page);
setTotalPages(total);
};
// 如果没有热点事件,不渲染组件
if (!events || events.length === 0) {
return null;
}
return (
<Card
mt={6}
mb={8}
bg={cardBg}
boxShadow="0 4px 12px rgba(0, 0, 0, 0.3), 0 0 20px rgba(255, 195, 0, 0.1)"
borderWidth="1px"
borderColor={borderColor}
position="relative"
zIndex={1}
animation="fadeInUp 0.8s ease-out 0.4s both"
sx={{
'@keyframes fadeInUp': {
'0%': { opacity: 0, transform: 'translateY(30px)' },
'100%': { opacity: 1, transform: 'translateY(0)' }
}
}}
>
<CardHeader pb={3} display="flex" justifyContent="space-between" alignItems="flex-start">
<Box>
<Heading
size="lg"
bgGradient={PROFESSIONAL_COLORS.gradients.gold}
bgClip="text"
fontWeight="extrabold"
>
🔥 热点事件
</Heading>
<p className="section-subtitle" style={{paddingTop: '8px', color: PROFESSIONAL_COLORS.text.secondary}}>
展示最近5天内涨幅最高的事件助您把握市场热点
</p>
</Box>
{/* 页码指示器 */}
{totalPages > 1 && (
<Badge
bg={PROFESSIONAL_COLORS.gold[500]}
color="black"
fontSize="sm"
px={3}
py={1}
borderRadius="full"
ml={4}
>
{currentPage} / {totalPages}
</Badge>
)}
</CardHeader>
<CardBody py={4} px={4}>
<HotEvents
events={events}
onPageChange={handlePageChange}
onEventClick={onEventClick}
/>
</CardBody>
</Card>
);
};
export default HotEventsSection;