This commit is contained in:
2026-05-08 22:43:11 +05:00
parent 714486ffa6
commit 8f52c3d4c1
4 changed files with 161 additions and 0 deletions

161
PROJECT_INFO.md Normal file
View File

@@ -0,0 +1,161 @@
# Hotel 777 - Система бронирования отеля
## Общее описание
Hotel 777 — это веб-приложение для бронирования номеров в гостинице, расположенной на берегу моря в Абхазии (п. Мгудзырхуа, набережная ул. 1). Проект представляет собой полнофункциональную систему управления бронированиями с публичной частью для клиентов и административной панелью.
## Технологический стек
- **Backend**: Node.js + Express 5.x
- **База данных**: SQLite3
- **Аутентификация**: JWT (jsonwebtoken) + bcryptjs
- **Обработка изображений**: Sharp (конвертация в WebP)
- **Загрузка файлов**: Multer
- **Frontend**: Bootstrap 5, Font Awesome, кастомные шрифты (Inter, Playfair Display)
- **Контейнеризация**: Docker + Docker Compose
## Структура проекта
```
hotell777_260507/
├── server.js # Основной файл сервера (784 строки)
├── package.json # Зависимости проекта
├── Dockerfile # Сборка Docker образа
├── docker-compose.yml # Оркестрация контейнера
├── .env # Переменные окружения
├── .gitignore
├── data/
│ └── bookings.db # База данных SQLite
├── public/
│ ├── index.html # Публичная страница (613 строк)
│ ├── admin.html # Админ-панель (949 строк)
│ ├── css/ # Стили (Bootstrap, шрифты, кастомные стили)
│ ├── 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
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 /api/rooms` — список доступных номеров
- `POST /api/bookings` — создание бронирования
- `POST /api/promocodes/validate` — проверка промокода и расчет скидки
- `GET /api/bookings` — получение всех бронирований (требуется API_KEY в заголовке X-API-Key)
### Административные (требуется JWT):
- `POST /api/admin/login` — вход в систему
- `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` — удаление промокода
## Основные функции
1. **Публичная часть**:
- Просмотр номеров и цен
- Бронирование номера с указанием дат, количества гостей
- Применение промокодов
- Галерея изображений
- Информация о гостинице, развлечениях, отзывах
2. **Админ-панель**:
- Просмотр всех бронирований
- Изменение статусов бронирований
- Управление номерами (создание, редактирование, удаление)
- Управление промокодами
- История изменений по каждому бронированию
- Статистика и фильтрация
3. **Дополнительно**:
- Автоматическая конвертация изображений в WebP
- Автоматическое создание номеров по умолчанию
- Проверка доступности промокодов по датам
- Расчет стоимости с учетом скидок
## Переменные окружения (.env)
```
PORT=3000
HOTEL777KEY=<секретный_ключ_API>
ADMIN_LOGIN=<логин_администратора>
ADMIN_PASSWORD=<пароль_администратора>
JWT_SECRET=<секрет_JWT>
hotelName="Hotel 777"
hotelAddress="Абхазия, золотой берег"
hotelPhone="+79400000000"
```
## 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
## Особенности реализации
- Все цены указаны в рублях за человека за ночь
- Количество ночей рассчитывается как разница между датами заезда и выезда
- История изменений сохраняется автоматически при любом изменении бронирования
- Суперадмин автоматически создается/обновляется из переменных окружения при запуске
- Изображения номеров загружаются через форму админ-панели и конвертируются в WebP

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB