Case study
zlitego.pl
Sklep z meblami z drewna litego: płatności Stripe, wysyłka InPost, panel admina, moduł CAD. Pierwsza rzecz, jaką zbudowałem z AI.
Kontekst
Robię meble z drewna litego i potrzebowałem miejsca, w którym mógłbym je pokazać — a przy okazji chciałem się nauczyć, jak zbudować sklep od podszewki. To był mój pierwszy projekt zrobiony z AI: powstał z własnej potrzeby, nie na zlecenie.
Problemy nie były przez to wymyślone. Meble z drewna litego to egzemplarze pojedyncze, nie produkty katalogowe — każdy stół czy strugnica istnieje raz. Sklep musiał to odzwierciedlić: rezerwować towar w koszyku, żeby dwie osoby nie kupiły tego samego egzemplarza, i traktować dostawę inaczej dla mebli, których transportu nie da się wycenić z góry.
Co zbudowałem
- Stronę główną z pięcioma ścieżkami: sprzedaż, galeria realizacji, odkup starych mebli, kontakt i szkicownik.
- Galerię projektów z opisem wyrobu i zdjęciami z pracowni.
- Koszyk z regułą wygaszania opcji dostawy przy produktach wymagających indywidualnej wyceny transportu.
- Rezerwacje towaru w koszyku, które wygasają i wracają do sprzedaży.
- Płatności online przez Stripe i wysyłkę przez InPost ShipX.
- Panel administracyjny z blokadą logowania po adresie IP.
- Szkicownik CAD, w którym klient rysuje konstrukcję z wymiarami w milimetrach i wysyła projekt do wyceny.
Sedno
Decyzje techniczne
Dlaczego sklep odbiera klientowi wybór dostawy?
Strugnicy dębowej za 3300 zł nie wyśle się paczkomatem. Sklep to wie: przy produktach wymagających indywidualnej wyceny transportu wygasza opcje wysyłki i zostawia sam odbiór osobisty, zamiast pozwolić zamówić kuriera i tłumaczyć się później. Reguła siedzi w koszyku, nie w regulaminie — klient nie może wybrać czegoś, czego i tak nie da się zrobić.
Dlaczego rezerwacje towaru wygasają?
Meble z drewna litego to egzemplarze pojedyncze — nie ma „drugiej sztuki z magazynu”. Dodanie do koszyka rezerwuje egzemplarz, żeby dwie osoby nie kupiły tego samego stołu, ale rezerwacja wygasa i wraca do sprzedaży. Bez wygasania porzucony koszyk zamrażałby towar na zawsze.
Dlaczego blokada logowania do panelu siedzi w pliku, a nie w sesji?
Bo blokada w sesji nie jest blokadą. Atakujący, który nie odsyła ciasteczka, dostaje nową sesję przy każdym żądaniu — licznik prób startuje od zera i limit znika. Licznik trzymany w pliku, po adresie IP, tego nie da się obejść skasowaniem ciasteczka. Pięć nieudanych prób blokuje adres na 15 minut.
Skąd pomysł na Szkicownik?
Klient wie, czego chce, ale nie umie tego opisać — a ja nie umiem wycenić opisu. Szkicownik odwraca kolejność: klient rysuje konstrukcję z prawdziwymi wymiarami w milimetrach, wysyła projekt, a ja go wykonuję. Zamiast wymiany maili „coś takiego, ale niższe” dostaję rysunek techniczny.
Jak to wygląda
Stack
- PHP 8
- React
- Stripe
- InPost ShipX
- MySQL
- Apache / OVH
- PL/EN
Sklep działa produkcyjnie pod własną domeną — zobacz go w akcji.