# 🛍️ Sinov loyihasi: Modul B — ShopPress (Onlayn savdo markazi) ## 1. Loyiha haqida qisqacha ma'lumot Jadal rivojlanayotgan elektron tijorat bozorida **ShopPress** startapi ma'murlarga mahsulotlar va buyurtmalarni bevosita boshqarish imkonini beruvchi o'zining savdo platformasini ishga tushirmoqda. Ma'murlar mahsulotlarni ro'yxatdan o'tkazishi va boshqarishi hamda buyurtmalarni qayta ishlashi mumkin, oddiy tashrif buyuruvchilar esa mahsulotlarni ko'rishlari va sotib olishlari mumkin. Ushbu loyihada ishtirokchilar ma'lumotlar bazasini loyihalashdan tortib asosiy funksiyalarni amalga oshirishgacha bo'lgan barcha ishlarga javobgardirlar. Bu MVP (minimal hayotiy mahsulot) bo'lgani uchun asosiy funksionallikni amalga oshirishga e'tibor qarating. **Dizayn baholash mezoni hisoblanmaydi.** --- ## 2. Texnologiyalar to'plami va cheklovlar * **Texnologiyalar to'plami**: Dasturlash tili yoki freymvork bo'yicha cheklovlar yo'q. Laravel, Django, Ruby on Rails yoki Spring Boot kabi server-side rendering (SSR) qobiliyatiga ega har qanday freymvorkni erkin tanlashingiz mumkin. * **Ish stoli muhiti**: Responsiv (moslashuvchan) dizayn talab qilinmaydi. Ilova faqat Chrome brauzerining desktop versiyasida ishlashi kerak. * **Rasm yuklash**: Mahsulot rasmlari faqat JPG yoki PNG formatida bo'lishi kerak, fayl hajmi **5MB** bilan cheklangan. Ushbu tekshirish (validation) **server tomonida** amalga oshirilishi shart. * **Ma'lumotlar bazasi**: Kategoriyalar alohida jadvalda (`categories`) boshqarilishi kerak. Mahsulotlar jadvali (`products`) `category_id` ni tashqi kalit (FK) sifatida ko'rsatishi kerak. * **Dastlabki ma'lumotlar**: Quyidagi ma'lumotlar birinchi ishga tushirilganda (Seeder yoki Migration orqali) avtomatik ravishda yaratilishi kerak. * Ma'mur (Admin) hisobi: Ismi `Admin`, Email `admin@shoppress.local`, Parol `password` (parol xesh shaklida saqlanishi kerak) * Kamida 3 ta dastlabki kategoriya (masalan, `Kiyim-kechak`, `Elektronika`, `Oziq-ovqat`) --- ## 3. Bajarilishi kerak bo'lgan vazifalar ### **1. Autentifikatsiya** #### 1.1 Tizimga kirish va sessiyalarni boshqarish Kirish sahifasiga `/admin/login` manzili orqali kirish mumkin. Foydalanuvchi o'z emaili va parolini kiritadi. Muvaffaqiyatli kirishdan so'ng, foydalanuvchi ma'mur paneliga (dashboard) yo'naltiriladi. Xato bo'lsa, **"Incorrect email or password."** xabarini ko'rsating. Tizimga kirmasdan `/admin` ostidagi har qanday yo'nalishga kirishga urinish foydalanuvchini kirish sahifasiga qayta yo'naltiradi. Tizimdan chiqish sessiyani yo'q qiladi va kirish sahifasiga yo'naltiradi. Hozirda tizimga kirgan ma'murning ismi barcha ma'muriy sahifalarning navigatsiya qismida ko'rsatilishi kerak. --- ### **2. Ma'mur (Admin) funksiyalari** #### 2.1 Dashboard (Boshqaruv paneli) Dashboard standart ma'muriy sahifa bo'lib (`/admin` yoki `/admin/dashboard`), tizimga kirgandan keyin ko'rsatiladigan birinchi sahifadir. Dashboardda quyidagi 4 ta statistikani kartalar shaklida ko'rsating. | Karta yorlig'i | Mazmuni | | :--- | :--- | | **Total Products** | Mahsulotlarning umumiy soni | | **Active Products** | Statusi `Active` bo'lgan mahsulotlar soni | | **Total Orders** | Buyurtmalarning umumiy soni | | **Total Revenue** | Barcha yakuniy to'lov miqdorlarining yig'indisi (kupon chegirmalaridan keyin) | Shuningdek, eng oxirgi joylashtirilgan 5 ta buyurtma ro'yxatini ko'rsating. Har bir qatorda: Buyurtma raqami, Mijoz, Jami summa, Status va Sana bo'lishi kerak. #### 2.2 Mahsulotlarni boshqarish Mahsulotlarni boshqarish sahifasi (`/admin/products`) barcha mahsulotlarni jadvalda ko'rsatadi. Jadval ustunlari: **Nomi**, **Kategoriyasi**, **Narxi**, **Zaxira (Stock)**, **Statusi**, **Yaratilgan sana**, Tahrirlash / O'chirish tugmalari. Mahsulotlarni nomi bo'yicha filtrlash uchun qidiruv maydonini taqdim eting. Qidiruv so'zi yuborilganda faqat nomi ushbu kalit so'zni o'z ichiga olgan mahsulotlar ko'rsatiladi. **Mahsulotni ro'yxatdan o'tkazish shakli** (`/admin/products/new`) va **mahsulotni tahrirlash shakli** (`/admin/products/{id}/edit`) quyidagi maydonlarni o'z ichiga olishi kerak. * **Nomi** (majburiy, maksimal 100 belgi) * **Kategoriya** (majburiy, dropdown — ma'lumotlar bazasidagi kategoriyalar bilan to'ldirilgan) * **Narxi** (majburiy, butun son, 0 yoki undan katta) * **Zaxira (Stock)** (majburiy, butun son, 0 yoki undan katta) * **Tavsifi** (`