Skip to content

About

A realty portal

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

65 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Smart Realty

Портал объявлений недвижимости: жилая недвижимость, коммерческая недвижимость и рабочие пространства (коворкинги, офисы, переговорные) — поиск, публикация объявлений, модерация, карты, избранное, сравнение и переписка между пользователями.

Интерфейс полностью на русском языке.

О проекте

Портал построен вокруг трёх параллельных каталогов объявлений (жильё / коммерция / рабочие пространства), у каждого — свой набор фильтров, своя карточка объявления и своя пошаговая форма размещения, но общий движок поиска по карте, избранного, сравнения, чатов и модерации.

Основные возможности:

  • Каталоги и поиск — фильтры по сделке (купить/снять), типу объекта, цене, площади и т.д.; переключение "Список" / "Карта" во всех трёх каталогах.
  • Карта на 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

Ключи в .env

Переменная Назначение
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-тесты, один файл на эпик/доработку.

About

A realty portal

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages