Ijara Marketpleysi

Ijara

Toshkent uchun ijaralar marketpleysi — egalar buyumlarni (asboblar, elektronika, tadbir jihozlari, transport) joylaydi, ijarachilar ko'rib chiqadi, bron qiladi va onlayn to'laydi. Django REST Framework backend va Nuxt 3 + Pinia frontend bilan qurilgan.

Umumiy ma'lumot

Toshkentda odamlar bir marta sotib olib keyin qo'shnilarga norasmiy ravishda qarz beradigan ko'p narsa bor. Ijara buni rasmiylashtiradi: egalar asboblar, elektronika, tadbir jihozlari va transportni joylaydi; ijarachilar sana bo'yicha ko'rib chiqadi, bron qiladi va onlayn to'laydi. Men to'liq stek yaratdim — bandlov mantiqini boshqaruvchi Django APIdan tranzaksiyalar sodir bo'ladigan Nuxt 3 frontendgacha.

Men nima qildim

  • To'liq Django REST APIni loyihalashtirdim va yaratdim — hisoblar, ro'yxatlar, bandlovlar, to'lovlar va qidiruvni qamrab oluvchi beshta ilova moduli, barchasi aniq shartnomalar uchun OpenAPI sxemasi bilan.

  • Bandlov holat mashinasini va ikki marta bron qilishni oldini olishni yaratdim — bir xil buyumni kesishuvchi sanalarda bron qilishni fizik jihatdan imkonsiz qiladigan Postgres diapazoni cheklovi.

  • Nuxt 3 frontendini yaratdim — sahifa routingi, xotiradagi JWT tokenlari va xavfsiz yangilash cookielari bilan autentifikatsiya, ma'lumot olish, forma tekshiruvi va Stripe to'lov oqimi.

  • Yuklangan fotosuratlardan sarlavha, tavsif va toifani taklif qiluvchi OpenAI-yordamli ro'yxat yordamchisini qo'shdim — egalar uchun birinchi buyumni joylashning to'sig'ini kamaytiradi.

Arxitektura

Django API va Nuxt frontend alohida konteynerda ishlaydi, to'g'ri tartibda ishga tushishlari uchun sog'liq tekshiruvlari. Nuxt serveri barcha API chaqiruvlari uchun proksi vazifasini bajaradi, shuning uchun brauzer faqat bitta manbaga murojaat qiladi. JWT tokenlari xotirada (xavfsiz, lekin yangilanishda o'chiriladi), yangilash tokenlari esa httpOnly cookieda — xavfsizlik va qulay foydalanuvchi tajribasini muvozanatlashtiradigan autentifikatsiya namunasi.

Ichki tuzilishi

  • Postgres diapazoni kesishish cheklovi yordamida ma'lumotlar bazasi darajasida ikki marta bron qilishni oldini olish — hatto ikkita so'rov bir vaqtda kelsa ham, ma'lumotlar bazasi ikkinchisini rad etadi. Bekor qilingan yoki yakunlangan bandlovlar cheklovdan tashqarida, shuning uchun bir xil vaqt oynasi qayta bronlanishi mumkin.

  • To'liq audit izi bilan bandlov holat mashinasi: har bir holat o'zgarishi rol ruxsatlarini tekshiradigan va o'tish yozuvini qo'shadigan yagona funksiya orqali o'tadi — shuning uchun kim nimani va qachon o'zgartirganining to'liq tarixi mavjud.

  • Trigram zaxirasi bilan to'liq matn qidiruvi: ro'yxatlar tez kalit so'z qidiruvi uchun indekslanadi va trigram o'xshashlik tekshiruvi yozuv xatolarini va qisman moslikni ushlaydi — shuning uchun ijarachilar imlosi noto'g'ri bo'lsa ham qidirayotgan narsasini topadi.

Men nimani o'rgandim

  • Biznes qoidalarini ma'lumotlar bazasi darajasida amalga oshirish — faqat ilova kodida emas — bir vaqtda bir xil ma'lumotlarga bir nechta xizmatlar yoki so'rovlar tegsa xavfsiz qolishning yagona yo'li.

  • AI ro'yxat taklif xususiyati sarflangan sa'y-harakatga nisbatan ro'yxat yaratish tajribasiga katta ta'sir ko'rsatdi — ba'zan eng katta ta'sir xususiyatlari eng kichiklari.

Texnologiyalar

Frontend

  • Nuxt 3
  • Vue 3
  • TypeScript
  • Pinia
  • TanStack Query
  • vee-validate
  • Zod
  • @stripe/stripe-js

Backend

  • Django 5.2
  • Django REST Framework 3.16
  • SimpleJWT
  • drf-spectacular
  • Stripe Python SDK v10
  • OpenAI Python SDK v1

Ma'lumotlar

  • PostgreSQL 16
  • btree_gist
  • pg_trgm
  • SearchVectorField
  • GinIndex

Infratuzilma va Testlash

  • Docker Compose
  • uv
  • pytest-django
  • factory-boy
  • Playwright
  • Ruff