Grand Hotel — архитектура и документация
Архитектура, модель данных, план имплементации и функциональные возможности системы бронирования отеля.
Grand Hotel — Карта связей
Поток данных (React Context)
┌──────────────────────┐
│ Firebase │
│ Auth ──── Firestore │
└──┬───────┬──────┬────┘
│ │ │
┌───────────────┘ │ └───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌────────────────┐
│ AuthContext │ │ DataContext │ │ Direct reads │
│ │ │ │ │ (Rooms, │
│ user │ │ rooms[] │ │ Dashboard, │
│ isAdmin │ │ services[] │ │ Admin, │
│ loading │ │ loading │ │ SetupAdmin) │
│ register() │ │ addRoom() │ │ │
│ login() │ │ updateRoom() │ │ getDocs() │
│ logout() │ │ deleteRoom() │ │ addDoc() │
└──────┬──────┘ │ toggleSvc() │ │ updateDoc() │
│ └──────┬───────┘ │ deleteDoc() │
│ │ └───────┬────────┘
│ ┌──────────────┘ │
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ Components │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Navbar │ │RoomCard │ │ ServiceCard │ │
│ │useAuth() │ │useCart() │ │ useCart() │ │
│ │useCart() │ │ │ │ │ │
│ └──────────┘ └──────────┘ └───────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Login │ │ Register │ │ ProtectedRoute│ │
│ │useAuth() │ │useAuth() │ │ useAuth() │ │
│ └──────────┘ └──────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────┘
┌──────────────┐
│ CartContext │──── localStorage ('booking_cart')
│ items[] │
│ addToCart() │
│ remove...() │
│ total │
└──────────────┘
Карта страниц и зависимостей
Страницы Контексты Firestore Компоненты
─────────────────────────────────────────────────────────────────────────
Home.jsx (нет) (нет) Layout
│ ├─ Navbar
├─ Статичные данные └─ Footer
└─ Ссылки на /rooms, /services
Rooms.jsx useData() bookings (read) Layout
│ useState (local) rooms (read) └─ RoomCard × N
├─ Дата-пикеры (available, checkIn, checkOut)
├─ Фильтры
└─ Проверка доступности
RoomDetail.jsx useData() rooms (read) Layout
useCart() └─ Дата-пикеры
useParams()
Services.jsx useData() services (read) Layout
└─ ServiceCard × N
Cart.jsx useCart() (нет) Layout
Payment.jsx useCart() bookings (write) Layout
useAuth() → addDoc
Dashboard.jsx useAuth() bookings (read) Layout
(query by guestId)
Login.jsx useAuth() auth (signIn) Layout
Register.jsx useAuth() auth (createUser) Layout
users (write)
Admin.jsx useData() rooms (CRUD) Layout
useState (local) services (update) └─ 5 вкладок:
bookings (read, ├─ Шахматка
update status) ├─ Номера (CRUD)
├─ Бронирования
├─ Услуги (toggle)
└─ Настройки ( broken)
SetupAdmin.jsx useAuth() users/{uid}
(merge role=admin)
Маршруты и защита
/ → Home (публичный)
/rooms → Rooms (публичный)
/rooms/:id → RoomDetail (публичный)
/services → Services (публичный)
/login → Login (публичный)
/register → Register (публичный)
/cart → Cart (публичный)
/payment → Payment → ProtectedRoute
/dashboard → Dashboard → ProtectedRoute
/admin → Admin → AdminRoute (требуется админ)
/setup-admin → SetupAdmin → ProtectedRoute
Граф данных (Data lineage)
Seed (DataContext)
│
├──► Firestore: rooms → useData() ──► Rooms.jsx, RoomDetail.jsx, Admin.jsx
└──► Firestore: services → useData() ──► Services.jsx, Admin.jsx
Register / SetupAdmin
│
└──► Firestore: users → AuthContext ──► Navbar, ProtectedRoute, AdminRoute
Payment
│
└──► Firestore: bookings → Dashboard, Admin, Rooms (проверка доступности)
Компоненты без использования
| Компонент | Причина |
|---|---|
BookingForm.jsx |
Нигде не импортирован. Альтернатива — форма в RoomDetail.jsx |
Loading.jsx |
Нигде не импортирован. Используются инлайн-спиннеры |