# ð ïļ 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: `