Saleor Store
우리 컬렉션을 쇼핑하세요
Kasb Egalari — O'zbekiston ijodkorlari va barcha onlayn kasb egalari uchun platforma: videograf, dizayner, montajchi va boshqa mutaxassislar katalogi, xavfsiz buyurtma, jamoalar va kanallar, jonli efi
커머스TypeScript · CSSGitHub @gafurovabdulloh72-del온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Kasb Egalari — O'zbekiston ijodkorlari va barcha onlayn kasb egalari uchun platforma: videograf, dizayner, montajchi va boshqa mutaxassislar katalogi, xavfsiz buyurtma, jamoalar va kanallar, jonli efirlar, to'lovsiz vakansiyalar va rezyumelar.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Kasb Egalari — O'zbekistonning 14 ta hududi bo'ylab videograf, montajor, dizayner va boshqa ijodiy mutaxassislarni bir joyda topish platformasi. Mijoz interaktiv xaritada viloyatni bosadi, portfolio va narxlarni ko'radi, to'g'ridan-to'g'ri buyurtma beradi. Mutaxassis esa bepul ro'yxatdan o'tib, profil va portfoliosini joylaydi — buyurtmalar kabinetiga keladi.
/xarita) — hududlar mutaxassislar soniga qarab bo'yaladi (choropleth). Hududni bosing — ro'yxat chiqadi; yo'nalish tanlansa xarita ranglari ham shu yo'nalish bo'yicha qayta hisoblanadi. Holat URL bilan sinxron (?region=&category=)./mutaxassislar) — qidiruv, yo'nalish, hudud, narx, tajriba, "faqat tasdiqlanganlar" filtrlari, saralash va sahifalash./admin) — statistika, yangi profillarni tasdiqlash, "tavsiya etilgan" belgisi, o'chirish, so'nggi foydalanuvchilar va buyurtmalar.sitemap.xml, robots.txt, Open Graph, PWA manifest.Barcha interfeys matnlari o'zbek tilida (lotin).
| Qatlam | Nima ishlatilgan |
|---|---|
| Framework | Next.js 15 (App Router, Server Components, Route Handlers), React 19, TypeScript (strict) |
| Uslub | Tailwind CSS v4, "Studio" dizayn tizimi (src/app/globals.css), lokal shriftlar: Unbounded, Manrope, Instrument Serif |
| Ma'lumotlar bazasi | SQLite / libSQL (@libsql/client) + Drizzle ORM (drizzle-kit push bilan sxema) |
| Autentifikatsiya | Cookie'dagi JWT (jose), parollar bcryptjs bilan xeshlanadi, middleware.ts himoyalangan yo'llarni tekshiradi |
| Tekshiruv | Zod sxemalari (src/lib/validators.ts) — API va formalar uchun bitta manba |
| Ikonkalar | lucide-react |
| Xarita | Inline SVG, geoBoundaries ma'lumotlaridan avtomatik yaratilgan yo'llar |
Talablar: Node.js 20+ va npm.
cp .env.example .env # muhit o'zgaruvchilari
npm i # bog'liqliklar
npm run db:push # SQLite sxemasini yaratish (data/redince.db)
npm run db:seed # namuna ma'lumotlar: admin, mijozlar, 65 ta mutaxassis, sharhlar, buyurtmalar
npm run dev # http://localhost:3000
Boshqa skriptlar:
| Skript | Vazifasi |
|---|---|
npm run build / npm start | Production build va server |
npm run typecheck | tsc --noEmit |
npm run db:reset | Bazani o'chirib, qayta yaratish va to'ldirish |
npm run db:studio | Drizzle Studio (bazani brauzerda ko'rish) |
.env)| Kalit | Tavsif |
|---|---|
DATABASE_URL | file:./data/redince.db (lokal) yoki libsql://xxx.turso.io |
DATABASE_AUTH_TOKEN | Turso ishlatilsa — token |
AUTH_SECRET | JWT imzosi uchun uzun tasodifiy satr (kamida 32 belgi): openssl rand -base64 48 |
ADMIN_EMAIL, ADMIN_PASSWORD | Seed paytida yaratiladigan admin hisobi |
npm run db:seed dan keyin:
| Rol | Parol | |
|---|---|---|
| Admin | [email protected] | admin12345 |
| Mutaxassis | [email protected] | demo12345 |
| Mijoz | [email protected] | demo12345 |
Qolgan mutaxassislar uchun ham parol demo12345.
src/
├─ app/
│ ├─ page.tsx # Bosh sahifa (hero xarita, yo'nalishlar, tavsiya etilganlar)
│ ├─ xarita/ # To'liq xarita rejimi (MapExplorer)
│ ├─ mutaxassislar/ # Katalog + [slug] profil sahifasi
│ ├─ buyurtma/[id]/ # Buyurtma berish formasi
│ ├─ auth/kirish, auth/royxat # Kirish / ro'yxatdan o'tish
│ ├─ kabinet/ # Umumiy, buyurtmalar, profil, portfolio
│ ├─ admin/ # Admin panel
│ ├─ api/ # Route Handlers (quyidagi jadval)
│ ├─ not-found.tsx # 404
│ ├─ layout.tsx, globals.css # Asosiy layout va dizayn tizimi
│ └─ sitemap.ts, robots.ts, manifest.ts
├─ components/
│ ├─ ui/ # Primitivlar: Button, Badge, Avatar, Stars, Card, SectionHeading, EmptyState…
│ ├─ map/ # UzbekistanMap (SVG), MapExplorer, HomeMapSection, regions-geo.ts
│ ├─ specialists/ # Karta, filtrlar, sahifalash, portfolio galereyasi, sharhlar
│ ├─ orders/ # Buyurtma formasi va ro'yxati
│ ├─ kabinet/ # Kabinet navigatsiyasi va formalar
│ ├─ admin/ # AdminSpecialistsTable
│ └─ layout/ # Navbar, Footer, ThemeToggle, Backdrop
├─ lib/
│ ├─ db/schema.ts # Drizzle sxemasi (users, specialists, portfolio_items, orders, reviews)
│ ├─ db/seed.ts # Namuna ma'lumotlar
│ ├─ queries.ts # Server tomonidagi so'rovlar (server-only)
│ ├─ auth.ts # Sessiya, JWT, parol
│ ├─ api.ts # Route handler yordamchilari (ok / fail / parseBody / requireSession)
│ ├─ validators.ts # Zod sxemalari
│ ├─ constants.ts # 14 hudud, 8 yo'nalish, buyurtma holatlari
│ └─ utils.ts # cn, formatPrice, slugify, timeAgo…
├─ fonts/ # Unbounded, Manrope, Instrument Serif (woff2)
└─ middleware.ts # /kabinet, /admin, /buyurtma himoyasi
Barcha javoblar bir xil ko'rinishda:
{ "ok": true, "data": { } }
{ "ok": false, "error": "Xabar", "fields": { "email": "Email band" } }
| Metod | Yo'l | Kirish | Tavsif |
|---|---|---|---|
POST | /api/auth/register | — | Ro'yxatdan o'tish (role: client | specialist), sessiya cookie o'rnatiladi |
POST | /api/auth/login | — | Kirish |
POST | /api/auth/logout | — | Chiqish |
GET | /api/auth/me | — | Joriy foydalanuvchi (yoki null) |
GET | /api/specialists | — | Katalog. Parametrlar: q, region, category, priceMax, experience, verified=1, sort (rating|popular|newest|price_asc|price_desc), page, limit (≤60) → { items, total, page, pages } |
GET | /api/specialists/[slug] | — | Profil: portfolio va sharhlar bilan |
GET | /api/regions/stats | — | Hududlar va yo'nalishlar bo'yicha sonlar (xarita uchun) |
PUT | /api/profile | mutaxassis / admin | Mutaxassis profilini yaratish yoki yangilash |
PATCH | /api/profile | har qanday | Akkaunt: ism, telefon, avatar |
POST | /api/portfolio | mutaxassis / admin | Portfolio ishi qo'shish (ko'pi bilan 30 ta; YouTube uchun thumbnail avtomatik) |
DELETE | /api/portfolio/[id] | egasi / admin | Ishni o'chirish |
POST | /api/orders | har qanday | Buyurtma yuborish |
GET | /api/orders | har qanday | Mening buyurtmalarim (mijoz va mutaxassis sifatida) |
PATCH | /api/orders/[id] |
Hudud chegaralari geoBoundaries (gbOpen, UZB ADM1) ma'lumotlar to'plamidan olingan — litsenziya CC BY 4.0. GeoJSON equirectangular proyeksiyada (o'rta kenglik bo'yicha tuzatilgan) tekislikka o'tkazilib, Douglas–Peucker algoritmi bilan soddalashtirilgan va src/components/map/regions-geo.ts fayliga SVG path ko'rinishida yozilgan (fayl avtomatik yaratilgan, qo'lda tahrirlanmaydi). Har bir hududning markazi (cx, cy) markerlar va yorliqlar uchun ishlatiladi.
Manba: geoboundaries.org — Runfola, D. et al. (2020). geoBoundaries: A global database of political administrative boundaries.
AUTH_SECRET majburiy. Productionda u o'rnatilmagan bo'lsa server ishga tushmaydi (dev rejimida vaqtinchalik kalit ishlatiladi). Kalit almashtirilsa barcha sessiyalar bekor bo'ladi.DATABASE_URL=libsql://… va DATABASE_AUTH_TOKEN. Sxemani npm run db:push bilan yuboring./api/upload fayllarni public/uploads ichiga yozadi — bu faqat doimiy diskli serverda ishlaydi. Productionda S3 / Cloudflare R2 kabi obyekt saqlovchiga almashtiring (handler bitta joyda: src/app/api/upload/route.ts).next.config.ts → images.remotePatterns da ro'yxatdan o'tkaziladi.httpOnly, sameSite=lax, productionda secure — sayt HTTPS orqali xizmat qilishi kerak.ADMIN_PASSWORD) albatta o'zgartiring.Loyiha kodi — xususiy. Xarita ma'lumotlari — geoBoundaries, CC BY 4.0. Shriftlar — SIL Open Font License.
| tomonlar / admin |
| Holatni o'zgartirish (ruxsat etilgan o'tishlar tekshiriladi) |
POST | /api/reviews | har qanday | Sharh qoldirish / yangilash (bitta mutaxassisga bitta) |
POST | /api/upload | har qanday | Rasm yuklash (multipart/form-data, file, ≤5 MB, jpg/png/webp/gif) → public/uploads |
PATCH | /api/admin/specialists/[id] | admin | { isVerified?, isFeatured? } |
DELETE | /api/admin/specialists/[id] | admin | Mutaxassisni o'chirish (cascade) |