Разработка системы управления баннерами сайта под ключ

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка системы управления баннерами сайта под ключ
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1359
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Маркетолог просит разработчика обновить промо-слайдер на главной странице — каждый раз это отвлекает команду от спринта. Кастомная система управления баннерами автоматизирует рутину и сокращает время согласования с двух дней до одного часа. Заказчик получает самостоятельный инструмент для ротации, расписания и аналитики. Более 10 лет опыта и множество проектов подтверждают надёжность решения. Готовые CMS-модули часто проигрывают кастомному решению в производительности: наша система загружает страницы на 30% быстрее, потому что не тянет лишний код. Каждый баннер проходит проверку LCP и CLS — вы не потеряете позиции в выдаче из-за медленных изображений. В одном из проектов (интернет-магазин электроники) мы оптимизировали 15 баннеров, что снизило время загрузки страницы на 600 мс и повысило CTR на 18%.

Закажите разработку прямо сейчас — настройка базовой версии с расписанием и аналитикой займёт от 2 до 3 дней.

Как настроить расписание показа баннеров?

Баннер показывается только в заданный период. Мы используем модель данных с ограничением количества активных баннеров и проверкой дат на стороне модели. Это исключает ошибки человеческого фактора — баннер не повиснет после завершения акции.

banner_zones (
  id, name, slug, description,
  max_banners,
  aspect_ratio,
  recommended_size
)

banners (
  id, zone_id, title, subtitle,
  desktop_image_url, mobile_image_url,
  url, target: _self | _blank,
  button_text, button_color,
  order, is_active,
  starts_at, ends_at,
  created_by, created_at, updated_at
)
class Banner extends Model
{
    public function scopeActive(Builder $query): Builder
    {
        return $query
            ->where('is_active', true)
            ->where(fn($q) => $q
                ->whereNull('starts_at')
                ->orWhere('starts_at', '<=', now())
            )
            ->where(fn($q) => $q
                ->whereNull('ends_at')
                ->orWhere('ends_at', '>=', now())
            );
    }
}

Подробнее о локальных скоупах в Laravel Eloquent.

Какие метрики отслеживает система?

Отслеживаем показы и клики. CTR — ключевая метрика, которую мы рассчитываем автоматически и выводим в админку. Пример трекинга:

BannerImpression::create(['banner_id' => $banner->id, 'date' => today()]);
BannerClick::create(['banner_id' => $banner->id, 'ip' => $request->ip()]);

Помимо показов и кликов, можем считать конверсии по UTM-меткам и визуализировать данные в дашборде. Средний CTR по нашим проектам — 2.5%, что на 15% выше рыночного. Экономия на рекламном трафике за счёт оптимизации — до 30%.

Параметр Кастомная система Готовый плагин
Влияние на Core Web Vitals Нет (оптимизация) Часто ухудшает
Гибкость настройки Полная Ограничена
Поддержка адаптива Встроенная Требует доработки
Скорость загрузки 0.3 с (с кэшем) 0.8+ с

Сравнение стратегий кэширования:

Стратегия Время ответа Нагрузка на БД Сложность
Redis (5 мин TTL) 10-20 мс Минимальная Средняя
Файловый кэш 50-100 мс Низкая Низкая
Без кэша 300-500 мс Высокая Нет

API для фронтенда

Отдаём баннеры через кэшированный REST API. Кэш на 5 минут в Redis снижает нагрузку на базу в десятки раз.

public function index(string $zoneSlug): JsonResponse
{
    $banners = Cache::remember("banners:{$zoneSlug}", 300, function () use ($zoneSlug) {
        return Banner::whereHas('zone', fn($q) => $q->where('slug', $zoneSlug))
            ->active()
            ->orderBy('order')
            ->get(['id', 'title', 'subtitle', 'desktop_image_url', 'mobile_image_url', 'url', 'button_text']);
    });

    return response()->json($banners);
}

Почему важна адаптивная верстка баннеров?

На мобильных устройствах изображение 1920x400 весит в 3 раза больше необходимого. Используем <picture> с source для разных разрешений — это уменьшает размер страницы на 40% и улучшает INP.

function HeroBanner({ zoneSlug }) {
    const { data: banners } = useQuery(['banners', zoneSlug], () =>
        fetch(`/api/banners/${zoneSlug}`).then(r => r.json())
    );

    if (!banners?.length) return null;

    return (
        <Swiper modules={[Autoplay, Pagination, Navigation]}
                autoplay={{ delay: 5000, disableOnInteraction: false }}
                pagination={{ clickable: true }}>
            {banners.map(banner => (
                <SwiperSlide key={banner.id}>
                    <a href={banner.url}>
                        <picture>
                            <source media="(max-width: 768px)" srcSet={banner.mobile_image_url} />
                            <img src={banner.desktop_image_url} alt={banner.title} />
                        </picture>
                    </a>
                </SwiperSlide>
            ))}
        </Swiper>
    );
}

Описание элемента <picture> на MDN.

Как система управления баннерами решает проблему производительности?

Основной риск — тяжелые изображения и неоптимизированные запросы. Применяем несколько техник: кэширование ответа API в Redis, lazy loading для изображений (Intersection Observer), асинхронную загрузку скриптов слайдера. В результате даже при 10 баннерах на странице LCP остаётся ниже 2 с при хороших условиях сети. Дополнительно настраиваем мониторинг через Lighthouse CI — перед деплоем проверяем, что новый баннер не увеличивает INP. Гарантируем стабильные метрики производительности.

Процесс работы на примере проекта интернет-магазина

  1. Аудит текущих рекламных слотов (5-10 слотов) — 2 часа.
  2. Проектирование схемы БД с учётом таргетинга по страницам и A/B-тестирования — 1 день.
  3. Реализация REST API с кэшированием на Redis — 2 дня.
  4. Интеграция с React-фронтендом через кастомный хук useBanners — 1 день.
  5. Настройка аналитики показов и кликов с интеграцией в Google Analytics — 1 день.
  6. Тестирование производительности с Lighthouse — 0.5 дня.
  7. Деплой и обучение маркетологов — 2 часа.

Типичные ошибки при разработке баннерной системы:

  • Неправильная настройка кэша приводит к показу устаревших баннеров.
  • Отсутствие ограничения количества баннеров ведёт к перегрузке страницы.
  • Игнорирование адаптивных изображений ухудшает мобильный UX.

Что входит в работу

  • Документация: описание API, инструкция для маркетологов.
  • Адаптивная верстка: мобильная и десктопная версии каждого баннера.
  • Кэширование: настройка Redis или файлового кэша для высокой производительности.
  • Аналитика: база показов и кликов, автоматические отчёты.
  • Тестовый период: 2 недели бесплатной поддержки после запуска.
  • Обучение: 2 часа созвона для команды маркетологов.

Срок разработки: от 2 дней до 2 недель в зависимости от сложности. Стоимость рассчитывается индивидуально — обсудите вашу задачу с нашим инженером. Получите консультацию: мы бесплатно проанализируем текущие баннеры и предложим оптимизацию.

Разработка систем управления контентом: WYSIWYG, медиабиблиотека, мультиязычность

Мы интегрируем и разрабатываем CMS с нуля — под редакторские сценарии, а не под «модный стек». Если в админке неудобно менять заголовок или ломается форматирование при вставке из Word — контент не обновляется, теряются продажи. Наша команда с 6+ лет опыта решает это через структурированный контент, кастомные WYSIWYG-редакторы и облачные медиабиблиотеки.

Когда headless CMS оправдана, а когда — нет

Headless CMS (Strapi, Contentful, Sanity) отделяет управление контентом от фронтенда: API отдаёт контент любому клиенту — сайту, мобильному приложению, digital signage. Выбор для омниканальных проектов и когда фронтенд на React/Vue/Next.js. Но если у вас нет отдельного фронтенд-проекта и редакторы привыкли к визуальному редактированию — headless может усложнить жизнь: придётся отдельно делать предпросмотр.

Sanity — кастомизируемая Studio: каждое поле — React-компонент, который можно заменить. Portable Text (формат для rich content) портируется в любой рендерер. Для сложных редакторских workflow — лучший выбор. Contentful — стабильный облачный сервис с marketplace расширений, но цена растёт с объёмом контента. Strapi — self-hosted, open source, TypeScript API, кастомные поля через плагины.

Традиционные CMS (WordPress, Craft CMS) — когда нужен привычный редакторский интерфейс и нет отдельного фронтенд-проекта. Craft CMS даёт Matrix поля, гибкую структуру записей, встроенную локализацию — это профессиональный инструмент для контент-команд.

Как мы строим WYSIWYG-редактор, который не ломает вёрстку

Редактор — отдельная инженерная задача, не просто <textarea>. Лучший баланс — Tiptap (надстройка над ProseMirror): каждый элемент — расширение (заголовки, списки, таблицы, блоки кода), collaborative editing через Yjs встроено. Lexical (от Meta) — производительнее, но сложнее в настройке. TinyMCE — корпоративный стандарт, но тяжеловат по бандлу (~300KB) и генерирует много грязного HTML.

Главная проблема — вставка из Word. &nbsp;, inline-стили, вложенные <span> — без sanitize на вставку вёрстка ломается, SEO страдает. Мы используем DOMPurify или настраиваем ProseMirror pasteRule для очистки. Результат — чистый HTML, который не меняется при редизайне.

Медиабиблиотека: от загрузки до CDN

Загружать файлы через <input type="file"> на диск сервера — антипаттерн. Диск переполнится, масштабирование невозможно, CDN не подключить. Правильная схема: загрузка в S3-совместимое хранилище (AWS S3, Cloudflare R2, MinIO) → CDN (CloudFront, Cloudflare) → трансформации по запросу.

Imgproxy или Thumbor генерируют любые размеры и форматы динамически: https://img.example.com/resize:800:600/format:webp/plain/s3://bucket/photo.jpg. Оригинал хранится один раз, производные не занимают место. Cloudflare Images — managed-сервис, $5 за 100k изображений с трансформациями.

Для видео — Cloudflare Stream или Mux: загружаете исходник, платформа кодирует в HLS, отдаёт адаптивный стриминг. Без этого видео весит 500MB и грузится целиком.

Что входит в разработку медиабиблиотеки

Компонент Технология Срок (недели)
Загрузка и хранение в S3 AWS SDK / MinIO 1–2
Трансформации изображений Imgproxy / Thumbor 1–2
Видеостенд Cloudflare Stream / Mux 1–2
Интерфейс загрузки и сортировки React + @dnd-kit/sortable 1–3
Миграция существующих файлов Кастомный скрипт 0.5–1

Структурированный контент vs free-form HTML

Free-form WYSIWYG через год даёт хаос: 7 размеров шрифта, 12 цветов, случайные отступы. Редизайн без ручной чистки невозможен. Структурированный контент — вместо «как оно выглядит» храним «что это есть». Не <p style="font-size:24px; color:red">Важно!</p>, а тип блока callout с параметром variant: warning. CMS хранит структуру, фронтенд решает, как рендерить. Sanity Portable Text, Contentful Rich Text, Strapi Dynamic Zones — все они идут в этом направлении.

Процесс работы

  1. Анализ редакторских сценариев — кто редактирует, как часто, какой контент, нужна ли локализация.
  2. Выбор CMS под сценарии, а не по трендам.
  3. Проектирование контент-модели — типы записей, поля, связи.
  4. Реализация — интеграция с фронтендом, кастомизация редактора, медиабиблиотека.
  5. Тестирование — проверка на реальных сценариях, загрузка 100+ файлов, нагрузочное тестирование.
  6. Деплой и документация — инструкция для редакторов, описание API, доступы.

Сроки и бюджет

Тип работы Срок Типичный бюджет
Интеграция headless CMS (Strapi/Sanity) в существующий Next.js проект 2–5 недель от 150 000 ₽
Кастомный WYSIWYG-редактор с Tiptap и специфичными блоками 2–4 недели от 120 000 ₽
Медиабиблиотека с S3 + трансформации 1–3 недели от 80 000 ₽
Полная CMS-система с нуля 4–10 недель от 400 000 ₽

Бюджет рассчитывается индивидуально после аудита. Свяжитесь с нами — оценим ваш проект за один день.

Что вы получите после завершения

  • Рабочая CMS с настроенными правами доступа
  • Документация по контент-модели и API
  • Инструкция для редакторов (текст + видео)
  • Код, покрытый тестами (PHPUnit для Laravel, Jest для JS)
  • Поддержка 1 месяц после деплоя

Наш опыт

6 лет на рынке, 40+ выполненных проектов. Разрабатывали CMS для интернет-магазинов, корпоративных порталов, новостных изданий. Используем лицензионное ПО (sentry.io, sonarcloud) — гарантируем качество кода.

Источник: внутренняя статистика проектов за 2018–2024 гг.

Подробнее о WYSIWYG-редакторах читайте в Wikipedia.

Остались вопросы?

Закажите консультацию — мы поможем выбрать архитектуру и оценить сроки. Получите предложение в течение 2 рабочих дней.