World Vibe Web
The distributed app store for vibe-coded projects. Browse, discover, and install open-source apps from across GitHub.
翻譯準備中
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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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) |