# DramaLing 專案資料夾結構指南 ## 完整目錄結構 ``` dramaling-vocab-learning/ ├── 📁 .claude/ # Claude AI 配置 │ └── CLAUDE.md # AI 助手指引文件 │ ├── 📁 .github/ # GitHub 配置 │ └── workflows/ # GitHub Actions │ ├── ci.yml # CI 流程 │ └── deploy.yml # 部署流程 │ ├── 📁 docs/ # 專案文檔 │ ├── 00_starter/ # 啟動文檔 │ ├── 01_requirement/ # 需求文檔 │ ├── 02_design/ # 設計文檔 │ ├── 03_development/ # 開發文檔 │ ├── 04_testing/ # 測試文檔 │ ├── 05_deployment/ # 部署文檔 │ └── 06_project-management/ # 專案管理 │ ├── 📁 public/ # 靜態資源 │ ├── images/ # 圖片資源 │ ├── fonts/ # 字體檔案 │ └── favicon.ico # 網站圖標 │ ├── 📁 app/ # Next.js App Router (根目錄) │ ├── login/ # 登入頁面 │ ├── register/ # 註冊頁面 │ ├── dashboard/ # 主儀表板 │ ├── flashcards/ # 詞卡管理 │ ├── learn/ # 學習頁面(複習系統) │ ├── generate/ # AI 生成詞卡頁面 │ │ │ │ ├── api/ # API 路由 │ │ ├── auth/ # 認證 API │ │ ├── flashcards/ # 詞卡 API │ │ ├── ai/ # AI 生成 API │ │ ├── stats/ # 統計 API │ │ └── tags/ # 標籤 API │ │ │ ├── layout.tsx # 根佈局 │ ├── page.tsx # 首頁(Landing Page) │ ├── globals.css # 全域樣式 │ └── not-found.tsx # 404 頁面 │ │ ├── 📁 components/ # React 組件(根目錄) │ │ ├── ui/ # UI 基礎組件 │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── dialog.tsx │ │ │ ├── input.tsx │ │ │ ├── label.tsx │ │ │ ├── select.tsx │ │ │ ├── separator.tsx │ │ │ ├── skeleton.tsx │ │ │ ├── toast.tsx │ │ │ └── ... │ │ │ │ │ ├── layout/ # 佈局組件 │ │ │ ├── header.tsx # 頁首 │ │ │ ├── sidebar.tsx # 側邊欄 │ │ │ ├── footer.tsx # 頁尾 │ │ │ └── navigation.tsx # 導航 │ │ │ │ │ ├── flashcard/ # 詞卡相關組件 │ │ │ ├── flashcard-item.tsx │ │ │ ├── flashcard-list.tsx │ │ │ ├── flashcard-form.tsx │ │ │ └── flashcard-review.tsx │ │ │ │ │ ├── auth/ # 認證組件 │ │ │ ├── login-form.tsx │ │ │ ├── register-form.tsx │ │ │ └── auth-guard.tsx │ │ │ │ │ └── providers/ # Context Providers │ │ ├── auth-provider.tsx │ │ ├── theme-provider.tsx │ │ └── query-provider.tsx │ │ ├── 📁 lib/ # 工具函數庫(根目錄) │ │ ├── supabase/ # Supabase 配置 │ │ │ ├── client.ts # 客戶端 │ │ │ ├── server.ts # 伺服器端 │ │ │ └── admin.ts # 管理員客戶端 │ │ │ │ │ ├── ai/ # AI 相關 │ │ │ ├── gemini.ts # Gemini 配置 │ │ │ └── prompts.ts # Prompt 模板 │ │ │ │ │ ├── utils/ # 工具函數 │ │ │ ├── cn.ts # Class names │ │ │ ├── format.ts # 格式化函數 │ │ │ ├── validation.ts # 驗證函數 │ │ │ └── sm2.ts # SM-2 演算法 │ │ │ │ └── constants.ts # 常數定義 │ ├── 📁 hooks/ # 自定義 Hooks(根目錄) │ ├── use-auth.ts # 認證 Hook │ ├── use-flashcards.ts # 詞卡 Hook │ ├── use-toast.ts # Toast Hook │ └── use-debounce.ts # 防抖 Hook │ ├── 📁 types/ # TypeScript 類型(根目錄) │ ├── database.ts # 資料庫類型 │ ├── flashcard.ts # 詞卡類型 │ ├── user.ts # 用戶類型 │ ├── api.ts # API 類型 │ └── supabase.ts # Supabase 類型 │ ├── 📁 store/ # 狀態管理(根目錄) │ ├── auth-store.ts # 認證狀態 │ ├── flashcard-store.ts # 詞卡狀態 │ └── ui-store.ts # UI 狀態 │ ├── 📁 tests/ # 測試檔案 │ ├── unit/ # 單元測試 │ ├── integration/ # 整合測試 │ └── e2e/ # E2E 測試 │ ├── 📁 scripts/ # 腳本檔案 │ ├── seed.ts # 資料播種 │ ├── migrate.ts # 資料庫遷移 │ └── backup.ts # 備份腳本 │ ├── 📄 配置檔案 ├── .env.local # 環境變數(本地) ├── .env.example # 環境變數範例 ├── .eslintrc.json # ESLint 配置 ├── .gitignore # Git 忽略檔案 ├── .prettierrc # Prettier 配置 ├── components.json # shadcn/ui 配置 ├── middleware.ts # Next.js 中間件 ├── next-env.d.ts # Next.js 類型定義 ├── next.config.mjs # Next.js 配置 ├── package.json # 專案依賴 ├── postcss.config.mjs # PostCSS 配置 ├── tailwind.config.ts # Tailwind 配置 ├── tsconfig.json # TypeScript 配置 └── vercel.json # Vercel 配置 ``` ## 專案結構說明(根據實際實作) > **注意**: 本專案將主要程式碼放置在根目錄而非 `/src` 資料夾中 ## 資料夾用途說明 ### /app Next.js 13+ App Router 的核心目錄,包含所有頁面和 API 路由。位於專案根目錄。 **命名規範**: - 使用小寫和連字符 - 括號 `()` 用於路由分組(不影響 URL) - 方括號 `[]` 用於動態路由 **實際實作檔案**: - `page.tsx`: 首頁 Landing Page - `layout.tsx`: 根佈局,包含全站基本設定 - `login/page.tsx`: 登入頁面 - `register/page.tsx`: 註冊頁面 - `dashboard/page.tsx`: 儀表板頁面 - `flashcards/page.tsx`: 詞卡管理頁面 - `learn/page.tsx`: 學習頁面(多種測驗模式) - `generate/page.tsx`: AI 生成詞卡頁面 ### /components 可重用的 React 組件,位於專案根目錄。 **組織原則**: - `ui/`: shadcn/ui 基礎組件(使用 shadcn/ui 自動生成) - 業務組件按功能分組(待實作) - 佈局組件整合在頁面中 **實際實作組件**: - 目前組件邏輯直接整合在各頁面檔案中 - 使用 React Hooks 管理狀態(useState, useEffect) - 採用 Tailwind CSS 進行樣式設計 ### /lib 不含 React 的純 JavaScript/TypeScript 工具,位於專案根目錄。 **內容**: - `utils.ts`: 工具函數(如 cn 函數) - 第三方服務配置(待實作) - 常數定義(待實作) ### /hooks 自定義 React Hooks(待實作)。 **命名規範**: - 以 `use` 開頭 - 描述性命名 ### /types TypeScript 類型定義(待實作)。 **組織方式**: - 按領域分組 - 共享類型放在對應檔案 ### /store Zustand 狀態管理(待實作)。 **設計原則**: - 按功能領域分割 - 保持狀態最小化 ## 檔案命名規範 ### 組件檔案 ``` - PascalCase: UserProfile.tsx - 組件相關: user-profile.module.css ``` ### 工具函數 ``` - camelCase: formatDate.ts - 測試檔案: formatDate.test.ts ``` ### 類型定義 ``` - PascalCase: User.ts - 介面: IUser, IUserProps ``` ### API 路由 ``` - 資料夾: kebab-case - 檔案: route.ts ``` ## Import 順序建議 ```typescript // 1. React/Next.js import React from 'react' import { useRouter } from 'next/navigation' // 2. 第三方庫 import { z } from 'zod' import { useQuery } from '@tanstack/react-query' // 3. 內部組件 import { Button } from '@/components/ui/button' import { FlashCard } from '@/components/flashcard' // 4. 工具函數 import { cn } from '@/lib/utils' import { formatDate } from '@/lib/format' // 5. 類型 import type { User } from '@/types/user' // 6. 樣式 import styles from './styles.module.css' ``` ## 最佳實踐 ### 1. 組件組織 - 相關組件放在同一資料夾 - 共享組件放在 `/components/ui` - 頁面特定組件可放在頁面資料夾內 ### 2. API 路由 - RESTful 命名 - 使用適當的 HTTP 方法 - 錯誤處理標準化 ### 3. 狀態管理 - 優先使用 React 內建狀態 - 全域狀態使用 Zustand - 服務器狀態使用 React Query ### 4. 類型安全 - 所有組件都要有類型定義 - 使用 `type` 而非 `interface`(除非需要擴展) - 避免使用 `any` ### 5. 程式碼分割 - 使用動態導入大型組件 - 路由級別的程式碼分割 - 優化 bundle 大小 ## 環境配置 ### 必要的環境變數 ```env # Supabase NEXT_PUBLIC_SUPABASE_URL= NEXT_PUBLIC_SUPABASE_ANON_KEY= SUPABASE_SERVICE_ROLE_KEY= # Gemini AI GEMINI_API_KEY= # App NEXT_PUBLIC_APP_URL= ``` ### Git 忽略規則 確保以下檔案不被提交: - `.env.local` - `node_modules/` - `.next/` - `*.log` ## 實際頁面結構(已實作) ### 公開頁面 - `/` - 首頁(Landing Page):產品介紹、功能展示、CTA - `/login` - 登入頁面 - `/register` - 註冊頁面 ### 認證後頁面 - `/dashboard` - 儀表板:學習統計、進度追蹤、快速操作 - `/flashcards` - 詞卡管理:卡組列表、詞卡瀏覽、收藏管理、錯誤回報 - `/learn` - 學習頁面:多種學習模式(翻卡、選擇題、填空、聽力、口說) - `/generate` - AI 生成:文本輸入、智能萃取、批量生成詞卡 ### 頁面特色功能 #### Dashboard 頁面 (`/app/dashboard/page.tsx`) - 學習統計卡片(總詞卡、連續天數、正確率、今日進度) - 最近學習詞彙列表 - 卡組進度展示 - 學習趨勢圖表 - 頂部導航列:包含 DramaLing 標題和頁面切換 - 歡迎區塊:快速操作按鈕(開始學習、AI 生成) - 標籤式內容切換:最近學習、我的卡組、學習統計 #### Flashcards 頁面 (`/app/flashcards/page.tsx`) - 多標籤頁切換(我的卡組、所有詞卡、收藏、錯誤回報) - 智能檢測功能(AI 檢查詞卡內容正確性) - 批量操作支援 - 卡組管理(進度追蹤、標籤分類) - 搜尋過濾功能:支援關鍵字搜尋和標籤篩選 - 錯誤回報管理:顯示待處理錯誤數量和一鍵檢測 - 統計卡片:顯示總詞卡數、已掌握、待複習等數據 - 智能檢測模態框:檢測詞卡內容並提供修正建議 #### Learn 頁面 (`/app/learn/page.tsx`) - 五種學習模式切換: - 翻卡模式:點擊翻轉查看答案,包含難度評分 - 選擇題模式:根據定義選擇正確翻譯 - 填空題模式:根據例句圖片填入正確詞彙 - 聽力測試:聽音頻選擇正確單字 - 口說測試:錄音練習發音 - 進度條顯示:實時顯示學習進度 - 難度評分系統:三級評分(完全不記得、有點困難、很簡單) - 例句圖片支援:可點擊放大查看 - 錯誤回報功能:每種模式都有回報按鈕 - 詞卡導航:上一個/下一個按鈕 - 模態框功能:圖片放大顯示、錯誤回報表單 #### Generate 頁面 (`/app/generate/page.tsx`) - 兩種輸入模式(手動輸入、影劇截圖) - 兩種萃取方式(詞彙萃取、智能萃取) - 批量生成控制(5-20 個詞卡,使用滑桿調整) - 預覽和編輯生成結果: - 完整詞卡資訊展示(翻譯、定義、同義詞、反義詞) - 原始例句和 AI 生成例句對比 - 例句圖片預覽(可點擊放大) - CEFR 難度等級標記 - 用戶限制提示(免費/訂閱) - 生成過程動畫:載入旋轉圖標 - 詞卡編輯和刪除功能 - 批量保存到卡組 ## 開發工作流程 1. **功能開發**:在 `/app` 對應的頁面資料夾中開發 2. **組件提取**:將可重用部分提取到 `/components` 3. **樣式管理**:使用 Tailwind CSS + shadcn/ui 組件 4. **狀態管理**:頁面內使用 React State,跨頁面考慮 Zustand 5. **類型定義**:在 `/types` 中定義共享類型(待實作) 6. **API 整合**:在 `/app/api` 實作後端邏輯(待實作) 7. **文檔更新**:在 `/docs` 中更新相關文檔 ## 前端實作技術細節 ### 狀態管理模式 - **頁面級狀態**:使用 `useState` 管理本地狀態 - **模態框控制**:布林狀態控制顯示/隱藏 - **表單處理**:受控組件模式,實時更新輸入值 - **列表渲染**:使用 `map` 函數動態生成組件 ### UI 互動設計 - **響應式設計**:使用 Tailwind 響應式前綴(sm:, md:, lg:) - **過渡動畫**:`transition-*` 類別實現平滑過渡 - **載入狀態**:按鈕禁用、旋轉動畫、骨架屏 - **錯誤處理**:條件渲染錯誤訊息和提示 ### 組件通信 - **Props 傳遞**:父子組件間數據傳遞 - **事件處理**:onClick、onChange 等事件綁定 - **條件渲染**:三元運算符和邏輯與運算符 ### 效能優化考量 - **懶加載**:圖片和大型組件的延遲載入(待實作) - **記憶化**:使用 useMemo、useCallback(待優化) - **虛擬列表**:大量數據渲染優化(待實作)