87 lines
5.7 KiB
Markdown
87 lines
5.7 KiB
Markdown
# hBarkodDB - Akıllı Barkod Veritabanı ve Tarayıcı
|
||
|
||
Bu proje, `adresler.html` dosyasındaki ürün linklerini (barkodist.com) asenkron olarak tarayarak **Ürün Adı, Ürün Resmi, Kategorisi, Ait Olduğu Şirket ve Barkod Numarasını** ayıklayan ve bunları bir veritabanında toplayan akıllı bir otomasyon sistemidir.
|
||
|
||
Proje, tarama sürecini kontrol edebileceğiniz, veriler içinde arama yapıp düzenleme gerçekleştirebileceğiniz ve EAN-13 Barkod ile QR Kod üretebileceğiniz premium görünümlü, modern bir karanlık mod web arayüzüne sahiptir.
|
||
|
||
---
|
||
|
||
## 🚀 Mimaride Yapılan Son Güncelleştirmeler ve İyileştirmeler
|
||
|
||
### 1. In-Memory Batching Queue Manager (MySQL Kilitlenme Çözümü)
|
||
- **Sorun**: 5 asenkron işçi (thread) veritabanından aynı anda "pending" durumundaki URL'leri okumaya ve "processing" olarak güncellemeye çalıştığında, MySQL üzerinde satır kilitlenmeleri (deadlock) ve transaction çakışmaları meydana geliyordu.
|
||
- **Çözüm**: Sunucu belleğinde (RAM) çalışan ortak bir kuyruk yöneticisi (`getNextQueueItem`) geliştirildi. İşçiler veritabanını tek tek satır düzeyinde sorgulamak yerine, tek sorguda 20 adet pending URL'yi topluca çekerek veritabanında `processing` durumuna çeker ve RAM'de sırayla tüketir. Bu sayede veritabanı kilitlenmeleri tamamen engellenmiş ve tarama performansı maksimize edilmiştir.
|
||
|
||
### 2. HTTP Short-Polling Fallback (Anlık Gösterim Yedek Sistemi)
|
||
- **Sorun**: Server-Sent Events (SSE) protokolü, tarayıcı ayarları, kurumsal güvenlik duvarları veya yerel ağ proxy yapılandırmaları nedeniyle anlık log akışını ve istatistikleri bloke edebiliyordu. Bu durumda arayüz bağlantı aşamasında takılı kalıyordu.
|
||
- **Çözüm**: Ön yüzde [app.js](file:///D:/Calismalar/ai/hBarkodDB/public/app.js) içerisine akıllı bir yedek sistem yazıldı. SSE bağlantısı 2.5 saniye içinde kurulamadığı veya koptuğu anda, sistem otomatik olarak HTTP kısa sorgulama (Short-Polling) moduna geçerek her 1.5 saniyede bir `/api/stats` endpoint'ini sorgular. Bu sayede canlı panel her şartta kesintisiz çalışır.
|
||
|
||
### 3. Eşsiz URL Ayıklama (Kuyruk Süzgeci)
|
||
- `adresler.html` dosyası içinde toplam **91,592 adet** ürün bağlantısı yer almaktadır.
|
||
- Ancak bu linkler mükerrer (aynı ürün adresinin birden fazla kez tekrarlanması) kayıtlar barındırır.
|
||
- Veritabanı bütünlüğünü korumak ve mükerrer taramayı engellemek adına kuyruk tablosundaki `url` sütununa benzersizlik (`@unique`) kısıtı getirilmiştir.
|
||
- Yapılan analiz sonucunda dosyada tam olarak **11,439 adet benzersiz ürün** adresi olduğu tespit edilmiş ve kuyruğa başarıyla bu miktarda aktarım yapılmıştır.
|
||
|
||
### 4. Prisma `groupBy` Sıralama & Filtreleme Optimizasyonu
|
||
- Kategori ve Şirket filtre comboları doldurulurken, Prisma'nın `groupBy` sorgularında `take` filtresinin sıralama kısıtı aşılmıştır.
|
||
- Tüm kategori ve şirket filtreleri **ürün sayısına göre azalan sırada (en popüler olandan en aza)** listelenecek şekilde `orderBy` optimizasyonuyla güncellenmiştir.
|
||
|
||
---
|
||
|
||
## 🛠️ Kurulum ve Çalıştırma
|
||
|
||
### 1. Gereksinimler
|
||
- Node.js (v18+)
|
||
- MySQL (Varsayılan olarak XAMPP localhost:3306 ve `root` şifresiz kullanıcısı)
|
||
|
||
### 2. Veritabanı Hazırlama
|
||
MySQL sunucunuz çalışırken aşağıdaki komut veritabanını ve gerekli tabloları otomatik oluşturur:
|
||
```bash
|
||
npx prisma migrate dev --name init
|
||
```
|
||
|
||
### 3. Çalıştırma
|
||
Projeyi başlatmak için aşağıdaki komutu çalıştırın:
|
||
```bash
|
||
npm start
|
||
```
|
||
Uygulama başlatıldığında `adresler.html` dosyasını otomatik okuyarak **11,439 eşsiz adresi** veritabanı kuyruğuna yükleyecek ve tarama işlemine hazır hale getirecektir.
|
||
|
||
Web arayüzüne tarayıcınızdan şu adresten ulaşabilirsiniz:
|
||
👉 **[http://localhost:3000](http://localhost:3000)**
|
||
|
||
---
|
||
|
||
## 📁 Proje Yapısı
|
||
|
||
- [prisma/schema.prisma](file:///D:/Calismalar/ai/hBarkodDB/prisma/schema.prisma): Veritabanı modelleri (Product ve ScrapeQueue).
|
||
- [src/server.js](file:///D:/Calismalar/ai/hBarkodDB/src/server.js): API yolları, Express sunucusu, istek loglayıcı ve SSE canlı veri yayını.
|
||
- [src/scraper.js](file:///D:/Calismalar/ai/hBarkodDB/src/scraper.js): HTML okuyucu, asenkron tarayıcı işçileri (in-memory batching) ve sayfa ayıklama mantığı.
|
||
- [src/utils.js](file:///D:/Calismalar/ai/hBarkodDB/src/utils.js): Ürün adı miktar & birim temizleme algoritması.
|
||
- [public/index.html](file:///D:/Calismalar/ai/hBarkodDB/public/index.html): Dashboard ve Veritabanı sekmelerinin bulunduğu HTML5 arayüzü (app.js scripti entegre edilmiştir).
|
||
- [public/style.css](file:///D:/Calismalar/ai/hBarkodDB/public/style.css): Glassmorphism ve mikrogiriş animasyonlu modern vanilla CSS.
|
||
- [public/app.js](file:///D:/Calismalar/ai/hBarkodDB/public/app.js): Ön uç dinamik yönetimi, kısa sorgulama yedek mekanizması ve JsBarcode/QRCode.js entegrasyonu.
|
||
- [.gitignore](file:///D:/Calismalar/ai/hBarkodDB/.gitignore): Git takibine alınmaması gereken dosyaların yapılandırılması.
|
||
|
||
---
|
||
|
||
## ⚙️ Farklı Veritabanlarına Geçiş (Prisma)
|
||
|
||
Projeyi MySQL'den başka bir veritabanına geçirmek oldukça kolaydır.
|
||
|
||
### SQLite'a Geçiş:
|
||
1. `prisma/schema.prisma` dosyasındaki `provider` değerini değiştirin:
|
||
```prisma
|
||
datasource db {
|
||
provider = "sqlite"
|
||
url = "file:./dev.db"
|
||
}
|
||
```
|
||
2. `@db.VarChar` ve `@db.Text` gibi veritabanına özel tipleri şemadan kaldırın.
|
||
3. Yeniden migration oluşturun: `npx prisma migrate dev --name init_sqlite`
|
||
|
||
### PostgreSQL veya SQL Server'a Geçiş:
|
||
1. `.env` dosyasındaki `DATABASE_URL` değerini yeni sunucunuza göre düzenleyin.
|
||
2. `prisma/schema.prisma` dosyasında `provider` değerini `"postgresql"` veya `"sqlserver"` yapın.
|
||
3. `npx prisma migrate dev` komutunu çalıştırın.
|