2026-01-20 16:36:20 +07:00
|
|
|
|
# 🛠️ Web Development Documentation: e-Learning Platform (Frontend)
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
เอกสารฉบับนี้สรุปรายละเอียดทางเทคนิค โครงสร้างโค้ด และการทำงานของระบบ **Frontend-Learner**
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-20 16:36:20 +07:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
## 🏗️ 1. Technical Foundation (รากฐานทางเทคนิค)
|
2026-01-20 16:36:20 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
รวมข้อมูลเครื่องมือ, ระบบความปลอดภัย และประสิทธิภาพการทำงานไว้ด้วยกัน
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 1.1 Tech Stack
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **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)
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 1.2 Core Systems & Security
|
2026-01-23 10:11:30 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **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 เดิมซ้ำๆ ในเวลาเดียวกัน
|
2026-01-23 10:11:30 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
---
|
2026-01-23 10:11:30 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
## 📂 2. Frontend Structure (โครงสร้างหน้าเว็บและ UI)
|
2026-01-23 10:11:30 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 2.1 Application Routes (`pages/`)
|
2026-01-23 10:11:30 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
| 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` | การสอบวัดผล |
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 2.2 Reusable Components (`components/`)
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **Layout:** `AppHeader.vue`, `AppSidebar.vue`, `MobileNav.vue` (Navigation หลัก)
|
|
|
|
|
|
- **Common:** `FormInput.vue` (ฟอร์ม), `LoadingSpinner.vue` (สถานะโหลด), `LanguageSwitcher.vue` (เปลี่ยนภาษา)
|
|
|
|
|
|
- **Modules:** `CourseCard.vue` (แสดงผลคอร์สแบบ Grid), `UserAvatar.vue` (รูปโปรไฟล์)
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
## 🧠 3. Logic & Data Layer (Composables + API)
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
รวบรวม Logic และ API Endpoint ที่เกี่ยวข้องไว้ในที่เดียวเพื่อความเข้าใจง่าย
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 3.1 `useAuth.ts` (Authentication & User)
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
จัดการสถานะผู้ใช้, ล็อกอิน, และข้อมูลส่วนตัว
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **Endpoints:**
|
|
|
|
|
|
- `GET /api/user/me`: ดึงข้อมูลโปรไฟล์ (Cached)
|
|
|
|
|
|
- `PUT /api/user/me`: อัปเดตข้อมูลส่วนตัว
|
|
|
|
|
|
- `POST /api/user/change-password`: เปลี่ยนรหัสผ่าน
|
2026-01-28 15:56:38 +07:00
|
|
|
|
- `POST /api/user/upload-avatar`: อัปโหลดรูปโปรไฟล์
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 3.2 `useCourse.ts` (Course & Learning)
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
หัวใจหลักของการเรียนการสอน ตั้งแต่หน้ารายการคอร์สจนถึงห้องเรียน
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **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}`: ดึงวิดีโอเนื้อหา
|
2026-01-28 10:01:21 +07:00
|
|
|
|
- `GET /api/students/courses/{id}/lessons/{lessonId}/access-check`: ตรวจสอบสิทธิ์การเข้าถึงบทเรียน
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- `POST /api/students/lessons/{lessonId}/progress`: บันทึกเวลาเรียน (Video Progress)
|
2026-01-28 10:01:21 +07:00
|
|
|
|
- `GET /api/students/lessons/{lessonId}/progress`: ดึงเวลาเรียนล่าสุด
|
|
|
|
|
|
- `POST /api/students/courses/{id}/lessons/{lessonId}/complete`: บันทึกว่าเรียนจบแล้ว
|
|
|
|
|
|
- `POST /api/students/courses/{id}/lessons/{lessonId}/quiz/submit`: ส่งคำตอบแบบทดสอบ (Quiz)
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 3.3 `useCategory.ts` & Utilities
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- `fetchCategories`: ดึงหมวดหมู่ (`GET /api/categories`) สำหรับตัวกรองหน้า Discovery
|
|
|
|
|
|
- `useFormValidation.ts`: รวม RegEx สำหรับตรวจสอบ Email, Password เบื้องต้น
|
2026-01-27 11:31:08 +07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
## 🎨 4. Design System & Theming
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### 4.1 Dark Mode Strategy
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
ระบบใช้ **Class-based Dark Mode** ของ Tailwind ผสมกับ CSS Variables:
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
- **Backgrounds:** `bg-slate-50` (Light) vs `bg-slate-900` (Dark)
|
|
|
|
|
|
- **Text Visibility Rule (New):**
|
|
|
|
|
|
- ใช้ **Utility Classes** ระบุสีตรงๆ แทนตัวแปร CSS ในจุดสำคัญเพื่อป้องกันสีเพี้ยน
|
|
|
|
|
|
- Ex: `<h1 class="text-slate-900 dark:text-white">`
|
|
|
|
|
|
- **Fonts:** Prompt (Headings), Sarabun (Body)
|
2026-01-13 10:46:40 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
---
|
2026-01-23 10:08:07 +07:00
|
|
|
|
|
2026-01-28 10:01:21 +07:00
|
|
|
|
## 6. Dependency Map & Relationships (แผนผังความสัมพันธ์ไฟล์)
|
2026-01-28 09:55:21 +07:00
|
|
|
|
|
|
|
|
|
|
ส่วนนี้ใช้อ้างอิงเวลาแก้ไขโค้ด เพื่อดูว่าไฟล์ไหนเชื่อมโยงหรือถูกเรียกใช้โดยไฟล์ใดบ้าง (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 ทั้งเว็บ
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## <20>📊 7. Project Status (สถานะการพัฒนา)
|
2026-01-21 17:03:09 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
### ✅ Completed Updates (สิ่งที่ทำเสร็จแล้ว)
|
2026-01-21 17:03:09 +07:00
|
|
|
|
|
2026-01-27 14:34:39 +07:00
|
|
|
|
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:** รองรับภาษาไทยสมบูรณ์พร้อมคำอธิบายโค้ด
|
2026-01-28 15:56:38 +07:00
|
|
|
|
5. **Profile Avatar:** ระบบอัปโหลดรูปโปรไฟล์จริง (`/api/user/upload-avatar`) พร้อมแสดงผลทันทีแบบ Real-time และการจัดการสถานะ (Upload/Change)
|
2026-01-29 17:05:12 +07:00
|
|
|
|
6. **Quiz System Integrations:**
|
|
|
|
|
|
- เชื่อมต่อ API ส่งคำตอบ (`/api/.../quiz/submit`) และแสดงผลคะแนน
|
|
|
|
|
|
- ระบบคำนวณคะแนนและสถานะ Pass/Fail จาก Server จริง
|
|
|
|
|
|
- แก้ไขปัญหา Cache ฯ หน้าเรียน (`learning.vue`) ให้แสดงสถานะ "เรียนจบ" (✅) ทันทีที่สอบผ่าน โดยใช้ Timestamp Query (`?_t=...`) และ Watcher Logic
|
2026-01-21 17:03:09 +07:00
|
|
|
|
|
2026-01-28 15:56:38 +07:00
|
|
|
|
### 🚀 Pending / Future Work (สิ่งที่ต้องทำต่อ)
|
2026-01-21 17:03:09 +07:00
|
|
|
|
|
2026-01-29 17:05:12 +07:00
|
|
|
|
1. **Advanced Features:** ระบบ Reviews/Rating คอร์สเรียน
|
|
|
|
|
|
2. **Certificates:** ระบบดาวน์โหลดใบประกาศนียบัตร (ข้อมูล Backend พร้อมแล้ว รอเชื่อมต่อ UI)
|
|
|
|
|
|
3. **Payment Gateway:** (ถ้ามีในอนาคต)
|
2026-01-16 10:03:04 +07:00
|
|
|
|
|
2026-01-20 16:36:20 +07:00
|
|
|
|
---
|