8-bo'lim — chuqur tahlil

Kod namunalari

Bu yerda loyihaning haqiqiy kodidan olingan (soddalashtirilgan) 4 ta parcha bor — har biri "Django va OOP" hamda "Kirish va rollar" bo'limlarida aytilgan g'oyalarning aslida qanday yozilishini ko'rsatadi.

1Model — ma'lumot qanday tasvirlanadi

Talaba haqidagi ma'lumot backend'da shunday "blank-forma" (model) sifatida yozilgan:

backend/apps/accounts/models.py

class Student(BaseModel):
    full_name = CharField(max_length=200)
    faculty = CharField(max_length=200)
    student_id = CharField(unique=True, max_length=60)
    password_hash = CharField(max_length=255)
    sport_type = ForeignKey("sports.SportType")
    weekly_star = BooleanField(default=False)
    monthly_star = BooleanField(default=False)

Har bir qator — bazadagi bitta ustun. ForeignKey — "Talaba" jadvalidan "Sport turi" jadvaliga bog'lanish (4-bo'limda gaplashgan g'oya). Bu klass yozilgan zahoti, Django avtomatik ravishda bazada mos jadval va ustunlarni yaratadi — dasturchi qo'lda SQL buyrug'i yozishi shart emas.

2View — so'rovga qanday javob beriladi

Foydalanuvchi /api/sports/ manzilini so'raganda ishga tushadigan haqiqiy kod:

backend/apps/sports/views.py

class SportTypeListView(APIView):
    # GET /api/sports/ — ochiq (kirish shart emas)
    permission_classes = [AllowAny]

    def get(self, request):
        sportlar = SportType.objects.all()
        if request.query_params.get("active") == "1":
            sportlar = sportlar.filter(active=True)
        return Response({"items": SportTypeListSerializer(sportlar, many=True).data})

Bu — restoran misolidagi "oshpaz". Bazadan ma'lumot so'raydi (SportType.objects.all()), kerak bo'lsa filtrlaydi, so'ng frontend tushunadigan formatga o'girib (Serializer) qaytaradi.

3Kirish tekshiruvi — "chiptani" o'qish

Har bir so'rovda foydalanuvchi kimligini aniqlaydigan funksiya (6-bo'limdagi "chipta" tushunchasi shu yerda amalga oshadi):

backend/core/auth.py

def get_session(request):
    token = request.COOKIES.get("tobb_etu_session")
    if not token:
        return None  # chipta yo'q — mehmon sifatida davom etadi
    return decode_token(token)  # chiptani "o'qiydi"

Agar brauzerda "chipta" (cookie) bo'lmasa yoki u soxta/muddati o'tgan bo'lsa, funksiya None qaytaradi — va tizim foydalanuvchini oddiy mehmon sifatida ko'radi, hech qanday maxsus amalga ruxsat bermaydi.

4Frontend — tugma o'z holatini qanday biladi

"Shu sportga qo'shilish" tugmasi uchta holatni bilishi kerak: yuklanmoqda, allaqachon a'zo, yoki hali emas. React'da bu "state" (holat) orqali boshqariladi:

frontend/src/components/sport/JoinSportButton.tsx

const [joining, setJoining] = useState(false);

// tugma bosilganda:
setJoining(true);
const res = await fetch("/api/profile/sports", {
  method: "POST",
  body: JSON.stringify({ sportTypeId: sportId }),
});
setJoining(false);
if (res.ok) showToast("success", "Sportga a'zo bo'ldingiz!");
💡

"State" nima? Bu — komponentning "xotirasi": joining qiymati true bo'lsa, tugma "yuklanmoqda" ko'rinishini oladi; false bo'lsa — oddiy holatga qaytadi. Qiymat o'zgarganda, React ekranni AVTOMATIK qayta chizadi — dasturchi buni qo'lda qilishi shart emas.

5Bu to'rttasi birgalikda

Yuqoridagi to'rt parcha — bitta oddiy amalning (masalan, sportga a'zo bo'lish) to'rt bosqichini ko'rsatadi: Model (ma'lumot qanday saqlanadi) → View (so'rovga qanday javob beriladi) → Auth (kim so'rayotgani tekshiriladi) → Frontend (foydalanuvchiga natija qanday ko'rsatiladi). Butun loyiha — shu bosqichlarning turli mavzular (sport, turnir, yangilik...) uchun ko'p marta takrorlanishidan iborat.