Портал объявлений недвижимости: жилая недвижимость, коммерческая недвижимость и рабочие пространства (коворкинги, офисы, переговорные) — поиск, публикация объявлений, модерация, карты, избранное, сравнение и переписка между пользователями.
Интерфейс полностью на русском языке.
Портал построен вокруг трёх параллельных каталогов объявлений (жильё / коммерция / рабочие пространства), у каждого — свой набор фильтров, своя карточка объявления и своя пошаговая форма размещения, но общий движок поиска по карте, избранного, сравнения, чатов и модерации.
Основные возможности:
- Каталоги и поиск — фильтры по сделке (купить/снять), типу объекта, цене, площади и т.д.; переключение "Список" / "Карта" во всех трёх каталогах.
- Карта на Yandex Maps JS API 3.0 — пины объявлений из результатов поиска, автоподбор границ карты под все найденные объекты, а также выделение произвольной области на карте (клик по двум углам) — список фильтруется по объектам внутри выделенного полигона через
ST_Contains/SPATIAL INDEXв MySQL (с PHP-фолбэком на других СУБД, используется в тестах на SQLite). - Подбор адреса при создании объявления — автодополнение адреса и уточнение точки кликом по карте (HTTP-геокодер Yandex), поля адреса и координат при этом нередактируемы вручную — заполняются только через карту/подсказки, чтобы объявление нельзя было создать с координатами "наугад".
- Пошаговые формы размещения объявления — отдельный мастер (шаги: основное → адрес → характеристики → фото) для каждого из трёх типов недвижимости, с загрузкой нескольких фото и указанием главного фото.
- Личный кабинет — свои объявления по всем трём категориям со статусами (на модерации / активно / отклонено / в архиве), причина отклонения, снятие собственного активного объявления с публикации (в архив) без участия администратора, смена телефона и пароля, аватар.
- Избранное и сравнение объявлений — полиморфные, работают одинаково для всех трёх типов недвижимости, сравнение — с лимитом в 3 объявления.
- Чаты между пользователями — переписка по конкретному объявлению ("Написать продавцу"), список диалогов, обновление сообщений через
wire:poll. - Уведомления — колокольчик в шапке (database notifications): решение по модерации, новые сообщения в чате.
- Админ-панель на Filament (
/admin) — модерация объявлений всех трёх типов (одобрить/отклонить с указанием причины), управление пользователями, FAQ и справочными страницами. - FAQ — отдельная страница с категориями вопросов и аккордеон на главной.
- Антифлуд при входе — Yandex SmartCaptcha подключается автоматически после 3 неверных попыток пароля подряд.
- Правовая информация — статичные страницы "О компании", "Помощь", пользовательское соглашение, политика конфиденциальности.
- Backend: PHP 8.3+, Laravel 13
- UI: Livewire 3 + Volt, Alpine.js, Tailwind CSS 4, Flowbite (аккордеоны, часть UI-паттернов)
- Админ-панель: Filament 3
- База данных: MySQL (в проде — используются генерируемые
POINT-колонки иSPATIAL INDEXдля гео-поиска по области); тесты выполняются на SQLite с PHP-фолбэком для полигонального фильтра - Карты: Yandex Maps JS API 3.0 + HTTP Geocoder API
- Изображения: Intervention Image (обработка аватаров и фото объявлений, конвертация в WebP)
- Сборка фронтенда: Vite
- Тесты: PHPUnit (feature-тесты) + Livewire Testing; ключевые сценарии (карта, геокодер, кросс-каталожная логика) дополнительно проверялись вручную через Playwright против реально запущенного приложения
- CAPTCHA: Yandex SmartCaptcha
- PHP ^8.3 с расширениями, обычными для Laravel (в т.ч.
gd/imagickдля Intervention Image) - Composer
- Node.js + npm
- MySQL 8+ (для полноценной работы гео-поиска по выделенной области; SQLite подходит для тестов и локальной разработки без этой функции)
composer install
cp .env.example .env
php artisan key:generate
# .env: указать DB_* (см. ниже), при необходимости YANDEX_MAPS_API_KEY и SMARTCAPTCHA_*
php artisan migrate
npm install
npm run build # или npm run dev для разработки с HMR
php artisan storage:link
php artisan serveТесты:
php artisan test| Переменная | Назначение |
|---|---|
YANDEX_MAPS_API_KEY |
Yandex Maps JS API 3.0 + HTTP Геокодер (developer.tech.yandex.ru). Без ключа карта и подбор адреса заменяются заглушкой с пояснением, остальной функционал не ломается. |
SMARTCAPTCHA_SITE_KEY / SMARTCAPTCHA_SERVER_KEY |
Yandex SmartCaptcha (cloud.yandex.ru) — капча на форме входа после 3 неверных попыток пароля. |
DB_* |
Подключение к MySQL. На SQLite фильтр по выделенной области на карте работает через PHP-фолбэк вместо ST_Contains. |
После изменения ключей на сервере: php artisan config:cache.
Актуальный процесс обновления продакшна (хостинг Timeweb) подробно описан в deploy-guide.md. Коротко:
- Разработка ведётся отдельно от сервера; изменения коммитятся и пушатся в
mainрепозиторияpraviilon/realty-portal. - На сервер изменения попадают вручную, командой обновления — автодеплоя на каждый push нет, чтобы непроверенные изменения не улетали в продакшн сами.
- Обновление сервера:
cd ~/realty-portal git pull origin main composer install --no-dev --optimize-autoloader # если менялся composer.json/lock php artisan migrate --force # если добавлялись миграции php artisan optimize:clear
php artisan filament:install --panels --forceне нужно перезапускать на уже работающем сервере — эта команда пересоздаётAdminPanelProvider.phpиз шаблона и затирает кастомизацию. Она нужна только один раз, при первом деплое на чистый сервер.- Первичная настройка сервера (создание
.env,migrate,storage:link, первый администратор черезmake:filament-user+ простановкаrole = admin) — см.deploy-guide.md.
app/Livewire/— Livewire-компоненты: каталоги и поиск (Catalog/), пошаговые мастера создания объявлений (Property/,CommercialProperty/,Workspace/), избранное, сравнение, чаты, главная страница, FAQ.app/Filament/Resources/— ресурсы админ-панели (модерация по каждому типу недвижимости).app/Models/—ResidentialProperty,CommercialProperty,Workspaceи связанные модели (фото, цены рабочих пространств, избранное, сравнение, чаты, уведомления).resources/js/yandex-map.js,resources/js/address-geocoder.js— интеграция с Yandex Maps (пины/область на карте, автоподбор адреса).resources/views/livewire/— Blade-шаблоны Livewire-компонентов, сгруппированы так же, как компоненты вapp/Livewire/.database/migrations/— в т.ч. генерируемыеPOINT-колонки иSPATIAL INDEXдля гео-фильтра по каждому из трёх типов недвижимости.tests/Feature/— feature-тесты, один файл на эпик/доработку.