Dacă ai un salon, sigur cunoști asta
Clienți care scriu pe Instagram, sună când ești cu alt client sau trimit mesaj seara târziu. Răspunzi când poți, dar programările ajung în mai multe locuri: calendarul telefonului, un carnețel, un chat sau memoria ta.
Când salonul crește puțin, devine greu de ținut sub control. Ai servicii, prețuri, angajați, absențe și ore libere, iar clienții vor să se programeze simplu.
Nordic Cuts arată cum se poate rezolva asta cu o aplicație web proprie pentru un salon mic.
Ce este Nordic Cuts
Nordic Cuts este o aplicație web completă pentru frizerii și saloane. Clientul alege serviciul, frizerul, data și ora direct din browser, de pe mobil sau de pe PC, și vede prețul și durata înainte să trimită programarea.
În spatele paginii publice există un panou de administrare unde salonul gestionează servicii, frizeri, absențe și programări. Soluția e construită cu Java, Spring Boot, React și PostgreSQL. E o aplicație adevărată, nu o pagină de contact cu un formular.
Pentru clienții tăi
Clientul alege serviciul și vede ce frizeri îl fac. Dacă nu are o preferință, alege „Hvem som helst” (oricine), iar sistemul găsește primul frizer liber.
Apoi alege data și o oră liberă, completează numele, telefonul și emailul și acceptă condițiile de confidențialitate. Programarea se salvează în aceeași bază de date pe care o folosește panoul de administrare.
Pentru tine, ca proprietar
Vezi ce este programat, cine face fiecare lucrare și ce servicii oferă salonul. Frizerii sunt legați de serviciile pe care le fac, absențele se înregistrează, iar fiecare programare are un status: în așteptare, confirmată, anulată sau finalizată.
Soluția poate trimite clientului o confirmare pe email, un email când se schimbă statusul și o notificare salonului pentru fiecare programare nouă. Nu plătești comision pe programare, iar datele clienților rămân în baza de date a salonului.
Ce include
- Pagină publică pentru salon, cu un design întunecat și modern.
- Programare online în patru pași: serviciu, frizer, oră și date de contact.
- „Hvem som helst” (oricine): sistemul alege primul frizer liber care face serviciul.
- Protecție împotriva programărilor duble, verificată în backend.
- Servicii cu preț, durată și descriere.
- Frizeri cu poză, status și serviciile pe care le fac.
- Înregistrarea absențelor angajaților.
- Programări cu status: în așteptare, confirmată, anulată și finalizată.
- Confirmare pe email pentru client și notificări pentru salon.
- Acord de confidențialitate (GDPR) în formularul de programare.
- Autentificare cu roluri de administrator și utilizator.
Pentru cine se potrivește
Se potrivește frizeriilor, barber shop-urilor și saloanelor mici care vor să-și controleze propriul flux de programări. Merge și pentru alte afaceri cu programări, unde clientul alege persoana, serviciul și ora.
Dacă azi gestionezi multe lucruri manual, o astfel de soluție îți poate economisi timp și le face clienților programarea mai simplă.
Cum lucrăm
Nu este un șablon fix în care toată lumea primește exact același lucru. Folosim demo-ul ca punct de plecare și îl adaptăm la salonul tău: servicii, prețuri, angajați, limbi, design și flux de lucru.
Există un cost de pornire pentru dezvoltare și configurare, apoi mentenanță și hosting stabilite clar. Știi ce este inclus înainte să începem.
Tehnologia din spatele Nordic Cuts
Partea asta e pentru curioși sau pentru programatorul pe care vrei să-l întrebi. Pe scurt: o singură aplicație Spring Boot care servește și API-ul, și aplicația React, cu PostgreSQL ca bază de date.
| Componentă | Tehnologie | Ce face |
|---|---|---|
| Backend | Java 21, Spring Boot 4.1, JHipster 9.4 | API REST, reguli de programare, email și securitate |
| Bază de date | PostgreSQL | Salvează servicii, frizeri, absențe și programări |
| ORM | Hibernate 7 cu Spring Data JPA și Ehcache | Leagă clasele Java de tabele, cu cache pentru citiri frecvente |
| Modificări de schemă | Liquibase | Modificări versionate, aplicate automat la pornire |
| Build | Maven Wrapper și frontend-maven-plugin | Construiește backendul și frontendul într-un singur JAR executabil |
| Frontend | React 19, TypeScript 5.9, Tailwind CSS | Pagina publică și fluxul de programare, gândite întâi pentru mobil |
| Administrare | React, Redux Toolkit, Bootstrap 5 | Servicii, frizeri, absențe, programări și utilizatori |
| Securitate | Spring Security cu JWT | Autentificare și roluri de administrator și utilizator |
| Hosting | Docker pe Railway (UE) | Health check, deploy automat din main și repornire la eroare |
| Calitate | GitHub Actions, JUnit, Jest, Cypress, Testcontainers | Fiecare modificare e testată înainte să ajungă în producție |
Backend: Java 21 și Spring Boot 4.1
Baza a fost generată cu JHipster 9.4, apoi adaptată și extinsă pentru un salon. Codul e organizat pe straturi: resursele REST primesc cererile, clasele de serviciu conțin regulile de business, iar repository-urile vorbesc cu baza de date. DTO-urile sunt mapate cu MapStruct, iar tot ce intră e validat cu Bean Validation înainte să fie salvat.
Regulile de programare stau în backend, nu doar în browser. Înainte să salveze o programare, sistemul verifică dacă frizerul nu are deja o programare care se suprapune. Programările anulate nu contează. Dacă clientul alege „Hvem som helst”, backendul caută un frizer activ care face serviciul și e liber în acel interval. Calendarul citește orele ocupate dintr-un endpoint separat și le afișează ca indisponibile.
Emailurile se trimit cu Spring Mail și șabloane Thymeleaf: confirmare pentru client, mesaj la schimbarea statusului și notificare pentru salon.
Bază de date: PostgreSQL, Hibernate și Liquibase
Patru entități JPA descriu salonul: Tjeneste (serviciu), Frisor (frizer), Fravaer (absență) și Bestilling (programare). Un frizer poate face mai multe servicii (many-to-many), o programare indică un serviciu și un frizer, iar o absență aparține unui frizer. Hibernate 7 face legătura dintre obiectele Java și tabelele din PostgreSQL, iar Ehcache e cache de nivel doi pentru datele citite des.
Schema bazei de date nu se modifică niciodată de mână. Fiecare modificare e un changelog Liquibase versionat în Git, aplicat automat la pornirea aplicației. Local folosim H2, testele rulează pe un PostgreSQL real în Docker prin Testcontainers, iar producția folosește PostgreSQL pe Railway.
Securitate și API
Panoul de administrare e protejat cu Spring Security și tokenuri JWT, cu roluri separate de administrator și utilizator. Fără autentificare poți face doar ce îi trebuie unui client: să citești serviciile și frizerii activi, să vezi orele ocupate și să trimiți o programare. Restul cere autentificare, iar API-ul de administrare cere rolul de administrator.
API-ul e documentat cu OpenAPI (springdoc). Spring Boot Actuator oferă health check și metrici în format Prometheus, ca să vezi oricând că aplicația e în viață.
Frontend: React 19 și TypeScript
Frontendul e scris în TypeScript cu React 19, React Router 7 și Redux Toolkit și e împachetat cu Webpack 5. Formularele folosesc react-hook-form, cu validare pe fiecare câmp, apelurile către API trec prin Axios, iar datele calendaristice sunt gestionate cu Day.js.
Partea publică folosește Tailwind CSS, cu un design întunecat propriu, „amber glass”: panouri de sticlă, pete de lumină caldă, granulație de film și animații discrete. Animațiile se opresc când utilizatorul a ales mișcare redusă în sistemul de operare. Panoul de administrare folosește Bootstrap 5.
Maven construiește totul într-un singur fișier
O singură comandă Maven construiește toată soluția. Maven Wrapper fixează versiunea de Maven, iar frontend-maven-plugin instalează Node 24 și construiește aplicația React în cadrul build-ului Maven. Rezultatul e un singur JAR executabil, cu backend și frontend.
Dockerfile-ul construiește în două etape. O imagine cu JDK compilează și împachetează aplicația, iar imaginea finală conține doar runtime-ul Java 21 și JAR-ul. Imaginea e mai mică și sunt mai puține lucruri care se pot strica.
Teste și CI
Fiecare pull request trece prin GitHub Actions înainte de merge: ESLint, verificare TypeScript, teste Jest, build de producție pentru frontend, verificarea formatării Java cu Prettier și Spotless și, la final, Maven verify cu teste unitare și de integrare pe PostgreSQL. Totul durează cam cinci minute.
În total sunt peste 500 de teste automate: 318 în Java și 219 în frontend. Pe lângă ele există teste end-to-end în Cypress și teste de arhitectură în ArchUnit, care verifică respectarea straturilor.
Hosting pe Railway
Aplicația rulează ca un container Docker pe Railway, în UE, cu PostgreSQL ca serviciu separat. Când se schimbă main, Railway construiește o imagine nouă și îi trimite trafic abia după ce răspunde /management/health. Dacă aplicația cade, repornește singură, iar o versiune anterioară poate fi restaurată.
Fluxul de lucru e același pentru fiecare modificare: branch separat, pull request, CI verde, merge în develop și apoi un release în main, care se publică automat.
„Nu se poate face asta în cinci minute cu vibe coding?”
Ba sigur că da. Scrii „fă-mi o aplicație de programări pentru frizerie”, apeși Enter și după cinci minute ai ceva care arată ca o aplicație de programări. Apoi vine sâmbătă dimineața: doi clienți la ușă cu aceeași oră, nimeni nu știe unde s-au salvat programările, iar aplicația merge doar pe laptopul programatorului.
Nordic Cuts a durat ceva mai mult de cinci minute: 88 de commituri, 39 de pull requesturi și peste 500 de teste automate din ianuarie 2026. Singurul lucru care durează cu adevărat cinci minute e rularea CI. Și noi folosim AI în fiecare zi și ne scutește de multe ore, dar regulile din backend, testele și operarea țin programările în funcțiune într-o sâmbătă cu salonul plin.
Încearcă demo-ul și vorbim
Demo-ul este deschis. Testează fluxul de programare și vezi cum ar fi pentru un client. Dacă ai întrebări, discutăm și vedem ce se potrivește salonului tău.
Te întrebi dacă o aplicație proprie merită pentru salonul tău? Citește ghidul Sistem de programări pentru salon: aplicație proprie sau soluție gata făcută?.