# 🛠ïļ Web Development Documentation: e-Learning Platform (Frontend) āđ€āļ­āļāļŠāļēāļĢāļ‰āļšāļąāļšāļ™āļĩāđ‰āļŠāļĢāļļāļ›āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„ āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āđ‰āļ” āđāļĨāļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļš **Frontend-Learner** --- ## 🏗ïļ 1. Technical Foundation (āļĢāļēāļāļāļēāļ™āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„) āļĢāļ§āļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­, āļĢāļ°āļšāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ§āđ‰āļ”āđ‰āļ§āļĒāļāļąāļ™ ### 1.1 Tech Stack - **Core:** [Nuxt 3](https://nuxt.com) (Vue 3 Composition API), TypeScript `^5.0` - **Styling:** Tailwind CSS (Utility) + Vanilla CSS Variables (Theming) - **State:** `ref`/`reactive` (Local) + `useState` (Global/Shared State) - **Localization:** `@nuxtjs/i18n` (TH/EN Support) ### 1.2 Core Systems & Security - **Authentication:** āļĢāļ°āļšāļš Auth āļœāļđāļāļāļąāļš API āđ‚āļ”āļĒāļĄāļĩ Middleware (`middleware/auth.ts`) āļ„āļ­āļĒāļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ Route āđ€āļ‰āļžāļēāļ° - **API Handling:** āđƒāļŠāđ‰ `runtimeConfig.public.apiBase` āļˆāļąāļ”āļāļēāļĢ Base URL āđāļĨāļ° Auto-attach Bearer Token āđƒāļ™ Composables - **Performance:** - **Caching:** āđƒāļŠāđ‰ `useState` āļˆāļģāļ‚āđ‰āļ­āļĄāļđāļĨ (User Profile, Courses, Categories) āđ€āļžāļ·āđˆāļ­āļĨāļ” request āļ‹āđ‰āļģāļ‹āđ‰āļ­āļ™ - **Request Deduping:** āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ API āđ€āļ”āļīāļĄāļ‹āđ‰āļģāđ† āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ --- ## 📂 2. Frontend Structure (āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđāļĨāļ° UI) ### 2.1 Application Routes (`pages/`) | Module | āđ„āļŸāļĨāđŒ | Path | āļŦāļ™āđ‰āļēāļ—āļĩāđˆ | | :---------- | :------------------------- | :---------------------- | :--------------------------- | | **Public** | `index.vue` | `/` | āļŦāļ™āđ‰āļēāđāļĢāļ Landing Page | | | `browse/index.vue` | `/browse` | āļŦāļ™āđ‰āļēāļĢāļ§āļĄāļ„āļ­āļĢāđŒāļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ” | | | `browse/discovery.vue` | `/browse/discovery` | **āļĢāļ°āļšāļšāļ„āđ‰āļ™āļŦāļēāđāļĨāļ° Filter** | | | `course/[id].vue` | `/course/:id` | **āļŦāļ™āđ‰āļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļ­āļĢāđŒāļŠ** | | **Auth** | `auth/login.vue` | `/auth/login` | āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš | | | `auth/register.vue` | `/auth/register` | āļŠāļĄāļąāļ„āļĢāļŠāļĄāļēāļŠāļīāļāļœāļđāđ‰āđ€āļĢāļĩāļĒāļ™ | | **Student** | `dashboard/index.vue` | `/dashboard` | āđāļ”āļŠāļšāļ­āļĢāđŒāļ”āļ āļēāļžāļĢāļ§āļĄ | | | `dashboard/my-courses.vue` | `/dashboard/my-courses` | āļ„āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡āļ‰āļąāļ™ | | | `classroom/learning.vue` | `/classroom/learning` | **āļŦāđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļ™ (Video Player)** | | | `classroom/quiz.vue` | `/classroom/quiz` | āļāļēāļĢāļŠāļ­āļšāļ§āļąāļ”āļœāļĨ | ### 2.2 Reusable Components (`components/`) - **Layout:** `AppHeader.vue`, `AppSidebar.vue`, `MobileNav.vue` (Navigation āļŦāļĨāļąāļ) - **Common:** `FormInput.vue` (āļŸāļ­āļĢāđŒāļĄ), `LoadingSpinner.vue` (āļŠāļ–āļēāļ™āļ°āđ‚āļŦāļĨāļ”), `LanguageSwitcher.vue` (āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ āļēāļĐāļē) - **Modules:** `CourseCard.vue` (āđāļŠāļ”āļ‡āļœāļĨāļ„āļ­āļĢāđŒāļŠāđāļšāļš Grid), `UserAvatar.vue` (āļĢāļđāļ›āđ‚āļ›āļĢāđ„āļŸāļĨāđŒ) --- ## 🧠 3. Logic & Data Layer (Composables + API) āļĢāļ§āļšāļĢāļ§āļĄ Logic āđāļĨāļ° API Endpoint āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđ„āļ§āđ‰āđƒāļ™āļ—āļĩāđˆāđ€āļ”āļĩāļĒāļ§āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ‡āđˆāļēāļĒ ### 3.1 `useAuth.ts` (Authentication & User) āļˆāļąāļ”āļāļēāļĢāļŠāļ–āļēāļ™āļ°āļœāļđāđ‰āđƒāļŠāđ‰, āļĨāđ‡āļ­āļāļ­āļīāļ™, āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāđˆāļ§āļ™āļ•āļąāļ§ - **Endpoints:** - `GET /api/user/me`: āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ›āļĢāđ„āļŸāļĨāđŒ (Cached) - `PUT /api/user/me`: āļ­āļąāļ›āđ€āļ”āļ•āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāđˆāļ§āļ™āļ•āļąāļ§ - `POST /api/user/change-password`: āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļŦāļąāļŠāļœāđˆāļēāļ™ ### 3.2 `useCourse.ts` (Course & Learning) āļŦāļąāļ§āđƒāļˆāļŦāļĨāļąāļāļ‚āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆāļŦāļ™āđ‰āļēāļĢāļēāļĒāļāļēāļĢāļ„āļ­āļĢāđŒāļŠāļˆāļ™āļ–āļķāļ‡āļŦāđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļ™ - **Course Catalog Endpoints:** - `GET /api/courses`: āļ”āļķāļ‡āļ„āļ­āļĢāđŒāļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ” (Cached) - `GET /api/courses/{id}`: āļ”āļķāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļ­āļĢāđŒāļŠ - `POST /api/students/courses/{id}/enroll`: āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ€āļĢāļĩāļĒāļ™ - **Classroom Endpoints:** - `GET /api/students/courses`: āļ”āļķāļ‡ "āļ„āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡āļ‰āļąāļ™" - `GET /api/students/courses/{id}/learn`: āļ”āļķāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļšāļ—āđ€āļĢāļĩāļĒāļ™ (Syllabus) - `GET /api/students/courses/{id}/lessons/{lessonId}`: āļ”āļķāļ‡āļ§āļīāļ”āļĩāđ‚āļ­āđ€āļ™āļ·āđ‰āļ­āļŦāļē - `GET /api/students/courses/{id}/lessons/{lessonId}/access-check`: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļ—āđ€āļĢāļĩāļĒāļ™ - `POST /api/students/lessons/{lessonId}/progress`: āļšāļąāļ™āļ—āļķāļāđ€āļ§āļĨāļēāđ€āļĢāļĩāļĒāļ™ (Video Progress) - `GET /api/students/lessons/{lessonId}/progress`: āļ”āļķāļ‡āđ€āļ§āļĨāļēāđ€āļĢāļĩāļĒāļ™āļĨāđˆāļēāļŠāļļāļ” - `POST /api/students/courses/{id}/lessons/{lessonId}/complete`: āļšāļąāļ™āļ—āļķāļāļ§āđˆāļēāđ€āļĢāļĩāļĒāļ™āļˆāļšāđāļĨāđ‰āļ§ - `POST /api/students/courses/{id}/lessons/{lessonId}/quiz/submit`: āļŠāđˆāļ‡āļ„āļģāļ•āļ­āļšāđāļšāļšāļ—āļ”āļŠāļ­āļš (Quiz) ### 3.3 `useCategory.ts` & Utilities - `fetchCategories`: āļ”āļķāļ‡āļŦāļĄāļ§āļ”āļŦāļĄāļđāđˆ (`GET /api/categories`) āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļāļĢāļ­āļ‡āļŦāļ™āđ‰āļē Discovery - `useFormValidation.ts`: āļĢāļ§āļĄ RegEx āļŠāļģāļŦāļĢāļąāļšāļ•āļĢāļ§āļˆāļŠāļ­āļš Email, Password āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™ --- ## ðŸŽĻ 4. Design System & Theming ### 4.1 Dark Mode Strategy āļĢāļ°āļšāļšāđƒāļŠāđ‰ **Class-based Dark Mode** āļ‚āļ­āļ‡ Tailwind āļœāļŠāļĄāļāļąāļš CSS Variables: - **Backgrounds:** `bg-slate-50` (Light) vs `bg-slate-900` (Dark) - **Text Visibility Rule (New):** - āđƒāļŠāđ‰ **Utility Classes** āļĢāļ°āļšāļļāļŠāļĩāļ•āļĢāļ‡āđ† āđāļ—āļ™āļ•āļąāļ§āđāļ›āļĢ CSS āđƒāļ™āļˆāļļāļ”āļŠāļģāļ„āļąāļāđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļŠāļĩāđ€āļžāļĩāđ‰āļĒāļ™ - Ex: `

` - **Fonts:** Prompt (Headings), Sarabun (Body) --- ## 6. Dependency Map & Relationships (āđāļœāļ™āļœāļąāļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđ„āļŸāļĨāđŒ) āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđƒāļŠāđ‰āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ€āļ§āļĨāļēāđāļāđ‰āđ„āļ‚āđ‚āļ„āđ‰āļ” āđ€āļžāļ·āđˆāļ­āļ”āļđāļ§āđˆāļēāđ„āļŸāļĨāđŒāđ„āļŦāļ™āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļŦāļĢāļ·āļ­āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒāđ„āļŸāļĨāđŒāđƒāļ”āļšāđ‰āļēāļ‡ (Impact Analysis) ### 6.1 Page Dependencies (āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļŦāļĨāļąāļāđƒāļŠāđ‰āļ­āļ°āđ„āļĢāļšāđ‰āļēāļ‡) | Page (āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļš) | Components used (āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāđƒāļŠāđ‰) | Composables used (Logic & API āļ—āļĩāđˆāđƒāļŠāđ‰) | | :--------------------------------- | :------------------------------------------ | :---------------------------------------------------- | | **`pages/index.vue`** (Landing) | `LandingHeader`, `CourseCard` | `useAuth`, `useCourse` (fetchCourses) | | **`pages/browse/discovery.vue`** | `CourseCard`, `FormInput`, `LoadingSpinner` | `useCategory` (Filter), `useCourse` (Search/List) | | **`pages/course/[id].vue`** | `LoadingSpinner`, `UserAvatar` (Instructor) | `useCourse` (Detail, Enroll), `useAuth` (User Status) | | **`pages/classroom/learning.vue`** | `AppSidebar` (Curriculum), `GlobalLoader` | `useCourse` (Video, Progress), `useThemeMode` | | **`pages/dashboard/index.vue`** | `CourseCard` (Recommended), `UserAvatar` | `useAuth` (Profile), `useCourse` (My Courses) | | **`pages/auth/*.vue`** (Login/Reg) | `FormInput`, `LanguageSwitcher` | `useAuth` (Login/Register), `useFormValidation` | ### 6.2 Key Components Dependencies (Component āļ™āļĩāđ‰āļ–āļđāļāđƒāļŠāđ‰āļ—āļĩāđˆāđ„āļŦāļ™) - **`CourseCard.vue`** āļ–āļđāļāđƒāļŠāđ‰āđƒāļ™: - `pages/index.vue` (Recommended) - `pages/browse/index.vue` (Catalog List) - `pages/browse/discovery.vue` (Search Result) - `pages/dashboard/index.vue` (Dashboard Recommend) - `pages/dashboard/my-courses.vue` (My Course List) - **`FormInput.vue`** āļ–āļđāļāđƒāļŠāđ‰āđƒāļ™: - `pages/auth/*` (Login, Register, Forgot Password) - `pages/dashboard/profile.vue` (Edit Profile) ### 6.3 Composable Usage (Logic āļ™āļĩāđ‰āđƒāļ„āļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļšāđ‰āļēāļ‡) - **`useAuth.ts`** -> āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļāļ·āļ­āļšāļ—āļļāļāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļŠāđ‡āļ„ User, Logout, āļŦāļĢāļ·āļ­āđāļŠāļ”āļ‡āļŠāļ·āđˆāļ­ - **`useCourse.ts`** -> āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™āļŦāļ™āđ‰āļē Browse, Course Detail, Classroom, Dashboard - **`useThemeMode.ts`** -> āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™ `layouts/default.vue` āđ€āļžāļ·āđˆāļ­āļ„āļļāļĄ Theme āļ—āļąāđ‰āļ‡āđ€āļ§āđ‡āļš --- ## ïŋ―📊 7. Project Status (āļŠāļ–āļēāļ™āļ°āļāļēāļĢāļžāļąāļ’āļ™āļē) ### ✅ Completed Updates (āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ—āļģāđ€āļŠāļĢāđ‡āļˆāđāļĨāđ‰āļ§) 1. **Code Cleanup:** āļĨāļšāđ„āļŸāļĨāđŒāļ‚āļĒāļ° (Mock Data pages) āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļš 2. **Theme Refinement:** āđāļāđ‰āđ„āļ‚āļ›āļąāļāļŦāļēāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ Text Color āđƒāļ™ Light/Dark Mode āļŦāļ™āđ‰āļē `learning.vue` āđāļĨāļ° `discovery.vue` āđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ 3. **API Integration:** āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāļŦāļĨāļąāļāļ„āļĢāļšāļ–āđ‰āļ§āļ™ (Auth, Course, Enroll, Learning Progress) 4. **Localization:** āļĢāļ­āļ‡āļĢāļąāļšāļ āļēāļĐāļēāđ„āļ—āļĒāļŠāļĄāļšāļđāļĢāļ“āđŒāļžāļĢāđ‰āļ­āļĄāļ„āļģāļ­āļ˜āļīāļšāļēāļĒāđ‚āļ„āđ‰āļ” ### ïŋ― Pending / Future Work (āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ—āļģāļ•āđˆāļ­) 1. **Quiz System:** āļŦāļ™āđ‰āļē Quiz āļĒāļąāļ‡āļĢāļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ API (`/api/quizzes`) 2. **Certificates:** āļĢāļ°āļšāļšāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđƒāļšāļ›āļĢāļ°āļāļēāļĻāļ™āļĩāļĒāļšāļąāļ•āļĢ 3. **Advanced Features:** Upload āļĢāļđāļ›āđ‚āļ›āļĢāđ„āļŸāļĨāđŒāļˆāļĢāļīāļ‡, āļĢāļ°āļšāļš Reviews/Rating āļ„āļ­āļĢāđŒāļŠāđ€āļĢāļĩāļĒāļ™ ---