From e435f2ebd11633c555a8b49fc54d3c7a4e0ff0ba Mon Sep 17 00:00:00 2001
From: hongjli <3117313295@qq.com>
Date: 星期一, 16 六月 2025 16:59:43 +0800
Subject: [PATCH] 页面调整优化
---
src/components/SceneIntroDialog.tsx | 250 +++++++++++++++++++++++++++++++++----------------
1 files changed, 169 insertions(+), 81 deletions(-)
diff --git a/src/components/SceneIntroDialog.tsx b/src/components/SceneIntroDialog.tsx
index 89a999a..15ae804 100644
--- a/src/components/SceneIntroDialog.tsx
+++ b/src/components/SceneIntroDialog.tsx
@@ -8,7 +8,6 @@
interface SceneIntroDialogProps {
isOpen: boolean;
onClose: () => void;
- onStartChat: () => void;
scene: {
title: string;
description: string;
@@ -17,13 +16,13 @@
instructions?: string;
dataDescription?: string;
exampleData?: string;
+ chatbotId: string;
};
}
export default function SceneIntroDialog({
isOpen,
onClose,
- onStartChat,
scene
}: SceneIntroDialogProps) {
const [showDataPreview, setShowDataPreview] = useState(false);
@@ -42,6 +41,69 @@
});
}
}, [isOpen]);
+
+ const handleStartChat = () => {
+ onClose();
+ // 渚涘簲閾惧叏鏅礊瀵熷満鏅娇鐢ㄤ笓鐢ㄧ殑鑱婂ぉ椤甸潰
+ if (scene.chatbotId === 'SCPanoramaInsight') {
+ window.location.href = `/supply-chain-chat?key=app-6IZEwVNGfHrlLFlgLauLHtHo`;
+ } else {
+ window.location.href = `/ai-scene/chat?chatbotId=${scene.chatbotId}`;
+ }
+ };
+
+ // 瑙f瀽鍦烘櫙鑳屾櫙鍐呭
+ const parseBackground = (background: string): { simple: string } | { intro: string; sections: Array<{ title: string; items: string[] }> } | null => {
+ if (!background) return null;
+
+ // 妫�鏌ユ槸鍚﹀寘鍚粨鏋勫寲鍐呭锛堝渚涘簲閾惧叏鏅礊瀵熺殑鏍煎紡锛�
+ if (background.includes('**') && background.includes('锛�')) {
+ const sections = background.split('\n\n').filter(section => section.trim());
+ const intro = sections[0];
+ const detailSections = sections.slice(1);
+
+ return {
+ intro,
+ sections: detailSections.map(section => {
+ const lines = section.split('\n');
+ const title = lines[0].replace(/\*\*/g, '').replace('锛�', '');
+ const items = lines.slice(1).filter(line => line.trim().startsWith('-')).map(line => line.replace('- ', ''));
+ return { title, items };
+ })
+ };
+ }
+
+ return { simple: background };
+ };
+
+ // 瑙f瀽浣跨敤璇存槑鍐呭
+ const parseInstructions = (instructions: string): { simple: string } | { intro: string; scenarios: Array<{ title: string; description: string }>; conclusion: string } | null => {
+ if (!instructions) return null;
+
+ // 妫�鏌ユ槸鍚﹀寘鍚満鏅牸寮�
+ if (instructions.includes('**鍦烘櫙') && instructions.includes('锛�')) {
+ const sections = instructions.split('\n\n').filter(section => section.trim());
+ const intro = sections[0];
+ const scenarios = sections.slice(1, -1).map(section => {
+ const lines = section.split('\n');
+ const title = lines[0].replace(/\*\*/g, '').replace('锛�', '');
+ const description = lines[1] || '';
+ return { title, description };
+ });
+ const conclusion = sections[sections.length - 1];
+
+ return {
+ intro,
+ scenarios,
+ conclusion
+ };
+ }
+
+ return { simple: instructions };
+ };
+
+ const backgroundData = parseBackground(scene.background || '');
+ const instructionsData = parseInstructions(scene.instructions || '');
return (
<AnimatePresence>
@@ -143,7 +205,7 @@
transition={{ duration: 0.5, delay: 0.3 }}
>
<button
- onClick={onStartChat}
+ onClick={handleStartChat}
className="group relative w-64 cursor-pointer"
>
<div className="absolute -inset-0.5 rounded-lg bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB] opacity-60 blur group-hover:opacity-100 transition-all duration-300"></div>
@@ -193,18 +255,38 @@
delay: 0.2,
ease: [0.21, 1.11, 0.81, 0.99]
}}
- className="relative p-6 rounded-lg bg-gradient-to-r from-[#1A2547] to-[#1E2B63] group overflow-hidden"
+ className="bg-[#1A2547] rounded-lg p-6 border border-[#6ADBFF]/10"
>
- {/* 瑁呴グ鎬у厜鏁� */}
- <div className="absolute inset-0 bg-gradient-to-r from-[#6ADBFF]/0 via-[#6ADBFF]/5 to-[#6ADBFF]/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-1000 ease-out"></div>
-
- <div className="relative">
- <h3 className="text-lg font-semibold mb-4 flex items-center text-white group-hover:text-[#6ADBFF] transition-colors duration-300">
- <div className="w-1 h-4 bg-[#6ADBFF] mr-2 opacity-70 group-hover:opacity-100 group-hover:h-5 transition-all duration-300"></div>
- 鑳屾櫙璇存槑
- </h3>
- <p className="text-gray-300 leading-relaxed group-hover:text-gray-200 transition-colors duration-300">{scene.background}</p>
- </div>
+ <h3 className="text-lg font-medium text-[#6ADBFF] mb-4">鍦烘櫙鑳屾櫙</h3>
+ {backgroundData && 'simple' in backgroundData ? (
+ <p className="text-gray-300 leading-relaxed">
+ {backgroundData.simple}
+ </p>
+ ) : backgroundData && 'sections' in backgroundData && (
+ <div className="space-y-4">
+ <p className="text-gray-300 leading-relaxed">
+ {backgroundData.intro}
+ </p>
+ <div className="grid gap-4">
+ {backgroundData.sections.map((section, index) => (
+ <div key={index} className="bg-[#0F1629] rounded-lg p-4 border border-[#6ADBFF]/5">
+ <h4 className="text-[#FF6A88] font-medium mb-3 flex items-center">
+ <div className="w-2 h-2 rounded-full bg-[#FF6A88] mr-2"></div>
+ {section.title}
+ </h4>
+ <ul className="space-y-2">
+ {section.items.map((item, itemIndex) => (
+ <li key={itemIndex} className="text-gray-300 text-sm flex items-start">
+ <div className="w-1 h-1 rounded-full bg-[#6ADBFF]/60 mt-2 mr-3 flex-shrink-0"></div>
+ <span>{item}</span>
+ </li>
+ ))}
+ </ul>
+ </div>
+ ))}
+ </div>
+ </div>
+ )}
</motion.div>
{/* 浣跨敤璇存槑 */}
@@ -216,82 +298,88 @@
delay: 0.3,
ease: [0.21, 1.11, 0.81, 0.99]
}}
- className="relative p-6 rounded-lg bg-gradient-to-r from-[#1E2B63] to-[#1A2547] group overflow-hidden"
+ className="bg-[#1A2547] rounded-lg p-6 border border-[#6ADBFF]/10"
>
- {/* 瑁呴グ鎬у厜鏁� */}
- <div className="absolute inset-0 bg-gradient-to-r from-[#FF6A88]/0 via-[#FF6A88]/5 to-[#FF6A88]/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-1000 ease-out"></div>
-
- <div className="relative">
- <h3 className="text-lg font-semibold mb-4 flex items-center text-white group-hover:text-[#FF6A88] transition-colors duration-300">
- <div className="w-1 h-4 bg-[#FF6A88] mr-2 opacity-70 group-hover:opacity-100 group-hover:h-5 transition-all duration-300"></div>
- 浣跨敤璇存槑
- </h3>
- <p className="text-gray-300 leading-relaxed group-hover:text-gray-200 transition-colors duration-300">{scene.instructions}</p>
- </div>
+ <h3 className="text-lg font-medium text-[#6ADBFF] mb-4">浣跨敤璇存槑</h3>
+ {instructionsData && 'simple' in instructionsData ? (
+ <p className="text-gray-300 leading-relaxed">
+ {instructionsData.simple}
+ </p>
+ ) : instructionsData && 'scenarios' in instructionsData && (
+ <div className="space-y-4">
+ <p className="text-gray-300 leading-relaxed">
+ {instructionsData.intro}
+ </p>
+ <div className="grid gap-3">
+ {instructionsData.scenarios.map((scenario, index) => (
+ <div key={index} className="bg-[#0F1629] rounded-lg p-4 border border-[#6ADBFF]/5 hover:border-[#6ADBFF]/20 transition-colors duration-300">
+ <div className="flex items-center mb-2">
+ <div className="w-6 h-6 rounded-full bg-gradient-to-r from-[#6ADBFF] to-[#5E72EB] flex items-center justify-center mr-3">
+ <span className="text-white text-xs font-medium">{index + 1}</span>
+ </div>
+ <h4 className="text-[#F5A800] font-medium">
+ {scenario.title}
+ </h4>
+ </div>
+ <p className="text-gray-300 text-sm ml-9">
+ {scenario.description}
+ </p>
+ </div>
+ ))}
+ </div>
+ <div className="mt-4 p-4 bg-[#0F1629] rounded-lg border border-[#6ADBFF]/5">
+ <p className="text-gray-300 text-sm">
+ {instructionsData.conclusion}
+ </p>
+ </div>
+ </div>
+ )}
</motion.div>
- {/* 鏁版嵁璇存槑 */}
- <motion.div
- initial={{ opacity: 0, y: 20 }}
- animate={{ opacity: 1, y: 0 }}
- transition={{
- duration: 0.4,
- delay: 0.4,
- ease: [0.21, 1.11, 0.81, 0.99]
- }}
- className="relative p-6 rounded-lg bg-gradient-to-r from-[#1A2547] via-[#1E2B63] to-[#1A2547] group overflow-hidden"
- >
- {/* 瑁呴グ鎬у厜鏁� */}
- <div className="absolute inset-0 bg-gradient-to-r from-[#6ADBFF]/0 via-[#6ADBFF]/5 to-[#6ADBFF]/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-1000 ease-out"></div>
-
- <div className="relative">
- <div className="flex items-center justify-between mb-4">
- <h3 className="text-lg font-semibold flex items-center text-white group-hover:text-[#6ADBFF] transition-colors duration-300">
- <div className="w-1 h-4 bg-[#6ADBFF] mr-2 opacity-70 group-hover:opacity-100 group-hover:h-5 transition-all duration-300"></div>
- 鏁版嵁璇存槑
- </h3>
- <button
- onClick={() => setShowDataPreview(true)}
- className="flex items-center px-3 py-1.5 text-sm text-[#6ADBFF] hover:text-white bg-[#1A2547]/50 hover:bg-[#6ADBFF]/10 rounded-full transition-all duration-300 group/btn cursor-pointer"
- >
- <svg
- xmlns="http://www.w3.org/2000/svg"
- className="h-4 w-4 mr-1.5 opacity-70 group-hover/btn:opacity-100 transition-opacity duration-300"
- fill="none"
- viewBox="0 0 24 24"
- stroke="currentColor"
+ {/* 鏁版嵁璇存槑鍖哄潡 - 鍙湪鐗瑰畾鍦烘櫙鏄剧ず */}
+ {!['鎵湴鏈哄櫒浜洪攢鍞帹鑽愬皬鍔╂墜', '搴撳瓨绠$悊鐭ヨ瘑搴撻棶绛�'].includes(scene.title) && (
+ <motion.div
+ initial={{ opacity: 0, y: 20 }}
+ animate={{ opacity: 1, y: 0 }}
+ transition={{
+ duration: 0.4,
+ delay: 0.4,
+ ease: [0.21, 1.11, 0.81, 0.99]
+ }}
+ className="bg-[#1A2547] rounded-lg p-6 border border-[#6ADBFF]/10"
+ >
+ <div className="flex items-center justify-between mb-3">
+ <h3 className="text-lg font-medium text-[#6ADBFF]">鏁版嵁璇存槑</h3>
+ {scene.exampleData && (
+ <button
+ onClick={() => setShowDataPreview(true)}
+ className="group relative inline-flex items-center gap-2 px-3 py-1 text-sm text-gray-400 hover:text-[#FF6A88] rounded-md transition-all duration-300 cursor-pointer overflow-hidden"
>
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 10h16M4 14h16M4 18h16" />
- </svg>
- 婕旂ず鏁版嵁
- </button>
+ <div className="absolute inset-0 opacity-0 group-hover:opacity-100 bg-gradient-to-r from-[#FF6A88]/10 to-[#F5A800]/10 transition-opacity duration-300"></div>
+ <svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 relative z-10" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
+ </svg>
+ <span className="relative z-10">鏌ョ湅婕旂ず鏁版嵁</span>
+ </button>
+ )}
</div>
- <p className="text-gray-300 leading-relaxed group-hover:text-gray-200 transition-colors duration-300">
+ <p className="text-gray-300 leading-relaxed">
{scene.dataDescription || '鏈満鏅墍浣跨敤鐨勬暟鎹潎涓烘ā鎷熸暟鎹紝浠呯敤浜庢紨绀虹洰鐨勩�傚湪瀹為檯搴旂敤涓紝灏嗘牴鎹偍鐨勫叿浣撻渶姹備娇鐢ㄧ湡瀹炴暟鎹繘琛屽垎鏋愬拰澶勭悊銆�'}
</p>
- </div>
- </motion.div>
+ </motion.div>
+ )}
{/* 绀轰緥鏁版嵁棰勮瀵硅瘽妗� */}
- <DataPreviewDialog
- isOpen={showDataPreview}
- onClose={() => setShowDataPreview(false)}
- markdownContent={scene.exampleData || `
-### 婕旂ず鏁版嵁
-
-| 宸ヤ綅 | 鍘熸潗鏂欓渶姹� | 鍘熸潗鏂欐秷鑰楅�熺巼 | 鐢熶骇鐨勪骇鍝� | 浜х嚎鍚� |
-|------|------------|----------------|------------|--------|
-| 1 | A1 | 2/灏忔椂 | P | 浜х嚎1 |
-| 2 | A2 | 1/灏忔椂 | P | 浜х嚎1 |
-| 3 | A3 | 2/灏忔椂 | P | 浜х嚎1 |
-| 4 | A4 | 4/灏忔椂 | P | 浜х嚎1 |
-| 5 | A5 | 5/灏忔椂 | P | 浜х嚎1 |
-| 6 | - | - | P | 浜х嚎1 |
-| 7 | A7 | 3/灏忔椂 | P | 浜х嚎1 |
-| 8 | - | - | P | 浜х嚎1 |
-| 9 | A9 | 3/灏忔椂 | P | 浜х嚎1 |
- `}
- />
+ {scene.exampleData && !['鎵湴鏈哄櫒浜洪攢鍞帹鑽愬皬鍔╂墜', '搴撳瓨绠$悊鐭ヨ瘑搴撻棶绛�'].includes(scene.title) && (
+ <DataPreviewDialog
+ isOpen={showDataPreview}
+ onClose={() => setShowDataPreview(false)}
+ markdownContent={scene.exampleData}
+ sceneType={scene.chatbotId === 'RhMYLHI1SZNiX4kl' || scene.chatbotId === 'zO9YQDEHdIApG9zC' ? 'chadan' :
+ scene.chatbotId === 'JELkWpPLHQfRNhEH' ? 'buliao' :
+ scene.chatbotId === 'SCPanoramaInsight' ? 'panorama' : undefined}
+ />
+ )}
</div>
</div>
</div>
--
Gitblit v1.9.3