12 KiB
12 KiB
สรุปโครงสร้างและหน้าที่ของไฟล์ (File Architecture Summary)
เอกสารนี้สรุปภาพรวมของแต่ละโฟลเดอร์และไฟล์หลักในระบบ Frontend-Learner ว่าแต่ละไฟล์ทำหน้าที่อะไร และมีการเชื่อมโยง (Dependencies) กันอย่างไร
1. 📂 หน้าจอหลัก (Pages Directory: pages/)
ควบคุมการทำงานและการนำทาง (Routing) ของผู้ใช้งานแต่ละหน้า โดยจะเรียกใช้ components/ และ composables/ มาทำงานร่วมกัน
pages/index.vue(หน้า Landing Page):- หน้าที่: หน้าแรกสุดของระบบสำหรับผู้เยี่ยมชม นำเสนอคอร์สเด่น รายละเอียดสถิติ และรีวิวล่าสุด โดยดึงข้อมูลจริงจาก API (Dynamic Data) ขับเคลื่อน UI ทันสมัย
- การเชื่อมโยง: ใช้ Layout
landing, เชื่อมต่อuseCourse,useCategoryและ components พื้นฐานเช่นCourseCard,LandingHeader,LandingFooter,StarIcon, และNuxtTime
pages/auth/(กลุ่มหน้าเข้าสู่ระบบและสมัครสมาชิก):login.vue: หน้าเข้าสู่ระบบ (เชื่อมuseAuth->login())register.vue: หน้าลงทะเบียนผู้ใช้ใหม่ (เชื่อมuseAuth->register())forgot-password.vue: หน้าลืมรหัสผ่าน- การเชื่อมโยง: กลุ่มนี้ใช้ Layout
authและuseFormValidationเพื่อตรวจสอบฟอร์ม
pages/dashboard/(กลุ่มหน้าแผงควบคุมหลักของผู้ใช้):index.vue: หน้า Dashboard หลัก แสดงคอร์สที่กำลังเรียนและคอร์สแนะนำmy-courses.vue: หน้าแสดงคอร์สทั้งหมดที่ผู้เรียนลงทะเบียนแล้วprofile.vue: หน้าจัดการข้อมูลส่วนตัวของผู้ใช้งานannouncements.vue: หน้าแสดงประกาศระบบและประกาศจากคอร์ส- การเชื่อมโยง: ใช้ Layout
default, เชื่อมuseAuth,useCourse, และ components โซนlayout/กับcourse/
pages/classroom/(กลุ่มหน้าห้องเรียนเมื่อเข้าสู่คอร์ส):learning.vue: หน้าจอหลักของการเรียน (มี Video Player เนื้อหาบทเรียน และคอมเมนต์) ควบคุมสถานะความคืบหน้า (Progress)quiz.vue: หน้า Landing ก่อนเริ่มทำแบบทดสอบ แสดงรายละเอียดและสถิติ- การเชื่อมโยง: เชี่อมต่อ
useCourse,useQuizRunnerและเรียกใช้คอมโพเนนต์กลุ่มclassroom/
pages/quiz/[id].vue(หน้าจอขณะทำข้อสอบ):- หน้าที่: นำเสนอตัวคำถามแบบ Interactive และตัวเลือกการตอบ (ข้อความ, ตัวเลือกเดี่ยว, หลายตัวเลือก)
- การเชื่อมโยง: เชื่อมกับตัวจัดการสถานะ
useQuizRunnerหนักที่สุด
pages/course/[id].vue(หน้ารายละเอียดคอร์สก่อนซื้อ/ลงทะเบียน):- การเชื่อมโยง: เชื่อมต้อ
useCourseเพื่อดึงรายละเอียดแบบ SSR (Server-Side Rendering)
- การเชื่อมโยง: เชื่อมต้อ
2. 🧩 ตัวจัดการข้อมูล (Composables Directory: composables/)
เปรียบเสมือน "สมอง" ของระบบ แยกการจัดการข้อมูล (State) และการเรียก API (Fetch) ออกจากหน้าจอ (UI)
useAuth.ts:- หน้าที่: จัดการ Login, Register, Request Reset Password, อัปโหลดรูปโปรไฟล์ (Avatar), ระบบ Token (มีกลไก Refresh Token อัตโนมัติเมื่อพบ 401), และดึง/อัปเดตข้อมูลผู้ใช้
- ถูกเรียกใช้โดย: แทบทุกหน้าจอและ
middleware/auth.ts
useCourse.ts:- หน้าที่: ศูนย์รวม API คอร์สเรียน (ดึงรายการคอร์ส, รายละเอียด, รายชื่อบทเรียน, การลงทะเบียน, ส่งความคืบหน้า, โหลดหน้าวิดีโอ)
- ถูกเรียกใช้โดย:
pages/dashboard/,pages/classroom/,pages/course/และคอมโพเนนต์ที่แสดงรายการคอร์ส
useQuizRunner.ts:- หน้าที่: จัดการสถานะข้อสอบขณะรัน (Current Question), เก็บคำตอบ, ข้ามคำถาม, บันทึกส่งคะแนนเมื่อจบเกม
- ถูกเรียกใช้โดย:
pages/quiz/[id].vueและpages/classroom/quiz.vue
useCategory.ts: ดึงหมวดหมู่หลักสูตร นำไปใช้ทำ Filter ในindex.vueและmy-courses.vueuseThemeMode.ts: จัดการโหมดสว่าง-มืด (Dark/Light mode) บันทึกและซิงค์กับ LocalStorageuseFormValidation.ts: ดักจับ Error และ Validate กฎ (Rules) ต่างๆ ในฟอร์มรหัสผ่าน, สมัครสมาชิกuseNavItems.ts: จัดการรายการเมนูด้านซ้าย (Sidebar Links) เปลี่ยนเมนูตาม Role อัตโนมัติ
3. 📦 คอมโพเนนต์หน้าจอ (Components Directory: components/)
ส่วนประกอบของ UI ที่สามารถนำไปใช้ซ้ำได้ (Reusable) เพื่อลดความซ้ำซ้อนในโค้ดฝั่งหน้าจอ
layout/:AppHeader.vue&AppSidebar.vue: ประกอบร่างเป็นเมนูและส่วนหัวของ LayoutdefaultLandingHeader.vue&LandingFooter.vue: เมนูส่วนหน้าของเว็บ Guest
classroom/:VideoPlayer.vue: ตัวเล่นวิดีโออัจฉริยะ (จัดการ Youtube API และ Native Video) ส่งเวลาดูคืนหน้าlearning.vueเสมอCurriculumSidebar.vue: แถบขวาในห้องเรียนเพื่อกดเปลี่ยนบทเรียน แสดงสถานะล็อก/ผ่าน/กำลังเรียนAnnouncementModal.vue: เด้ง Pop-up แจ้งข่าวสารในคอร์สเรียน
course/:CourseCard.vue: การ์ดสี่เหลี่ยมแสดงหน้าปกคอร์ส (ถูกใช้ในindex.vueและmy-courses.vue)
profile/:- แบบฟอร์มแก้ไขแยกย่อยของหน้า
profile.vueเช่น ฟอร์มเปลี่ยนรหัส (PasswordChangeForm)
- แบบฟอร์มแก้ไขแยกย่อยของหน้า
common/:- คอมโพเนนต์จิปาถะทั่วไปที่ใช้ทุกที่ เช่น สวิตช์เปลี่ยนภาษา (
LanguageSwitcher) สปินเนอร์โหลดของระบบ (GlobalLoader.vue)
- คอมโพเนนต์จิปาถะทั่วไปที่ใช้ทุกที่ เช่น สวิตช์เปลี่ยนภาษา (
4. 🖼 โครงสร้างเลย์เอาต์ (Layouts Directory: layouts/)
เป็นตัวคลุม (Wrapper) พื้นโครงสร้างเว็บของหน้าจอนั้นๆ ไม่ให้กระตุกเมื่อเปลี่ยนเนื้อหา
default.vue: เลย์เอาต์หลัก มี Header และ Sidebar ใช้สำหรับ Dashboardauth.vue: เลย์เอาต์เรียบง่ายตรงกลางจอ มีพื้นหลังเบลอๆ สำหรับหน้า Login/Registerlanding.vue: เลย์เอาต์สำหรับหน้าindex.vueเต็มจอแบบ Modern นำเสนอผลิตภัณฑ์dashboard.vue: เลย์เอาต์สำหรับมุมมอง Dashboard บางชนิด (ขึ้นอยู่กับโปรเจกต์)
5. 🛡 ตัวกรองหน้าและยามรักษาความปลอดภัย (Middleware: middleware/)
auth.ts: ตรวจสอบผู้ใช้ก่อนเข้าหน้าใดๆ เสมอ (Route Guard)- ถ้ายังไม่ Login จะถูกดีดไปหน้า
/auth/login - ถ้าจะเข้าหน้า Login แต่มี Token ล็อกอินแล้ว จะผลักกลับไปหน้า
/dashboard - มันจะพึ่งพา Token ที่จัดการผ่าน
useAuth
- ถ้ายังไม่ Login จะถูกดีดไปหน้า
ภาพรวมการหมุนเวียนข้อมูล (Data Flow Example)
- ล็อกอินและจัดการ Session: หน้า
login.vueกดยืนยัน -> เรียกuseAuth.login()-> ได้ Token และรายละเอียดผู้ใช้ยัดลง Cookie -> หากดึงโปรไฟล์แล้ว API หมดอายุ (401) ระบบจะเรียกrefreshAccessToken()อัตโนมัติเพื่อใช้ต่อ - เข้าห้องเรียน: หน้า
index.vueกดคอร์ส -> ส่งเข้าmiddleware/auth.tsเช็คผ่านเข้าหน้าเรียน ->pages/course/[id].vueเรียกuseCourse.fetchCourseById(id)-> ส่งข้อมูลให้ UI - เปิดคลิปเรียน:
learning.vueส่ง URL ให้<VideoPlayer />เล่น - บันทึกเวลาเรียน:
VideoPlayerเฝ้าดูเวลา (TimeUpdate) -> รายงานตัวเลขกลับมายังบัญชีผู้ใช้ในlearning.vue-> เรียกuseCourse.saveVideoProgress()ส่ง API กลับ Database พร้อมเช็คสถานะเนื้อหาว่าสำเร็จหรือไม่