From 01d249c19a3c2ac43f2362b7f5b231521cad2a61 Mon Sep 17 00:00:00 2001 From: supalerk-ar66 Date: Mon, 23 Feb 2026 17:44:02 +0700 Subject: [PATCH] feat: add initial frontend pages for course browsing, recommendations, and user dashboard. --- .../components/layout/AppHeader.vue | 213 ++++++++---------- .../components/layout/LandingFooter.vue | 74 +++--- Frontend-Learner/composables/useCourse.ts | 2 + Frontend-Learner/i18n/locales/en.json | 11 + Frontend-Learner/i18n/locales/th.json | 16 +- Frontend-Learner/layouts/dashboard-index.vue | 122 +++++++++- Frontend-Learner/layouts/default.vue | 127 ++++++++++- Frontend-Learner/nuxt.config.ts | 1 + Frontend-Learner/pages/browse/discovery.vue | 73 ++++-- Frontend-Learner/pages/browse/index.vue | 52 +++-- Frontend-Learner/pages/browse/recommended.vue | 50 ++-- Frontend-Learner/pages/dashboard/index.vue | 10 +- .../pages/dashboard/my-courses.vue | 86 +++---- Frontend-Learner/public/img/logo.png | Bin 0 -> 252284 bytes 14 files changed, 570 insertions(+), 267 deletions(-) create mode 100644 Frontend-Learner/public/img/logo.png diff --git a/Frontend-Learner/components/layout/AppHeader.vue b/Frontend-Learner/components/layout/AppHeader.vue index d7cbacd5..0fd7c08a 100644 --- a/Frontend-Learner/components/layout/AppHeader.vue +++ b/Frontend-Learner/components/layout/AppHeader.vue @@ -8,8 +8,6 @@ import { ref, computed } from "vue"; const props = defineProps<{ - /** Controls visibility of the search bar */ - showSearch?: boolean; /** Controls visibility of the sidebar toggle button */ showSidebarToggle?: boolean; /** Type of navigation links to display */ @@ -19,6 +17,8 @@ const props = defineProps<{ const emit = defineEmits<{ /** Emitted when the hamburger menu is clicked */ toggleSidebar: []; + /** Emitted when the mobile menu toggle is clicked */ + toggleRightDrawer: []; }>(); const { t } = useI18n(); @@ -34,150 +34,135 @@ const navTypeComputed = computed(() => { : "public"; }); -const searchText = ref(""); + diff --git a/Frontend-Learner/components/layout/LandingFooter.vue b/Frontend-Learner/components/layout/LandingFooter.vue index ddcefb4f..52354631 100644 --- a/Frontend-Learner/components/layout/LandingFooter.vue +++ b/Frontend-Learner/components/layout/LandingFooter.vue @@ -1,7 +1,7 @@ @@ -23,17 +23,6 @@

แพลตฟอร์มการเรียนรู้ออนไลน์ที่มุ่งเน้นการพัฒนาทักษะดิจิทัลสำหรับคนรุ่นใหม่ เรียนรู้ได้ทุกที่ ทุกเวลา กับผู้เชี่ยวชาญตัวจริง

-
- - - - - - - - - -
@@ -58,40 +47,51 @@ - -
-

ติดต่อเรา

- + + info@chamomind.com + +
+ -
-

- © {{ new Date().getFullYear() }} E-Learning Platform. All rights reserved. + +

+

+ Copyright © CHAMOMIND CO., LTD. 2023

-
diff --git a/Frontend-Learner/composables/useCourse.ts b/Frontend-Learner/composables/useCourse.ts index 7e477d5f..1ae4a969 100644 --- a/Frontend-Learner/composables/useCourse.ts +++ b/Frontend-Learner/composables/useCourse.ts @@ -171,6 +171,7 @@ export const useCourse = () => { category_id?: number; page?: number; limit?: number; + search?: string; random?: boolean; is_recommended?: boolean; forceRefresh?: boolean @@ -193,6 +194,7 @@ export const useCourse = () => { if (apiParams.category_id) queryParams.append('category_id', apiParams.category_id.toString()) if (apiParams.page) queryParams.append('page', apiParams.page.toString()) if (apiParams.limit) queryParams.append('limit', apiParams.limit.toString()) + if (apiParams.search) queryParams.append('search', apiParams.search) if (apiParams.random !== undefined) queryParams.append('random', apiParams.random.toString()) if (apiParams.is_recommended !== undefined) queryParams.append('is_recommended', apiParams.is_recommended.toString()) diff --git a/Frontend-Learner/i18n/locales/en.json b/Frontend-Learner/i18n/locales/en.json index d6121675..db41be18 100644 --- a/Frontend-Learner/i18n/locales/en.json +++ b/Frontend-Learner/i18n/locales/en.json @@ -291,5 +291,16 @@ "statusNotStarted": "Not Started", "alertIncomplete": "Please answer all questions", "yourAnswer": "Your Answer" + }, + "footer": { + "location": "LOCATION", + "connectWithUs": "CONNECT WITH US", + "broncoHorse": "Bronco Hourse", + "address": "123 อาคารสยามทาวเวอร์ ชั้น 15 เขตปทุมวัน กรุงเทพฯ 10330", + "emailLabel": "Email", + "emailValue": "info{'@'}chamomind.com", + "telLabel": "Tel", + "telValue": "02-123-4567", + "copyright": "© 2026 E-Learning Platform. All rights reserved." } } diff --git a/Frontend-Learner/i18n/locales/th.json b/Frontend-Learner/i18n/locales/th.json index 82c9faf9..86154237 100644 --- a/Frontend-Learner/i18n/locales/th.json +++ b/Frontend-Learner/i18n/locales/th.json @@ -88,7 +88,7 @@ "myCourses": "คอร์สของฉัน", "browseCourses": "ค้นหาคอร์ส", "onlineCourses": "คอร์สออนไลน์", - "recommendedCourses": "คอร์สเรียนออนไลน์แนะนำ", + "recommendedCourses": "คอร์สเรียนแนะนำ", "announcements": "ข่าวประกาศ", "profile": "บัญชีผู้ใช้" }, @@ -107,7 +107,8 @@ "backToCatalog": "กลับหน้ารายการคอร์ส", "selectable": "รายการที่เลือก", "foundTotal": "พบทั้งหมด", - "items": "รายการ" + "items": "รายการ", + "subtitle": "เลือกเรียนรู้ทักษะใหม่ๆ จากหลักสูตรคุณภาพที่คัดสรรมาเพื่อคุณ" }, "myCourses": { "filterAll": "ทั้งหมด", @@ -291,5 +292,16 @@ "statusNotStarted": "ยังไม่ทำ", "alertIncomplete": "กรุณาเลือกคำตอบให้ครบทุกข้อ", "yourAnswer": "คำตอบของคุณ" + }, + "footer": { + "location": "สถานที่ตั้ง", + "connectWithUs": "ติดต่อเรา", + "broncoHorse": "Bronco Hourse", + "address": "123 อาคารสยามทาวเวอร์ ชั้น 15 เขตปทุมวัน กรุงเทพฯ 10330", + "emailLabel": "อีเมล", + "emailValue": "info{'@'}chamomind.com", + "telLabel": "เบอร์โทรศัพท์", + "telValue": "02-123-4567", + "copyright": "© 2026 E-Learning Platform. All rights reserved." } } diff --git a/Frontend-Learner/layouts/dashboard-index.vue b/Frontend-Learner/layouts/dashboard-index.vue index ee14d791..d9ff4593 100644 --- a/Frontend-Learner/layouts/dashboard-index.vue +++ b/Frontend-Learner/layouts/dashboard-index.vue @@ -8,7 +8,12 @@ // Initialize global theme management useThemeMode() -// No sidebar logic needed here as we are removing it +const { currentUser, logout } = useAuth() +const { isDark, set: setTheme } = useThemeMode() +const rightDrawerOpen = ref(false) +const toggleRightDrawer = () => { + rightDrawerOpen.value = !rightDrawerOpen.value +}