хз
This commit is contained in:
161
PROJECT_INFO.md
Normal file
161
PROJECT_INFO.md
Normal 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
|
||||||
BIN
public/img/rooms/placeholder.webp
Normal file
BIN
public/img/rooms/placeholder.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 278 B |
BIN
public/img/rooms/room-1778180456091-106322718.webp
Normal file
BIN
public/img/rooms/room-1778180456091-106322718.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 200 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 197 KiB |
Reference in New Issue
Block a user