178 lines
10 KiB
Markdown
178 lines
10 KiB
Markdown
# 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 удален (загрузка изображений через админ-панель отключена)
|