База знаний

Все инструкции от А до Я по работе с системой и ее архитектурой

1. Начало работы

Добро пожаловать в meloddyCMS! Платформа предназначена для легкого и интуитивного управления контентом ваших сайтов без необходимости знать программирование.

Регистрация и Вход

Вы можете самостоятельно зарегистрироваться на платформе. Для этого нажмите кнопку «Начать работу» на главной странице сайта или перейдите по ссылке https://meloddy-crm.ru/login.html?mode=register. Создайте свой аккаунт администратора, указав имя, действующий email и надежный пароль.

Личный профиль

В любой момент вы можете изменить свое отображаемое имя или адрес электронной почты. Для этого перейдите в раздел «Настройки» (вкладка «Профиль») в левом боковом меню панели управления.

2. Дашборд и Проекты

После входа вы попадаете на Дашборд. Это ваш главный пульт управления.

  • Статистика: Верхние плашки показывают общую сводку по вашему аккаунту: сколько у вас сайтов, сколько на них загружено изображений и какой объем на диске они занимают.
  • Активные проекты: Здесь в виде красивых карточек отображаются ваши сайты. По клику на кнопку редактирования вы перейдете в режим визуального редактора.
  • Последняя активность: Лента событий, показывающая, какие файлы изменялись в последнее время. Вы можете фильтровать ее по периоду (сегодня, неделя, месяц) и по конкретному сайту.

В карточке каждого проекта есть кнопка с тремя точками (...). При нажатии на неё откроется меню управления конкретным сайтом (настройки, SEO, аналитика и действия).

3. Визуальный редактор

Это главная фишка meloddyCMS. Вы редактируете сайт прямо поверх его реального дизайна.

Как менять текст

Наведите мышку на любой текст. Если он обвелся пунктирной линией, значит его можно изменить. Просто кликните по нему, сотрите старый текст и напишите новый. Форматирование (жирность, размер) сохранится автоматически.

Как менять картинки

Аналогично наведите на фотографию, логотип или иконку. По клику откроется стандартное окно вашего компьютера для выбора файла. Выберите новое изображение, и оно моментально загрузится на сайт.

Черновики и публикация

Когда вы вносите изменения, они сохраняются только для вас в виде черновика. Посетители сайта их не видят! Чтобы выкатить изменения на боевой сайт, обязательно нажмите фиолетовую кнопку «Опубликовать» на верхней панели редактора.

4. Настройки сайта и SEO

В дашборде, нажав (...) на карточке проекта, вы попадете в детальную панель управления сайтом, разделенную на несколько вкладок:

  • Вкладка «Настройки»: Здесь вы можете переименовать проект внутри CMS, добавить описание для клиентов, привязать собственный домен и загрузить favicon (иконку сайта).
  • Вкладка «Обзор»: Раздел детальной аналитики. Выводит количество просмотров и кликов, график визитов за неделю, статистику по типам устройств/браузеров посетителей, а также историю последних изменений.
  • Вкладка «SEO & Интеграции»: Важнейший блок для продвижения. Здесь настраиваются файл robots.txt, генерируется ссылка на авто-обновляемую карту сайта sitemap.xml, подключается ID счетчика Яндекс Метрики (с поддержкой Вебвизора) и привязываются уведомления в Telegram.
  • Вкладка «Доступ & Бэкапы»: Позволяет привязать сайт к коду вашего разработчика, настроить периодичность автобэкапов (каждый день, неделю или месяц), а также вручную создавать, скачивать и восстанавливать резервные копии проекта.
  • Вкладка «Опасная зона»: Служит для переноса прав владения сайтом на другой email или полного удаления проекта из CMS.

5. Заявки с сайта (Лиды)

Система может перехватывать данные с форм обратной связи на вашем сайте и моментально отправлять их вам в мессенджер.

Настройка Telegram

Чтобы бот присылал вам уведомления:

  1. Найдите в Telegram и запустите нашего официального бота: @meloddyCMS_bot (нажмите «Запустить» / Start).
  2. В меню бота запросите код для привязки нового сайта (бот выдаст вам короткий шестизначный код).
  3. В панели управления CMS в карточке нужного сайта нажмите три точки (...), выберите вкладку «SEO & Интеграции».
  4. В блоке «Уведомления в Telegram» введите полученный из бота код и нажмите «Подключить».
  5. Готово! Теперь все заявки с форм этого сайта будут мгновенно присылаться ботом прямо в ваш чат.

6. Создание из шаблонов

Если ваш разработчик подготовил для вас шаблоны, вы найдете их в Дашборде на вкладке «Шаблоны».

Чтобы развернуть новый сайт, достаточно нажать кнопку на карточке шаблона, ввести название нового проекта (ID) и подтвердить. CMS сама создаст точную копию этого шаблона в виде отдельного проекта, в котором вы сразу же сможете менять контент через визуальный редактор!

7. Управление файлами и медиатекой

В meloddyCMS встроен продвинутый, но простой в использовании Файловый менеджер. Доступ к нему осуществляется через главное меню в левой панели или по клику на кнопку «Файлы» в карточке нужного проекта.

Загрузка и организация

Вы можете перетаскивать файлы картинок, документов (PDF, DOCX) прямо в окно файлового менеджера. Все они будут бережно сохранены в структуре папок вашего сайта.

  • Оптимизация картинок: При загрузке через визуальный редактор система автоматически сжимает тяжелые фотографии, подгоняя их под веб-стандарты без видимой потери качества. При загрузке через Файловый менеджер файлы загружаются «как есть» — это полезно для документов.
  • Лимиты и квоты: Каждому проекту выделяется определенный объем дискового пространства на сервере (отображается на плашке дашборда). Если место заканчивается, вы можете удалить старые неиспользуемые скриншоты или архивы.

Использование подпапок

Для поддержания порядка создавайте отдельные папки, например /docs для PDF-инструкций и /images/blog для картинок новостей. Это предотвратит кашу в корневой папке.

8. Работа с лидами и встроенной CRM

Все контакты клиентов, которые заполняют формы на ваших сайтах, сохраняются во встроенную микро-CRM систему.

Панель «Заявки» (Канбан-доска)

В главном меню перейдите в раздел «Заявки». Вы увидите доску со столбцами, представляющими этапы воронки продаж:

  1. Новые: Сюда попадают только что отправленные формы. Они подсвечиваются ярким цветом.
  2. В работе: Перетащите карточку сюда, когда начали общение с клиентом.
  3. Завершено: Успешно закрытые сделки.
  4. Отказ: Спам или нецелевые запросы.

Вы можете кликнуть на любую карточку лида, чтобы увидеть полные детали: дату отправки, страницу, с которой пришла заявка, и все заполненные поля формы. Также внутри карточки можно оставлять текстовые заметки для менеджеров.

Экспорт данных

При необходимости выгрузить базу лидов для рассылки или анализа, воспользуйтесь кнопкой «Экспорт в Excel (CSV)». Файл скачается моментально.

9. Домены и SSL-сертификаты

По умолчанию ваши проекты доступны на служебных поддоменах вида site-123.meloddy.ru. Для боевого запуска необходимо привязать собственный домен.

Шаги для подключения домена:

  1. Купите домен у любого регистратора (Reg.ru, Ru-Center, Beget и др.).
  2. В панели управления регистратора перейдите в настройки DNS и добавьте следующую запись:
    • Тип: A, Имя (Хост): @ (или пустое), Значение (IP): 195.209.214.15
    • Тип: CNAME, Имя (Хост): www, Значение: ваш-домен.ru.
  3. В дашборде meloddyCMS нажмите на три точки (...) у вашего проекта, выберите вкладку «Настройки», введите имя домена и сохраните.

Автоматический SSL-сертификат (HTTPS)

Система сама отслеживает обновление DNS-записей и в течение 15 минут после привязки бесплатно выпустит SSL-сертификат Let's Encrypt для безопасного соединения HTTPS.

10. Управление пользователями и правами доступа

meloddyCMS поддерживает разграничение прав доступа. Это позволяет безопасно давать доступ разным специалистам.

Роли в системе

  • Администратор (Owner): Обладает полным доступом ко всем настройкам, созданию новых проектов, привязке доменов, оплате и управлению пользователями.
  • Клиент (Client Editor): Может заходить в визуальный редактор своих проектов, менять тексты и изображения, работать с CRM (заявками), просматривать аналитику. У него нет прав на удаление проектов или изменение системных конфигураций серверов.
  • Разработчик (Developer): Имеет доступ к загрузке ZIP-архивов с версткой, управлению шаблонами, редактированию файлов исходного кода через Файловый менеджер и настройкам прикрепления разработчика. Не видит личные финансовые данные владельца.

11. Интеграция вебхуков и внешних CRM (В разработке)

Если вы используете сторонние CRM-системы (например, amoCRM или Bitrix24), вы можете настроить интеграцию для автоматической пересылки лидов.

Прямая интеграция по API

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

Это позволяет связывать формы сайта с любыми конструкторами автоматизации, такими как Albato, Make или Integromat.

12. Резервные копии и история версий

Мы заботимся о сохранности ваших данных и автоматически делаем ежедневные бэкапы всей платформы.

Самостоятельные бэкапы проекта

Вы можете в любой момент выгрузить полную актуальную копию вашего сайта. Для этого зайдите в детальные настройки сайта (...), выберите вкладку «Доступ & Бэкапы» и нажмите «Скачать» (предварительно можно нажать «Создать бэкап» для создания свежей версии). Вы получите архив с HTML-кодом, скриптами и всеми вашими картинками.

Если вы случайно удалили важный блок или испортили страницу в визуальном редакторе, вы можете выбрать один из сохраненных бэкапов в выпадающем списке во вкладке «Доступ & Бэкапы» и восстановить сайт до этой точки сохранения.

1. Интеграция верстки (Посадка)

meloddyCMS не требует изучения сложных языков шаблонизаторов. Посадка происходит прямо на вашу готовую HTML-верстку.

  1. Возьмите вашу готовую папку с сайтом (с index.html, папками css, js, img).
  2. Убедитесь, что пути к стилям и картинкам в HTML — относительные от корня (например, <img src="/img/logo.png">).
  3. Запакуйте содержимое папки (именно файлы, а не саму папку) в ZIP-архив.
  4. В Дашборде админки нажмите «Загрузить сайт (.ZIP)» и выберите ваш архив.
  5. Система сама распакует сайт, настроит роутинг и сделает его доступным в CMS.

Важно для мультистраничников

Если у вас несколько страниц (например, index.html и about.html), загружайте их все в одном архиве. CMS автоматически найдет все HTML-файлы и сделает их редактируемыми.

2. Разметка элементов

Чтобы клиент мог менять текст или картинки в Визуальном редакторе, вам нужно разметить нужные теги специальными data-атрибутами.

Редактирование текста (data-editable)

Добавьте атрибут data-editable="уникальный_ключ" к любому текстовому тегу (h1-h6, p, span, div). Ключ должен быть уникальным в рамках страницы.

<h1 data-editable="hero_title">Мы создаем сайты</h1>
<p data-editable="hero_subtitle">Быстро и качественно</p>

Замена изображений (data-img-editable)

Для тегов <img> используйте атрибут data-img-editable="ключ". При клике в редакторе откроется загрузчик файлов.

<img data-img-editable="about_photo" src="/img/about.jpg" alt="О нас">

Фоновые изображения (data-bg-editable)

Если картинка задана через CSS свойство background-image (inline style), используйте data-bg-editable="ключ".

<section data-bg-editable="main_banner" style="background-image: url('/img/banner.jpg');">
    ...
</section>

3. Подключение форм (Лиды)

Для отправки заявок с сайта в Telegram-бот CMS, вам не нужно писать PHP-скрипты или настраивать SMTP. Достаточно слегка модифицировать вашу HTML-форму.

  1. Форма должна отправлять данные POST-запросом на наш API-эндпоинт: action="/api/submit-form".
  2. Каждое поле (input) должно иметь понятный атрибут name (например: name="Телефон", name="Имя"). CMS использует эти имена для формирования красивого сообщения в Telegram.
  3. Форма должна перехватываться через JS, либо редиректить на страницу "Спасибо". (Для базовой работы CMS сама отловит submit, если подключен наш базовый скрипт интеграции).
<form action="/api/submit-form" method="POST">
    <input type="text" name="Имя" placeholder="Ваше имя" required>
    <input type="tel" name="Телефон" placeholder="Ваш телефон" required>
    <button type="submit">Оставить заявку</button>
</form>

4. Создание шаблонов

Шаблоны позволяют вам один раз собрать типовой сайт (например, квиз или лендинг для стройки), а затем создавать из него новые проекты для клиентов в один клик.

Как создать шаблон:

  1. Сверстайте сайт и полностью разметьте его data-editable атрибутами.
  2. Создайте в корне папки файл template.json со следующим содержимым:
{
  "name": "Лендинг: Строительство домов",
  "description": "Светлый шаблон со слайдером и формой",
  "version": "1.0.0"
}
  1. Запакуйте все файлы сайта (вместе с template.json) в ZIP-архив.
  2. В Дашборде админки перейдите на вкладку «Шаблоны» и загрузите этот архив.

Теперь вы сможете разворачивать этот сайт под новых клиентов моментально, просто указывая новый домен или ID проекта!

5. Динамические компоненты и скрипты

В отличие от классических CMS, которые перестраивают DOM дерева и ломают ваши JavaScript плагины (слайдеры, табы, анимации), визуальный редактор meloddyCMS работает в режиме прямого редактирования.

Сохранение работоспособности JS

Когда пользователь редактирует текст или меняет картинку, CMS обновляет только текстовые узлы или атрибут src, не перезагружая страницу и не ломая привязанные JS-слушатели событий.

  • Динамические слайдеры: Если у вас есть инициализированный слайдер Swiper или Slick, он продолжит работать в визуальном редакторе. Если пользователь изменит изображение в слайде, оно обновится «на лету».
  • Рекомендация: Для элементов, которые скрыты при загрузке (например, модальные окна), вы можете использовать атрибут data-editable, но чтобы клиент мог их увидеть в редакторе, CMS предоставляет специальную панель просмотра скрытых элементов.

6. Тонкая настройка SEO и метатегов

Вы можете позволить клиенту самостоятельно редактировать SEO-параметры страницы, используя системные data-атрибуты.

Помимо вкладки «SEO & Файлы» в настройках дашборда, вы можете внедрить прямое редактирование метатегов в HTML коде шаблона:

  • <title data-editable="meta_title">...</title> — позволяет клиенту менять заголовок вкладки.
  • <meta name="description" content="Отредактируйте меня" data-editable="meta_description"> — описание для поисковиков.
  • Для картинок OpenGraph (OG Image) используйте <meta property="og:image" content="/img/share.jpg" data-img-editable="og_image">.

7. REST API Платформы

meloddyCMS предоставляет набор REST API эндпоинтов, которые вы можете использовать для интеграции с внешними системами или разработки собственных расширений.

Основные эндпоинты:

  • GET /api/sites — получить список всех сайтов текущего пользователя (доступно для ролей admin и developer).
  • POST /api/sites — создать новый сайт на основе ZIP-архива.
  • GET /api/sites/:id/files — получить структуру файлов проекта в формате JSON.
  • POST /api/submit-form — эндпоинт для отправки лидов. Принимает JSON или url-encoded данные и пересылает их в привязанный Telegram-чат.
  • POST /api/settings/developer — привязка разработчика к сайту по уникальному коду.

8. Локальная разработка и синхронизация

Для удобства разработки шаблонов и верстки вы можете использовать Git и разрабатывать сайты на своем локальном компьютере.

Синхронизация через FTP/SFTP или Git

Вы можете настроить автоматический деплой из вашей IDE (VS Code, WebStorm) прямо в директорию сайтов на сервере:

  • Путь к проектам на сервере: /home/ubuntuuser/meloddy-cms/data/sites/[siteId].
  • При обновлении файлов напрямую на сервере кэш визуального редактора сбрасывается автоматически, и клиент сразу видит обновленную верстку при следующем входе в редактор.

Осторожно с перезаписью

Если клиент уже отредактировал тексты на сайте через CMS, а вы зальете поверх новый ZIP-архив с версткой без сохранения файлов данных, то правки клиента могут быть заменены исходными текстами из верстки. Всегда делайте бэкап данных перед обновлением структуры!

9. База данных SQLite и архитектура данных

Вся конфигурация пользователей, проекты, связи с Telegram и лиды хранятся в легковесной и быстрой базе данных SQLite.

Схема БД и файлы данных:

  • Файл базы данных находится по пути: data/database.sqlite (или конфигурационный файл users.json / sites.json в зависимости от сборки).
  • Таблица leads содержит поля: id (уникальный номер), site_id (ID сайта), data (JSON строка со всеми полями формы), status (статус в CRM: new, in_progress, completed, rejected), created_at (дата создания).
  • Конфигурационные данные каждого отдельного сайта хранятся в скрытой папке проекта: data/sites/[siteId]/.meloddy/config.json.

10. Оптимизация производительности и скорость загрузки

meloddyCMS не делает лишних запросов к базе данных при открытии ваших сайтов посетителями. Все страницы отдаются напрямую веб-сервером Nginx как статический HTML, что обеспечивает невероятную скорость работы (100 баллов в Google PageSpeed Insights).

Рекомендации по оптимизации:

  1. Используйте современные форматы изображений (WebP, SVG).
  2. Подключайте CSS в шапке документа, а JS — в самом конце перед закрывающим тегом </body> с атрибутом defer.
  3. Минифицируйте ваши ассеты перед упаковкой в ZIP. CMS отдает файлы в оригинальном виде, поэтому предварительная минификация CSS/JS сэкономит трафик ваших пользователей.

11. Авто-посадка и подготовка верстки через ИИ

Чтобы максимально ускорить посадку сайта на meloddyCMS (особенно если верстка сгенерирована ИИ-конструкторами или визуальными средами вроде VibeCode), вы можете использовать любой ИИ-ассистент (Claude, ChatGPT, Gemini).

Используйте следующий подготовленный промпт. Скопируйте его и отправьте в чат с ИИ вместе с архивом вашего проекта или кодом страниц:

Ты — специализированный транскомпилятор и системный нормализатор статической верстки для платформы meloddyCMS. 
Твоя задача — преобразовать предоставленные исходные файлы верстки (HTML, CSS, JS, медиа-ресурсы), включая экспортированные из визуальных сред и генераторов кода (таких как VibeCode), и полностью подготовить их к интеграции с платформой meloddyCMS.

Выполняй обработку строго по шагам (Chain of Thought), следуя техническому регламенту ниже.

---

### ТЕХНИЧЕСКИЙ РЕГЛАМЕНТ ОБРАБОТКИ ВЕРСТКИ

#### ШАГ 1: Реорганизация структуры каталогов
Приведи файловую структуру проекта к следующему стандарту:
1. Все файлы страниц (*.html) должны быть перенесены исключительно в корень проекта.
2. Все файлы стилей (*.css) должны быть перенесены в директорию /css/.
3. Все файлы скриптов (*.js) должны быть перенесены в директорию /js/.
4. Все медиаресурсы (изображения png/jpg/webp/avif, векторная графика svg, шрифты, иконки, favicon) должны быть перенесены в директорию /img/.

#### ШАГ 2: Нормализация путей в коде (Рефакторинг ссылок)
Замени все относительные (../, ./, images/, assets/) и абсолютные сторонние пути во всех HTML и CSS файлах на относительные от корня сайта. Каждый путь должен начинаться со знака слэша /:
- Подключение стилей: <link rel="stylesheet" href="/css/style.css">
- Подключение скриптов: <script src="/js/main.js"></script>
- Подключение картинок: <img src="/img/logo.svg">
- Фоновые изображения в CSS: background-image: url('/img/hero-bg.webp');
- Фавикон: <link rel="icon" type="image/svg+xml" href="/favicon.svg"> (favicon.svg находится в корне).

#### ШАГ 3: Интеграция data-атрибутов редактирования (Визуальный редактор)
Разметь все контентные элементы специальными атрибутами. 

##### Валидация идентификаторов (ID):
Каждое значение атрибута (ключ) должно:
1. Быть уникальным в пределах одной страницы.
2. Соответствовать регулярному выражению: ^[a-z0-9_]+$ (только строчные латинские буквы, цифры и символ подчеркивания).
3. Иметь длину от 3 до 50 символов.
4. Отражать семантическое назначение элемента (например: hero_title, benefit_card_1_text).

##### Правила разметки элементов:
1. Редактируемый текст (data-editable):
   Добавь атрибут data-editable="[уникальный_ключ]" к тегам: <h1>-<h6>, <p>, <span>, <div class="...-text">, <a> (если внутри ссылки только простой текст).
   * ДО: <h2 class="title">Наши услуги</h2>
   * ПОСЛЕ: <h2 class="title" data-editable="services_title">Наши услуги</h2>
2. Заменяемые изображения (data-img-editable):
   Добавь атрибут data-img-editable="[уникальный_ключ]" к тегам <img>.
   * ДО: <img class="logo" src="img/logo-old.png" alt="Лого">
   * ПОСЛЕ: <img class="logo" src="/img/logo-old.png" data-img-editable="header_logo" alt="Лого">
3. Фоновые изображения (data-bg-editable):
   Если фон задан инлайн-стилем style="background-image: url(...)", добавь атрибут data-bg-editable="[уникальный_ключ]".
   * ДО: <div class="hero" style="background-image: url('assets/hero.jpg');">
   * ПОСЛЕ: <div class="hero" data-bg-editable="hero_banner" style="background-image: url('/img/hero.jpg');">

#### ШАГ 4: Интеграция лид-форм (CRM и уведомления)
Все HTML-формы на страницах сайта должны быть адаптированы для отправки лидов во встроенную CRM-систему meloddyCMS и привязанный Telegram-канал.

##### Правила для форм:
1. Тег <form> должен иметь атрибуты: action="/api/submit-form" и method="POST".
2. Каждый элемент ввода данных (<input>, <textarea>, <select>) обязан иметь атрибут name. Значение этого атрибута должно быть человекочитаемым русским словом или фразой, так как оно напрямую транслируется в Telegram-оповещения администратора.
3. Кнопка отправки формы должна иметь тип type="submit".

##### Таблица сопоставления полей (Few-shot mapping):
- name="name" или name="first-name" → name="Имя"
- name="phone" или name="tel" → name="Телефон"
- name="email" → name="Email"
- name="message" или name="comment" → name="Сообщение"
- name="company" → name="Компания"

##### Пример нормализации формы:
* ДО:
  <form id="contact-form">
      <input type="text" name="user_name" placeholder="Введите имя">
      <input type="tel" name="phone_number" placeholder="Ваш телефон">
      <textarea name="user_message"></textarea>
      <button class="submit-btn">Отправить</button>
  </form>
* ПОСЛЕ:
  <form action="/api/submit-form" method="POST">
      <input type="text" name="Имя" placeholder="Введите имя" required>
      <input type="tel" name="Телефон" placeholder="Ваш телефон" required>
      <textarea name="Сообщение"></textarea>
      <button type="submit" class="submit-btn">Отправить</button>
  </form>

#### ШАГ 5: Интеграция модулей (Интернет-магазин и Новости)
Если на исходном сайте присутствуют элементы интернет-магазина (каталог, корзина, кнопки покупки) или разделы блога/новостей, интегрируй их по следующим правилам meloddyCMS:

##### 1. Интернет-магазин (Модуль Магазин):
- Подключи скрипт корзины перед закрывающим тегом </body>:
  <script src="/js/client-cart.js"></script>
- Для кнопок покупки назначь обработчик клика, вызывающий добавление товара:
  MeloddyCart.addItem({ id: "ID", name: "Имя", price: Число, image: "/путь/к/картинке", selectedVariants: {} })
- Для отрисовки корзины подпишись на событие обновления:
  window.addEventListener('meloddy-cart-updated', renderCart)
- Форму оформления заказа отправляй через метод API:
  MeloddyCart.submitOrder({ name: "Имя", phone: "Телефон", comment: "Комментарий" })

##### 2. Новости / Статьи (Модуль Блог):
- Подключи SDK блога перед закрывающим тегом </body>:
  <script src="/js/client-blog.js"></script>
- Создай пустые контейнеры для авто-рендеринга ленты и полной статьи:
  <div id="blog-feed-container"></div>
  <div id="blog-post-container"></div>
- Настрой вызов рендеринга в зависимости от URL-параметров:
  const postSlug = new URLSearchParams(window.location.search).get('post');
  if (postSlug) {
      MeloddyBlog.renderPost('blog-post-container', postSlug);
  } else {
      MeloddyBlog.renderFeed('blog-feed-container');
  }
- Если в верстке детальной страницы статьи используются дополнительные независимые блоки (цитата автора, промо-баннер), добавь к ним атрибуты связывания:
  - data-blog-field="ключ" — для текстовых полей
  - data-blog-img="ключ" — для картинок

#### ШАГ 6: Валидация сборки (Sanity Check)
Перед генерацией ответа перепроверь полученный результат по чек-листу:
1. Нет ли сломанных путей и ссылок (каждый href/src стилей, скриптов и картинок начинается со слэша /).
2. Все ли data-атрибуты имеют валидные уникальные ключи (^[a-z0-9_]+$).
3. Все ли формы имеют action="/api/submit-form" и method="POST", а их поля — русские атрибуты name.
4. Убедись, что скрипты модулей (/js/client-cart.js, /js/client-blog.js) подключены только при необходимости.
5. Весь HTML-код валиден, теги закрыты, стили/скрипты не удалены.

---

### ФОРМАТ ОТВЕТА
Выведи результат строго в следующем формате:
1. Файловая структура: Схема перемещения файлов (какие файлы куда перенесены).
2. Сборка проекта: Полные версии измененных файлов (HTML-код страниц) без сокращений и пропусков. Не используй плейсхолдеры вида <!-- тут остальной код -->, выводи код целиком, чтобы его можно было скопировать.

После обработки ИИ вы получите готовую структуру файлов. Вам останется лишь запаковать их в ZIP-архив и загрузить в CMS в один клик!

1. Управление категориями каталога

Для создания полноценного каталога товаров перейдите в раздел «Магазин» на боковой панели и выберите вкладку «Категории». Категории позволяют структурировать товары и упрощают навигацию для покупателей.

  • Создание категории: Нажмите «Добавить категорию», укажите понятное название. Система автоматически сгенерирует URL-слаг (например, smartfony для «Смартфоны»). При желании слаг можно изменить вручную.
  • Вложенность (Иерархия): Поддерживается иерархическая структура каталога глубиной до 3 уровней. Вы можете создавать подкатегории (например: Электроника → Смартфоны → Apple).
  • Drag-and-Drop сортировка: Вы можете менять порядок вывода категорий и их вложенность простым перетаскиванием мыши в интерфейсе списка. Изменения сохраняются автоматически в реальном времени.

2. Схемы характеристик (Кастомные свойства)

Вкладка «Свойства товаров» позволяет создавать шаблоны характеристик, которые затем заполняются в карточках товаров. Это незаменимо для фильтрации и сравнения.

  • Группы свойств: Объединяйте характеристики в логические блоки (например, «Экран» или «Процессор»).
  • Типы полей:
    • Текст: Любое текстовое значение (например, «Бренд: Xiaomi»).
    • Число: Только числовые параметры (например, «Объем памяти: 256» или «Вес: 180»). Подходит для фильтрации по диапазону.
    • Список: Фиксированный набор значений (например, «Тип матрицы: AMOLED, IPS, OLED»).
    • Флажок (Логическое): Да/Нет переключатели (например, «Влагозащита: Да», «Поддержка eSIM: Нет»).

3. Добавление и оформление товаров

Вкладка «Товары» — основное рабочее пространство контент-менеджера. Для добавления товара нажмите «Добавить товар».

Основные параметры карточки товара:

  1. Название и Слаг: Уникальное имя товара (автоматически формирует красивый URL).
  2. Артикул (SKU): Уникальный идентификатор товарной позиции для склада и поиска.
  3. Цена и Старая цена: Текущая стоимость продажи. Если заполнено поле «Старая цена», система автоматически рассчитает скидку и выведет бейдж «Скидка» на фронтенде.
  4. Остатки на складе (Stock): Количество доступного товара. При каждом заказе остатки автоматически уменьшаются. Если остаток равен 0, товар помечается как «Нет в наличии» и кнопка покупки блокируется.
  5. Медиагалерея: Возможность загрузки до 10 качественных фотографий. Система поддерживает перетаскивание картинок для изменения их порядка отображения. Картинки сжимаются и конвертируются в веб-форматы.

Автоматический импорт изображений

Если при заполнении товара вы укажете ссылки на изображения с внешних ресурсов (например, из каталога поставщика), meloddyCMS автоматически скачает их в фоновом режиме, сохранит на вашем сервере и привяжет к товару. Это предотвратит сбои из-за недоступности внешних хостов!

4. Управление заказами и CRM

Все оформленные на сайте заказы моментально попадают во встроенную CRM-систему (раздел «Магазин» → вкладка «Заказы»).

  • Канбан-доска: Процесс обработки заказов разделен по колонкам-статусам:
    • Новые: Только что поступившие заказы. Подсвечиваются ярким индикатором и требуют подтверждения менеджера.
    • В обработке: Сборка, упаковка или доставка товара клиенту.
    • Выполненные: Успешно закрытые сделки. Данные из этой колонки попадают в графики аналитики.
    • Отмененные: Возвраты или спам-заказы.
  • Карточка заказа: При клике по карточке открывается детальная информация: список заказанных товаров (с указанием артикула, цены и выбранных покупателем вариантов/размеров), общая стоимость, контактные данные (ФИО, телефон, email, адрес) и комментарий.

5. Подключение Telegram-уведомлений

Для оперативного контроля заказов без необходимости постоянно держать открытой панель управления, meloddyCMS поддерживает отправку уведомлений в Telegram.

  1. В Telegram найдите бота @meloddyCMS_bot и нажмите «Запустить» (/start).
  2. Запросите код авторизации для сайта (бот пришлет вам секретный код).
  3. В настройках вашего проекта перейдите во вкладку «SEO & Интеграции» и в поле «Уведомления в Telegram» введите полученный код.
  4. Нажмите «Подключить». Бот пришлет подтверждение привязки.
  5. Теперь о каждом новом заказе или заполненной форме бот будет моментально сообщать вам в чат, присылая детальный список товаров и контакты покупателя.

6. Публичный REST API для разработчиков

Вы можете полностью кастомизировать вывод товаров, категорий и фильтров на вашем сайте, обращаясь к нашему публичному API. Авторизация (токены) для этих запросов не требуется.

Получение списка категорий

GET /api/commerce/:siteId/public/categories

Возвращает плоский массив категорий с иерархическими связями (родительский ID в поле parentId).

Получение списка товаров (с фильтрацией)

GET /api/commerce/:siteId/public/products?category=smartfony&limit=12&page=1

Поддерживаемые query-параметры:

  • category (строка): Слаг, имя или ID категории для фильтрации.
  • search (строка): Полнотекстовый поиск по названию или SKU.
  • minPrice / maxPrice (числа): Фильтрация по диапазону цен.
  • page (число): Номер страницы (по умолчанию 1).
  • limit (число): Количество товаров на страницу (по умолчанию 20).

Получение детальной информации о товаре

GET /api/commerce/:siteId/public/products/:idOrSlug

Возвращает объект товара, включая его характеристики (массив properties), остатки, галерею картинок, а также массив relatedProductsData (до 8 связанных товаров, настроенных в панели).

7. Интеграция корзины с помощью client-cart.js

Чтобы не писать логику хранения товаров в LocalStorage, мелочевки подсчетов и отправки заказов вручную, подключите нашу официальную JS-библиотеку:

<script src="/js/client-cart.js"></script>

После подключения на объекте window становится доступен глобальный класс MeloddyCart, инкапсулирующий все необходимые методы:

  • MeloddyCart.getItems(): Возвращает массив элементов корзины. Каждый элемент содержит:
    {
      productId: "ID_товара",
      name: "Название товара",
      price: 1500,
      quantity: 2,
      image: "/img/photo.png",
      selectedVariants: { "Цвет": "Черный", "Размер": "L" }
    }
  • MeloddyCart.addItem(item): Добавляет товар в корзину. Аргумент должен содержать поля: id, name, price, quantity, image, и опционально selectedVariants. Если товар с таким ID и опциями уже есть в корзине, его количество увеличивается.
  • MeloddyCart.removeItem(productId, selectedVariants): Удаляет товар из корзины. Если товар имеет выбранные варианты, необходимо передать их вторым аргументом для точного сопоставления.
  • MeloddyCart.updateQuantity(productId, quantity, selectedVariants): Обновляет количество товара до указанного значения.
  • MeloddyCart.clear(): Полностью очищает корзину.
  • MeloddyCart.getTotalCount(): Возвращает общее число товаров в корзине (сумма всех quantity).
  • MeloddyCart.getTotalPrice(): Возвращает суммарную стоимость товаров.
  • MeloddyCart.submitOrder(orderData): Отправляет заказ на сервер в CRM. Метод возвращает Promise.

    Формат объекта orderData:

    {
      name: "Иван Иванов",
      phone: "+7 (999) 123-45-67",
      email: "ivan@example.com",
      comment: "Доставка до двери"
    }

8. Работа с опциями и вариантами товаров

Часто один и тот же товар продается в разных вариациях (например, футболка размера S, M, L или телефон с 128ГБ и 256ГБ памяти). meloddyCMS и библиотека корзины полностью поддерживают кастомные свойства при оформлении заказа.

Как передать выбранные опции в корзину:

При клике на кнопку «В корзину» соберите выбранные пользователем значения из выпадающих списков или радио-кнопок и передайте их в свойстве selectedVariants:

const productToBuy = {
    id: "tshirt_01",
    name: "Фирменная футболка",
    price: 1990,
    image: "/site/shop/tshirt.jpg",
    quantity: 1,
    selectedVariants: {
        "Размер": "L",
        "Цвет": "Синий"
    }
};

// Добавляем в корзину
MeloddyCart.addItem(productToBuy);

В CRM в карточке заказа эти данные отобразятся в структурированном виде: Фирменная футболка (Размер: L, Цвет: Синий), что позволит менеджеру не ошибиться при комплектации.

9. Полный пример верстки интернет-магазина

Ниже приведен готовый пример фронтенд-кода каталога товаров, корзины и формы оформления заказа, который вы можете скопировать и внедрить на свой сайт:

<!-- Подключаем библиотеку корзины -->
<script src="/js/client-cart.js"></script>

<!-- Контейнер каталога товаров -->
<div id="catalog-container" class="products-grid"></div>

<!-- Контейнер корзины -->
<div class="cart-section">
    <h3>Корзина (<span id="cart-count">0</span> шт.)</h3>
    <div id="cart-items"></div>
    <div class="cart-total">Итого: <strong id="cart-total-price">0</strong> ₽</div>
    
    <!-- Форма оформления -->
    <form id="checkout-form" onsubmit="submitOrder(event)" style="margin-top: 15px;">
        <input type="text" id="order-name" placeholder="Ваше Имя" required style="display:block; margin-bottom:8px;">
        <input type="tel" id="order-phone" placeholder="Телефон" required style="display:block; margin-bottom:8px;">
        <button type="submit">Оформить заказ</button>
    </form>
</div>

<script>
    window.meloddySiteId = window.location.pathname.split('/')[2] || 'my-shop-id';

    async function initCatalog() {
        const response = await fetch(`/api/commerce/\${window.meloddySiteId}/public/products?limit=6`);
        if (response.ok) {
            const data = await response.json();
            const container = document.getElementById('catalog-container');
            container.innerHTML = data.products.map(p => `
                <div class="product-card">
                    <img src="\${p.images[0] || '/img/no-photo.png'}" alt="\${p.name}" width="150">
                    <h4>\${p.name}</h4>
                    <p>Цена: \${p.price} ₽</p>
                    <button onclick="buyProduct('\${p.id}', '\${p.name}', \${p.price}, '\${p.images[0] || ''}')">Купить</button>
                </div>
            `).join('');
        }
    }

    function buyProduct(id, name, price, image) {
        MeloddyCart.addItem({ id, name, price, image, quantity: 1 });
    }

    function renderCart() {
        const items = MeloddyCart.getItems();
        const itemsContainer = document.getElementById('cart-items');
        const countContainer = document.getElementById('cart-count');
        const totalContainer = document.getElementById('cart-total-price');

        countContainer.textContent = MeloddyCart.getTotalCount();
        totalContainer.textContent = MeloddyCart.getTotalPrice();

        if (items.length === 0) {
            itemsContainer.innerHTML = '<p>Корзина пуста</p>';
            return;
        }

        itemsContainer.innerHTML = items.map(item => `
            <div class="cart-item" style="display:flex; justify-content:space-between; margin-bottom:8px;">
                <div>\${item.name} (\${item.quantity} x \${item.price} ₽)</div>
                <button onclick="MeloddyCart.removeItem('\${item.productId}', \${JSON.stringify(item.selectedVariants)})">Удалить</button>
            </div>
        `).join('');
    }

    window.addEventListener('meloddy-cart-updated', renderCart);

    async function submitOrder(e) {
        e.preventDefault();
        const orderData = {
            name: document.getElementById('order-name').value,
            phone: document.getElementById('order-phone').value,
            comment: 'Заказ оформлен через кастомную корзину'
        };

        try {
            const res = await MeloddyCart.submitOrder(orderData);
            alert(\`Заказ оформлен! Номер заказа: \${res.orderId}\`);
            MeloddyCart.clear();
            document.getElementById('checkout-form').reset();
        } catch(err) {
            alert(\`Ошибка оформления: \${err.message}\`);
        }
    }

    document.addEventListener('DOMContentLoaded', () => {
        initCatalog();
        renderCart();
    });
</script>