Skip to content

WebCONuz/edu-test-frontend

Repository files navigation

πŸŽ“ Edu Test β€” Frontend

Test yechish platformasining frontend qismi. Next.js 15, TypeScript, shadcn/ui asosida qurilgan to'liq funksional web ilova.


πŸ›  Texnologiyalar

Texnologiya Versiya Maqsad
Next.js 15 (App Router) Frontend framework
TypeScript 5+ Type safety
Tailwind CSS v4 Styling
shadcn/ui Radix + Nova preset UI komponentlar
TanStack Query v5 Server state, caching, pagination
Zustand + persist latest Client state (auth user)
React Hook Form latest Form management
Zod latest Form validation
react-katex + katex latest LaTeX formula render
js-cookie latest Cookie management

πŸ“ Loyiha strukturasi

edu-test-frontend/
β”œβ”€β”€ app/                          β†’ Next.js routing (faqat page.tsx lar)
β”‚   β”œβ”€β”€ (auth)/                   β†’ Himoyasiz sahifalar (login bo'lsa redirect)
β”‚   β”‚   β”œβ”€β”€ login/
β”‚   β”‚   β”œβ”€β”€ register/
β”‚   β”‚   β”œβ”€β”€ forgot-password/
β”‚   β”‚   └── reset-password/
β”‚   β”œβ”€β”€ admin/                    β†’ Admin panel (admin, super_admin)
β”‚   β”‚   β”œβ”€β”€ layout.tsx            β†’ Role-based sidebar (super_admin vs admin)
β”‚   β”‚   β”œβ”€β”€ dashboard/
β”‚   β”‚   β”œβ”€β”€ subjects/
β”‚   β”‚   β”œβ”€β”€ questions/
β”‚   β”‚   β”œβ”€β”€ students/
β”‚   β”‚   β”œβ”€β”€ sessions/
β”‚   β”‚   β”œβ”€β”€ users/                β†’ Faqat super_admin
β”‚   β”‚   └── teachers/             β†’ Faqat admin
β”‚   β”œβ”€β”€ teacher/                  β†’ Teacher panel
β”‚   β”‚   β”œβ”€β”€ layout.tsx
β”‚   β”‚   β”œβ”€β”€ dashboard/
β”‚   β”‚   β”œβ”€β”€ subjects/
β”‚   β”‚   └── questions/
β”‚   β”œβ”€β”€ student/                  β†’ Student interfeysi (login shart emas)
β”‚   β”‚   β”œβ”€β”€ test/
β”‚   β”‚   β”œβ”€β”€ result/
β”‚   β”‚   └── results/
β”‚   β”œβ”€β”€ layout.tsx                β†’ Root layout (QueryClientProvider)
β”‚   β”œβ”€β”€ page.tsx                  β†’ Landing page
β”‚   └── providers.tsx             β†’ TanStack Query provider
β”œβ”€β”€ features/                     β†’ Business logic (feature-based)
β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”œβ”€β”€ api/                  β†’ auth.api.ts
β”‚   β”‚   β”œβ”€β”€ components/           β†’ LoginForm, RegisterForm, ForgotPasswordForm, ResetPasswordForm
β”‚   β”‚   β”œβ”€β”€ hooks/                β†’ useLogin, useRegister, useForgotPassword, useResetPassword
β”‚   β”‚   β”œβ”€β”€ store/                β†’ auth.store.ts (Zustand β€” user, role)
β”‚   β”‚   └── types/                β†’ auth.types.ts
β”‚   β”œβ”€β”€ students/
β”‚   β”‚   β”œβ”€β”€ api/                  β†’ students.api.ts
β”‚   β”‚   β”œβ”€β”€ components/           β†’ StudentEntryForm, StudentTestPage, StudentResultPage, StudentMyResultsPage
β”‚   β”‚   β”œβ”€β”€ hooks/                β†’ useStudentEntry, useStudentTest, useMyResults
β”‚   β”‚   └── types/                β†’ student.types.ts
β”‚   β”œβ”€β”€ subjects/
β”‚   β”‚   β”œβ”€β”€ api/                  β†’ subjects.api.ts
β”‚   β”‚   β”œβ”€β”€ hooks/                β†’ useSubjects
β”‚   β”‚   └── types/                β†’ subject.types.ts
β”‚   β”œβ”€β”€ teacher/
β”‚   β”‚   β”œβ”€β”€ api/                  β†’ teacher.api.ts (subjects + questions CRUD + import)
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard/        β†’ TeacherDashboardPage
β”‚   β”‚   β”‚   β”œβ”€β”€ subjects/         β†’ TeacherSubjectsPage
β”‚   β”‚   β”‚   └── questions/        β†’ TeacherQuestionsPage
β”‚   β”‚   β”œβ”€β”€ hooks/                β†’ teacher.hooks.ts
β”‚   β”‚   └── types/                β†’ teacher.types.ts
β”‚   β”œβ”€β”€ admin/
β”‚   β”‚   β”œβ”€β”€ api/                  β†’ admin.api.ts (users + students + sessions)
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard/        β†’ AdminDashboardPage
β”‚   β”‚   β”‚   β”œβ”€β”€ subjects/         β†’ AdminSubjectsPage
β”‚   β”‚   β”‚   β”œβ”€β”€ questions/        β†’ AdminQuestionsPage
β”‚   β”‚   β”‚   β”œβ”€β”€ students/         β†’ AdminStudentsPage
β”‚   β”‚   β”‚   β”œβ”€β”€ sessions/         β†’ AdminSessionsPage
β”‚   β”‚   β”‚   β”œβ”€β”€ users/            β†’ AdminUsersPage (super_admin only)
β”‚   β”‚   β”‚   └── teachers/         β†’ AdminTeachersPage (admin only)
β”‚   β”‚   β”œβ”€β”€ hooks/                β†’ admin.hooks.ts
β”‚   β”‚   └── types/                β†’ admin.types.ts
β”‚   └── landing/
β”‚       └── components/           β†’ LandingPage
β”œβ”€β”€ shared/
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ MathText.tsx          β†’ LaTeX formula render
β”‚   β”‚   └── panel-layout/         β†’ PanelSidebar, PanelHeader (shared)
β”‚   β”œβ”€β”€ hooks/                    β†’ global hooks
β”‚   └── types/                    β†’ react-katex.d.ts, global types
β”œβ”€β”€ components/
β”‚   └── ui/                       β†’ shadcn komponentlari (auto-generated)
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ constants.ts              β†’ API_URL, ROUTES
β”‚   β”œβ”€β”€ fetcher.ts                β†’ Global fetch wrapper (401 β†’ auto refresh)
β”‚   └── query-client.ts           β†’ TanStack Query sozlamalari
└── middleware.ts                 β†’ Token tekshiruv + rol himoya + auto refresh

πŸ‘₯ Rollar va imkoniyatlar

Imkoniyat super_admin admin teacher
Barcha fanlarni ko'rish βœ… βœ… βœ…
Fan yaratish/yangilash βœ… βœ… βœ…
Fanni inactive qilish βœ… βœ… Faqat o'ziniki
Barcha savollarni ko'rish βœ… βœ… Faqat o'ziniki
Savol yaratish/yangilash βœ… βœ… βœ…
Fayldan savol import βœ… βœ… βœ…
Studentlar ro'yxati βœ… βœ… ❌
Studentni bloklash/faollashtirish βœ… βœ… ❌
Sessiyalar statistikasi βœ… βœ… ❌
Teacherlar ro'yxati βœ… βœ… ❌
Foydalanuvchilar CRUD βœ… ❌ ❌

πŸ”„ Student flow

/ (landing page)
    ↓
/student β†’ telefon + ism + fan + savol soni + vaqt (daqiqada)
    ↓
check-phone β†’ mavjud user β†’ ism avtomatik to'ldiriladi (readonly)
    ↓
/student/test β†’ savollar + timer + progress bar + javob variantlari
    ↓                           ↓
Vaqt tugasa (auto submit)    "Testni yakunlash" tugmasi
    ↓
/student/result β†’ natija (foiz, to'g'ri/noto'g'ri, vaqt) + savollar tahlili
    ↓
/student/results β†’ telefon orqali barcha testlar tarixi va statistika

πŸ”’ Autentifikatsiya va xavfsizlik

Token saqlash:

  • access_token β€” httpOnly cookie da (1 soat)
  • refresh_token β€” httpOnly cookie da (1 kun)
  • Frontend tokenlarni ko'rmaydi β€” barcha so'rovlarda credentials: 'include'

Auto refresh mexanizmi:

1. middleware.ts β€” sahifaga kirishda:
   access_token expire β†’ GET /auth/refresh (Cookie header bilan)
   β†’ Yangi Set-Cookie response β†’ Foydalanuvchi hech narsa sezmaydi

2. fetcher.ts β€” API so'rovda:
   401 kelsa β†’ GET /auth/refresh β†’ Asl so'rovni qayta yuborish
   Refresh muvaffaqiyatsiz β†’ / ga redirect

Rol himoyasi (middleware.ts):

Route Ruxsat berilgan rollar Ruxsatsiz bo'lsa
/admin/users super_admin /admin/dashboard
/admin/* admin, super_admin /teacher/dashboard
/teacher/* teacher /admin/dashboard
/login, /register Token yo'q Dashboard ga redirect
/student/* Hamma β€”

Zustand persist:

  • user (role, fullName, email) localStorage da saqlanadi
  • Logout β†’ clearUser() β†’ / ga redirect

βž• LaTeX formulalar

Matematik formulalar $...$ formatida saqlanadi va react-katex orqali render qilinadi:

import { MathText } from '@/shared/components/MathText'

<MathText text="$\frac{3}{4}$ kg un kerak" />
// β†’ ΒΎ kg un kerak

<MathText text="Tenglamani yeching: $x^2 - 5x + 6 = 0$" />
// β†’ Tenglamani yeching: xΒ²-5x+6=0

MathText komponenti $...$ qismlarini KaTeX orqali, qolganini oddiy matn sifatida render qiladi. Savol matni, javob variantlari va natija sahifasida ishlatiladi.


πŸ“Š Paginatsiya

Savollar backend tomonidan paginate qilinadi:

useQuestions(page: number, limit: number, subjectId?: string)
// queryKey: ['questions', page, limit, subjectId]
// Response: {
//   data: Question[],
//   meta: { total, page, limit, totalPages, hasNext, hasPrev }
// }

Filter o'zgarganda page avtomatik 1 ga reset bo'ladi. Pagination UI list pastida ko'rsatiladi.


πŸ—‚ Shared komponentlar

PanelSidebar + PanelHeader

Teacher va Admin panellar uchun umumiy layout:

// Har ikki panel bir xil komponentdan foydalanadi
<PanelSidebar title="Teacher Panel" navItems={navItems} />
<PanelHeader pageTitles={pageTitles} />

// Admin layoutda role ga qarab navItems o'zgaradi
const navItems = isSuperAdmin ? superAdminNavItems : adminNavItems

Sidebar da: logo, nav links (active state bilan), user info, logout tugmasi.

fetcher.ts

Barcha API so'rovlar uchun markaziy wrapper:

  • credentials: 'include' β€” cookie avtomatik yuboriladi
  • 401 β†’ auto refresh β†’ retry
  • Query params support
  • FormData support (fayl yuklash uchun)

πŸš€ O'rnatish

1. Repozitoriyani clone qilish

git clone https://github.com/username/edu-test-frontend.git
cd edu-test-frontend

2. Paketlarni o'rnatish

npm install

3. .env.local fayl yaratish

NEXT_PUBLIC_API_URL=http://localhost:4000/api

4. Dasturni ishga tushirish

# Development
npm run dev

# Production build
npm run build
npm run start

Dastur http://localhost:3000 da ishga tushadi.

⚠️ Backend http://localhost:4000 da ishlab turishi kerak. Backend repo: edu-test-backend


πŸ“– Sahifalar ro'yxati

URL Tavsif Himoya
/ Landing page Ochiq
/login Tizimga kirish Ochiq (login bo'lsa redirect)
/register Teacher ro'yxati Ochiq (login bo'lsa redirect)
/forgot-password Parolni tiklash emaili Ochiq
/reset-password?token=... Yangi parol kiritish Ochiq
/student Test boshlash Ochiq
/student/test Test yechish (timer bilan) Ochiq
/student/result Test natijasi + tahlil Ochiq
/student/results Barcha testlar tarixi Ochiq
/teacher/dashboard Statistika va tezkor harakatlar teacher
/teacher/subjects Fanlar CRUD teacher
/teacher/questions Savollar CRUD + import teacher
/admin/dashboard Kengaytirilgan statistika admin, super_admin
/admin/subjects Barcha fanlar boshqaruvi admin, super_admin
/admin/questions Barcha savollar boshqaruvi admin, super_admin
/admin/students Studentlar + bloklash/faollashtirish admin, super_admin
/admin/sessions Sessiyalar statistikasi + filter admin, super_admin
/admin/teachers Teacherlar ro'yxati (readonly) admin
/admin/users Foydalanuvchilar CRUD super_admin

🧩 Feature moduli arxitekturasi

Har bir feature quyidagi tuzilishda bo'ladi:

features/[feature-name]/
β”œβ”€β”€ api/         β†’ fetcher orqali backend bilan muloqot
β”œβ”€β”€ components/  β†’ UI komponentlar
β”œβ”€β”€ hooks/       β†’ TanStack Query hooks (useQuery, useMutation)
β”œβ”€β”€ store/       β†’ Zustand store (kerak bo'lsa)
└── types/       β†’ TypeScript interfeyslari

Asosiy qoida: app/ papkasidagi page.tsx faqat feature komponentni chaqiradi β€” hech qanday logic yo'q:

// app/teacher/subjects/page.tsx
import { TeacherSubjectsPage } from "@/features/teacher/components/subjects/TeacherSubjectsPage";

export default function SubjectsPage() {
  return <TeacherSubjectsPage />;
}

Import tartibi (dependency chain):

types β†’ api β†’ hooks β†’ components β†’ page.tsx

πŸ“ Litsenziya

MIT

Releases

No releases published

Packages

 
 
 

Contributors