Files
n8n_Demo/web_frontend/exhibition-demo/src/pages/ResultPage.tsx
Yep_Q 3db7af209c fix: 修复TypeScript配置错误并更新项目文档
详细说明:
- 修复了@n8n/config包的TypeScript配置错误
- 移除了不存在的jest-expect-message类型引用
- 清理了所有TypeScript构建缓存
- 更新了可行性分析文档,添加了技术实施方案
- 更新了Agent prompt文档
- 添加了会展策划工作流文档
- 包含了n8n-chinese-translation子项目
- 添加了exhibition-demo展示系统框架
2025-09-08 10:49:45 +08:00

261 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import {
FileText,
Target,
TrendingUp,
Calendar,
DollarSign,
AlertTriangle,
ChevronLeft,
ChevronRight,
RotateCcw,
Download
} from 'lucide-react';
import { useDemoStore } from '../store/demoStore';
interface ResultPageProps {
onRestart: () => void;
}
const sections = [
{ id: 'overview', title: '策划案概述', icon: FileText },
{ id: 'introduction', title: '展会介绍与预期效果', icon: Target },
{ id: 'marketing', title: '营销方案', icon: TrendingUp },
{ id: 'operation', title: '现场运营方案', icon: Calendar },
{ id: 'budget', title: '预算与收益分析', icon: DollarSign },
{ id: 'risk', title: '风险评估与应急预案', icon: AlertTriangle },
];
const ResultPage: React.FC<ResultPageProps> = ({ onRestart }) => {
const [currentSection, setCurrentSection] = useState(0);
const { generatedContent } = useDemoStore();
const handlePrevious = () => {
if (currentSection > 0) {
setCurrentSection(currentSection - 1);
}
};
const handleNext = () => {
if (currentSection < sections.length - 1) {
setCurrentSection(currentSection + 1);
}
};
// Mock content for demonstration
const getSectionContent = (sectionId: string) => {
const mockContent = {
overview: {
title: '2024长三角国际新能源汽车与智能交通产业博览会',
content: `
## 策划背景
在全球碳中和目标推动下,新能源汽车产业迎来爆发式增长。长三角地区作为中国汽车产业核心集群,聚集了特斯拉、上汽、蔚来等龙头企业。
## 策划目的
- 打造长三角地区新能源汽车与智能交通领域第一展会品牌
- 吸引300家优质展商实现现场意向交易额超8亿元人民币
- 促进产业链上下游合作,推动技术创新和产业升级
- 推广绿色出行理念,助力碳中和目标实现
`,
images: ['/api/placeholder/600/400', '/api/placeholder/600/400']
},
introduction: {
title: '展会规模与预期',
content: `
## 展会主题
「智行未来,绿动长三角」
## 预计规模
- 展览面积50,000平方米
- 标准展位1,200个9平米/个)
- 特装展位20,000平方米
- 参展商家数350家
- 参观人次50,000人次
## 预期效果
- 现场成交额预计超10亿元
- 带动相关产业收入约30亿元
- 媒体曝光量超1亿次
`,
images: []
},
// Add more sections...
};
return mockContent[sectionId] || generatedContent[sectionId] || mockContent.overview;
};
const currentSectionData = getSectionContent(sections[currentSection].id);
return (
<div className="min-h-screen p-6">
<div className="max-w-7xl mx-auto">
{/* Header */}
<motion.div
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
className="mb-8"
>
<div className="flex items-center justify-between">
<h1 className="text-4xl font-bold text-gradient">
</h1>
<div className="flex items-center gap-4">
<button
onClick={() => {}}
className="px-4 py-2 glass-morphism rounded-xl hover:scale-105 transition-transform flex items-center gap-2"
>
<Download className="w-4 h-4" />
</button>
<button
onClick={onRestart}
className="px-4 py-2 glass-morphism rounded-xl hover:scale-105 transition-transform flex items-center gap-2"
>
<RotateCcw className="w-4 h-4" />
</button>
</div>
</div>
</motion.div>
{/* Section Tabs */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.2 }}
className="mb-8"
>
<div className="flex items-center gap-2 overflow-x-auto scrollbar-thin pb-2">
{sections.map((section, index) => {
const Icon = section.icon;
return (
<button
key={section.id}
onClick={() => setCurrentSection(index)}
className={`
flex items-center gap-2 px-4 py-2 rounded-xl transition-all whitespace-nowrap
${currentSection === index
? 'bg-gradient-to-r from-blue-500 to-purple-500 text-white shadow-lg'
: 'glass-morphism hover:scale-105'
}
`}
>
<Icon className="w-4 h-4" />
<span className="font-medium">{section.title}</span>
</button>
);
})}
</div>
</motion.div>
{/* Content Area */}
<AnimatePresence mode="wait">
<motion.div
key={currentSection}
initial={{ opacity: 0, x: 20 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -20 }}
transition={{ duration: 0.3 }}
className="glass-morphism rounded-2xl p-8"
>
{/* Section Header */}
<div className="mb-6">
<h2 className="text-3xl font-bold mb-2">
{currentSectionData.title}
</h2>
<div className="h-1 w-20 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full" />
</div>
{/* Section Content */}
<div className="prose prose-neutral dark:prose-invert max-w-none">
<div className="whitespace-pre-wrap text-neutral-700 dark:text-neutral-300">
{currentSectionData.content}
</div>
</div>
{/* Images */}
{currentSectionData.images && currentSectionData.images.length > 0 && (
<div className="mt-8 grid grid-cols-2 gap-4">
{currentSectionData.images.map((src, index) => (
<motion.div
key={index}
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ delay: index * 0.1 }}
className="rounded-xl overflow-hidden shadow-lg"
>
<img
src={src}
alt={`Section image ${index + 1}`}
className="w-full h-full object-cover"
/>
</motion.div>
))}
</div>
)}
</motion.div>
</AnimatePresence>
{/* Navigation */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.4 }}
className="mt-8 flex items-center justify-between"
>
<button
onClick={handlePrevious}
disabled={currentSection === 0}
className={`
px-4 py-2 rounded-xl flex items-center gap-2 transition-all
${currentSection === 0
? 'opacity-50 cursor-not-allowed glass-morphism'
: 'glass-morphism hover:scale-105'
}
`}
>
<ChevronLeft className="w-4 h-4" />
</button>
{/* Page Indicators */}
<div className="flex items-center gap-2">
{sections.map((_, index) => (
<div
key={index}
className={`
w-2 h-2 rounded-full transition-all
${currentSection === index
? 'w-8 bg-gradient-to-r from-blue-500 to-purple-500'
: 'bg-neutral-400'
}
`}
/>
))}
</div>
<button
onClick={handleNext}
disabled={currentSection === sections.length - 1}
className={`
px-4 py-2 rounded-xl flex items-center gap-2 transition-all
${currentSection === sections.length - 1
? 'opacity-50 cursor-not-allowed glass-morphism'
: 'glass-morphism hover:scale-105'
}
`}
>
<ChevronRight className="w-4 h-4" />
</button>
</motion.div>
</div>
</div>
);
};
export default ResultPage;