# Hotel 777 - Система бронирования отеля ## Общее описание Hotel 777 — это веб-приложение для бронирования номеров в гостинице, расположенной на берегу моря в Абхазии (п. Мгудзырхуа, набережная ул. 1). Проект представляет собой полнофункциональную систему управления бронированиями с публичной частью для клиентов и административной панелью. ## Технологический стек - **Backend**: Node.js + Express 5.x - **База данных**: SQLite3 - **Аутентификация**: JWT (jsonwebtoken) + bcryptjs - **Обработка изображений**: Sharp (конвертация в WebP) - **Frontend**: Bootstrap 5, Font Awesome, кастомные шрифты (Inter, Playfair Display) - **Контейнеризация**: Docker + Docker Compose ## Структура проекта ``` hotell777_260507/ ├── server.js # Основной файл сервера (633 строки) ├── package.json # Зависимости проекта ├── Dockerfile # Сборка Docker образа ├── docker-compose.yml # Оркестрация контейнера ├── .env # Переменные окружения (только API_KEY) ├── .gitignore ├── PROJECT_INFO.md # Описание проекта ├── data/ │ └── bookings.db # База данных SQLite ├── public/ │ ├── index.html # Публичная страница │ ├── admin.html # Админ-панель │ ├── css/ # Стили (Bootstrap, шрифты, кастомные стили) │ │ └── files/ # Шрифты Inter и Playfair Display │ ├── js/ │ │ ├── main.js # Логика публичной части │ │ └── bootstrap.bundle.min.js │ ├── img/ # Изображения отеля и номеров │ │ └── rooms/ # Фотографии номеров │ └── webfonts/ # Шрифты Font Awesome └── node_modules/ ``` ## База данных ### Таблицы: 1. **bookings** — бронирования - Поля: id, name, phone, adults, children, checkin_date, checkout_date, wishes, status, room_type, comment, base_price, discount_percent, discount_amount, total_price, promocode_id, created_at - Статусы: 'новая', 'оплачена', 'зарезервирована', 'заселена', 'выехала', 'отменена' 2. **rooms** — номера отеля - Типы: 'Эконом' (2500₽/ночь), 'Стандарт' (4000₽/ночь), 'VIP Люкс' (8000₽/ночь) - Поля: type, name, description, rooms_count, single_beds, double_beds, has_sofa, has_ac, has_wifi, has_shower, max_guests, price_per_guest, image_path, is_active - Номера по умолчанию: 'Эконом 1' (3 шт, 2 односпальные кровати), 'Стандарт 1' (2 шт, 1 двуспальная + диван), 'VIP Люкс 1' (1 шт, 1 двуспальная + диван, до 4 гостей) 3. **promocodes** — промокоды - Поля: code, discount_percent (1-99%), valid_from, valid_to, valid_days, is_active 4. **booking_history** — история изменений бронирований - Отслеживает изменения полей: status, room_type, comment, discount_percent 5. **users** — пользователи системы - Роли: 'admin', 'user' - Суперадмин создается при первом запуске (пароль задается через .env) ## API Endpoints ### Публичные: - `GET /` — главная страница (index.html) - `GET /admin` — админ-панель (admin.html) - `GET /api/rooms` — список доступных номеров - `POST /api/bookings` — создание бронирования - `POST /api/promocodes/validate` — проверка промокода и расчет скидки - `GET /api/bookings` — получение всех бронирований (требуется API_KEY в заголовке X-API-Key) ### Аутентификация: - `POST /api/auth/login` — вход в систему (login, password) - `PUT /api/auth/me` — обновление профиля (full_name, email) - `POST /api/auth/change-password` — смена пароля (current_password, new_password) ### Административные (требуется JWT + роль admin): - `GET /api/admin/bookings` — список всех бронирований - `GET /api/admin/bookings/:id/history` — история изменений бронирования - `PATCH /api/admin/bookings/:id` — изменение статуса бронирования - `PATCH /api/admin/bookings/:id/room` — изменение типа номера - `PATCH /api/admin/bookings/:id/comment` — добавление комментария - `PATCH /api/admin/bookings/:id/discount` — изменение скидки - `GET /api/admin/rooms` — управление номерами - `POST /api/admin/rooms` — создание номера - `PUT /api/admin/rooms/:id` — обновление номера - `DELETE /api/admin/rooms/:id` — удаление номера - `GET /api/admin/promocodes` — управление промокодами - `POST /api/admin/promocodes` — создание промокода - `PUT /api/admin/promocodes/:id` — обновление промокода - `DELETE /api/admin/promocodes/:id` — удаление промокода - `GET /api/admin/users` — список пользователей - `POST /api/admin/users` — создание пользователя - `PUT /api/admin/users/:id` — обновление пользователя - `DELETE /api/admin/users/:id` — удаление пользователя ## Основные функции 1. **Публичная часть**: - Просмотр номеров и цен (цена за ночь) - Бронирование номера с указанием дат, количества гостей - Применение промокодов - Галерея изображений - Информация о гостинице, развлечениях, отзывах 2. **Админ-панель**: - Просмотр всех бронирований - Изменение статусов бронирований - Управление номерами (создание, редактирование, удаление) - Управление промокодами - Управление пользователями (создание, редактирование, удаление) - История изменений по каждому бронированию 3. **Аутентификация и пользователи**: - Вход по логину и паролю (JWT токен на 24 часа) - Смена пароля пользователем - Обновление профиля (имя, email) - Разграничение прав: admin и user 4. **Дополнительно**: - Автоматическая конвертация изображений в WebP (при наличии в папке img) - Автоматическое создание номеров по умолчанию - Проверка доступности промокодов по датам - Расчет стоимости с учетом скидок (calculateBasePrice) ## Переменные окружения (.env) ``` HOTEL777KEY=<секретный_ключ_API> ``` - PORT=3000 (по умолчанию) - JWT_SECRET (опционально, по умолчанию 'fallback-secret-change-in-production') - Пароль администратора задается при первом запуске через регистрацию ## Docker развертывание - Образ: `kalugin66/hotell777_260507` - Порт: 3000 (проброшен через внешний прокси) - Сеть: applications (внешняя сеть Docker) - Тома: `/docker/hotell777_260507/data:/app/data` - Healthcheck: проверка доступности через wget ## Запуск проекта ```bash # Установка зависимостей npm install # Запуск в production режиме npm start # Запуск в development режиме (с nodemon) npm run dev ``` ## Docker команды ```bash # Сборка и запуск docker compose up -d --build # Пересборка без кэша docker compose build --no-cache && docker compose up -d # Создание внешней сети (если не существует) docker network create applications ``` ## Git репозиторий - URL: https://git.dadehard.ru/kalugin66/hotell777_260507.git - Ветка по умолчанию: main ## Автор - GitHub: kalugin66 ## Особенности реализации - Все цены указаны в рублях за номер за ночь - Количество ночей рассчитывается как разница между датами заезда и выезда - История изменений сохраняется автоматически при любом изменении бронирования - Администраторы создаются через API (`POST /api/admin/users`) - Автоматическая конвертация изображений в WebP (функция convertImages) - CORS настроен через заголовки (не требуется отдельный middleware) - Multer удален (загрузка изображений через админ-панель отключена)