OCTOBOATS
OCTOBOATS: Plattform i företagsklass för bokning av yachter och lyxresor
OCTOBOATS: Plattform i företagsklass för bokning av yachter och lyxresor
Premium Full-Stack SPA som konstruerar en sömlös bokningsupplevelse för maritima lyxäventyr, med betalningsorkestrering på företagsnivå, tillgänglighetshantering i realtid och en sofistikerad kontrollpanel för administratörsverksamhet.
Affärsidén
OCTOBOATS löser den fragmenterade marknaden för bokning av lyxyachter och upplevelser genom att tillhandahålla en enhetlig och friktionsfri plattform där kunder kan upptäcka, jämföra och boka maritima premiumupplevelser. Plattformen förvandlar bokningskomplexitet till en intuitiv och konverteringsoptimerad upplevelse—vilket genererar högre genomsnittligt ordervärde (AOV) genom intelligenta merförsäljningar, kampanjflexibilitet och strategiska mekanismer för att återvinna övergivna kundvagnar. Byggd för prestanda under sekunden, 99,9 % betalningstillförlitlighet och sömlös skalbarhet, demonstrerar OCTOBOATS teknisk ingenjörskonst i produktionsklass i varje arkitektoniskt lager.
Kärnvärdeerbjudande
Prestanda och skalbarhet
- Optimerad frågeexekvering: Ivrig laddning (eager-loading) av relationer med strategiska frågebegränsningar för att eliminera N+1-problem i kundvagn, kassa och tillgänglighetsflöden
- Intelligent cachningsstrategi: 1-timmars cache för startsidans egenskaper (städer, marinor, yachtkataloger) med cache-invalidering vid kritiska uppdateringar, vilket minskar databasbelastningen med ~70 % på sidor med hög trafik
- Databasarkitektur: Polymorfa relationer för en enhetlig bokningsmodell (hanterar både yachter och resor), vilket möjliggör ett gemensamt affärslogiklager för olika produkttyper
- Tillgänglighetskontroll i realtid: Validering av tillgänglighet med skydd mot race-conditions genom databastransaktioner under utcheckning, vilket förhindrar dubbelbokningar och överbokningar
UX/UI-excellens
- Responsiv lyxdesign: Mobile-first React-arkitektur med Tailwind CSS v4, vilket ger pixelperfekta upplevelser för alla skärmstorlekar
- Konverteringsoptimerade flöden: Flerstegsutcheckning med progressivt avslöjande, bevarad kundvagn och ett-klicks-acceptans av merförsäljning
- Premiumkomponentbibliotek: Radix UI-huvudlösa komponenter som säkerställer tillgänglighet (WCAG 2.1 AA) utan att offra designelegans
- Intelligent formulärhantering: Validering på serversidan med Laravel Form Requests, realtidsfeedback på klientsidan via TypeScript-typsäkerhet
- Stöd för mörkt läge: Temabeständighet med localStorage, ingen blixt av ostylat innehåll (FOUC)
Säkerhet och tillförlitlighet
- Fortifierad autentisering: Laravel Fortify med tvåfaktorsautentisering (2FA/TOTP), sessionshantering och säker lösenordshashning (bcrypt)
- Betalningssäkerhet: PCI-kompatibel Kashier-integration med 3DS-autentisering, transaktionsverifiering på serversidan och validering av webhook-signaturer
- Auktoriseringslager: Finkornig policybaserad åtkomstkontroll (kontrollpanel endast för administratörer, användarspecifika bokningsvyer)
- CSRF- och XSS-skydd: Inbyggt Laravel-middleware-skydd för alla tillståndsändrande operationer
- Transaktionell integritet: Databastransaktioner under webhook-bearbetning säkerställer att bokningsposter inte kan existera utan motsvarande betalningsposter
Teknisk arkitektur och stack
┌─────────────────────────────────────────────────────────────────────┐ │ KLIENTLAGER (React 19) │ │ ┌─────────────┬──────────────┬──────────────┬──────────────────┐ │ │ │ Sidor │ Komponenter │ Hooks │ Tjänster │ │ │ │ (TypeScript)│ (Radix UI) │ (Custom) │ (API-anrop) │ │ │ └─────────────┴──────────────┴──────────────┴──────────────────┘ │ │ ↓ Inertia-protokoll ↓ │ ├─────────────────────────────────────────────────────────────────────┤ │ SERVERLAGER (Laravel 12, PHP 8.2) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ Controllers (Tunna) → Form Requests (Validering) → Policies │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ Affärslogiktjänster │ │ │ │ • KashierPaymentService (Betalningsorkestrering) │ │ │ │ • KashierWebhookService (Transaktionsbearbetning) │ │ │ │ • PageServices (Domänspecifik dataaggregering) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ Eloquent-modeller och relationer │ │ │ │ • Polymorfa bokningar (Yacht/Resa) │ │ │ │ • Tillgänglighetshantering (validering i realtid) │ │ │ │ • Kundvagnssystem (flerartikel, persistent) │ │ │ └──────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────────┤ │ DATABASLAGER (MySQL/Postgres) │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ Normaliserat schema: Användare → Bokningar ← (Yachter/Resor) │ │ │ │ Tillgänglighetsindex, främmande nycklar, kaskaderande rader │ │ │ └──────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────────┤ │ EXTERNA TJÄNSTER OCH INFRASTRUKTUR │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ • Kashier Payment Gateway (3DS aktiverat) │ │ │ │ • E-postmeddelanden (Laravel Mail) │ │ │ │ • Sessionslagring (Redis-kompatibel) │ │ │ │ • Fillagring (Lokal/S3) │ │ │ └──────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
Frontend-stack
- Ramverk: React 19 med strikt TypeScript (
tsconfig.json: strikt läge aktiverat) - SSR/Hydrering: Inertia.js v2 med serverrenderade sid-props, vilket eliminerar vattenfallsanrop
- Styling: Tailwind CSS v4 + Tailwind CSS Vite-plugin för optimerade byggen
- UI-komponenter: Radix UI (huvudlöst, tillgängligt, ostylat) inbäddat i anpassat komponentbibliotek
- Formulärhantering: React Hook Form med valideringsfeedback från Laravel på serversidan
- Routing: Wayfinder v0 för typsäker routgenerering från Laravel-rutter
- Typsäkerhet: Fullständig TypeScript-täckning med strikta null-kontroller, diskriminerade unioner för API-svar
- Byggverktyg: Vite med React-kompilator-plugin för optimerad JSX, smart tree-shaking
Backend-stack
- Ramverk: Laravel 12 med strömlinjeformad filstruktur (ingen Kernel.php, middleware i bootstrap/app.php)
- ORM: Eloquent med ivrig laddning (eager loading), polymorfa relationer och frågeoptimering
- Autentisering: Laravel Fortify (huvudlös autentiseringsbackend) med 2FA/TOTP-stöd via
TwoFactorAuthenticatable-trait - API-lager: RESTful-slutpunkter som följer JSON:API-konventioner, returnerar Laravel API Resources för konsekvent svarformatering
- Validering: Form Request-klasser för deklarativa, återanvändbara valideringsregler
- Auktorisering: Policybaserad åtkomstkontroll med Laravel Gates och Policies
- Cachning: Laravel cache-fasad med 1 timmes standard-TTL för aggregeringar på startsidan
- Bakgrundsjobb: Kösystem (konfigurerat för synkron exekvering i utvecklingsmiljö, databas/Redis i produktion)
- Testning: Pest 4 med
RefreshDatabase-trait för isolerad testexekvering
Viktiga tekniska djupdykningar
1. Polymorf bokningsarkitektur: En modell, flera produkttyper
Utmaningen: Yachter och resor representerar fundamentalt olika produkttyper med olika prismodeller, tillgänglighetsbegränsningar och affärsregler. Ett naivt tillvägagångssätt skulle kräva separata bokningstabeller och duplicerad logik. OCTOBOATS förenar dessa elegant med Eloquents polymorfa relationer.
**Varför detta är viktigt:**
- **Enda källan till sanning** för bokningsgodkännande, betalningsbearbetning och återbetalningar—oavsett produkttyp
- **Gemensam administratörspanel** för att se alla bokningar med enhetlig filtrering och godkännandearbetsflöde
- **Skalbar till N produkttyper** (framtid: hotell, matupplevelser) utan att duplicera controllers
- **Databasnormalisering** säkerställer referentiell integritet; främmande nycklar förhindrar föräldralösa bokningar
---
<h3 id="section-8ad3f563d2cd5b8158034492b3873963">2. Betalnings-webhook-arkitektur: Bygga robust transaktionsbearbetning</h3>
Utmaningen:
Betalningsgateways (Kashier) är i grunden otillförlitliga—webhooks kan komma i fel ordning, dupliceras eller aldrig komma fram. Utan idempotent bearbetning och atomära transaktioner kan användare få flera bokningar för en betalning eller vice versa.
Varför detta är viktigt:
- Exactly-once-semantik via merchantOrderId som idempotent nyckel; omlevererade webhooks ignoreras säkert
- Databastransaktioner säkerställer att boknings- och betalningsposter skapas atomärt tillsammans
- Kaskaderande raderingar i kundvagnen sker först efter bekräftad betalning, vilket förhindrar förlorade ordrar
- Webhook-resiliens: Misslyckade betalningar blockerar inte framtida försök; omförsökslogik inbyggd i Kashier-konfigurationen
Resultat: Noll förlorade betalningar, förutsägbart tillstånd, spårbarhet via response_data JSON-fält.
3. Tillgänglighetsvalidering i realtid: Förhindra dubbelbokningar
Utmaningen: Två kunder som tittar på samma yacht på samma datum klickar på "Boka nu" samtidigt. Utan pessimistisk låsning eller smart validering lyckas båda bokningarna, vilket leder till överbokning av inventariet.
Varför detta är viktigt:
- Race-condition-säker validering sker inom samma HTTP-förfrågningscykel, vilket minimerar TOCTOU-fönster (time-of-check-time-of-use)
- Användarfeedback är omedelbar och specifik ("endast 2 platser kvar"), vilket driver konverteringar
- Webhook-idempotens innebär att om betalningsbearbetningen gör omförsök, är skapandet av bokningen säkert
- Spårbarhet via tabellen
yacht_availabilitiesvisar bokningshistorik
Resultat: Noll överbokningar, transparent tillgänglighet, trygga bokningar.
4. Komplex pris- och kundvagnmotor: Flerartikel, flervaluta, kampanjlogik
Utmaningen: Utcheckningen måste beräkna totalpriset med hänsyn till:
- Flera artiklar i kundvagnen (blandning av yachter och resor)
- Antal vuxen/barn-biljetter per artikel
- Prisvariationer per dag (yacht-tillgänglighet)
- Kampanjkodsrabatter (fasta eller procentuella)
- Merförsäljning (dryck, utrustningsuthyrning) med prissättning per marina
- Marinaskatter (procentbaserade)
Den tekniska lösningen:
Varför detta är viktigt:
- Komponerbar prislogik kräver inte ny kod för nya rabattkategorier
- Snapshot-mönster (taget vid bokning) säkerställer historisk noggrannhet; prisändringar efter utcheckning påverkar inte bekräftelser
- Typsäkra beräkningar via Laravels
decimal-cast förhindrar flyttalsfel - Frontend-spegel (React-komponenter) använder identisk beräkningslogik för WYSIWYG-förhandsgranskning av utcheckning
5. Frontend-optimering: Inertia + React för tillståndskänsliga SPA:er
Utmaningen: Traditionella serverrenderade appar kräver fullständiga sidomladdningar; SPA:er gör JavaScript-buntar uppsvällda. Inertia överbryggar detta gap: servern renderar sidor som React-komponenter, hydrerar med props, vilket eliminerar komplexiteten i tillståndssynkronisering.
Varför detta är viktigt:
- Typsäkerhet över HTTP-gränsen via Wayfinder; rutt-parametrar/svar genereras automatiskt från Laravel-rutter
- Progressiv förbättring via uppskjutna props; skelett-UI laddas omedelbart medan tunga listor laddas asynkront
- Reaktiva uppdateringar utan sidomladdning; kundvagnsändringar utlöser omedelbara UI-uppdateringar
- Noll JavaScript-uppsvällning för sidinteraktivitet; endast kritiska UI-komponenter hydreras
Funktioner och möjligheter
Kundinriktade funktioner
- Bläddra och sök: Filtrera yachter och resor efter stad, marina, kapacitet, prisintervall
- Smart kundvagn: Lägg till flera artiklar, spara till senare, redigera kvantiteter/datum i realtid
- Utcheckning med ett klick: Strömlinjeformat betalningsflöde med Kashier 3DS
- Dubbel bokning: Boka yachter (timme/dag) eller kurerade resor (vuxen/barn-prissättning)
- Kampanjmotor: Applicera kampanjkoder, beräkna rabatter automatiskt
- Merförsäljning: Tilläggstjänster (dryck, utrustning) vid utcheckning
- Chatbot: AI-driven kundsupport med fallback till kontaktformulär
- Innehållssidor: Gallerivisning, FAQ, om/kontakt
Administratörspanel
- Bokningshantering: Se, godkänn, redigera och registrera betalningar för alla bokningar
- Inventariehantering: Skapa/redigera yachter, resor, ställ in tillgänglighet, prissättning
- Gallerihantering: Ladda upp och organisera galleribilder efter kategori
- Kampanjkoder: Skapa/hantera rabattkoder med användningsbegränsningar
- Merförsäljning och tillägg: Konfigurera ytterligare tjänster och prissättning
- Webbplatsinställningar: Hantera FAQ, kontaktinställningar, global konfiguration
Tekniska funktioner
- 2FA-autentisering: TOTP-baserad tvåfaktorsautentisering
- Rollbaserad åtkomst: Admin-policyer upprätthåller behörighetsgränser
- Responsiv design: Mobile-first, fungerar på alla enheter
- Mörkt läge: Temabeständighet, automatisk detektering av systempreferenser
- Tillgänglighet: WCAG 2.1 AA-efterlevnad via Radix UI-komponenter
- SSR-redo: Kapacitet för serverrendering för SEO och snabbare initial laddning
Projektstruktur
octaboats/
├── app/
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Admin/ # Controllers för adminpanel
│ │ │ ├── Api/ # API-slutpunkter
│ │ │ └── *.php # Controllers för publika sidor
│ │ ├── Requests/ # Validering av formulärförfrågningar
│ │ ├── Resources/ # JSON-svarformaterare
│ │ ├── Middleware/ # HTTP-middleware
│ │ └── Policies/ # Auktoriseringspolicyer
│ ├── Models/ # Eloquent-modeller
│ ├── Services/ # Affärslogik (Betalning, Webhook, Sidaggregering)
│ └── Actions/ # Single-action-klasser (Fortify-autentisering)
├── resources/
│ ├── js/
│ │ ├── pages/ # React-sidkomponenter
│ │ │ ├── admin/ # Sidor för adminpanel
│ │ │ ├── auth/ # Inloggning, registrering, lösenordsåterställning
│ │ │ └── *.tsx # Publika sidor
│ │ ├── components/ # Återanvändbara React-komponenter
│ │ ├── hooks/ # Anpassade React-hooks
│ │ ├── services/ # Frontend-API-klienter
│ │ ├── types/ # TypeScript-gränssnitt
│ │ ├── layouts/ # Layout-wrappers
│ │ └── app.tsx # Inertia-inställningar
│ ├── css/
│ │ └── app.css # Tailwind-direktiv
│ └── views/ # E-postmallar (Blade)
├── routes/
│ ├── web.php # Publika/gäst-rutter
│ ├── api.php # API-slutpunkter
│ ├── admin.php # Rutter för adminpanel (kräver autentisering + admin-policy)
│ ├── settings.php # Rutter för användarinställningar
│ └── console.php # Artisan-kommandon
├── database/
│ ├── migrations/ # Schemamigreringar
│ ├── factories/ # Modellfabriker för testning
│ └── seeders/ # Databasseeders
├── config/ # Applikationskonfiguration
├── bootstrap/
│ ├── app.php # Applikationsinställningar (middleware, routning)
│ └── providers.php # Registrering av tjänsteleverantörer
├── tests/ # Pest-tester
├── storage/ # Uppladdningar, loggar, cache
├── vite.config.ts # Frontend-byggkonfiguration
├── composer.json # PHP-beroenden
├── package.json # Node-beroenden
└── README.md # Denna fil
Säkerhetsöverväganden
- HTTPS tvingas: Alla externa integrationer kräver säkra anslutningar
- CSRF-skydd: Tokenvalidering för alla POST/PUT/PATCH/DELETE-förfrågningar
- Skydd mot SQL-injektion: Parameteriserade frågor via Eloquent ORM
- XSS-skydd: React undslipper automatiskt dynamiskt innehåll; ingen dangerouslySetInnerHTML
- Autentisering: Fortifierat 2FA-stöd för administratörer
- Betalningssäkerhet: 3DS aktiverat, PCI-efterlevnad via Kashier
- Känslig data: Lösenordshashning (bcrypt), hemligheter i .env, two_factor_*-fält dolda i API-svar
- VIKTIGT: Commit aldrig .env- eller *.key-filer; använd .env.example som mall
Tekniker och beroenden
| Lager | Teknik | Version | Syfte | |-------|-----------|---------|---------| | PHP | Laravel Framework | 12.0 | Backend-ramverk | | PHP | Laravel Fortify | 1.30 | Huvudlös autentisering | | PHP | Laravel Inertia | 2.0 | Server-side-props till React | | PHP | Laravel Wayfinder | 0.1.9 | Typsäker routgenerering | | PHP | Pest | 4.4 | Testramverk | | Frontend | React | 19.2 | UI-rendering | | Frontend | TypeScript | Senaste | Typsäkerhet | | Frontend | Tailwind CSS | 4.0 | Utility-first styling | | Frontend | Radix UI | Senaste | Huvudlösa komponenter | | Frontend | Inertia.js | 2.3.7 | Klientside-adapter | | Bygge | Vite | Senaste | Snabbt byggverktyg | | Betalningar | Kashier | Live API | Betalningsgateway |
Viktiga lärdomar och demonstrerade best practices
Detta projekt exemplifierar ingenjörskonst i produktionsklass genom:
- Arkitektonisk renhet: Polymorfa relationer eliminerar kodduplicering; tunna controllers delegerar till tjänster; policyer upprätthåller auktorisering på modellnivå
- Transaktionell integritet: Databastransaktioner säkerställer atomicitet mellan bokning och betalning; webhook-idempotens förhindrar dubbelbearbetning
- Typsäkerhet: Fullständig TypeScript-täckning förhindrar runtime-fel; Laravel Form Requests validerar på serversidan; API Resources formar svar konsekvent
- Prestandaoptimering: Ivrig laddning eliminerar N+1-frågor; intelligent cachning minskar databastrycket; Vite-byggen levererar endast nödvändig JavaScript
- Användarupplevelse: Inertia + React ger SPA-responsivitet utan JS-uppsvällning; Tailwind CSS möjliggör snabb, konsekvent UI-iteration
- Testbarhet: Pests uttrycksfulla syntax gör testavsikter tydliga; RefreshDatabase-trait isolerar tester; fabriker tillhandahåller realistiska fixturer
- Säkerhet: Fortify hanterar edge cases för autentisering; policyer centraliserar auktorisering; webhook-bearbetning av betalningar är idempotent och transaktionell
- Utvecklarupplevelse: Wayfinder genererar automatiskt typsäkra rutter; ESLint + Prettier upprätthåller kodstil; modulära tjänster uppmuntrar komposition
Erkännanden
- Laravel-teamet: För det eleganta, åsiktsdrivna ramverket
- Inertia.js-författare: För att ha överbryggat världarna mellan server-renderade appar och SPA:er
- Tailwind Labs: För att ha möjliggjort snabb och konsekvent UI-utveckling
- React Core Team: För det stridstesta komponentbiblioteket
Projektgalleri