From afd729b1ac33634465a0f43f59821612a1c74e2e Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Tue, 25 Aug 2026 03:48:32 +0330 Subject: [PATCH] feat(front): add professor portal view, schedule & earnings charts, and account navigation --- src/api/professorApi.js | 6 + src/layouts/AccountLayout.vue | 24 + src/router/index.js | 6 + src/stores/authStore.js | 5 + src/views/account/AccountHomeView.vue | 82 ++ src/views/account/ProfessorPortalView.vue | 1529 +++++++++++++++++++++ 6 files changed, 1652 insertions(+) create mode 100644 src/api/professorApi.js create mode 100644 src/views/account/ProfessorPortalView.vue diff --git a/src/api/professorApi.js b/src/api/professorApi.js new file mode 100644 index 0000000..cef628b --- /dev/null +++ b/src/api/professorApi.js @@ -0,0 +1,6 @@ +// /src/api/professorApi.js +import axiosInstance from './axiosInstance' + +export const professorApi = { + getPortal: () => axiosInstance.get('/professors/portal') +} diff --git a/src/layouts/AccountLayout.vue b/src/layouts/AccountLayout.vue index 27f4e38..4492f86 100644 --- a/src/layouts/AccountLayout.vue +++ b/src/layouts/AccountLayout.vue @@ -12,6 +12,10 @@ @@ -121,6 +125,26 @@ nav { color: var(--leaf); } +.professor-link { + display: flex; + align-items: center; + gap: 0.5rem; + background: rgba(232, 163, 23, 0.08); + border: 1px solid rgba(232, 163, 23, 0.25); + color: var(--ink); +} + +.professor-link:hover, +.professor-link.router-link-active { + background: linear-gradient(135deg, rgba(232, 163, 23, 0.2), rgba(45, 106, 79, 0.15)); + color: var(--ink); + border-color: var(--saffron); +} + +.professor-icon { + font-size: 1.1rem; +} + .logout-btn { margin-top: 1.25rem; width: 100%; diff --git a/src/router/index.js b/src/router/index.js index 677089b..02fb7d7 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -43,6 +43,12 @@ const routes = [ component: () => import('@/views/account/AccountHomeView.vue'), meta: { title: 'پنل کاربری | گام نو' } }, + { + path: 'teaching', + name: 'professor-portal', + component: () => import('@/views/account/ProfessorPortalView.vue'), + meta: { title: 'میزکار اساتید و تدریس | گام نو' } + }, { path: 'classes', name: 'my-classes', diff --git a/src/stores/authStore.js b/src/stores/authStore.js index a44d631..76a5164 100644 --- a/src/stores/authStore.js +++ b/src/stores/authStore.js @@ -13,6 +13,10 @@ export const useAuthStore = defineStore('auth', () => { if (!user.value) return '' return `${user.value.name || ''}`.trim() }) + const isProfessor = computed(() => { + const roleName = user.value?.role?.name || user.value?.role + return roleName === 'Professor' || user.value?.isProfessor === true + }) function setTokens(access, refresh) { accessToken.value = access @@ -71,6 +75,7 @@ export const useAuthStore = defineStore('auth', () => { user, isAuthenticated, fullName, + isProfessor, setTokens, setUser, login, diff --git a/src/views/account/AccountHomeView.vue b/src/views/account/AccountHomeView.vue index 49e6ca2..951ce64 100644 --- a/src/views/account/AccountHomeView.vue +++ b/src/views/account/AccountHomeView.vue @@ -5,6 +5,17 @@

کلاس‌های ثبت‌شده و گواهی‌نامه‌هایتان را از اینجا مدیریت کنید.

+
+
+
🎓 پنل ویژه اساتید گام نو
+

میزکار و پنل تدریس اساتید

+

مشاهده کلاس‌های در حال برگزاری، زمان‌بندی جلسات، آمار دانشجویان و گزارش و نمودار سهم تدریس شما

+
+ + ورود به میزکار تدریس ← + +
+
کلاس‌های من @@ -72,6 +83,77 @@ onMounted(async () => { color: var(--ink-soft); } +.professor-banner { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; + padding: 1.5rem 1.75rem; + margin-bottom: 1.5rem; + border-radius: 1.25rem; + background: linear-gradient(135deg, #14352b 0%, #1f4e3f 60%, #2d6a4f 100%); + color: var(--chalk); + box-shadow: 0 10px 25px -5px rgba(20, 53, 43, 0.25); + border: 1px solid rgba(232, 163, 23, 0.3); +} + +.professor-badge-pill { + display: inline-block; + font-size: 0.75rem; + font-weight: 700; + padding: 0.2rem 0.65rem; + border-radius: 999px; + background: rgba(232, 163, 23, 0.2); + color: #ffd166; + border: 1px solid rgba(232, 163, 23, 0.4); + margin-bottom: 0.5rem; +} + +.professor-banner h2 { + font-family: var(--font-display); + font-size: 1.35rem; + color: #fff; + margin: 0 0 0.35rem 0; +} + +.professor-banner p { + font-size: 0.88rem; + color: rgba(255, 255, 255, 0.85); + margin: 0; + line-height: 1.5; + max-width: 540px; +} + +.professor-cta-btn { + white-space: nowrap; + padding: 0.75rem 1.25rem; + border-radius: 0.85rem; + background: var(--saffron); + color: var(--ink); + font-weight: 700; + font-size: 0.9rem; + box-shadow: 0 4px 12px rgba(232, 163, 23, 0.3); + transition: transform 0.2s ease, box-shadow 0.2s ease; + flex-shrink: 0; +} + +.professor-cta-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(232, 163, 23, 0.4); +} + +@media (max-width: 768px) { + .professor-banner { + flex-direction: column; + align-items: flex-start; + padding: 1.25rem; + } + .professor-cta-btn { + width: 100%; + text-align: center; + } +} + .summary-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); diff --git a/src/views/account/ProfessorPortalView.vue b/src/views/account/ProfessorPortalView.vue new file mode 100644 index 0000000..76f127f --- /dev/null +++ b/src/views/account/ProfessorPortalView.vue @@ -0,0 +1,1529 @@ + + + + +