From 3c9d1879e059d33a785c02b10f4d57fd2024b8d3 Mon Sep 17 00:00:00 2001
From: hongjli <3117313295@qq.com>
Date: 星期一, 28 四月 2025 15:57:36 +0800
Subject: [PATCH] 渲染echarts图优化

---
 src/app/globals.css   |   25 ++++++++++++
 src/app/chat/page.tsx |   64 +++++++++++++++++++++++++-------
 2 files changed, 75 insertions(+), 14 deletions(-)

diff --git a/src/app/chat/page.tsx b/src/app/chat/page.tsx
index 7c8d06c..7f6ac0c 100644
--- a/src/app/chat/page.tsx
+++ b/src/app/chat/page.tsx
@@ -50,17 +50,18 @@
   const hasRenderedRef = useRef<boolean>(false);
   const chartInstanceRef = useRef<any>(null);
   
-  // 鍒濆鍖朌OM瀹瑰櫒
+  // 鍒濆鍖朌OM瀹瑰櫒 - 鎻愬墠璁剧疆鍥哄畾楂樺害
   useEffect(() => {
-    // 纭繚瀹瑰櫒鍑嗗濂戒簡
+    // 纭繚瀹瑰櫒鍑嗗濂戒簡骞朵笖鏈夌‘瀹氱殑楂樺害
     if (chartContainerRef.current) {
-      // 璁剧疆涓�涓垵濮嬮珮搴﹀拰瀹藉害锛岄伩鍏�"invalid dom"閿欒
+      // 璁剧疆涓�涓浐瀹氱殑楂樺害锛岄伩鍏嶆覆鏌撳悗鍙樺寲
       const container = chartContainerRef.current;
       container.style.width = '100%';
-      container.style.height = '400px';
+      container.style.height = '400px'; // 鍥哄畾楂樺害400px
+      container.style.minHeight = '400px'; // 闃叉楂樺害鍙樺皬
       
       // 娣诲姞涓存椂鍐呭锛岀‘淇滵OM娓叉煋瀹屾垚
-      container.innerHTML = '<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;"><span>姝e湪鍑嗗鍥捐〃...</span></div>';
+      container.innerHTML = '<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#f5f7f9;"><span>姝e湪鍑嗗鍥捐〃...</span></div>';
     }
   }, []);
   
@@ -115,6 +116,18 @@
             const chartOption = safeFunc();
             
             if (chartOption) {
+              // 绂佺敤鍔ㄧ敾锛岄伩鍏嶆覆鏌撴椂鐨勫竷灞�鍙樺寲
+              chartOption.animation = false;
+              
+              // 淇敼tooltip閰嶇疆锛岀‘淇濇樉绀哄湪閫傚綋浣嶇疆
+              if (chartOption.tooltip) {
+                chartOption.tooltip = {
+                  ...chartOption.tooltip,
+                  confine: false, // 涓嶉檺鍒跺湪鍥捐〃鍖哄煙鍐�
+                  extraCssText: 'z-index:9999; pointer-events:auto; margin-top:60px;',
+                };
+              }
+              
               chartInstance.setOption(chartOption);
               setError(null);
             } else {
@@ -184,6 +197,16 @@
         // 濡傛灉涓诲浘琛ㄥ凡缁忓垵濮嬪寲锛屽鐢ㄥ叾閰嶇疆
         if (chartInstanceRef.current) {
           const option = chartInstanceRef.current.getOption();
+          
+          // 璋冩暣妯℃�佺獥鍙d腑tooltip鐨勯厤缃�
+          if (option && option.tooltip) {
+            option.tooltip = {
+              ...option.tooltip,
+              confine: false,
+              extraCssText: 'z-index:10000; margin-top: 0; max-width: 80vw;',
+            };
+          }
+          
           modalChartInstance.setOption(option);
         } else {
           // 濡傛灉涓诲浘琛ㄦ病鏈夊垵濮嬪寲锛屽皾璇曚粠浠g爜鍒濆鍖�
@@ -204,6 +227,15 @@
             const chartOption = safeFunc();
             
             if (chartOption) {
+              // 璋冩暣妯℃�佺獥鍙g殑tooltip閰嶇疆
+              if (chartOption.tooltip) {
+                chartOption.tooltip = {
+                  ...chartOption.tooltip,
+                  confine: false,
+                  extraCssText: 'z-index:10000; max-width: 80vw;',
+                };
+              }
+              
               modalChartInstance.setOption(chartOption);
             } else {
               throw new Error("鏃犳硶鑾峰彇妯℃�佸浘琛ㄩ厤缃�");
@@ -258,13 +290,13 @@
         </div>
       )}
       
-      {/* 鍥捐〃瀹瑰櫒 */}
+      {/* 鍥捐〃瀹瑰櫒 - 鍥哄畾楂樺害 */}
       <div
         ref={chartContainerRef}
         className="w-full bg-white border border-gray-200 rounded-lg overflow-hidden chart-container"
         style={{ 
-          height: '300px',
-          minHeight: '300px',
+          height: '400px',
+          minHeight: '400px',
           visibility: 'visible',
           position: 'relative'
         }}
@@ -333,22 +365,26 @@
   // 妫�鏌ユ秷鎭槸鍚﹀畬鏁� - 閫氳繃鐖剁粍浠朵紶閫掔殑isMessageComplete鐘舵��
   const isComplete = useContext(MessageCompletionContext);
   
-  // 鍦ㄦ秷鎭湭瀹屾垚鏃舵樉绀哄姞杞藉姩鐢�
+  // 鍦ㄦ秷鎭湭瀹屾垚鏃舵樉绀哄姞杞藉姩鐢� - 鍥哄畾楂樺害鍖归厤鍥捐〃
   if (language === 'javascript' && !isComplete) {
     return (
-      <div className="w-full bg-gray-50 rounded-md my-4 p-6 text-center">
-        <div className="flex flex-col items-center justify-center">
+      <div className="w-full bg-gray-50 rounded-md my-4 p-6 text-center" style={{height: '400px'}}>
+        <div className="flex flex-col items-center justify-center h-full">
           <div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-gray-400 mb-4"></div>
-          <p className="text-gray-500">浠g爜鍔犺浇涓�...</p>
+          <p className="text-gray-500">鍔犺浇涓�...</p>
           <p className="text-xs text-gray-400 mt-2">绛夊緟娑堟伅瀹屾垚鍚庡皢娓叉煋鍥捐〃</p>
         </div>
       </div>
     );
   }
   
-  // 娑堟伅瀹屾垚鍚庯紝濡傛灉鏄浘琛ㄤ唬鐮佸垯娓叉煋涓哄浘琛�
+  // 娑堟伅瀹屾垚鍚庯紝濡傛灉鏄浘琛ㄤ唬鐮佸垯娓叉煋涓哄浘琛� - 鍦ㄥ閮ㄥ寘瑁呬竴灞傚浐瀹氶珮搴﹀鍣�
   if (isEchartsCode() && isComplete) {
-    return <EchartsRenderer code={value} />;
+    return (
+      <div style={{height: '400px', minHeight: '400px', position: 'relative'}}>
+        <EchartsRenderer code={value} />
+      </div>
+    );
   }
   
   // 鏅�欽avaScript浠g爜鎴栧叾浠栬瑷�鐨勪唬鐮佸潡锛岀洿鎺ユ樉绀轰唬鐮�
diff --git a/src/app/globals.css b/src/app/globals.css
index 611ff50..546c47c 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -870,3 +870,28 @@
 body:has(.echart-wrapper:has(+ .fullscreen-controls)) {
   overflow: hidden;
 }
+
+/* 褰诲簳鍥哄畾鍥捐〃瀹瑰櫒鐨勯珮搴� */
+[data-echarts-container="true"] {
+  height: 400px !important;
+  min-height: 400px !important;
+  width: 100%;
+  position: relative;
+}
+
+/* 纭繚tooltip鏄剧ず鍦ㄩ�傚綋浣嶇疆 */
+.echarts-tooltip-wrap, 
+div[class*="echarts-tooltip"],
+div[class*="tooltip"] {
+  z-index: 9999 !important;
+  top: auto !important; /* 闃叉鍥哄畾鍦ㄩ《閮� */
+  transform: translateY(0) !important; /* 闃叉鍚戜笂鍋忕Щ */
+  max-width: 80vw !important; /* 闄愬埗鏈�澶у搴� */
+  pointer-events: auto !important;
+}
+
+/* 纭繚鐑姏鍥総ooltip鍦ㄩ珮椋庨櫓鍖哄煙鏄剧ず鏃朵笉浼氳瀵艰埅鏍忛伄鎸� */
+body .ec-tooltip, 
+body .echarts-tooltip {
+  margin-top: 60px !important; /* 纭繚涓嶄細鏄剧ず鍦ㄥ鑸爮涔嬩笂 */
+}

--
Gitblit v1.9.3