dramaling-vocab-learning/docs/03_development/setup/folder-structure.md

14 KiB
Raw Blame History

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 順序建議

// 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 大小

環境配置

必要的環境變數

# 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待優化
  • 虛擬列表:大量數據渲染優化(待實作)