page.tsx 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. "use client"
  2. import { useState, useCallback } from "react"
  3. import { Button } from "@/components/ui/button"
  4. import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
  5. import { Progress } from "@/components/ui/progress"
  6. import { Badge } from "@/components/ui/badge"
  7. import { Database, Settings, Brain, Sparkles, ChevronRight, Play, BookOpen } from "lucide-react"
  8. import DataCollectionStep from "@/components/data-collection-step"
  9. import DataPreprocessingStep from "@/components/data-preprocessing-step"
  10. import ModelTrainingStep from "@/components/model-training-step"
  11. import ImageGenerationStep from "@/components/image-generation-step"
  12. const steps = [
  13. {
  14. id: 1,
  15. title: "数据采集",
  16. description: "选择图像作为AI的学习材料",
  17. icon: Database,
  18. color: "bg-chart-1",
  19. details: "学习如何为AI模型收集和准备训练数据",
  20. },
  21. {
  22. id: 2,
  23. title: "数据预处理",
  24. description: "对图像进行清洗和标准化处理",
  25. icon: Settings,
  26. color: "bg-chart-2",
  27. details: "了解数据预处理在AI训练中的重要作用",
  28. },
  29. {
  30. id: 3,
  31. title: "模型训练",
  32. description: "模拟AI学习图像特征的过程",
  33. icon: Brain,
  34. color: "bg-chart-3",
  35. details: "观察AI如何从数据中学习和提取特征",
  36. },
  37. {
  38. id: 4,
  39. title: "图像生成",
  40. description: "输入提示词生成新的艺术作品",
  41. icon: Sparkles,
  42. color: "bg-chart-4",
  43. details: "体验AI根据学习内容创作新图像的过程",
  44. },
  45. ]
  46. export default function HomePage() {
  47. const [currentStep, setCurrentStep] = useState(0)
  48. const [isStarted, setIsStarted] = useState(false)
  49. const [selectedImages, setSelectedImages] = useState<string[]>([])
  50. const handleStartLearning = () => {
  51. setIsStarted(true)
  52. setCurrentStep(1)
  53. }
  54. const handleStepClick = (stepId: number) => {
  55. if (isStarted) {
  56. setCurrentStep(stepId)
  57. }
  58. }
  59. const handleImagesChange = useCallback((images: string[]) => {
  60. setSelectedImages(images)
  61. }, [])
  62. const renderStepContent = () => {
  63. switch (currentStep) {
  64. case 1:
  65. return (
  66. <DataCollectionStep
  67. onNext={() => setCurrentStep(2)}
  68. selectedImages={selectedImages}
  69. onImagesChange={handleImagesChange}
  70. />
  71. )
  72. case 2:
  73. return <DataPreprocessingStep onNext={() => setCurrentStep(3)} selectedImages={selectedImages} />
  74. case 3:
  75. return <ModelTrainingStep onNext={() => setCurrentStep(4)} />
  76. case 4:
  77. return <ImageGenerationStep selectedImages={selectedImages} />
  78. default:
  79. return null
  80. }
  81. }
  82. return (
  83. <div className="min-h-screen bg-background">
  84. {/* Header */}
  85. <header className="border-b border-border bg-card">
  86. <div className="container mx-auto px-4 py-6">
  87. <div className="flex items-center justify-between">
  88. <div>
  89. <h1 className="text-3xl font-bold font-serif text-primary">AI绘画教学平台</h1>
  90. <p className="text-muted-foreground mt-2">探索人工智能绘画的奥秘</p>
  91. </div>
  92. <Badge variant="secondary" className="text-sm">
  93. <BookOpen className="w-4 h-4 mr-1" />
  94. 教育版
  95. </Badge>
  96. </div>
  97. </div>
  98. </header>
  99. <div className="flex">
  100. {/* Sidebar Navigation */}
  101. <aside className="w-80 bg-sidebar border-r border-sidebar-border min-h-screen">
  102. <div className="p-6">
  103. <div className="mb-6">
  104. <h2 className="text-lg font-semibold font-serif mb-2">学习进度</h2>
  105. <Progress value={(currentStep / steps.length) * 100} className="h-2" />
  106. <p className="text-sm text-muted-foreground mt-2">
  107. {currentStep > 0 ? `第 ${currentStep} 步,共 ${steps.length} 步` : "准备开始学习"}
  108. </p>
  109. </div>
  110. <nav className="space-y-2">
  111. {steps.map((step) => {
  112. const Icon = step.icon
  113. const isActive = currentStep === step.id
  114. const isCompleted = currentStep > step.id
  115. const isAccessible = isStarted && step.id <= currentStep + 1
  116. return (
  117. <button
  118. key={step.id}
  119. onClick={() => handleStepClick(step.id)}
  120. disabled={!isAccessible}
  121. className={`w-full text-left p-4 rounded-lg border transition-all duration-200 ${
  122. isActive
  123. ? "bg-sidebar-primary text-sidebar-primary-foreground border-sidebar-primary"
  124. : isCompleted
  125. ? "bg-sidebar-accent text-sidebar-accent-foreground border-sidebar-accent"
  126. : isAccessible
  127. ? "bg-sidebar hover:bg-sidebar-accent border-sidebar-border hover:border-sidebar-accent"
  128. : "bg-muted text-muted-foreground border-border opacity-50 cursor-not-allowed"
  129. }`}
  130. >
  131. <div className="flex items-center gap-3">
  132. <div className={`p-2 rounded-md ${isActive || isCompleted ? "bg-white/20" : "bg-primary/10"}`}>
  133. <Icon className="w-5 h-5" />
  134. </div>
  135. <div>
  136. <h3 className="font-semibold text-sm">{step.title}</h3>
  137. <p className="text-xs opacity-80 mt-1">{step.description}</p>
  138. </div>
  139. {isAccessible && <ChevronRight className="w-4 h-4 opacity-60" />}
  140. </div>
  141. </button>
  142. )
  143. })}
  144. </nav>
  145. </div>
  146. </aside>
  147. {/* Main Content */}
  148. <main className="flex-1 p-8">
  149. {!isStarted ? (
  150. // Welcome Screen
  151. <div className="max-w-4xl mx-auto">
  152. <div className="text-center mb-12">
  153. <h2 className="text-4xl font-bold font-serif text-foreground mb-4">欢迎来到AI绘画世界</h2>
  154. <p className="text-xl text-muted-foreground max-w-2xl mx-auto leading-relaxed">
  155. 通过这个交互式学习平台,你将深入了解AI绘画的完整流程,
  156. 从数据采集到最终的艺术创作,每一步都有详细的解释和实践操作。
  157. </p>
  158. </div>
  159. <div className="grid md:grid-cols-2 gap-6 mb-12">
  160. {steps.map((step) => {
  161. const Icon = step.icon
  162. return (
  163. <Card key={step.id} className="hover:shadow-lg transition-shadow">
  164. <CardHeader>
  165. <div className="flex items-center gap-3">
  166. <div className={`p-3 rounded-lg ${step.color} text-white`}>
  167. <Icon className="w-6 h-6" />
  168. </div>
  169. <div>
  170. <CardTitle className="font-serif">{step.title}</CardTitle>
  171. <CardDescription>{step.description}</CardDescription>
  172. </div>
  173. </div>
  174. </CardHeader>
  175. <CardContent>
  176. <p className="text-sm text-muted-foreground">{step.details}</p>
  177. </CardContent>
  178. </Card>
  179. )
  180. })}
  181. </div>
  182. <div className="text-center">
  183. <Button onClick={handleStartLearning} size="lg" className="text-lg px-8 py-6 font-semibold">
  184. <Play className="w-5 h-5 mr-2" />
  185. 开始学习之旅
  186. </Button>
  187. <p className="text-sm text-muted-foreground mt-4">预计学习时间:30-45分钟</p>
  188. </div>
  189. </div>
  190. ) : (
  191. // Step Content Area
  192. <div className="max-w-4xl mx-auto">
  193. <div className="mb-8">
  194. <div className="flex items-center gap-3 mb-4">
  195. <Badge variant="outline">第 {currentStep} 步</Badge>
  196. <h2 className="text-3xl font-bold font-serif">{steps[currentStep - 1].title}</h2>
  197. </div>
  198. <p className="text-lg text-muted-foreground">{steps[currentStep - 1].details}</p>
  199. </div>
  200. {renderStepContent()}
  201. </div>
  202. )}
  203. </main>
  204. </div>
  205. </div>
  206. )
  207. }