← Все проекты

01 · Проект

Карта путешествий

Интерактивное веб-приложение, которое собирает точки из личного travel-блога и превращает их в единую карту с маркерами, карточками и фильтрацией по годам.

Laravel Vue.js MapLibre GL Joomla REST API Redis Scheduler MySQL
Карта путешествий
01

Задача

Идея проекта появилась из личного travel-блога на Joomla. Заметки уже хранились в базе CMS, но хотелось получить отдельный интерфейс, где все поездки можно увидеть на карте и при необходимости отфильтровать.

Основная задача — не дублировать данные в новой системе, а использовать существующую базу Joomla как источник данных, а Laravel API сделать связующим слоем между базой и Vue-интерфейсом.

02

Архитектура

Проект разделён на несколько уровней. Joomla продолжает отвечать за хранение материалов, Laravel предоставляет API, а Vue.js отвечает за интерфейс карты. Для визуализации используется MapLibre GL.

По мере развития проекта была проведена синхронизация таблиц. Данные Joomla стали перекачиваться в таблицу Laravel и тянуться оттуда напрямую. Новые данные добавляются в таблицу Laravel, существующие обновляются, а неактуальные удаляются.

Для оптимизации запросов было реализовано кеширование данных с помощью Redis.

Все эти службы с определенной периодичностью запускает Scheduler.

Поток данных: Joomla DB → Scheduler → Synchronization → Laravel DB (name_table)
Laravel API → Redis → Vue.js → MapLibre GL → маркеры и popup
MySQLLaravel APIRedisVueMapLibre
03

Получение данных

Scheduler обращается к таблице контента Joomla через отдельное подключение к базе -> берет данные -> добавляет/обновляет/удаляет в таблице Laravel

DB::connection('database_joomla')
    ->table('name_table_joomla')
    ->get();

Потом последующие данные уже берутся непосредственно из таблицы Laravel

 return self::query()
            ->select(...)

Отдельный endpoint позволяет получать точки с фильтром по году, поэтому Vue не нужно загружать и обрабатывать весь набор данных при каждом переключении фильтра.

Данные кешируются с помощью Redis и поэтому нет необходимости постоянно тянуть данные из таблицы. Кеш обновляется также с помощью планировщика каждый час.

04

Карта и маркеры

На клиентской стороне MapLibre используется для отображения карты. Для каждой записи создаётся маркер, а popup показывает дополнительную информацию о путешествии.

Отдельно прорабатывалась стилизация маркеров и popup, чтобы интерфейс карты визуально выглядел симпатично и современно.

05

Фильтрация

Фильтр по годам отправляет запрос в Laravel API. Если год не выбран, загружается полный набор точек. При выборе года API возвращает только соответствующие записи.

/api/filter-data?year=2025

Такой подход позволяет оставить бизнес-логику фильтрации на сервере и не перегружать браузер лишними данными.

06

Что было сложным

  • Связать отдельное Laravel-приложение с существующей базой Joomla.
  • Разделить получение данных, API и отображение карты.
  • Организовать обновление маркеров при смене фильтра без перезагрузки страницы.
  • Стилизовать MapLibre popup и маркеры под собственный дизайн.
  • Переписать логику запросов с Joomla на Laravel и переработать архитектуру.
07

Результат

В результате получился отдельный картографический интерфейс, который использует реальные данные travel-блога и может развиваться независимо от Joomla. Архитектура также оставляет возможность добавлять новые фильтры, типы точек и дополнительные API-методы.