Обзор
Модуль новостей позволяет публиковать статьи для пользователей прямо в Cabinet. Администраторы создают статьи с WYSIWYG-редактором, загружают медиа, управляют категориями и тегами. Пользователи видят ленту новостей в Cabinet с фильтрацией по категориям.Возможности
- Полноценный WYSIWYG-редактор (TipTap) с поддержкой изображений и видео
- Управляемые категории и теги с цветовой маркировкой
- Загрузка медиа: drag-drop, вставка из буфера, файловый пикер
- Избранная статья — автоматически снимается с остальных при назначении
- Счётчик просмотров с дедупликацией (5 мин на пользователя)
- Автогенерация slug из заголовка (транслитерация кириллицы)
- Серверная санитизация HTML-контента (XSS-защита)
- RBAC-права:
news:read,news:create,news:edit,news:delete
Настройка
Переменные окружения
Модуль новостей использует настройки медиа-загрузки:Docker
В Dockerfile автоматически создаются поддиректории:uploads/images/, uploads/videos/, uploads/thumbnails/.
При использовании Docker убедитесь, что volume
./uploads примонтирован для сохранения медиа между перезапусками.Управление статьями
Создание статьи
Admin Cabinet → Новости → Создать статьюРедактор контента
Редактор построен на TipTap (Prosemirror) и поддерживает:- Форматирование: жирный, курсив, подчёркивание, зачёркнутый
- Заголовки H1-H3
- Списки (нумерованные и маркированные)
- Ссылки
- Изображения и видео (через загрузку медиа)
- Блоки кода
Публикация
При первой публикации автоматически устанавливаетсяpublished_at — дата, по которой сортируется лента. Повторное снятие и публикация не меняют эту дату.
Избранная статья
Только одна статья может быть отмечена как избранная. При назначении новой избранной все остальные автоматически теряют этот статус (атомарная транзакция).Категории и теги
Категории
Управляемые категории с цветовой маркировкой. Используются для фильтрации ленты новостей.
При удалении категории все статьи с ней теряют привязку (
category_id=NULL).
Теги
Управляемые теги с цветовой маркировкой. Одна статья может иметь один тег.
При удалении тега все статьи с ним теряют привязку (
tag_id=NULL).
Загрузка медиа
Поддерживаемые форматы
Обработка изображений
- Определение формата по magic bytes (не по расширению)
- Исправление EXIF-ориентации (фотографии с телефона)
- Нормализация в RGB
- Ресайз если сторона > 2048 px (с сохранением пропорций, LANCZOS)
- Сжатие JPEG с заданным качеством
- Генерация thumbnail 400×400 px
Безопасность загрузки
- Определение типа по magic bytes (не MIME sniffing)
- Защита от decompression bomb (макс. 25M пикселей)
- UUID-имена файлов (без пользовательского ввода)
- Атомарная запись (
.tmp→rename) - Защита от path traversal при удалении
- HEIC/HEIF отклоняются (формат изображений, не видео)
Лента новостей (для пользователей)
Пользователи видят ленту опубликованных статей в Cabinet:- Сортировка по дате публикации (новые сверху)
- Фильтрация по категориям
- Пагинация (до 100 статей на страницу)
- Счётчик просмотров (с дедупликацией: 1 просмотр на пользователя за 5 минут)
- Полный контент статьи при открытии по slug
Счётчик просмотров скрыт от обычных пользователей и виден только администраторам.
RBAC права
Если включён RBAC, для управления новостями требуются права:
Настройка прав: RBAC
