Files
hotell777_260507/PROJECT_INFO.md
2026-05-08 23:49:27 +05:00

10 KiB
Raw Permalink Blame History

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

Запуск проекта

# Установка зависимостей
npm install

# Запуск в production режиме
npm start

# Запуск в development режиме (с nodemon)
npm run dev

Docker команды

# Сборка и запуск
docker compose up -d --build

# Пересборка без кэша
docker compose build --no-cache && docker compose up -d

# Создание внешней сети (если не существует)
docker network create applications

Git репозиторий

Автор

  • GitHub: kalugin66

Особенности реализации

  • Все цены указаны в рублях за номер за ночь
  • Количество ночей рассчитывается как разница между датами заезда и выезда
  • История изменений сохраняется автоматически при любом изменении бронирования
  • Администраторы создаются через API (POST /api/admin/users)
  • Автоматическая конвертация изображений в WebP (функция convertImages)
  • CORS настроен через заголовки (не требуется отдельный middleware)
  • Multer удален (загрузка изображений через админ-панель отключена)