{"id":48531582,"url":"https://github.com/lmoroz/beauty-book","last_synced_at":"2026-04-08T00:01:55.723Z","repository":{"id":340377265,"uuid":"217351812","full_name":"lmoroz/beauty-book","owner":"lmoroz","description":"Beauty salon booking platform protopype  with AI-powered LLM chat agent, real-time scheduling, and admin dashboard. Yii2 REST API + Vue 3 SPA.","archived":false,"fork":false,"pushed_at":"2026-02-24T15:46:54.000Z","size":4360,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-24T18:58:29.109Z","etag":null,"topics":["ai-agent","booking-system","docker","function-calling","javascript","llm","php","redis","rest-api","spa","sse","vite","vue3","yii2"],"latest_commit_sha":null,"homepage":"https://beautybook.ubiz.ru","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lmoroz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-10-24T17:08:28.000Z","updated_at":"2026-02-24T15:49:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lmoroz/beauty-book","commit_stats":null,"previous_names":["lmoroz/beauty-book"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/lmoroz/beauty-book","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmoroz%2Fbeauty-book","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmoroz%2Fbeauty-book/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmoroz%2Fbeauty-book/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmoroz%2Fbeauty-book/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lmoroz","download_url":"https://codeload.github.com/lmoroz/beauty-book/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmoroz%2Fbeauty-book/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31533824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","booking-system","docker","function-calling","javascript","llm","php","redis","rest-api","spa","sse","vite","vue3","yii2"],"created_at":"2026-04-08T00:01:53.444Z","updated_at":"2026-04-08T00:01:55.699Z","avatar_url":"https://github.com/lmoroz.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BeautyBook\n\nПлатформа онлайн-записи для салонов красоты с моделью коворкинга — мастера арендуют рабочие места, а салон предоставляет инфраструктуру для работы с клиентами: расписание, онлайн-запись, уведомления и аналитику.\n\n## Бизнес-модель\n\nТрёхсторонняя система с разделением ролей:\n\n- **Салон** — управляет пространством, контролирует мастеров, отслеживает общую эффективность\n- **Мастер** — независимый специалист, арендующий рабочее место, управляет своими услугами, расписанием и клиентами\n- **Клиент** — просматривает каталог, записывается на приём, получает напоминания\n\n## Стек технологий\n\n| Слой                       | Технология                       |\n|----------------------------|----------------------------------|\n| Бэкенд                     | PHP 7.4+ / Yii2 (Basic Template) |\n| База данных                | MySQL 8.0                        |\n| Кеш / Очередь / Блокировки | Redis 7.x                        |\n| Фронтенд                   | Vue 3 + Vite                     |\n| HTTP-сервер                | Nginx                            |\n| Инфраструктура             | Docker Compose                   |\n\n## Архитектура\n\nПриложение построено по принципу разделения — Yii2 предоставляет версионированный REST API, Vue 3 SPA потребляет его как самостоятельный клиент.\n\n```\nbeautybook/\n│\n├── docker/                         # Конфигурация Docker\n│   ├── nginx/default.conf          # Nginx reverse proxy\n│   ├── php/Dockerfile              # PHP-FPM с расширениями\n│   └── redis/redis.conf            # Конфигурация Redis\n│\n├── api/                            # Yii2 Basic Template — REST API\n│   ├── config/\n│   │   ├── db.php                  # Подключение к MySQL\n│   │   ├── redis.php               # Подключение к Redis\n│   │   └── web.php                 # Конфигурация приложения, URL-правила\n│   ├── controllers/api/v1/         # Версионированные API-контроллеры\n│   │   ├── BookingController.php\n│   │   ├── MasterController.php\n│   │   ├── ScheduleController.php\n│   │   └── ServiceController.php\n│   ├── models/                     # ActiveRecord-модели\n│   │   ├── Booking.php\n│   │   ├── Master.php\n│   │   ├── Salon.php\n│   │   ├── Service.php\n│   │   └── TimeSlot.php\n│   ├── components/                 # Redis-компоненты\n│   │   ├── RedisLock.php           # Распределённая блокировка при бронировании\n│   │   ├── RedisQueue.php          # Очередь уведомлений\n│   │   └── RateLimiter.php         # Ограничение частоты запросов\n│   ├── workers/\n│   │   └── NotificationWorker.php  # Обработчик очереди (консольная команда)\n│   └── migrations/                 # Схема базы данных\n│\n├── frontend/                       # Vue 3 SPA (Vite)\n│   └── src/\n│       ├── views/                  # Страницы\n│       ├── components/             # Переиспользуемые UI-компоненты\n│       ├── composables/            # Хуки Composition API\n│       ├── stores/                 # Pinia — управление состоянием\n│       ├── router/                 # Vue Router\n│       └── api/                    # Axios HTTP-слой\n│\n├── docker compose.yml\n└── README.md\n```\n\n## Основные возможности\n\n### Онлайн-запись\n\nКлиент выбирает мастера, услугу, свободный тайм-слот и подтверждает запись. Процесс бронирования использует **распределённую блокировку Redis** (`SETNX` с TTL), чтобы предотвратить гонку при одновременном бронировании одного слота двумя клиентами.\n\n### Умное расписание\n\nМастера управляют доступностью через слоты расписания. Слоты генерируются на основе шаблонов рабочих часов и могут быть индивидуально заблокированы или открыты. Данные расписания кешируются в Redis с автоматической инвалидацией при изменениях.\n\n### Очередь уведомлений\n\nПодтверждения бронирований и напоминания о записях обрабатываются асинхронно через **очередь на Redis** (Lists с `LPUSH`/`BRPOP`). Выделенный консольный воркер потребляет очередь и отправляет уведомления.\n\n### Ограничение частоты запросов (Rate Limiting)\n\nПубличные эндпоинты защищены **Sliding Window Rate Limiter** на основе Redis Sorted Sets. Это предотвращает спам бронирований и злоупотребление API без влияния на легитимный трафик.\n\n### Обновления в реальном времени\n\nИзменения расписания транслируются через **Redis Pub/Sub → SSE (Server-Sent Events)**, обеспечивая мгновенную синхронизацию для всех участников:\n\n- **Дашборд мастера** — новые бронирования и отмены отображаются в расписании без перезагрузки страницы\n- **Виджет бронирования клиента** — если другой клиент забронировал слот, пока первый выбирает время, занятый слот плавно исчезает из списка доступных, а если он был уже выбран — сбрасывается с предупреждением\n\n\u003cvideo src=\"https://github.com/user-attachments/assets/d3ce7f9e-0387-48f8-aa81-8cdbba3b2df6\" controls width=\"100%\"\u003e\u003c/video\u003e\n\n### Ролевой доступ\n\n| Роль   | Доступ                                                                             |\n|--------|------------------------------------------------------------------------------------|\n| Клиент | Просмотр каталога, запись на приём, проверка статуса записи                        |\n| Мастер | Управление расписанием, просмотр услуг, подтверждение и отмена записей             |\n| Админ  | Управление мастерами, услугами и категориями, настройки салона, базовая статистика |\n\n### 🤖 AI-агент (Booking Assistant)\n\nВ приложении встроен **AI-агент** — интеллектуальный помощник в онлайн-чате, который помогает клиентам подобрать мастера, услугу и удобное время для записи в естественно-языковом диалоге.\n\n**Как это работает:**\n\n```text\nКлиент (Vue Chat Widget)\n  ↕ WebSocket / SSE\nYii2 API (POST /api/v1/chat)\n  ↕ HTTP\nLLM-провайдер (OpenAI / Ollama)\n  ↕ Function Calling\nИнструменты агента → БД / Redis\n```\n\nАгент умеет:\n\n- Искать мастеров по специализации или имени\n- Показывать услуги и цены конкретного мастера\n- Проверять свободные слоты на нужную дату\n- Создавать и отменять бронирования\n- Сообщать статус записи\n\nКонтекст разговора хранится в **Redis** (TTL 1 час) на стороне сервера и в **localStorage** на стороне клиента. Диалог сохраняется между вкладками и перезагрузками; новый разговор начинается после 4 часов неактивности.\n\nЕсли агент не может обработать запрос — предлагает связаться с администратором салона.\n\n\u003cimg src=\"assets/chat-bot.gif\" alt=\"Демонстрация AI-ассистента\" width=\"100%\"\u003e\n\n## API\n\nБазовый путь: `/api/v1/`\n\n| Метод   | Эндпоинт                       | Описание                   |\n|---------|--------------------------------|----------------------------|\n| `GET`   | `/masters`                     | Список мастеров салона     |\n| `GET`   | `/masters/{id}`                | Профиль мастера с услугами |\n| `GET`   | `/masters/{id}/schedule?date=` | Свободные тайм-слоты       |\n| `POST`  | `/bookings`                    | Создать бронирование       |\n| `GET`   | `/bookings/{id}`               | Статус бронирования        |\n| `PATCH` | `/bookings/{id}/cancel`        | Отмена бронирования        |\n| `GET`   | `/master/dashboard`            | Дашборд мастера            |\n| `PATCH` | `/master/schedule`             | Управление расписанием     |\n| `GET`   | `/admin/analytics`             | Аналитика салона           |\n| `POST`  | `/chat`                        | Чат с AI-агентом           |\n\n## Использование Redis\n\nRedis в проекте — **не просто кеш**, а выполняет шесть различных ролей:\n\n| Роль                      | Структура данных        | Назначение                           |\n|---------------------------|-------------------------|--------------------------------------|\n| Распределённая блокировка | `SETNX` + TTL           | Предотвращение двойного бронирования |\n| Очередь задач             | Lists (`LPUSH`/`BRPOP`) | Асинхронная обработка уведомлений    |\n| Rate Limiter              | Sorted Sets             | Sliding window защита API            |\n| Pub/Sub                   | Каналы                  | Трансляция изменений расписания      |\n| Кеш                       | Strings/Hashes + TTL    | Кеширование расписания и каталога    |\n| Хранилище сессий          | Yii2 Redis Session      | Серверные сессии                     |\n\n## Быстрый старт\n\n### Предварительные требования\n\n- Docker \u0026 Docker Compose v2\n- Git\n\n### Запуск\n\n```bash\n# Клонировать репозиторий\ngit clone https://github.com/lmoroz/beautybook.git\ncd beautybook\n\n# Запустить все сервисы\ndocker compose up -d --build\n\n# Выполнить миграции\ndocker compose exec php php yii migrate --interactive=0\n\n# Приложение доступно:\n# - Фронтенд:  http://localhost:3000\n# - API:       http://localhost:8080/api/v1/\n# - MySQL:     localhost:3306\n# - Redis:     localhost:6379\n```\n\n### Остановка\n\n```bash\ndocker compose down\n```\n\n### Сброс базы данных\n\n```bash\ndocker compose exec php php yii migrate/redo --interactive=0\n```\n\n### Запуск воркера уведомлений\n\n```bash\ndocker compose exec php php yii queue/listen\n```\n\n## Схема базы данных\n\n```text\n┌──────────┐     ┌──────────┐     ┌──────────┐\n│  salons  │────\u003c│ masters  │────\u003c│ services │\n└──────────┘     └────┬─────┘     └────┬─────┘\n                      │                │\n                 ┌────┴─────┐         │\n                 │time_slots│         │\n                 └────┬─────┘         │\n                      │                │\n                 ┌────┴─────┐         │\n                 │ bookings │─────────┘\n                 └──────────┘\n\nsalons     1 ──\u003c N  masters\nmasters    1 ──\u003c N  services\nmasters    1 ──\u003c N  time_slots\ntime_slots 1 ──\u003c 1  bookings\nservices   1 ──\u003c N  bookings\n```\n\n## Разработка\n\n### Бэкенд (Yii2 API)\n\n```bash\n# Зайти в PHP-контейнер\ndocker compose exec php bash\n\n# Выполнить миграции\nphp yii migrate\n\n# Создать новую миграцию\nphp yii migrate/create create_bookings_table\n```\n\n### Фронтенд (Vue 3)\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\n### Стандарты кода\n\n- **PHP:** PSR-12, автоформатирование через [PHP-CS-Fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer)\n- **Vue:** Composition API (`\u003cscript setup\u003e`), без Options API\n- **Коммиты:** [Conventional Commits](https://www.conventionalcommits.org/)\n- **Язык:** английский для кода, комментариев и документации\n\n#### PHP-CS-Fixer\n\n```bash\n# Проверка стиля (dry-run)\ndocker compose exec php composer cs-check\n\n# Автоформатирование\ndocker compose exec php composer cs-fix\n```\n\nКонфигурация: `api/.php-cs-fixer.php` (PSR-12 + упорядочивание импортов, single quotes, trailing commas).\n\n#### Git-хуки\n\nPre-commit хук автоматически проверяет стиль PHP-файлов при коммите.\n\nАктивация (один раз после клонирования):\n\n```bash\ngit config core.hooksPath .githooks\n```\n\n\u003e Если `composer install` выполняется на хосте (не в контейнере), хуки активируются автоматически.\n\n## Лицензия\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmoroz%2Fbeauty-book","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flmoroz%2Fbeauty-book","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmoroz%2Fbeauty-book/lists"}