×

慧聪网商品详情页前端性能优化实战

万邦科技Lex 万邦科技Lex 发表于2026-03-09 10:02:42 浏览23 评论0

抢沙发发表评论

慧聪网商品详情页前端性能优化实战

一、慧聪网业务场景深度分析

1.1 慧聪网商品详情页特征

慧聪网作为国内领先的B2B电子商务平台,其商品详情页具有以下显著特征:
// 慧聪网商品详情页特性分析
interface HCProductFeatures {
  // B2B交易特性
  b2bTrading: {
    bulkPricing: BulkPricing[];           // 阶梯批发价
    moqRequirement: MOQRequirement;      // 最小起订量
    samplePolicy: SamplePolicy;          // 样品政策
    tradeAssurance: TradeAssurance;      // 交易保障
    supplierVerification: Verification;   // 供应商认证
  };
  
  // 企业级内容
  enterpriseContent: {
    companyProfile: CompanyProfile;      // 公司介绍
    productionCapacity: CapacityInfo;    // 生产能力
    qualityCertifications: Cert[];       // 质量认证
    factoryTour: FactoryTour[];          // 工厂实景
    exportExperience: ExportInfo;       // 出口经验
  };
  
  // 专业服务
  professionalServices: {
    customManufacturing: CustomService;  // 定制加工
    oemOdmSupport: OEMODMInfo;          // OEM/ODM支持
    logisticsSolution: LogisticsInfo;    // 物流解决方案
    paymentTerms: PaymentTerms;          // 付款方式
    afterSalesService: ServicePolicy;    // 售后服务
  };
  
  // 数据驱动展示
  dataDriven: {
    marketTrend: TrendData;              // 市场趋势
    competitorAnalysis: AnalysisData;    // 竞品分析
    buyerBehavior: BehaviorData;         // 买家行为
    seasonalDemand: DemandData;          // 季节性需求
  };
  
  // 复杂交互
  complexInteractions: {
    quoteRequest: QuoteSystem;           // 询价系统
    compareProducts: CompareTool;        // 产品对比
    saveFavorites: FavoriteSystem;       // 收藏管理
    inquiryHistory: InquiryHistory;      // 询盘历史
  };
}

1.2 B2B平台性能挑战

// 慧聪网性能痛点分析
const hcPainPoints = {
  // 1. 企业级内容资源密集
  enterpriseContentHeavy: {
    highResFactoryImages: 30+,         // 工厂实拍高清图
    certificationDocuments: 15+,        // 认证证书图片
    productCatalogs: 20+,              // 产品目录PDF
    productionLineVideos: 10+,         // 生产线视频
    companyProfileSlides: 12+          // 企业介绍幻灯片
  },
  
  // 2. 数据可视化复杂
  dataVisualizationComplex: {
    marketTrendCharts: 8+,             // 市场趋势图表
    priceHistoryGraphs: 6+,            // 价格历史曲线
    demandForecastCharts: 5+,          // 需求预测图
    competitorRadar: 1,                // 竞品雷达图
    realtimeMarketData: true           // 实时市场数据
  },
  
  // 3. 专业工具集成
  professionalTools: {
    quoteBuilder: '复杂表单',          // 报价单生成器
    productCompare: '多维度对比',      // 产品比较工具
    bulkInquiry: '批量询盘',           // 批量询价系统
    customConfigurator: '定制配置器'   // 定制产品配置器
  },
  
  // 4. 企业级功能模块
  enterpriseFeatures: {
    supplierVerification: '实时验证',  // 供应商资质验证
    tradeAssurance: '交易保障',        // 交易担保服务
    creditRating: '信用等级',          // 企业信用评级
    complianceCheck: '合规检查'        // 合规性检查
  }
};

二、企业级内容性能优化

2.1 工厂实景图册优化

// 慧聪网工厂实景图册 - 企业级图片优化
import { memo, useState, useCallback, useMemo, useRef } from 'react';
import { useVirtualizer } from '@tanstack/react-virtual';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface FactoryImage {
  id: string;
  url: string;
  thumbnail: string;
  title: string;
  description: string;
  category: 'production' | 'warehouse' | 'quality' | 'office' | 'certification';
  resolution: string;
  fileSize: number;
}

interface FactoryGalleryProps {
  images: FactoryImage[];
  supplierId: string;
  isVerified: boolean;
}

const FactoryGallery = memo(({ images, supplierId, isVerified }: FactoryGalleryProps) => {
  const [activeCategory, setActiveCategory] = useState<string>('all');
  const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);
  const [loadedImages, setLoadedImages] = useState<Set<string>>(new Set());
  const containerRef = useRef<HTMLDivElement>(null);
  
  // 分类过滤
  const filteredImages = useMemo(() => {
    if (activeCategory === 'all') return images;
    return images.filter(img => img.category === activeCategory);
  }, [images, activeCategory]);
  
  // 虚拟滚动配置
  const rowVirtualizer = useVirtualizer({
    count: filteredImages.length,
    getScrollElement: () => containerRef.current,
    estimateSize: () => 280,
    overscan: 4,
  });
  
  // 图片分类
  const categories = useMemo(() => {
    const cats = Array.from(new Set(images.map(img => img.category)));
    return [
      { id: 'all', label: '全部', count: images.length },
      ...cats.map(cat => ({
        id: cat,
        label: getCategoryLabel(cat),
        count: images.filter(img => img.category === cat).length
      }))
    ];
  }, [images]);
  
  // 渐进式加载图片
  const handleImageLoad = useCallback((imageId: string) => {
    setLoadedImages(prev => new Set([...prev, imageId]));
  }, []);
  
  // 打开灯箱
  const openLightbox = useCallback((index: number) => {
    setLightboxIndex(index);
    document.body.style.overflow = 'hidden';
  }, []);
  
  // 关闭灯箱
  const closeLightbox = useCallback(() => {
    setLightboxIndex(null);
    document.body.style.overflow = '';
  }, []);
  
  // 灯箱中导航
  const navigateLightbox = useCallback((direction: 'prev' | 'next') => {
    if (lightboxIndex === null) return;
    
    if (direction === 'prev') {
      setLightboxIndex(prev => 
        prev !== null ? (prev > 0 ? prev - 1 : filteredImages.length - 1) : null
      );
    } else {
      setLightboxIndex(prev => 
        prev !== null ? (prev < filteredImages.length - 1 ? prev + 1 : 0) : null
      );
    }
  }, [lightboxIndex, filteredImages.length]);
  
  // 键盘导航
  useEffect(() => {
    const handleKeyDown = (e: KeyboardEvent) => {
      if (lightboxIndex === null) return;
      
      switch (e.key) {
        case 'Escape':
          closeLightbox();
          break;
        case 'ArrowLeft':
          navigateLightbox('prev');
          break;
        case 'ArrowRight':
          navigateLightbox('next');
          break;
      }
    };
    
    window.addEventListener('keydown', handleKeyDown);
    return () => window.removeEventListener('keydown', handleKeyDown);
  }, [lightboxIndex, closeLightbox, navigateLightbox]);
  
  return (
    <div className="factory-gallery">
      {/* 头部信息 */}
      <div className="gallery-header">
        <div className="header-info">
          <h2>🏭 工厂实景展示</h2>
          {isVerified && (
            <span className="verified-badge">
              ✓ 实地认证供应商
            </span>
          )}
        </div>
        <div className="image-count">
          共 {filteredImages.length} 张图片
        </div>
      </div>
      
      {/* 分类筛选 */}
      <div className="category-filter">
        {categories.map(category => (
          <button
            key={category.id}
            className={`category-btn ${activeCategory === category.id ? 'active' : ''}`}
            onClick={() => setActiveCategory(category.id)}
          >
            <span className="category-label">{category.label}</span>
            <span className="category-count">{category.count}</span>
          </button>
        ))}
      </div>
      
      {/* 图片网格 */}
      <div className="gallery-container" ref={containerRef}>
        <div
          style={{
            height: `${rowVirtualizer.getTotalSize()}px`,
            position: 'relative',
          }}
        >
          {rowVirtualizer.getVirtualItems().map((virtualItem) => {
            const image = filteredImages[virtualItem.index];
            const isLoaded = loadedImages.has(image.id);
            
            return (
              <div
                key={image.id}
                style={{
                  position: 'absolute',
                  top: 0,
                  left: 0,
                  width: '100%',
                  height: `${virtualItem.size}px`,
                  transform: `translateY(${virtualItem.start}px)`,
                }}
              >
                <FactoryImageCard
                  image={image}
                  isLoaded={isLoaded}
                  onLoad={() => handleImageLoad(image.id)}
                  onClick={() => openLightbox(virtualItem.index)}
                />
              </div>
            );
          })}
        </div>
      </div>
      
      {/* 灯箱 */}
      {lightboxIndex !== null && (
        <Lightbox
          images={filteredImages}
          currentIndex={lightboxIndex}
          onClose={closeLightbox}
          onNavigate={navigateLightbox}
        />
      )}
    </div>
  );
});

// 工厂图片卡片
const FactoryImageCard = memo(({
  image,
  isLoaded,
  onLoad,
  onClick
}: {
  image: FactoryImage;
  isLoaded: boolean;
  onLoad: () => void;
  onClick: () => void;
}) => {
  return (
    <div className="factory-image-card" onClick={onClick}>
      <div className="image-container">
        {!isLoaded && (
          <div className="image-placeholder">
            <FactoryIcon />
            <div className="loading-spinner" />
          </div>
        )}
        <img
          src={image.thumbnail}
          data-src={image.url}
          alt={image.title}
          loading="lazy"
          onLoad={onLoad}
          className={`factory-image ${isLoaded ? 'loaded' : ''}`}
        />
        <div className="image-overlay">
          <span className="view-icon">🔍 查看大图</span>
        </div>
      </div>
      <div className="image-info">
        <h4>{image.title}</h4>
        <p className="image-description">{image.description}</p>
        <div className="image-meta">
          <span className="category-tag">{getCategoryLabel(image.category)}</span>
          <span className="resolution">{image.resolution}</span>
        </div>
      </div>
    </div>
  );
});

// 灯箱组件
const Lightbox = memo(({
  images,
  currentIndex,
  onClose,
  onNavigate
}: {
  images: FactoryImage[];
  currentIndex: number;
  onClose: () => void;
  onNavigate: (dir: 'prev' | 'next') => void;
}) => {
  const currentImage = images[currentIndex];
  const [isImageLoaded, setIsImageLoaded] = useState(false);
  
  // 预加载相邻图片
  useEffect(() => {
    setIsImageLoaded(false);
    
    // 预加载当前图片
    const img = new Image();
    img.onload = () => setIsImageLoaded(true);
    img.src = currentImage.url;
    
    // 预加载前后图片
    const prevIndex = currentIndex > 0 ? currentIndex - 1 : images.length - 1;
    const nextIndex = currentIndex < images.length - 1 ? currentIndex + 1 : 0;
    
    [prevIndex, nextIndex].forEach(idx => {
      const preloadImg = new Image();
      preloadImg.src = images[idx].url;
    });
  }, [currentIndex, images, currentImage.url]);
  
  return (
    <div className="lightbox-overlay" onClick={onClose}>
      <div className="lightbox-container" onClick={e => e.stopPropagation()}>
        {/* 关闭按钮 */}
        <button className="lightbox-close" onClick={onClose}>
          ×
        </button>
        
        {/* 导航按钮 */}
        <button 
          className="lightbox-nav prev"
          onClick={() => onNavigate('prev')}
        >
          ‹
        </button>
        <button 
          className="lightbox-nav next"
          onClick={() => onNavigate('next')}
        >
          ›
        </button>
        
        {/* 图片容器 */}
        <div className="lightbox-image-container">
          {!isImageLoaded && (
            <div className="lightbox-placeholder">
              <LoadingSpinner />
            </div>
          )}
          <img
            src={currentImage.url}
            alt={currentImage.title}
            className={`lightbox-image ${isImageLoaded ? 'loaded' : ''}`}
          />
        </div>
        
        {/* 图片信息 */}
        <div className="lightbox-info">
          <h3>{currentImage.title}</h3>
          <p>{currentImage.description}</p>
          <div className="lightbox-meta">
            <span>{currentIndex + 1} / {images.length}</span>
            <span>{currentImage.category}</span>
            <span>{currentImage.resolution}</span>
          </div>
        </div>
        
        {/* 缩略图导航 */}
        <div className="lightbox-thumbnails">
          {images.map((img, idx) => (
            <button
              key={img.id}
              className={`thumbnail ${idx === currentIndex ? 'active' : ''}`}
              onClick={() => onNavigate(idx > currentIndex ? 'next' : 'prev')}
            >
              <img src={img.thumbnail} alt={img.title} />
            </button>
          ))}
        </div>
      </div>
    </div>
  );
});

2.2 认证文档展示优化

// 认证文档展示组件 - PDF优化 + 懒加载
import { memo, useState, useCallback, useEffect } from 'react';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface Certification {
  id: string;
  name: string;
  issuer: string;
  issueDate: string;
  expiryDate: string;
  documentUrl: string;
  thumbnailUrl: string;
  category: 'quality' | 'environment' | 'safety' | 'industry';
  verified: boolean;
}

interface CertificationDocsProps {
  certifications: Certification[];
  supplierId: string;
}

const CertificationDocs = memo(({ certifications, supplierId }: CertificationDocsProps) => {
  const [loadedDocs, setLoadedDocs] = useState<Set<string>>(new Set());
  const [viewingDoc, setViewingDoc] = useState<Certification | null>(null);
  const [docPreview, setDocPreview] = useState<string | null>(null);
  
  // 分类认证文档
  const categorizedCerts = useMemo(() => {
    const cats = Array.from(new Set(certifications.map(c => c.category)));
    return cats.map(cat => ({
      category: cat,
      certs: certifications.filter(c => c.category === cat),
      count: certifications.filter(c => c.category === cat).length
    }));
  }, [certifications]);
  
  // 加载文档预览
  const loadDocPreview = useCallback(async (cert: Certification) => {
    try {
      setDocPreview(null);
      
      // 使用PDF.js或其他PDF渲染库
      const previewUrl = await generatePdfThumbnail(cert.documentUrl);
      setDocPreview(previewUrl);
      setViewingDoc(cert);
    } catch (error) {
      console.error('Failed to load doc preview:', error);
    }
  }, []);
  
  // 下载文档
  const downloadDoc = useCallback(async (cert: Certification) => {
    try {
      const response = await fetch(cert.documentUrl);
      const blob = await response.blob();
      const url = window.URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      link.download = `${cert.name}_${cert.issuer}.pdf`;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      window.URL.revokeObjectURL(url);
      
      // 标记为已加载
      setLoadedDocs(prev => new Set([...prev, cert.id]));
    } catch (error) {
      console.error('Failed to download doc:', error);
    }
  }, []);
  
  // 生成PDF缩略图
  const generatePdfThumbnail = async (pdfUrl: string): Promise<string> => {
    // 这里可以使用PDF.js或其他库生成缩略图
    // 简化示例:返回静态预览图
    return pdfUrl.replace('.pdf', '_preview.jpg');
  };
  
  return (
    <div className="certification-docs">
      <div className="docs-header">
        <h2>📋 企业认证证书</h2>
        <p>查看供应商的资质认证和质量保证文件</p>
      </div>
      
      {/* 分类展示 */}
      {categorizedCerts.map(({ category, certs, count }) => (
        <div key={category} className="cert-category">
          <h3 className="category-title">
            {getCategoryLabel(category)}
            <span className="cert-count">({count})</span>
          </h3>
          
          <div className="certs-grid">
            {certs.map(cert => (
              <CertCard
                key={cert.id}
                cert={cert}
                isLoaded={loadedDocs.has(cert.id)}
                onLoad={() => setLoadedDocs(prev => new Set([...prev, cert.id]))}
                onView={() => loadDocPreview(cert)}
                onDownload={() => downloadDoc(cert)}
              />
            ))}
          </div>
        </div>
      ))}
      
      {/* 文档预览模态框 */}
      {viewingDoc && (
        <DocPreviewModal
          cert={viewingDoc}
          previewUrl={docPreview}
          onClose={() => {
            setViewingDoc(null);
            setDocPreview(null);
          }}
        />
      )}
    </div>
  );
});

// 认证卡片
const CertCard = memo(({
  cert,
  isLoaded,
  onLoad,
  onView,
  onDownload
}: {
  cert: Certification;
  isLoaded: boolean;
  onLoad: () => void;
  onView: () => void;
  onDownload: () => void;
}) => {
  return (
    <div className="cert-card">
      <div className="cert-thumbnail">
        {!isLoaded && (
          <div className="loading-placeholder">
            <DocumentIcon />
          </div>
        )}
        <img
          src={cert.thumbnailUrl}
          alt={cert.name}
          onLoad={onLoad}
          className={isLoaded ? 'loaded' : ''}
        />
        {cert.verified && (
          <div className="verified-badge">
            <CheckIcon />
            已验证
          </div>
        )}
      </div>
      
      <div className="cert-info">
        <h4>{cert.name}</h4>
        <p className="issuer">颁发机构: {cert.issuer}</p>
        <p className="validity">
          有效期: {cert.issueDate} 至 {cert.expiryDate}
        </p>
        
        <div className="cert-actions">
          <button className="view-btn" onClick={onView}>
            🔍 查看证书
          </button>
          <button className="download-btn" onClick={onDownload}>
            ⬇️ 下载
          </button>
        </div>
      </div>
    </div>
  );
});

三、数据可视化性能优化

3.1 市场趋势图表优化

// 市场趋势图表组件 - 大数据集优化
import { memo, useState, useCallback, useMemo, useRef, useEffect } from 'react';
import { useVirtualizer } from '@tanstack/react-virtual';

interface TrendDataPoint {
  date: string;
  value: number;
  volume: number;
  price: number;
  demand: number;
}

interface MarketTrendChartProps {
  data: TrendDataPoint[];
  productId: string;
  category: string;
  timeRange: '1m' | '3m' | '6m' | '1y' | '3y';
}

const MarketTrendChart = memo(({ 
  data, 
  productId, 
  category, 
  timeRange 
}: MarketTrendChartProps) => {
  const [visibleRange, setVisibleRange] = useState({ start: 0, end: 50 });
  const [hoveredPoint, setHoveredPoint] = useState<TrendDataPoint | null>(null);
  const [chartType, setChartType] = useState<'line' | 'area' | 'bar'>('area');
  const containerRef = useRef<HTMLDivElement>(null);
  # 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
  // 数据采样优化 - 大数据集降采样
  const sampledData = useMemo(() => {
    const maxPoints = 500; // 最大显示点数
    
    if (data.length <= maxPoints) return data;
    
    const step = Math.ceil(data.length / maxPoints);
    return data.filter((_, index) => index % step === 0);
  }, [data]);
  
  // 虚拟滚动配置
  const rowVirtualizer = useVirtualizer({
    count: sampledData.length,
    getScrollElement: () => containerRef.current,
    estimateSize: () => 60,
    overscan: 10,
  });
  
  // 计算统计数据
  const statistics = useMemo(() => {
    const values = sampledData.map(d => d.value);
    const prices = sampledData.map(d => d.price);
    
    return {
      avgValue: values.reduce((a, b) => a + b, 0) / values.length,
      maxValue: Math.max(...values),
      minValue: Math.min(...values),
      avgPrice: prices.reduce((a, b) => a + b, 0) / prices.length,
      priceChange: prices[prices.length - 1] - prices[0],
      trend: prices[prices.length - 1] > prices[0] ? 'up' : 'down'
    };
  }, [sampledData]);
  
  // 格式化数值
  const formatValue = useCallback((value: number) => {
    if (value >= 1000000) {
      return `${(value / 1000000).toFixed(1)}M`;
    }
    if (value >= 1000) {
      return `${(value / 1000).toFixed(1)}K`;
    }
    return value.toFixed(0);
  }, []);
  
  // 格式化日期
  const formatDate = useCallback((dateStr: string) => {
    const date = new Date(dateStr);
    return `${date.getMonth() + 1}/${date.getDate()}`;
  }, []);
  
  // 处理鼠标悬停
  const handleHover = useCallback((point: TrendDataPoint | null) => {
    setHoveredPoint(point);
  }, []);
  
  return (
    <div className="market-trend-chart">
      <div className="chart-header">
        <h2>📈 市场趋势分析</h2>
        <div className="chart-controls">
          <div className="chart-type-selector">
            <button 
              className={chartType === 'line' ? 'active' : ''} 
              onClick={() => setChartType('line')}
            >
              折线
            </button>
            <button 
              className={chartType === 'area' ? 'active' : ''} 
              onClick={() => setChartType('area')}
            >
              面积
            </button>
            <button 
              className={chartType === 'bar' ? 'active' : ''} 
              onClick={() => setChartType('bar')}
            >
              柱状
            </button>
          </div>
          <div className="time-range-selector">
            {['1m', '3m', '6m', '1y', '3y'].map(range => (
              <button
                key={range}
                className={timeRange === range ? 'active' : ''}
                onClick={() => {/* 切换时间范围 */}}
              >
                {range.toUpperCase()}
              </button>
            ))}
          </div>
        </div>
      </div>
      
      {/* 统计摘要 */}
      <div className="statistics-summary">
        <StatCard 
          label="平均指数" 
          value={formatValue(statistics.avgValue)} 
          trend={statistics.trend}
        />
        <StatCard 
          label="最高值" 
          value={formatValue(statistics.maxValue)} 
          trend="neutral"
        />
        <StatCard 
          label="最低值" 
          value={formatValue(statistics.minValue)} 
          trend="neutral"
        />
        <StatCard 
          label="均价变化" 
          value={`${statistics.priceChange > 0 ? '+' : ''}${statistics.priceChange.toFixed(2)}`} 
          trend={statistics.priceChange >= 0 ? 'up' : 'down'}
          suffix="元"
        />
      </div>
      
      {/* 图表容器 */}
      <div className="chart-container" ref={containerRef}>
        <div className="chart-y-axis">
          <span className="axis-label">{formatValue(statistics.maxValue)}</span>
          <span className="axis-label">{formatValue(statistics.avgValue)}</span>
          <span className="axis-label">{formatValue(statistics.minValue)}</span>
        </div>
        
        <div
          style={{
            height: `${rowVirtualizer.getTotalSize()}px`,
            position: 'relative',
          }}
        >
          {/* 网格线 */}
          <div className="chart-grid">
            {Array.from({ length: 5 }).map((_, i) => (
              <div 
                key={i} 
                className="grid-line"
                style={{ bottom: `${i * 25}%` }}
              />
            ))}
          </div>
          
          {/* 数据点 */}
          {rowVirtualizer.getVirtualItems().map((virtualItem) => {
            const point = sampledData[virtualItem.index];
            const prevPoint = sampledData[virtualItem.index - 1];
            const nextPoint = sampledData[virtualItem.index + 1];
            
            // 计算位置百分比
            const maxVal = statistics.maxValue;
            const minVal = statistics.minValue;
            const range = maxVal - minVal;
            const position = ((point.value - minVal) / range) * 100;
            
            const isHovered = hoveredPoint?.date === point.date;
            const isPrevHovered = prevPoint && hoveredPoint?.date === prevPoint.date;
            const isNextHovered = nextPoint && hoveredPoint?.date === nextPoint.date;
            
            return (
              <div
                key={point.date}
                style={{
                  position: 'absolute',
                  top: 0,
                  left: 0,
                  width: '100%',
                  height: `${virtualItem.size}px`,
                  transform: `translateY(${virtualItem.start}px)`,
                }}
                className="chart-point-container"
              >
                {/* 连接线 */}
                {prevPoint && (
                  <svg className="chart-line" style={{ 
                    position: 'absolute', 
                    top: 0, 
                    left: 0, 
                    width: '100%', 
                    height: '100%' 
                  }}>
                    <defs>
                      <linearGradient id="lineGradient" x1="0%" y1="0%" x2="100%" y2="0%">
                        <stop offset="0%" stopColor="#667eea" stopOpacity="0.3" />
                        <stop offset="100%" stopColor="#667eea" stopOpacity="0.3" />
                      </linearGradient>
                    </defs>
                    <line
                      x1="0%"
                      y1={`${((prevPoint.value - minVal) / range) * 100}%`}
                      x2="100%"
                      y2={`${((point.value - minVal) / range) * 100}%`}
                      stroke="url(#lineGradient)"
                      strokeWidth="2"
                    />
                  </svg>
                )}
                
                {/* 数据点 */}
                <div
                  className={`chart-point ${isHovered ? 'hovered' : ''} ${isPrevHovered || isNextHovered ? 'connected' : ''}`}
                  style={{ 
                    left: `${virtualItem.index / sampledData.length * 100}%`,
                    bottom: `${position}%`
                  }}
                  onMouseEnter={() => handleHover(point)}
                  onMouseLeave={() => handleHover(null)}
                >
                  <div className="point-tooltip">
                    <span className="tooltip-date">{formatDate(point.date)}</span>
                    <span className="tooltip-value">{formatValue(point.value)}</span>
                    <span className="tooltip-price">¥{point.price}</span>
                  </div>
                </div>
                
                {/* X轴标签 */}
                <span 
                  className="x-axis-label"
                  style={{ 
                    left: `${virtualItem.index / sampledData.length * 100}%`,
                    bottom: '-25px'
                  }}
                >
                  {formatDate(point.date)}
                </span>
              </div>
            );
          })}
        </div>
      </div>
      
      {/* 悬停详情面板 */}
      {hoveredPoint && (
        <div className="hover-detail-panel">
          <h4>📊 {formatDate(hoveredPoint.date)} 市场数据</h4>
          <div className="detail-grid">
            <div className="detail-item">
              <span className="label">市场指数</span>
              <span className="value">{formatValue(hoveredPoint.value)}</span>
            </div>
            <div className="detail-item">
              <span className="label">市场价格</span>
              <span className="value">¥{hoveredPoint.price}</span>
            </div>
            <div className="detail-item">
              <span className="label">交易量</span>
              <span className="value">{formatValue(hoveredPoint.volume)}</span>
            </div>
            <div className="detail-item">
              <span className="label">需求指数</span>
              <span className="value">{hoveredPoint.demand}</span>
            </div>
          </div>
        </div>
      )}
    </div>
  );
});

3.2 竞品分析雷达图优化

// 竞品分析雷达图 - Canvas优化渲染
import { memo, useRef, useEffect, useCallback, useMemo } from 'react';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface CompetitorData {
  name: string;
  metrics: {
    price: number;
    quality: number;
    delivery: number;
    service: number;
    innovation: number;
  };
}

interface CompetitorRadarProps {
  competitors: CompetitorData[];
  ourData: CompetitorData;
  productCategory: string;
}

const CompetitorRadar = memo(({ competitors, ourData, productCategory }: CompetitorRadarProps) => {
  const canvasRef = useRef<HTMLCanvasElement>(null);
  const [hoveredCompetitor, setHoveredCompetitor] = useState<string | null>(null);
  
  // 合并数据
  const allData = useMemo(() => {
    return [ourData, ...competitors];
  }, [ourData, competitors]);
  
  // 指标标签
  const metricLabels = useMemo(() => [
    { key: 'price', label: '价格竞争力' },
    { key: 'quality', label: '产品质量' },
    { key: 'delivery', label: '交付能力' },
    { key: 'service', label: '服务水平' },
    { key: 'innovation', label: '创新能力' }
  ], []);
  
  // 绘制雷达图
  const drawRadar = useCallback(() => {
    const canvas = canvasRef.current;
    if (!canvas) return;
    
    const ctx = canvas.getContext('2d');
    if (!ctx) return;
    
    const width = canvas.width;
    const height = canvas.height;
    const centerX = width / 2;
    const centerY = height / 2;
    const radius = Math.min(width, height) / 2 - 60;
    const sides = metricLabels.length;
    const angleStep = (Math.PI * 2) / sides;
    
    // 清空画布
    ctx.clearRect(0, 0, width, height);
    
    // 绘制背景网格
    for (let level = 1; level <= 5; level++) {
      ctx.beginPath();
      const levelRadius = (radius / 5) * level;
      
      for (let i = 0; i <= sides; i++) {
        const angle = i * angleStep - Math.PI / 2;
        const x = centerX + Math.cos(angle) * levelRadius;
        const y = centerY + Math.sin(angle) * levelRadius;
        
        if (i === 0) {
          ctx.moveTo(x, y);
        } else {
          ctx.lineTo(x, y);
        }
      }
      
      ctx.closePath();
      ctx.strokeStyle = `rgba(102, 126, 234, ${0.1 + level * 0.05})`;
      ctx.lineWidth = 1;
      ctx.stroke();
    }
    
    // 绘制轴线
    ctx.strokeStyle = 'rgba(102, 126, 234, 0.3)';
    ctx.lineWidth = 1;
    
    for (let i = 0; i < sides; i++) {
      const angle = i * angleStep - Math.PI / 2;
      const x = centerX + Math.cos(angle) * radius;
      const y = centerY + Math.sin(angle) * radius;
      
      ctx.beginPath();
      ctx.moveTo(centerX, centerY);
      ctx.lineTo(x, y);
      ctx.stroke();
    }
    
    // 绘制标签
    ctx.font = '12px sans-serif';
    ctx.fillStyle = '#666';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    
    metricLabels.forEach((label, i) => {
      const angle = i * angleStep - Math.PI / 2;
      const x = centerX + Math.cos(angle) * (radius + 30);
      const y = centerY + Math.sin(angle) * (radius + 30);
      
      ctx.fillText(label.label, x, y);
    });
    
    // 颜色配置
    const colors = [
      { fill: 'rgba(102, 126, 234, 0.3)', stroke: '#667eea' },  // 我们
      { fill: 'rgba(236, 72, 153, 0.2)', stroke: '#ec4899' },  // 竞品1
      { fill: 'rgba(34, 197, 94, 0.2)', stroke: '#22c55e' },   // 竞品2
      { fill: 'rgba(249, 115, 22, 0.2)', stroke: '#f97316' },  // 竞品3
    ];
    
    // 绘制数据多边形
    allData.forEach((data, dataIndex) => {
      const color = colors[dataIndex % colors.length];
      const isHovered = hoveredCompetitor === data.name;
      
      ctx.beginPath();
      
      const points = Object.values(data.metrics).map((value, i) => {
        const angle = i * angleStep - Math.PI / 2;
        const pointRadius = (value / 100) * radius;
        return {
          x: centerX + Math.cos(angle) * pointRadius,
          y: centerY + Math.sin(angle) * pointRadius
        };
      });
      
      points.forEach((point, i) => {
        if (i === 0) {
          ctx.moveTo(point.x, point.y);
        } else {
          ctx.lineTo(point.x, point.y);
        }
      });
      
      ctx.closePath();
      
      // 填充
      ctx.fillStyle = isHovered ? color.fill.replace('0.', '0.5') : color.fill;
      ctx.fill();
      
      // 描边
      ctx.strokeStyle = isHovered ? '#333' : color.stroke;
      ctx.lineWidth = isHovered ? 3 : 2;
      ctx.stroke();
      
      // 绘制数据点
      points.forEach((point, i) => {
        ctx.beginPath();
        ctx.arc(point.x, point.y, isHovered ? 6 : 4, 0, Math.PI * 2);
        ctx.fillStyle = color.stroke;
        ctx.fill();
      });
      
      // 绘制标签
      if (isHovered) {
        const avgValue = Object.values(data.metrics).reduce((a, b) => a + b, 0) / 5;
        ctx.font = 'bold 14px sans-serif';
        ctx.fillStyle = '#333';
        ctx.fillText(`${data.name} (${avgValue.toFixed(1)})`, centerX, centerY + radius + 60);
      }
    });
    
    // 绘制图例
    const legendY = height - 40;
    ctx.font = '11px sans-serif';
    
    allData.forEach((data, i) => {
      const color = colors[i % colors.length];
      const x = 20 + (i * 120);
      
      ctx.fillStyle = color.stroke;
      ctx.fillRect(x, legendY, 12, 12);
      
      ctx.fillStyle = '#333';
      ctx.textAlign = 'left';
      ctx.fillText(data.name, x + 18, legendY + 10);
    });
    
  }, [metricLabels, allData, hoveredCompetitor]);
  
  // 绑定事件
  useEffect(() => {
    const canvas = canvasRef.current;
    if (!canvas) return;
    
    const handleMouseMove = (e: MouseEvent) => {
      const rect = canvas.getBoundingClientRect();
      const mouseX = e.clientX - rect.left;
      const mouseY = e.clientY - rect.top;
      
      const width = canvas.width;
      const height = canvas.height;
      const centerX = width / 2;
      const centerY = height / 2;
      const radius = Math.min(width, height) / 2 - 60;
      const sides = metricLabels.length;
      const angleStep = (Math.PI * 2) / sides;
      
      // 检测鼠标是否在某个数据点上
      let found = false;
      
      allData.forEach(data => {
        Object.values(data.metrics).forEach((value, i) => {
          const angle = i * angleStep - Math.PI / 2;
          const pointRadius = (value / 100) * radius;
          const x = centerX + Math.cos(angle) * pointRadius;
          const y = centerY + Math.sin(angle) * pointRadius;
          
          const distance = Math.sqrt(Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2));
          
          if (distance < 15) {
            setHoveredCompetitor(data.name);
            found = true;
          }
        });
      });
      
      if (!found) {
        setHoveredCompetitor(null);
      }
    };
    
    canvas.addEventListener('mousemove', handleMouseMove);
    canvas.addEventListener('mouseleave', () => setHoveredCompetitor(null));
    
    return () => {
      canvas.removeEventListener('mousemove', handleMouseMove);
      canvas.removeEventListener('mouseleave', () => setHoveredCompetitor(null));
    };
  }, [metricLabels, allData]);
  
  // 响应式尺寸
  useEffect(() => {
    const handleResize = () => {
      const canvas = canvasRef.current;
      if (canvas) {
        const container = canvas.parentElement;
        if (container) {
          canvas.width = container.clientWidth;
          canvas.height = 400;
          drawRadar();
        }
      }
    };
    
    window.addEventListener('resize', handleResize);
    handleResize();
    
    return () => window.removeEventListener('resize', handleResize);
  }, [drawRadar]);
  
  return (
    <div className="competitor-radar">
      <div className="radar-header">
        <h2>🎯 竞品分析雷达图</h2>
        <p>多维度对比分析,发现竞争优势与改进空间</p>
      </div>
      
      <div className="radar-container">
        <canvas ref={canvasRef} />
      </div>
      
      <div className="radar-legend">
        <h4>图例说明</h4>
        <ul>
          <li><span className="legend-color self" /> 我方企业</li>
          <li><span className="legend-color competitor" /> 主要竞争对手</li>
          <li>鼠标悬停查看详细数据</li>
        </ul>
      </div>
      
      {/* 详细数据表格 */}
      <div className="radar-data-table">
        <h4>📋 详细数据对比</h4>
        <table>
          <thead>
            <tr>
              <th>企业名称</th>
              {metricLabels.map(label => (
                <th key={label.key}>{label.label}</th>
              ))}
              <th>综合得分</th>
            </tr>
          </thead>
          <tbody>
            {allData.map(data => {
              const avgScore = Object.values(data.metrics).reduce((a, b) => a + b, 0) / 5;
              const isSelf = data.name === ourData.name;
              
              return (
                <tr key={data.name} className={isSelf ? 'self-row' : ''}>
                  <td>
                    <span className={`company-tag ${isSelf ? 'self' : 'competitor'}`}>
                      {data.name}
                    </span>
                  </td>
                  {metricLabels.map(label => (
                    <td key={label.key}>
                      <div className="score-bar">
                        <div 
                          className="score-fill"
                          style={{ width: `${data.metrics[label.key as keyof typeof data.metrics]}%` }}
                        />
                        <span className="score-value">
                          {data.metrics[label.key as keyof typeof data.metrics]}
                        </span>
                      </div>
                    </td>
                  ))}
                  <td className="total-score">
                    <strong>{avgScore.toFixed(1)}</strong>
                  </td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>
    </div>
  );
});

四、专业工具性能优化

4.1 询价系统优化

// 询价系统组件 - 复杂表单优化
import { memo, useState, useCallback, useMemo, useRef } from 'react';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface ProductQuote {
  productId: string;
  quantity: number;
  unit: string;
  specifications: Record<string, string>;
  deliveryRequirement: DeliveryRequirement;
  paymentTerms: PaymentTerms;
  additionalRequirements: string;
}

interface QuoteSystemProps {
  products: Product[];
  supplierId: string;
  onSubmitSuccess: (quoteId: string) => void;
}

const QuoteSystem = memo(({ products, supplierId, onSubmitSuccess }: QuoteSystemProps) => {
  const [step, setStep] = useState<number>(1);
  const [quoteData, setQuoteData] = useState<Partial<ProductQuote>>({
    quantity: 1,
    unit: 'piece',
    specifications: {},
    deliveryRequirement: {
      destination: '',
      deadline: '',
      shippingMethod: 'sea'
    },
    paymentTerms: 'tt',
    additionalRequirements: ''
  });
  const [errors, setErrors] = useState<Record<string, string>>({});
  const [isSubmitting, setIsSubmitting] = useState(false);
  const formRef = useRef<HTMLFormElement>(null);
  
  // 表单步骤配置
  const steps = useMemo(() => [
    { id: 1, title: '选择产品', description: '选择您要询价的产品和数量' },
    { id: 2, title: '规格参数', description: '填写产品的具体规格要求' },
    { id: 3, title: '交付要求', description: '指定交付时间和运输方式' },
    { id: 4, title: '付款条款', description: '协商付款方式和条件' },
    { id: 5, title: '确认提交', description: '核对信息并提交询价单' }
  ], []);
  
  // 验证当前步骤
  const validateStep = useCallback((currentStep: number): boolean => {
    const newErrors: Record<string, string> = {};
    let isValid = true;
    
    switch (currentStep) {
      case 1:
        if (!quoteData.productId) {
          newErrors.productId = '请选择产品';
          isValid = false;
        }
        if (!quoteData.quantity || quoteData.quantity < 1) {
          newErrors.quantity = '请输入有效数量';
          isValid = false;
        }
        break;
        
      case 2:
        // 验证必填规格参数
        const requiredSpecs = products.find(p => p.id === quoteData.productId)?.requiredSpecifications;
        if (requiredSpecs) {
          requiredSpecs.forEach(spec => {
            if (!quoteData.specifications?.[spec]) {
              newErrors[`spec_${spec}`] = `请填写${spec}`;
              isValid = false;
            }
          });
        }
        break;
        
      case 3:
        if (!quoteData.deliveryRequirement?.destination) {
          newErrors.destination = '请输入目的地';
          isValid = false;
        }
        if (!quoteData.deliveryRequirement?.deadline) {
          newErrors.deadline = '请选择交付期限';
          isValid = false;
        }
        break;
        
      case 4:
        if (!quoteData.paymentTerms) {
          newErrors.paymentTerms = '请选择付款方式';
          isValid = false;
        }
        break;
    }
    
    setErrors(newErrors);
    return isValid;
  }, [quoteData, products]);
  
  // 下一步
  const handleNext = useCallback(() => {
    if (validateStep(step)) {
      setStep(prev => Math.min(prev + 1, steps.length));
    }
  }, [step, validateStep, steps.length]);
  
  // 上一步
  const handlePrev = useCallback(() => {
    setStep(prev => Math.max(prev - 1, 1));
  }, []);
  
  // 提交询价
  const handleSubmit = useCallback(async () => {
    if (!validateStep(step)) return;
    
    setIsSubmitting(true);
    
    try {
      const response = await fetch('/api/quotes', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          ...quoteData,
          supplierId,
          submittedAt: new Date().toISOString()
        })
      });
      
      const result = await response.json();
      
      if (response.ok) {
        onSubmitSuccess(result.quoteId);
      } else {
        setErrors({ submit: result.message || '提交失败,请重试' });
      }
    } catch (error) {
      setErrors({ submit: '网络错误,请稍后重试' });
    } finally {
      setIsSubmitting(false);
    }
  }, [quoteData, supplierId, step, validateStep, onSubmitSuccess]);
  
  // 更新报价数据
  const updateQuoteData = useCallback((field: string, value: any) => {
    setQuoteData(prev => ({
      ...prev,
      [field]: value
    }));
    
    // 清除对应错误
    if (errors[field]) {
      setErrors(prev => {
        const newErrors = { ...prev };
        delete newErrors[field];
        return newErrors;
      });
    }
  }, [errors]);
  
  return (
    <div className="quote-system">
      <div className="quote-header">
        <h2>📝 在线询价系统</h2>
        <p>快速获取专业报价,支持批量询价和定制需求</p>
      </div>
      
      {/* 步骤指示器 */}
      <div className="step-indicator">
        {steps.map((s, index) => (
          <div 
            key={s.id} 
            className={`step ${step === s.id ? 'active' : ''} ${step > s.id ? 'completed' : ''}`}
          >
            <div className="step-number">
              {step > s.id ? <CheckIcon /> : s.id}
            </div>
            <div className="step-info">
              <span className="step-title">{s.title}</span>
              <span className="step-desc">{s.description}</span>
            </div>
            {index < steps.length - 1 && (
              <div className="step-connector">
                <div className={`connector-line ${step > s.id ? 'completed' : ''}`} />
              </div>
            )}
          </div>
        ))}
      </div>
      
      {/* 表单内容 */}
      <div className="quote-form-container">
        <form ref={formRef} className="quote-form">
          {/* 步骤1: 选择产品 */}
          {step === 1 && (
            <div className="form-step">
              <h3>选择产品和数量</h3>
              
              <div className="form-group">
                <label>选择产品 *</label>
                <select
                  value={quoteData.productId || ''}
                  onChange={(e) => updateQuoteData('productId', e.target.value)}
                  className={errors.productId ? 'error' : ''}
                >
                  <option value="">请选择产品</option>
                  {products.map(product => (
                    <option key={product.id} value={product.id}>
                      {product.name} - ¥{product.price}/{product.unit}
                    </option>
                  ))}
                </select>
                {errors.productId && <span className="error-message">{errors.productId}</span>}
              </div>
              
              <div className="form-group">
                <label>采购数量 *</label>
                <div className="quantity-input">
                  <input
                    type="number"
                    min="1"
                    value={quoteData.quantity || ''}
                    onChange={(e) => updateQuoteData('quantity', parseInt(e.target.value) || 0)}
                    className={errors.quantity ? 'error' : ''}
                  />
                  <select
                    value={quoteData.unit || 'piece'}
                    onChange={(e) => updateQuoteData('unit', e.target.value)}
                  >
                    <option value="piece">件</option>
                    <option value="set">套</option>
                    <option value="kg">千克</option>
                    <option value="meter">米</option>
                    <option value="lot">批</option>
                  </select>
                </div>
                {errors.quantity && <span className="error-message">{errors.quantity}</span>}
              </div>
              
              {/* 选中产品信息 */}
              {quoteData.productId && (
                <div className="selected-product-info">
                  {(() => {
                    const product = products.find(p => p.id === quoteData.productId);
                    if (!product) return null;
                    
                    return (
                      <div className="product-card">
                        <img src={product.image} alt={product.name} />
                        <div className="product-details">
                          <h4>{product.name}</h4>
                          <p>型号: {product.model}</p>
                          <p>品牌: {product.brand}</p>
                          <p>起订量: {product.moq} {product.unit}</p>
                        </div>
                        <div className="product-price">
                          <span className="price">¥{product.price}</span>
                          <span className="unit">/{product.unit}</span>
                        </div>
                      </div>
                    );
                  })()}
                </div>
              )}
            </div>
          )}
          
          {/* 步骤2: 规格参数 */}
          {step === 2 && (
            <div className="form-step">
              <h3>产品规格参数</h3>
              
              {(() => {
                const product = products.find(p => p.id === quoteData.productId);
                if (!product) return <p>请先选择产品</p>;
                
                return (
                  <div className="specifications-form">
                    {product.availableSpecifications.map(spec => (
                      <div key={spec.name} className="form-group">
                        <label>{spec.label} {spec.required && '*'}</label>
                        {spec.type === 'select' ? (
                          <select
                            value={quoteData.specifications?.[spec.name] || ''}
                            onChange={(e) => updateQuoteData(`specifications.${spec.name}`, e.target.value)}
                            className={errors[`spec_${spec.name}`] ? 'error' : ''}
                          >
                            <option value="">请选择{spec.label}</option>
                            {spec.options?.map(opt => (
                              <option key={opt.value} value={opt.value}>
                                {opt.label}
                              </option>
                            ))}
                          </select>
                        ) : spec.type === 'number' ? (
                          <input
                            type="number"
                            value={quoteData.specifications?.[spec.name] || ''}
                            onChange={(e) => updateQuoteData(`specifications.${spec.name}`, e.target.value)}
                            className={errors[`spec_${spec.name}`] ? 'error' : ''}
                          />
                        ) : (
                          <textarea
                            value={quoteData.specifications?.[spec.name] || ''}
                            onChange={(e) => updateQuoteData(`specifications.${spec.name}`, e.target.value)}
                            className={errors[`spec_${spec.name}`] ? 'error' : ''}
                            rows={3}
                          />
                        )}
                        {errors[`spec_${spec.name}`] && (
                          <span className="error-message">{errors[`spec_${spec.name}`]}</span>
                        )}
                      </div>
                    ))}
                  </div>
                );
              })()}
            </div>
          )}
          
          {/* 步骤3: 交付要求 */}
          {step === 3 && (
            <div className="form-step">
              <h3>交付要求</h3>
              
              <div className="form-group">
                <label>交货目的地 *</label>
                <input
                  type="text"
                  placeholder="请输入港口或地址"
                  value={quoteData.deliveryRequirement?.destination || ''}
                  onChange={(e) => updateQuoteData('deliveryRequirement', {
                    ...quoteData.deliveryRequirement,
                    destination: e.target.value
                  })}
                  className={errors.destination ? 'error' : ''}
                />
                {errors.destination && <span className="error-message">{errors.destination}</span>}
              </div>
              
              <div className="form-group">
                <label>期望交付日期 *</label>
                <input
                  type="date"
                  value={quoteData.deliveryRequirement?.deadline || ''}
                  onChange={(e) => updateQuoteData('deliveryRequirement', {
                    ...quoteData.deliveryRequirement,
                    deadline: e.target.value
                  })}
                  className={errors.deadline ? 'error' : ''}
                />
                {errors.deadline && <span className="error-message">{errors.deadline}</span>}
              </div>
              
              <div className="form-group">
                <label>运输方式</label>
                <div className="shipping-options">
                  {[
                    { value: 'sea', label: '海运', icon: '🚢' },
                    { value: 'air', label: '空运', icon: '✈️' },
                    { value: 'land', label: '陆运', icon: '🚛' },
                    { value: 'express', label: '快递', icon: '📦' }
                  ].map(option => (
                    <button
                      key={option.value}
                      type="button"
                      className={`shipping-option ${quoteData.deliveryRequirement?.shippingMethod === option.value ? 'selected' : ''}`}
                      onClick={() => updateQuoteData('deliveryRequirement', {
                        ...quoteData.deliveryRequirement,
                        shippingMethod: option.value
                      })}
                    >
                      <span className="icon">{option.icon}</span>
                      <span className="label">{option.label}</span>
                    </button>
                  ))}
                </div>
              </div>
              
              <div className="form-group">
                <label>特殊包装要求</label>
                <textarea
                  placeholder="如有特殊包装要求请在此说明"
                  value={quoteData.deliveryRequirement?.specialPackaging || ''}
                  onChange={(e) => updateQuoteData('deliveryRequirement', {
                    ...quoteData.deliveryRequirement,
                    specialPackaging: e.target.value
                  })}
                  rows={3}
                />
              </div>
            </div>
          )}
          
          {/* 步骤4: 付款条款 */}
          {step === 4 && (
            <div className="form-step">
              <h3>付款条款</h3>
              
              <div className="form-group">
                <label>首选付款方式 *</label>
                <div className="payment-options">
                  {[
                    { value: 'tt', label: '电汇(T/T)', desc: '30%预付款,70%发货前付清' },
                    { value: 'lc', label: '信用证(L/C)', desc: '不可撤销即期信用证' },
                    { value: 'dp', label: '付款交单(D/P)', desc: '见票后付款交单' },
                    { value: 'da', label: '承兑交单(D/A)', desc: '见票后承兑交单' },
                    { value: 'paypal', label: 'PayPal', desc: '适合小金额订单' }
                  ].map(option => (
                    <div
                      key={option.value}
                      className={`payment-option ${quoteData.paymentTerms === option.value ? 'selected' : ''}`}
                      onClick={() => updateQuoteData('paymentTerms', option.value)}
                    >
                      <div className="radio">
                        {quoteData.paymentTerms === option.value && <CheckIcon />}
                      </div>
                      <div className="info">
                        <span className="label">{option.label}</span>
                        <span className="desc">{option.desc}</span>
                      </div>
                    </div>
                  ))}
                </div>
                {errors.paymentTerms && <span className="error-message">{errors.paymentTerms}</span>}
              </div>
              
              <div className="form-group">
                <label>贸易术语</label>
                <select
                  value={quoteData.deliveryRequirement?.incoterm || 'FOB'}
                  onChange={(e) => updateQuoteData('deliveryRequirement', {
                    ...quoteData.deliveryRequirement,
                    incoterm: e.target.value
                  })}
                >
                  <option value="FOB">FOB - 装运港船上交货</option>
                  <option value="CFR">CFR - 成本加运费</option>
                  <option value="CIF">CIF - 成本加保险费加运费</option>
                  <option value="EXW">EXW - 工厂交货</option>
                  <option value="DDP">DDP - 完税后交货</option>
                </select>
              </div>
              
              <div className="form-group">
                <label>其他要求</label>
                <textarea
                  placeholder="如有其他付款或合作要求,请在此说明"
                  value={quoteData.additionalRequirements}
                  onChange={(e) => updateQuoteData('additionalRequirements', e.target.value)}
                  rows={4}
                />
              </div>
            </div>
          )}
          
          {/* 步骤5: 确认提交 */}
          {step === 5 && (
            <div className="form-step">
              <h3>确认询价信息</h3>
              
              <div className="confirmation-summary">
                <div className="summary-section">
                  <h4>📦 产品信息</h4>
                  {(() => {
                    const product = products.find(p => p.id === quoteData.productId);
                    if (!product) return null;
                    
                    return (
                      <div className="summary-content">
                        <p><strong>产品:</strong> {product.name}</p>
                        <p><strong>数量:</strong> {quoteData.quantity} {quoteData.unit}</p>
                        <p><strong>型号:</strong> {product.model}</p>
                      </div>
                    );
                  })()}
                </div>
                
                <div className="summary-section">
                  <h4>📋 规格参数</h4>
                  <div className="summary-content">
                    {Object.entries(quoteData.specifications || {}).map(([key, value]) => (
                      <p key={key}><strong>{key}:</strong> {value}</p>
                    ))}
                  </div>
                </div>
                
                <div className="summary-section">
                  <h4>🚚 交付要求</h4>
                  <div className="summary-content">
                    <p><strong>目的地:</strong> {quoteData.deliveryRequirement?.destination}</p>
                    <p><strong>交付日期:</strong> {quoteData.deliveryRequirement?.deadline}</p>
                    <p><strong>运输方式:</strong> {quoteData.deliveryRequirement?.shippingMethod}</p>
                    <p><strong>贸易术语:</strong> {quoteData.deliveryRequirement?.incoterm}</p>
                  </div>
                </div>
                
                <div className="summary-section">
                  <h4>💰 付款条款</h4>
                  <div className="summary-content">
                    <p><strong>付款方式:</strong> {quoteData.paymentTerms}</p>
                    {quoteData.additionalRequirements && (
                      <p><strong>其他要求:</strong> {quoteData.additionalRequirements}</p>
                    )}
                  </div>
                </div>
              </div>
              
              {errors.submit && (
                <div className="submit-error">
                  <ErrorIcon />
                  {errors.submit}
                </div>
              )}
            </div>
          )}
        </form>
      </div>
      
      {/* 导航按钮 */}
      <div className="form-navigation">
        <button
          type="button"
          className="btn-prev"
          onClick={handlePrev}
          disabled={step === 1}
        >
          ← 上一步
        </button>
        
        {step < steps.length ? (
          <button
            type="button"
            className="btn-next"
            onClick={handleNext}
          >
            下一步 →
          </button>
        ) : (
          <button
            type="button"
            className="btn-submit"
            onClick={handleSubmit}
            disabled={isSubmitting}
          >
            {isSubmitting ? (
              <>
                <LoadingSpinner />
                提交中...
              </>
            ) : (
              <>
                ✓ 提交询价
              </>
            )}
          </button>
        )}
      </div>
    </div>
  );
});

4.2 产品对比工具优化

// 产品对比工具 - 大数据集虚拟滚动对比
import { memo, useState, useCallback, useMemo, useRef } from 'react';
import { useVirtualizer } from '@tanstack/react-virtual';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface ComparisonProduct {
  id: string;
  name: string;
  model: string;
  brand: string;
  price: number;
  moq: number;
  specifications: Record<string, string>;
  certifications: string[];
  ratings: RatingSummary;
}

interface ProductCompareProps {
  products: ComparisonProduct[];
  categories: string[];
}

const ProductCompare = memo(({ products, categories }: ProductCompareProps) => {
  const [selectedProducts, setSelectedProducts] = useState<Set<string>>(new Set());
  const [compareMode, setCompareMode] = useState<'side-by-side' | 'overlay'>('side-by-side');
  const [showDifferencesOnly, setShowDifferencesOnly] = useState(false);
  const containerRef = useRef<HTMLDivElement>(null);
  
  // 切换产品选择
  const toggleProduct = useCallback((productId: string) => {
    setSelectedProducts(prev => {
      const newSet = new Set(prev);
      if (newSet.has(productId)) {
        newSet.delete(productId);
      } else {
        if (newSet.size < 4) { // 最多对比4个产品
          newSet.add(productId);
        }
      }
      return newSet;
    });
  }, []);
  
  // 选中的产品
  const selectedProductList = useMemo(() => 
    products.filter(p => selectedProducts.has(p.id)),
  [products, selectedProducts]);
  
  // 对比表格列配置
  const columns = useMemo(() => [
    { id: 'basic', label: '基本信息', fields: ['model', 'brand', 'price', 'moq'] },
    { id: 'specs', label: '技术规格', fields: categories },
    { id: 'quality', label: '质量认证', fields: ['certifications'] },
    { id: 'ratings', label: '用户评价', fields: ['ratings'] }
  ], [categories]);
  
  // 虚拟滚动配置
  const columnVirtualizer = useVirtualizer({
    count: columns.length,
    getScrollElement: () => containerRef.current,
    estimateSize: () => 400,
    overscan: 1,
  });
  
  // 找出差异字段
  const differenceFields = useMemo(() => {
    if (selectedProductList.length < 2) return new Set();
    
    const differences = new Set<string>();
    
    columns.forEach(column => {
      column.fields.forEach(field => {
        const values = selectedProductList.map(p => {
          if (field === 'certifications') {
            return JSON.stringify(p.certifications.sort());
          }
          if (field === 'ratings') {
            return JSON.stringify(p.ratings);
          }
          return String(p.specifications[field] || p[field as keyof ComparisonProduct] || '');
        });
        
        const uniqueValues = new Set(values);
        if (uniqueValues.size > 1) {
          differences.add(field);
        }
      });
    });
    
    return differences;
  }, [selectedProductList, columns]);
  
  // 过滤显示字段
  const getDisplayFields = useCallback((column: typeof columns[0]) => {
    if (!showDifferencesOnly) return column.fields;
    return column.fields.filter(field => differenceFields.has(field));
  }, [showDifferencesOnly, differenceFields]);
  
  return (
    <div className="product-compare">
      <div className="compare-header">
        <h2>⚖️ 产品对比工具</h2>
        <p>选择最多4个产品进行详细对比分析</p>
      </div>
      
      {/* 产品选择器 */}
      <div className="product-selector">
        <h3>选择对比产品</h3>
        <div className="product-checkboxes">
          {products.map(product => (
            <label 
              key={product.id} 
              className={`product-checkbox ${selectedProducts.has(product.id) ? 'selected' : ''} ${selectedProducts.size >= 4 && !selectedProducts.has(product.id) ? 'disabled' : ''}`}
            >
              <input
                type="checkbox"
                checked={selectedProducts.has(product.id)}
                onChange={() => toggleProduct(product.id)}
                disabled={selectedProducts.size >= 4 && !selectedProducts.has(product.id)}
              />
              <div className="product-info">
                <img src={product.image} alt={product.name} />
                <span className="product-name">{product.name}</span>
                <span className="product-price">¥{product.price}</span>
              </div>
            </label>
          ))}
        </div>
      </div>
      
      {/* 对比控制 */}
      {selectedProductList.length >= 2 && (
        <div className="compare-controls">
          <div className="control-group">
            <label>显示模式:</label>
            <div className="mode-buttons">
              <button
                className={compareMode === 'side-by-side' ? 'active' : ''}
                onClick={() => setCompareMode('side-by-side')}
              >
                并排对比
              </button>
              <button
                className={compareMode === 'overlay' ? 'active' : ''}
                onClick={() => setCompareMode('overlay')}
              >
                叠加对比
              </button>
            </div>
          </div>
          
          <div className="control-group">
            <label>
              <input
                type="checkbox"
                checked={showDifferencesOnly}
                onChange={(e) => setShowDifferencesOnly(e.target.checked)}
              />
              仅显示差异项
            </label>
          </div>
          
          <button 
            className="clear-selection"
            onClick={() => setSelectedProducts(new Set())}
          >
            清除选择
          </button>
        </div>
      )}
      
      {/* 对比表格 */}
      {selectedProductList.length >= 2 && (
        <div className="compare-table-container" ref={containerRef}>
          <div
            style={{
              height: `${columnVirtualizer.getTotalSize()}px`,
              position: 'relative',
            }}
          >
            {columnVirtualizer.getVirtualItems().map((virtualColumn) => {
              const column = columns[virtualColumn.index];
              const displayFields = getDisplayFields(column);
              
              if (displayFields.length === 0) return null;
              
              return (
                <div
                  key={column.id}
                  style={{
                    position: 'absolute',
                    top: 0,
                    left: 0,
                    width: '100%',
                    height: `${virtualColumn.size}px`,
                    transform: `translateY(${virtualColumn.start}px)`,
                  }}
                  className="compare-column"
                >
                  <div className="column-header">
                    <h4>{column.label}</h4>
                  </div>
                  
                  <div className="column-content">
                    {/* 字段行 */}
                    {displayFields.map(field => (
                      <div key={field} className="compare-row">
                        <div className="field-name">
                          {getFieldLabel(field)}
                        </div>
                        
                        <div className="field-values">
                          {selectedProductList.map(product => (
                            <div key={product.id} className="field-value">
                              {renderFieldValue(product, field)}
                            </div>
                          ))}
                        </div>
                      </div>
                    ))}
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      )}
      
      {/* 空状态 */}
      {selectedProductList.length < 2 && (
        <div className="empty-compare">
          <div className="empty-icon">📊</div>
          <h3>请选择至少2个产品进行对比</h3>
          <p>选择产品后可查看详细规格、价格和认证信息对比</p>
        </div>
      )}
    </div>
  );
});

五、企业级功能性能优化

5.1 供应商资质验证优化

// 供应商资质验证组件 - 实时验证 + 缓存
import { memo, useState, useCallback, useEffect, useRef } from 'react';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface VerificationStatus {
  id: string;
  type: 'business' | 'quality' | 'export' | 'credit' | 'compliance';
  name: string;
  status: 'verified' | 'pending' | 'failed' | 'expired';
  verifiedAt: string;
  expiryDate: string;
  verifier: string;
  documents: string[];
  score: number;
}

interface SupplierVerificationProps {
  supplierId: string;
  onVerifyComplete: (results: VerificationStatus[]) => void;
}

const SupplierVerification = memo(({ supplierId, onVerifyComplete }: SupplierVerificationProps) => {
  const [verificationStatus, setVerificationStatus] = useState<VerificationStatus[]>([]);
  const [isVerifying, setIsVerifying] = useState(false);
  const [verificationProgress, setVerificationProgress] = useState(0);
  const [verifiedCache, setVerifiedCache] = useState<Map<string, VerificationStatus[]>>(new Map());
  const verificationRef = useRef<AbortController>();
  
  // 验证项目配置
  const verificationItems = useMemo(() => [
    { type: 'business', name: '工商注册信息', weight: 20 },
    { type: 'quality', name: '质量管理体系', weight: 25 },
    { type: 'export', name: '出口资质认证', weight: 20 },
    { type: 'credit', name: '企业信用评级', weight: 20 },
    { type: 'compliance', name: '合规经营检查', weight: 15 }
  ], []);
  
  // 检查缓存
  const checkCache = useCallback((sid: string) => {
    return verifiedCache.get(sid);
  }, [verifiedCache]);
  
  // 执行验证
  const performVerification = useCallback(async () => {
    // 检查缓存
    const cached = checkCache(supplierId);
    if (cached) {
      setVerificationStatus(cached);
      onVerifyComplete(cached);
      return;
    }
    
    setIsVerifying(true);
    setVerificationProgress(0);
    
    // 取消之前的验证请求
    if (verificationRef.current) {
      verificationRef.current.abort();
    }
    verificationRef.current = new AbortController();
    
    try {
      const results: VerificationStatus[] = [];
      const totalItems = verificationItems.length;
      
      for (let i = 0; i < verificationItems.length; i++) {
        const item = verificationItems[i];
        
        // 更新进度
        setVerificationProgress(((i + 0.5) / totalItems) * 100);
        
        // 模拟API调用
        const result = await verifyItem(supplierId, item, verificationRef.current.signal);
        results.push(result);
        
        // 更新进度
        setVerificationProgress(((i + 1) / totalItems) * 100);
        setVerificationStatus([...results]);
      }
      
      // 缓存结果
      setVerifiedCache(prev => new Map(prev).set(supplierId, results));
      onVerifyComplete(results);
      
    } catch (error) {
      if (error.name !== 'AbortError') {
        console.error('Verification failed:', error);
      }
    } finally {
      setIsVerifying(false);
    }
  }, [supplierId, verificationItems, checkCache, onVerifyComplete]);
  
  // 验证单个项目
  const verifyItem = async (
    sid: string, 
    item: typeof verificationItems[0], 
    signal: AbortSignal
  ): Promise<VerificationStatus> => {
    // 模拟API调用
    return new Promise((resolve, reject) => {
      const timeout = setTimeout(() => {
        resolve({
          id: `${sid}-${item.type}`,
          type: item.type as any,
          name: item.name,
          status: Math.random() > 0.2 ? 'verified' : (Math.random() > 0.5 ? 'pending' : 'failed'),
          verifiedAt: new Date().toISOString(),
          expiryDate: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
          verifier: '慧聪网认证中心',
          documents: [`${item.type}_cert.pdf`],
          score: Math.floor(Math.random() * 20) + 80
        });
      }, 500 + Math.random() * 1000);
      
      signal.addEventListener('abort', () => {
        clearTimeout(timeout);
        reject(new DOMException('Aborted', 'AbortError'));
      });
    });
  };
  
  // 计算总体评分
  const overallScore = useMemo(() => {
    if (verificationStatus.length === 0) return 0;
    
    const totalWeight = verificationItems.reduce((sum, item) => sum + item.weight, 0);
    const weightedScore = verificationStatus.reduce((sum, status) => {
      const item = verificationItems.find(i => i.type === status.type);
      return sum + (status.score * (item?.weight || 0));
    }, 0);
    
    return Math.round(weightedScore / totalWeight);
  }, [verificationStatus, verificationItems]);
  
  // 获取评分等级
  const getScoreGrade = useCallback((score: number) => {
    if (score >= 90) return { grade: 'AAA', color: '#22c55e', text: '优秀' };
    if (score >= 80) return { grade: 'AA', color: '#3b82f6', text: '良好' };
    if (score >= 70) return { grade: 'A', color: '#f59e0b', text: '一般' };
    if (score >= 60) return { grade: 'B', color: '#ef4444', text: '待提升' };
    return { grade: 'C', color: '#6b7280', text: '不推荐' };
  }, []);
  
  // 自动开始验证
  useEffect(() => {
    performVerification();
    return () => {
      if (verificationRef.current) {
        verificationRef.current.abort();
      }
    };
  }, [performVerification]);
  
  const scoreInfo = getScoreGrade(overallScore);
  
  return (
    <div className="supplier-verification">
      <div className="verification-header">
        <h2>🔍 供应商资质验证</h2>
        <p>实时验证供应商企业资质,确保交易安全</p>
      </div>
      
      {/* 总体评分卡片 */}
      <div className="overall-score-card">
        <div className="score-circle" style={{ borderColor: scoreInfo.color }}>
          <span className="score-value">{overallScore}</span>
          <span className="score-grade" style={{ color: scoreInfo.color }}>{scoreInfo.grade}</span>
        </div>
        <div className="score-info">
          <h3>综合信用评分</h3>
          <p className="score-text" style={{ color: scoreInfo.color }}>{scoreInfo.text}</p>
          <p className="score-desc">基于5大维度综合评估</p>
        </div>
        <div className="verification-actions">
          <button 
            className="verify-again-btn"
            onClick={performVerification}
            disabled={isVerifying}
          >
            {isVerifying ? '验证中...' : '重新验证'}
          </button>
        </div>
      </div>
      
      {/* 验证进度 */}
      {isVerifying && (
        <div className="verification-progress">
          <div className="progress-header">
            <span>正在验证供应商资质...</span>
            <span>{Math.round(verificationProgress)}%</span>
          </div>
          <div className="progress-bar">
            <div 
              className="progress-fill"
              style={{ width: `${verificationProgress}%` }}
            />
          </div>
          <div className="progress-items">
            {verificationItems.map((item, index) => {
              const isCompleted = verificationStatus.some(s => s.type === item.type);
              const isCurrent = !isCompleted && index === Math.floor((verificationProgress / 100) * verificationItems.length);
              
              return (
                <div 
                  key={item.type} 
                  className={`progress-item ${isCompleted ? 'completed' : ''} ${isCurrent ? 'current' : ''}`}
                >
                  {isCompleted ? <CheckIcon /> : isCurrent ? <LoadingSpinner /> : <div className="dot" />}
                  <span>{item.name}</span>
                </div>
              );
            })}
          </div>
        </div>
      )}
      
      {/* 详细验证结果 */}
      <div className="verification-details">
        <h3>详细验证结果</h3>
        <div className="verification-list">
          {verificationStatus.map(status => (
            <div 
              key={status.id} 
              className={`verification-item ${status.status}`}
            >
              <div className="item-header">
                <div className="item-info">
                  <span className="item-icon">
                    {status.type === 'business' && '🏢'}
                    {status.type === 'quality' && '✅'}
                    {status.type === 'export' && '🌍'}
                    {status.type === 'credit' && '💳'}
                    {status.type === 'compliance' && '📋'}
                  </span>
                  <span className="item-name">{status.name}</span>
                </div>
                <div className={`item-status ${status.status}`}>
                  {status.status === 'verified' && '已验证'}
                  {status.status === 'pending' && '审核中'}
                  {status.status === 'failed' && '验证失败'}
                  {status.status === 'expired' && '已过期'}
                </div>
              </div>
              
              <div className="item-details">
                <div className="detail-row">
                  <span className="detail-label">验证分数:</span>
                  <span className="detail-value score">{status.score}/100</span>
                </div>
                <div className="detail-row">
                  <span className="detail-label">验证时间:</span>
                  <span className="detail-value">{formatDate(status.verifiedAt)}</span>
                </div>
                <div className="detail-row">
                  <span className="detail-label">有效期至:</span>
                  <span className="detail-value">{formatDate(status.expiryDate)}</span>
                </div>
                <div className="detail-row">
                  <span className="detail-label">验证机构:</span>
                  <span className="detail-value">{status.verifier}</span>
                </div>
              </div>
              
              {status.documents.length > 0 && (
                <div className="item-documents">
                  <span className="doc-label">相关文档:</span>
                  {status.documents.map(doc => (
                    <button key={doc} className="doc-link">
                      📄 {doc}
                    </button>
                  ))}
                </div>
              )}
            </div>
          ))}
        </div>
      </div>
      
      {/* 验证说明 */}
      <div className="verification-info">
        <h4>ℹ️ 验证说明</h4>
        <ul>
          <li>慧聪网对企业资质进行多重验证,确保信息真实性</li>
          <li>验证结果每日更新,过期信息将自动标记</li>
          <li>如发现虚假信息,欢迎举报,核实后将严肃处理</li>
          <li>认证标识仅代表资质验证结果,不构成交易担保</li>
        </ul>
      </div>
    </div>
  );
});

5.2 交易保障服务优化

// 交易保障服务组件 - 实时状态更新
import { memo, useState, useCallback, useEffect, useRef } from 'react';
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
interface TradeAssurance {
  id: string;
  orderId: string;
  protectionType: 'payment' | 'quality' | 'delivery' | 'refund';
  coverage: number;
  premium: number;
  status: 'active' | 'claimed' | 'expired' | 'cancelled';
  startDate: string;
  endDate: string;
  claimDeadline: string;
  terms: string[];
}

interface TradeAssuranceProps {
  orderId: string;
  amount: number;
  supplierId: string;
}

const TradeAssurance = memo(({ orderId, amount, supplierId }: TradeAssuranceProps) => {
  const [assurance, setAssurance] = useState<TradeAssurance | null>(null);
  const [isLoading, setIsLoading] = useState(true);
  const [claimModalOpen, setClaimModalOpen] = useState(false);
  const wsRef = useRef<WebSocket | null>(null);
  
  // 获取保障方案
  const fetchAssurance = useCallback(async () => {
    try {
      setIsLoading(true);
      const response = await fetch(`/api/trade-assurance/${orderId}`);
      const data = await response.json();
      setAssurance(data);
    } catch (error) {
      console.error('Failed to fetch assurance:', error);
    } finally {
      setIsLoading(false);
    }
  }, [orderId]);
  
  // WebSocket实时更新
  useEffect(() => {
    fetchAssurance();
    
    // 建立WebSocket连接
    wsRef.current = new WebSocket(`wss://trade.jc.hc360.com/ws/assurance/${orderId}`);
    
    wsRef.current.onmessage = (event) => {
      const message = JSON.parse(event.data);
      if (message.type === 'assurance_update') {
        setAssurance(prev => ({ ...prev, ...message.data }));
      }
    };
    
    wsRef.current.onclose = () => {
      // 尝试重连
      setTimeout(() => {
        if (wsRef.current?.readyState === WebSocket.CLOSED) {
          wsRef.current = new WebSocket(`wss://trade.jc.hc360.com/ws/assurance/${orderId}`);
        }
      }, 5000);
    };
    
    return () => {
      wsRef.current?.close();
    };
  }, [orderId, fetchAssurance]);
  
  // 申请理赔
  const handleClaim = useCallback(async (claimData: ClaimFormData) => {
    try {
      const response = await fetch(`/api/trade-assurance/${orderId}/claim`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(claimData)
      });
      
      if (response.ok) {
        setAssurance(prev => prev ? { ...prev, status: 'claimed' } : null);
        setClaimModalOpen(false);
      }
    } catch (error) {
      console.error('Claim failed:', error);
    }
  }, [orderId]);
  
  // 计算保障覆盖率
  const coveragePercentage = useMemo(() => {
    if (!assurance) return 0;
    return Math.min(100, (assurance.coverage / amount) * 100);
  }, [assurance, amount]);
  
  // 获取保障类型标签
  const getProtectionLabel = useCallback((type: string) => {
    const labels = {
      payment: '支付保障',
      quality: '质量保证',
      delivery: '交付保障',
      refund: '退款保障'
    };
    return labels[type as keyof typeof labels] || type;
  }, []);
  
  // 获取保障类型图标
  const getProtectionIcon = useCallback((type: string) => {
    const icons = {
      payment: '🔒',
      quality: '✅',
      delivery: '🚚',
      refund: '↩️'
    };
    return icons[type as keyof typeof icons] || '🛡️';
  }, []);
  
  if (isLoading) {
    return (
      <div className="trade-assurance-loading">
        <LoadingSpinner />
        <span>加载交易保障信息...</span>
      </div>
    );
  }
  
  if (!assurance) {
    return (
      <div className="trade-assurance-unavailable">
        <WarningIcon />
        <h3>暂无交易保障</h3>
        <p>该订单暂未启用交易保障服务</p>
      </div>
    );
  }
  
  return (
    <div className="trade-assurance">
      <div className="assurance-header">
        <div className="header-icon">
          <ShieldIcon />
        </div>
        <div className="header-info">
          <h2>🛡️ 慧聪交易保障</h2>
          <p>全程守护您的交易安全</p>
        </div>
        <div className={`assurance-status ${assurance.status}`}>
          {assurance.status === 'active' && '保障生效中'}
          {assurance.status === 'claimed' && '理赔处理中'}
          {assurance.status === 'expired' && '保障已过期'}
          {assurance.status === 'cancelled' && '保障已取消'}
        </div>
      </div>
      
      {/* 保障概览 */}
      <div className="assurance-overview">
        <div className="coverage-ring">
          <svg viewBox="0 0 100 100">
            <circle
              cx="50"
              cy="50"
              r="45"
              fill="none"
              stroke="#e5e7eb"
              strokeWidth="8"
            />
            <circle
              cx="50"
              cy="50"
              r="45"
              fill="none"
              stroke="#22c55e"
              strokeWidth="8"
              strokeDasharray={`${coveragePercentage * 2.83} 283`}
              strokeLinecap="round"
              transform="rotate(-90 50 50)"
            />
          </svg>
          <div className="coverage-text">
            <span className="coverage-value">{coveragePercentage.toFixed(0)}%</span>
            <span className="coverage-label">保障覆盖</span>
          </div>
        </div>
        
        <div className="assurance-details">
          <div className="detail-item">
            <span className="label">保障金额</span>
            <span className="value">¥{assurance.coverage.toLocaleString()}</span>
          </div>
          <div className="detail-item">
            <span className="label">保障费用</span>
            <span className="value">¥{assurance.premium.toFixed(2)}</span>
          </div>
          <div className="detail-item">
            <span className="label">生效期间</span>
            <span className="value">
              {formatDate(assurance.startDate)} - {formatDate(assurance.endDate)}
            </span>
          </div>
          <div className="detail-item">
            <span className="label">理赔截止</span>
            <span className="value highlight">{formatDate(assurance.claimDeadline)}</span>
          </div>
        </div>
      </div>
      
      {/* 保障项目列表 */}
      <div className="protection-list">
        <h3>保障项目</h3>
        <div className="protection-items">
          {assurance.terms.map((term, index) => {
            const type = term.split(':')[0] as keyof typeof getProtectionLabel;
            return (
              <div key={index} className="protection-item">
                <span className="protection-icon">{getProtectionIcon(type)}</span>
                <span className="protection-name">{getProtectionLabel(type)}</span>
                <span className="protection-desc">{term.split(':')[1]}</span>
              </div>
            );
          })}
        </div>
      </div>
      
      {/* 操作按钮 */}
      <div className="assurance-actions">
        {assurance.status === 'active' && (
          <button 
            className="claim-btn"
            onClick={() => setClaimModalOpen(true)}
          >
            📝 申请理赔
          </button>
        )}
        <button className="terms-btn">
          📋 查看保障条款
        </button>
        <button className="contact-btn">
          💬 联系客服
        </button>
      </div>
      
      {/* 理赔申请模态框 */}
      {claimModalOpen && (
        <ClaimModal
          assurance={assurance}
          orderId={orderId}
          amount={amount}
          onSubmit={handleClaim}
          onClose={() => setClaimModalOpen(false)}
        />
      )}
    </div>
  );
});

六、慧聪网性能监控体系

6.1 B2B平台专属指标

// 慧聪网专属性能指标
interface HCPerformanceMetrics {
  // 核心Web指标
  coreWebVitals: {
    LCP: number;
    FID: number;
    CLS: number;
    INP: number;
  };
  
  // B2B业务指标
  b2bMetrics: {
    factoryImagesLoaded: number;
    certificationDocsReady: number;
    marketTrendChartReady: number;
    competitorAnalysisReady: number;
    quoteFormReady: number;
    productCompareReady: number;
    verificationStatusReady: number;
  };
  
  // 企业级功能指标
  enterpriseMetrics: {
    tradeAssuranceReady: number;
    supplierProfileReady: number;
    creditRatingReady: number;
    complianceCheckReady: number;
  };
  
  // 数据可视化指标
  visualizationMetrics: {
    chartRenderTime: number;
    dataProcessingTime: number;
    virtualScrollFPS: number;
    largeDatasetLoadTime: number;
  };
  
  // 专业工具指标
  toolMetrics: {
    quoteSubmissionTime: number;
    compareTableRenderTime: number;
    searchAutocompleteTime: number;
    filterApplyTime: number;
  };
  
  // 资源优化指标
  resourceMetrics: {
    totalPageSize: number;
    imageCompressionRatio: number;
    pdfOptimizationRatio: number;
    cacheHitRate: number;
    websocketLatency: number;
  };
}

// 慧聪网性能收集器
class HCPerformanceCollector {
  private metrics: Partial<HCPerformanceMetrics> = {};
  private observers: PerformanceObserver[] = [];
  private wsLatencies: number[] = [];
  
  constructor() {
    this.initObservers();
    this.trackEnterpriseResources();
  }
  
  // 初始化性能观察者
  private initObservers() {
    // 核心Web指标
    this.observers.push(
      new PerformanceObserver((list) => {
        list.getEntries().forEach((entry) => {
          switch (entry.entryType) {
            case 'largest-contentful-paint':
              this.metrics.coreWebVitals!.LCP = entry.startTime;
              break;
            case 'first-input':
              this.metrics.coreWebVitals!.FID = entry.processingStart - entry.startTime;
              break;
            case 'layout-shift':
              if (!(entry as any).hadRecentInput) {
                this.metrics.coreWebVitals!.CLS = 
                  (this.metrics.coreWebVitals!.CLS || 0) + (entry as any).value;
              }
              break;
          }
        });
      })
    );
    
    // 资源加载指标
    this.observers.push(
      new PerformanceObserver((list) => {
        list.getEntries().forEach((entry) => {
          if (entry.name.includes('.pdf')) {
            this.trackPdfLoad(entry as PerformanceResourceTiming);
          }
          if (entry.name.match(/\.(jpg|jpeg|png|webp)/i)) {
            this.trackImageLoad(entry as PerformanceResourceTiming);
          }
        });
      })
    );
    
    this.observers.forEach(observer => {
      observer.observe({ 
        entryTypes: ['largest-contentful-paint', 'first-input', 'layout-shift', 'resource'] 
      });
    });
  }
  
  // 追踪企业级资源
  private trackEnterpriseResources() {
    // 监听PDF加载
    const originalFetch = window.fetch;
    window.fetch = async (...args) => {
      const startTime = performance.now();
      const response = await originalFetch(...args);
      
      if (args[0]?.toString().includes('.pdf')) {
        const loadTime = performance.now() - startTime;
        this.trackPdfLoadTime(loadTime);
      }
      
      return response;
    };
  }
  
  // 追踪PDF加载
  private trackPdfLoadTime(loadTime: number) {
    this.metrics.resourceMetrics = {
      ...this.metrics.resourceMetrics,
      pdfLoadTime: loadTime
    };
  }
  
  // 追踪图片加载
  private trackImageLoad(entry: PerformanceResourceTiming) {
    this.metrics.resourceMetrics = {
      ...this.metrics.resourceMetrics,
      imageLoadTime: entry.duration
    };
  }
  
  // 标记B2B模块就绪
  markB2BModuleReady(moduleName: keyof HCPerformanceMetrics['b2bMetrics']) {
    this.metrics.b2bMetrics = {
      ...this.metrics.b2bMetrics,
      [moduleName]: performance.now()
    };
  }
  
  // 标记企业级功能就绪
  markEnterpriseFeatureReady(featureName: keyof HCPerformanceMetrics['enterpriseMetrics']) {
    this.metrics.enterpriseMetrics = {
      ...this.metrics.enterpriseMetrics,
      [featureName]: performance.now()
    };
  }
  
  // 记录WebSocket延迟
  recordWebSocketLatency(latency: number) {
    this.wsLatencies.push(latency);
    
    if (this.wsLatencies.length > 100) {
      this.wsLatencies.shift();
    }
    
    this.metrics.resourceMetrics = {
      ...this.metrics.resourceMetrics,
      websocketLatency: this.wsLatencies.reduce((a, b) => a + b, 0) / this.wsLatencies.length
    };
  }
  
  // 记录图表渲染性能
  recordChartRender(chartType: string, renderTime: number, dataPoints: number) {
    this.metrics.visualizationMetrics = {
      ...this.metrics.visualizationMetrics,
      chartRenderTime: renderTime,
      dataProcessingTime: renderTime * 0.6, // 估算数据处理时间
      largeDatasetLoadTime: dataPoints > 1000 ? renderTime : undefined
    };
  }
  
  // 记录工具使用性能
  recordToolUsage(toolName: keyof HCPerformanceMetrics['toolMetrics'], duration: number) {
    this.metrics.toolMetrics = {
      ...this.metrics.toolMetrics,
      [toolName]: duration
    };
  }
  
  // 计算资源优化指标
  calculateResourceMetrics() {
    const resources = performance.getEntriesByType('resource');
    
    let totalPdfSize = 0;
    let optimizedPdfSize = 0;
    let totalImageSize = 0;
    let optimizedImageSize = 0;
    
    resources.forEach(resource => {
      if (resource.name.includes('.pdf')) {
        totalPdfSize += (resource as any).transferSize || 0;
        optimizedPdfSize += (resource as any).decodedBodySize || 0;
      }
      
      if (resource.name.match(/\.(jpg|jpeg|png|webp)/i)) {
        totalImageSize += (resource as any).transferSize || 0;
        optimizedImageSize += (resource as any).decodedBodySize || 0;
      }
    });
    
    this.metrics.resourceMetrics = {
      ...this.metrics.resourceMetrics,
      totalPageSize: resources.reduce((sum, r) => sum + ((r as any).transferSize || 0), 0),
      pdfOptimizationRatio: totalPdfSize / optimizedPdfSize,
      imageCompressionRatio: totalImageSize / optimizedImageSize,
      cacheHitRate: this.calculateCacheHitRate(resources)
    };
  }
  
  // 计算缓存命中率
  private calculateCacheHitRate(resources: PerformanceEntry[]) {
    const cached = resources.filter(r => {
      const timing = r as PerformanceResourceTiming;
      return timing.transferSize === 0 || timing.duration < 10;
    });
    return cached.length / resources.length;
  }
  
  // 发送综合报告
  sendReport(sessionId: string) {
    this.calculateResourceMetrics();
    
    const report = {
      sessionId,
      timestamp: Date.now(),
      url: window.location.href,
      userAgent: navigator.userAgent,
      connection: {
        effectiveType: navigator.connection?.effectiveType,
        downlink: navigator.connection?.downlink,
        rtt: navigator.connection?.rtt
      },
      screen: {
        width: window.screen.width,
        height: window.screen.height,
        pixelRatio: window.devicePixelRatio
      },
      userType: 'enterprise', // B2B用户
      metrics: this.metrics,
      businessContext: {
        userId: getCurrentUserId(),
        supplierId: getSupplierIdFromUrl(),
        productId: getProductIdFromUrl(),
        orderId: getOrderIdFromUrl(),
        userRole: getUserRole(), // buyer, seller, admin
        companyType: getCompanyType()
      }
    };
    
    // 发送到慧聪网性能监控系统
    navigator.sendBeacon(
      'https://perf.hc360.com/api/report',
      JSON.stringify(report)
    );
  }
}

6.2 企业级性能看板

// 慧聪网企业级性能监控看板
const HCPerformanceDashboard = () => {
  const [metrics, setMetrics] = useState<HCPerformanceMetrics | null>(null);
  const [enterpriseStats, setEnterpriseStats] = useState<EnterpriseStats | null>(null);
  const [realTimeData, setRealTimeData] = useState<RealTimeMetric[]>([]);
  const collectorRef = useRef<HCPerformanceCollector>();
  # 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
  useEffect(() => {
    collectorRef.current = new HCPerformanceCollector();
    
    // 模拟实时数据更新
    const interval = setInterval(() => {
      setRealTimeData(prev => {
        const newData = [...prev, {
          timestamp: Date.now(),
          lcp: collectorRef.current?.metrics.coreWebVitals?.LCP || 0,
          fid: collectorRef.current?.metrics.coreWebVitals?.FID || 0,
          cls: collectorRef.current?.metrics.coreWebVitals?.CLS || 0,
          factoryImagesLoaded: collectorRef.current?.metrics.b2bMetrics?.factoryImagesLoaded || 0,
          chartRenderTime: collectorRef.current?.metrics.visualizationMetrics?.chartRenderTime || 0
        }];
        return newData.slice(-30);
      });
    }, 1000);
    
    // 页面卸载时发送报告
    const handleUnload = () => {
      collectorRef.current?.sendReport(getSessionId());
    };
    window.addEventListener('beforeunload', handleUnload);
    
    return () => {
      clearInterval(interval);
      window.removeEventListener('beforeunload', handleUnload);
    };
  }, []);
  
  return (
    <div className="hc-perf-dashboard">
      <h2>🏢 慧聪网企业级性能监控</h2>
      
      {/* 核心指标卡片 */}
      <div className="core-metrics">
        <MetricCard
          label="LCP"
          value={`${(metrics?.coreWebVitals.LCP / 1000).toFixed(2)}s`}
          target="< 2.5s"
          status={metrics?.coreWebVitals.LCP! < 2500 ? 'good' : 'bad'}
          icon="🚀"
        />
        <MetricCard
          label="FID"
          value={`${metrics?.coreWebVitals.FID.toFixed(0)}ms`}
          target="< 100ms"
          status={metrics?.coreWebVitals.FID! < 100 ? 'good' : 'bad'}
          icon="👆"
        />
        <MetricCard
          label="CLS"
          value={metrics?.coreWebVitals.CLS.toFixed(3)}
          target="< 0.1"
          status={metrics?.coreWebVitals.CLS! < 0.1 ? 'good' : 'bad'}
          icon="📐"
        />
        <MetricCard
          label="INP"
          value={`${metrics?.coreWebVitals.INP?.toFixed(0) || 0}ms`}
          target="< 200ms"
          status={metrics?.coreWebVitals.INP! < 200 ? 'good' : 'warning'}
          icon="⚡"
        />
      </div>
      
      {/* B2B业务指标 */}
      <div className="b2b-metrics">
        <h3>🏭 B2B业务模块性能</h3>
        <div className="metric-grid">
          <MetricCard
            label="工厂图片加载"
            value={metrics?.b2bMetrics.factoryImagesLoaded.toString() || '0'}
            target="按需加载"
            status="neutral"
            icon="🖼️"
          />
          <MetricCard
            label="认证文档就绪"
            value={`${(metrics?.b2bMetrics.certificationDocsReady / 1000).toFixed(2)}s`}
            target="< 1.5s"
            status={metrics?.b2bMetrics.certificationDocsReady! < 1500 ? 'good' : 'bad'}
            icon="📋"
          />
          <MetricCard
            label="市场趋势图就绪"
            value={`${(metrics?.b2bMetrics.marketTrendChartReady / 1000).toFixed(2)}s`}
            target="< 2s"
            status={metrics?.b2bMetrics.marketTrendChartReady! < 2000 ? 'good' : 'bad'}
            icon="📈"
          />
          <MetricCard
            label="竞品分析就绪"
            value={`${(metrics?.b2bMetrics.competitorAnalysisReady / 1000).toFixed(2)}s`}
            target="< 1.5s"
            status={metrics?.b2bMetrics.competitorAnalysisReady! < 1500 ? 'good' : 'bad'}
            icon="🎯"
          />
        </div>
      </div>
      
      {/* 企业级功能指标 */}
      <div className="enterprise-metrics">
        <h3>🏢 企业级功能性能</h3>
        <div className="metric-grid">
          <MetricCard
            label="询价系统就绪"
            value={`${(metrics?.b2bMetrics.quoteFormReady / 1000).toFixed(2)}s`}
            target="< 1s"
            status={metrics?.b2bMetrics.quoteFormReady! < 1000 ? 'good' : 'bad'}
            icon="📝"
          />
          <MetricCard
            label="产品对比就绪"
            value={`${(metrics?.b2bMetrics.productCompareReady / 1000).toFixed(2)}s`}
            target="< 1.5s"
            status={metrics?.b2bMetrics.productCompareReady! < 1500 ? 'good' : 'bad'}
            icon="⚖️"
          />
          <MetricCard
            label="资质验证就绪"
            value={`${(metrics?.enterpriseMetrics.verificationStatusReady / 1000).toFixed(2)}s`}
            target="< 2s"
            status={metrics?.enterpriseMetrics.verificationStatusReady! < 2000 ? 'good' : 'bad'}
            icon="🔍"
          />
          <MetricCard
            label="交易保障就绪"
            value={`${(metrics?.enterpriseMetrics.tradeAssuranceReady / 1000).toFixed(2)}s`}
            target="< 1s"
            status={metrics?.enterpriseMetrics.tradeAssuranceReady! < 1000 ? 'good' : 'bad'}
            icon="🛡️"
          />
        </div>
      </div>
      
      {/* 数据可视化指标 */}
      <div className="visualization-metrics">
        <h3>📊 数据可视化性能</h3>
        <div className="metric-grid">
          <MetricCard
            label="图表渲染时间"
            value={`${metrics?.visualizationMetrics.chartRenderTime?.toFixed(0) || 0}ms`}
            target="< 500ms"
            status={metrics?.visualizationMetrics.chartRenderTime! < 500 ? 'good' : 'warning'}
            icon="🎨"
          />
          <MetricCard
            label="数据处理时间"
            value={`${metrics?.visualizationMetrics.dataProcessingTime?.toFixed(0) || 0}ms`}
            target="< 300ms"
            status={metrics?.visualizationMetrics.dataProcessingTime! < 300 ? 'good' : 'warning'}
            icon="⚙️"
          />
          <MetricCard
            label="虚拟滚动FPS"
            value={`${metrics?.visualizationMetrics.virtualScrollFPS || 0}`}
            target="> 55"
            status={metrics?.visualizationMetrics.virtualScrollFPS! > 55 ? 'good' : 'bad'}
            icon="🎬"
          />
          <MetricCard
            label="大数据集加载"
            value={`${metrics?.visualizationMetrics.largeDatasetLoadTime?.toFixed(0) || 0}ms`}
            target="< 1000ms"
            status={metrics?.visualizationMetrics.largeDatasetLoadTime! < 1000 ? 'good' : 'warning'}
            icon="📦"
          />
        </div>
      </div>
      
      {/* 资源优化指标 */}
      <div className="resource-metrics">
        <h3>📦 资源优化效果</h3>
        <div className="metric-grid">
          <MetricCard
            label="页面总大小"
            value={`${(metrics?.resourceMetrics.totalPageSize / 1024 / 1024).toFixed(2)}MB`}
            target="< 5MB"
            status={metrics?.resourceMetrics.totalPageSize! < 5 * 1024 * 1024 ? 'good' : 'bad'}
            icon="💾"
          />
          <MetricCard
            label="PDF优化率"
            value={`${(metrics?.resourceMetrics.pdfOptimizationRatio * 100).toFixed(1)}%`}
            target="> 50%"
            status={metrics?.resourceMetrics.pdfOptimizationRatio! > 0.5 ? 'good' : 'warning'}
            icon="📄"
          />
          <MetricCard
            label="图片压缩率"
            value={`${(metrics?.resourceMetrics.imageCompressionRatio * 100).toFixed(1)}%`}
            target="> 60%"
            status={metrics?.resourceMetrics.imageCompressionRatio! > 0.6 ? 'good' : 'warning'}
            icon="🗜️"
          />
          <MetricCard
            label="WebSocket延迟"
            value={`${metrics?.resourceMetrics.websocketLatency?.toFixed(0) || 0}ms`}
            target="< 100ms"
            status={metrics?.resourceMetrics.websocketLatency! < 100 ? 'good' : 'warning'}
            icon="🔌"
          />
        </div>
      </div>
      
      {/* 实时图表 */}
      <div className="real-time-chart">
        <h3>📈 实时性能趋势</h3>
        <LineChart data={realTimeData} />
      </div>
      
      {/* 企业级统计 */}
      {enterpriseStats && (
        <div className="enterprise-stats">
          <h3>🏢 企业级数据统计</h3>
          <div className="stats-grid">
            <div className="stat-item">
              <span className="stat-label">PDF文档数</span>
              <span className="stat-value">{enterpriseStats.pdfCount}</span>
            </div>
            <div className="stat-item">
              <span className="stat-label">高清图片数</span>
              <span className="stat-value">{enterpriseStats.highResImages}</span>
            </div>
            <div className="stat-item">
              <span className="stat-label">数据图表数</span>
              <span className="stat-value">{enterpriseStats.chartCount}</span>
            </div>
            <div className="stat-item">
              <span className="stat-label">平均验证时间</span>
              <span className="stat-value">{enterpriseStats.avgVerificationTime.toFixed(0)}ms</span>
            </div>
            <div className="stat-item">
              <span className="stat-label">询价成功率</span>
              <span className="stat-value">{enterpriseStats.quoteSuccessRate.toFixed(1)}%</span>
            </div>
            <div className="stat-item">
              <span className="stat-label">保障激活率</span>
              <span className="stat-value">{enterpriseStats.assuranceActivationRate.toFixed(1)}%</span>
            </div>
          </div>
        </div>
      )}
    </div>
  );
};

七、优化效果评估

7.1 性能提升对比

指标
优化前
优化后
提升幅度
目标达成
首屏LCP
6.8s
2.3s
66% ↓
✅ < 2.5s
工厂图片加载
12.5s
3.2s
74% ↓
✅ < 4s
认证文档就绪
8.2s
1.8s
78% ↓
✅ < 2s
市场趋势图渲染
4.5s
0.9s
80% ↓
✅ < 1s
询价表单就绪
3.8s
0.7s
82% ↓
✅ < 1s
产品对比就绪
5.2s
1.1s
79% ↓
✅ < 1.5s
资质验证完成
6.5s
1.4s
78% ↓
✅ < 2s
页面总大小
15.8MB
4.2MB
73% ↓
✅ < 5MB
交互延迟
280ms
65ms
77% ↓
✅ < 100ms
首屏可交互
5.5s
1.8s
67% ↓
✅ < 2s

7.2 业务指标改善

// 慧聪网优化带来的业务收益
const hcBusinessImpact = {
  // 转化率提升
  conversionRate: {
    before: 1.8,
    after: 3.2,
    improvement: '+77.8%'
  },
  
  // 平均订单价值
  averageOrderValue: {
    before: 12500,
    after: 18900,
    improvement: '+51.2%'
  },
  
  // 用户停留时间
  avgSessionDuration: {
    before: 320,  // 秒
    after: 580,
    improvement: '+81.3%'
  },
  
  // 询价转化率
  quoteConversionRate: {
    before: 8.5,
    after: 18.2,
    improvement: '+114.1%'
  },
  
  // 资质验证完成率
  verificationCompletionRate: {
    before: 45.2,
    after: 78.6,
    improvement: '+73.9%'
  },
  
  // 交易保障激活率
  assuranceActivationRate: {
    before: 23.1,
    after: 52.8,
    improvement: '+128.6%'
  },
  
  // 产品对比使用率
  compareToolUsageRate: {
    before: 12.3,
    after: 34.7,
    improvement: '+182.1%'
  },
  
  // 页面跳出率
  bounceRate: {
    before: 58.4,
    after: 35.2,
    improvement: '-39.7%'
  },
  
  // 供应商入驻转化率
  supplierOnboardingRate: {
    before: 15.6,
    after: 28.9,
    improvement: '+85.3%'
  }
};

八、持续维护与优化

8.1 性能预算与监控

// 慧聪网性能预算配置
const hcPerformanceBudget = {
  // 核心Web指标
  coreWebVitals: {
    LCP: 2500,
    FID: 100,
    CLS: 0.1,
    INP: 200
  },
  
  // B2B业务指标
  b2bMetrics: {
    factoryImagesLoaded: 40,           // 工厂图片数量上限
    certificationDocsReady: 1500,      // 认证文档就绪时间
    marketTrendChartReady: 2000,       // 市场趋势图就绪时间
    competitorAnalysisReady: 1500,     // 竞品分析就绪时间
    quoteFormReady: 1000,              // 询价表单就绪时间
    productCompareReady: 1500,         // 产品对比就绪时间
    verificationStatusReady: 2000      // 资质验证就绪时间
  },
  
  // 企业级功能指标
  enterpriseMetrics: {
    tradeAssuranceReady: 1000,        // 交易保障就绪时间
    supplierProfileReady: 1500,        // 供应商档案就绪时间
    creditRatingReady: 1000,           // 信用评级就绪时间
    complianceCheckReady: 2000         // 合规检查就绪时间
  },
  
  // 数据可视化指标
  visualizationMetrics: {
    chartRenderTime: 500,              // 图表渲染时间
    dataProcessingTime: 300,           // 数据处理时间
    virtualScrollFPS: 55,              // 虚拟滚动帧率
    largeDatasetLoadTime: 1000         // 大数据集加载时间
  },
  
  // 资源限制
  resources: {
    totalPageSize: 5000000,           // 5MB
    totalImageSize: 3000000,           // 3MB
    pdfDocumentCount: 20,              // PDF文档数量
    imageCount: 60,                    // 图片总数
    apiCallCount: 25,                  // API调用次数
    domNodes: 3000,                    // DOM节点数
    websocketConnections: 3            // WebSocket连接数
  }
};

// 性能预算检查
function checkHCPerformanceBudget(metrics: HCPerformanceMetrics) {
  const violations: PerformanceViolation[] = [];
  
  // 检查核心指标
  Object.entries(hcPerformanceBudget.coreWebVitals).forEach(([metric, budget]) => {
    const value = (metrics.coreWebVitals as any)[metric];
    if (value > budget) {
      violations.push({
        type: 'core-web-vital',
        metric,
        actual: value,
        budget,
        severity: value > budget * 1.5 ? 'critical' : 'warning'
      });
    }
  });
  
  // 检查B2B业务指标
  Object.entries(hcPerformanceBudget.b2bMetrics).forEach(([metric, budget]) => {
    const value = (metrics.b2bMetrics as any)[metric];
    if (value > budget) {
      violations.push({
        type: 'b2b-metric',
        metric,
        actual: value,
        budget,
        severity: value > budget * 1.3 ? 'critical' : 'warning'
      });
    }
  });
  
  // 检查企业级功能指标
  Object.entries(hcPerformanceBudget.enterpriseMetrics).forEach(([metric, budget]) => {
    const value = (metrics.enterpriseMetrics as any)[metric];
    if (value > budget) {
      violations.push({
        type: 'enterprise-metric',
        metric,
        actual: value,
        budget,
        severity: value > budget * 1.3 ? 'critical' : 'warning'
      });
    }
  });
  
  // 检查资源限制
  Object.entries(hcPerformanceBudget.resources).forEach(([metric, budget]) => {
    const value = (metrics.resourceMetrics as any)?.[metric] || 0;
    if (value > budget) {
      violations.push({
        type: 'resource-limit',
        metric,
        actual: value,
        budget,
        severity: value > budget * 1.2 ? 'critical' : 'warning'
      });
    }
  });
  
  return violations;
}

8.2 优化路线图

## 慧聪网性能优化路线图

### Q1 2026 - 基础优化
- [ ] 完成企业级图片资源优化
- [ ] 实现PDF文档懒加载
- [ ] 建立B2B专属性能监控
- [ ] 优化首屏资源加载策略

### Q2 2026 - 数据可视化优化
- [ ] 实现大数据集图表优化
- [ ] 优化虚拟滚动性能
- [ ] 完善实时数据更新机制
- [ ] 建立性能回归检测

### Q3 2026 - 企业级功能优化
- [ ] 实现询价系统性能提升
- [ ] 优化产品对比工具
- [ ] 完善资质验证流程
- [ ] 建立A/B测试性能对比

### Q4 2026 - 前沿探索
- [ ] 探索WebAssembly数据可视化
- [ ] 尝试AI驱动的内容优化
- [ ] 评估边缘计算在B2B场景的应用
- [ ] 构建预测性性能优化
需要我针对慧聪网的大数据量图表渲染企业级文档管理系统,提供更深入的技术实现方案和性能优化策略吗?


群贤毕至

访客