// src/components/Citation/CitationMark.js import React, { useState } from 'react'; import { Popover, Typography, Space, Divider } from 'antd'; import { FileTextOutlined, UserOutlined, CalendarOutlined } from '@ant-design/icons'; const { Text } = Typography; /** * 引用标记组件 - 显示上标引用【1】【2】【3】 * 支持悬浮(桌面)和点击(移动)两种交互方式 * * @param {Object} props * @param {number} props.citationId - 引用 ID(1, 2, 3...) * @param {Object} props.citation - 引用数据对象 * @param {string} props.citation.author - 作者 * @param {string} props.citation.report_title - 报告标题 * @param {string} props.citation.declare_date - 发布日期 * @param {string} props.citation.sentences - 摘要片段 */ const CitationMark = ({ citationId, citation }) => { const [popoverVisible, setPopoverVisible] = useState(false); // 如果没有引用数据,不渲染 if (!citation) { return null; } // 引用卡片内容 const citationContent = (
{/* 报告标题 - 顶部突出显示 */}
{citation.report_title}
{/* 作者和日期 - 左右分布 */}
{/* 左侧:作者 */} {citation.author} {/* 右侧:发布日期(重点标注) */} {citation.declare_date}
{/* 摘要片段 */}
摘要片段 {citation.sentences}
); // 检测是否为移动设备 const isMobile = () => { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent ); }; // 移动端:仅点击触发 // 桌面端:悬浮 + 点击都触发 const triggerType = isMobile() ? 'click' : ['hover', 'click']; return ( { if (!isMobile()) { e.target.style.color = '#40a9ff'; e.target.style.textDecoration = 'underline'; } }} onMouseLeave={(e) => { if (!isMobile()) { e.target.style.color = '#1890ff'; e.target.style.textDecoration = 'none'; } }} onClick={() => { setPopoverVisible(!popoverVisible); }} > 【{citationId}】 ); }; export default CitationMark;