Hotel Management Web Application

Hôtel Lumière — a dual-interface hotel management system built for my 4th-year PFA (Projet de Fin d'Année). Staff UI uses Django server-rendered templates; client-facing side is a Vue 3 SPA consuming a REST API. Features room booking, check-in/out, dynamic pricing, Stripe payments, reviews, task management, and broadcast notifications.

RoleSolo Full-Stack Developer
Year2026
DjangoDjango REST FrameworkVue.js 3PostgreSQLChart.jsStripe APIRenderVercel
Hotel Management Web Application
2Interfaces: staff dashboard + guest SPA
DRFREST API bridging MVT and SPA
StripePayments on the booking flow
93Lighthouse Performance (mobile, Oct 2026)

The challenge

  • Problem Cover a hotel's whole reservation lifecycle — a server-rendered Django dashboard for staff plus a Vue 3 SPA for guests — so booking, pricing and account flows are correct on both sides.
  • Constraints Solo work on a 4th-year PFA; the hybrid architecture meant maintaining two frontend codebases in one project; no budget.
  • Hardest blockers Reservation dates rendering backwards, password fields accepting leading/trailing spaces, and dynamic pricing not firing when a room was selected in a new reservation.
  • Root cause Timezone handling was implicit, inputs were not normalised before persistence, and the reservation form was not wired to the pricing API on room selection.
  • Fix Explicit timezone handling in Django settings, strip() validation on credentials, and wiring the reservation form to a dynamic pricing endpoint that re-prices against live occupancy.

The approach

  • Architecture Django + DRF REST API on PostgreSQL; the staff dashboard stayed server-rendered (MVT) for fast CRUD, while the guest booking flow became a Vue 3 SPA.
  • API layer DRF serializers define the contract between the MVT dashboard and the SPA.
  • Pricing A dynamic pricing endpoint recalculates room rates from real-time occupancy and is called as soon as a room is selected.
  • Data integrity Timezone-aware date handling and normalised input (trimmed credentials) at the boundary.
  • Reporting Chart.js dashboards for occupancy and revenue.
  • Payments Stripe for booking payments.
  • Delivery Backend deployed on Render, SPA on Vercel.
Impact

Completed and presented as my 4th-year PFA — one system covering the full reservation lifecycle: search, dynamic pricing, booking, payment and check-in/out.

Screenshots

What I'd do differently

  • Reservation dates rendered backwards because timezone handling was implicit. I now fix an explicit timezone contract across storage, API and rendering before writing any date logic.
  • Password fields accepted stray spaces — I validate and normalise every input at the boundary instead of trusting the client.
  • Running a Django MVT dashboard and a Vue SPA in one project meant two frontends. Next time I'd pick one rendering strategy and expose a single API to both.