Поддержка

Журнал событий

Модуль аудита активности пользователей и изменений данных

Модуль Журнал событий (Action Events) предоставляет полный аудит-лог действий пользователей: авторизация, создание, обновление, удаление записей и другие операции.

Возможности

  • Таблица событий с фильтрацией, сортировкой и поиском
  • Модальное окно с деталями события (измененные данные, метаданные, IP)
  • Кнопка истории изменений в header каждого ресурса
  • Сравнение значений "Было / Стало"
  • Экспорт данных
  • Контроль доступа через Gate

Установка

1. Composer

composer require frame/action-events

Для локальной разработки:

composer.json
{
  "repositories": [
    {
      "type": "path",
      "url": "./packages/action-events",
      "options": { "symlink": true }
    }
  ],
  "require": {
    "frame/action-events": "*"
  }
}

2. Frontend

В файле инициализации подключите модуль до FramePlugin:

resources/js/frame.js
import { registerActionLogModule } from './modules/action-log'

registerActionLogModule()

app.use(FramePlugin, { ... })

3. Конфигурация

php artisan vendor:publish --tag=action-events-config

Конфигурация

config/action-events.php
return [
    // Ресурс пользователя для BelongsTo-связи.
    // Когда null — используется текстовое поле с UserFieldsMap.
    'user_resource' => \App\Frame\Resources\UserResource::class,
];
Значение по умолчанию в стабе конфига — App\Frame\Resources\UserResource::class. Если класса нет, любой запрос к /action-events упадёт с Class "" not found — Frame при сборке BelongsTo пытается инстанцировать несуществующий ресурс. Сразу после публикации конфига либо создайте UserResource, либо поставьте 'user_resource' => null.

Контроль доступа

Модуль регистрирует Gate frame-action-events. По умолчанию доступ разрешён всем авторизованным пользователям. Переопределите в AuthServiceProvider:

Gate::define('frame-action-events', function ($user) {
    return $user->hasRole('admin');
});

Страница журнала

Доступна по адресу /action-events. Отображается в навигации в секции «Модули».

Таблица содержит колонки:

  • Событие — тип действия с цветным бейджем (create, update, delete, login и др.)
  • Пользователь — BelongsTo-связь с ресурсом пользователя
  • Тип объекта — автоматически резолвится в label ресурса (например postНовости)
  • IP — IP-адрес с device и platform в caption
  • Дата — дата и время события

Модальное окно деталей

По клику на строку таблицы открывается модальное окно:

  • Детали события (тип, пользователь, ID события)
  • Объект — ссылка на ресурс (открывается в новой вкладке)
  • Измененные данные — таблица с колонками «Было / Стало» для update-событий
  • Метаданные — IP, device, platform, user agent, location
  • Исключение — если событие завершилось с ошибкой

Кнопка истории в ресурсах

Модуль автоматически добавляет иконку history на страницу просмотра каждого ресурса (через App Slots). По клику открывается модалка со списком всех изменений конкретной записи.

Кнопка:

  • Отображается рядом с breadcrumbs
  • Неактивна (disabled), если для записи нет событий
  • Видна только пользователям с доступом frame-action-events

API-эндпоинты

Все эндпоинты доступны под префиксом Frame API (по умолчанию /api/frame):

МетодПутьОписание
GET/action-events/{id}Детали события
GET/action-events/{resource}/{id}/historyИстория изменений записи
GET/action-events/{resource}/{id}/history/countКоличество событий записи

Расширение

Кастомный ресурс пользователя

Если ваш UserResource называется иначе, укажите его в конфиге:

'user_resource' => \App\Frame\Resources\AdminResource::class,

Если ресурса пользователя нет — установите null, и модуль будет показывать имя через UserFieldsMap:

'user_resource' => null,

Переводы

Добавьте переводы в lang/ru.json вашего проекта:

{
  "Action events": "Журнал событий",
  "View and analyze user activity, data changes, and system events": "Просмотр и анализ активности пользователей, изменений данных и системных событий"
}

Фронтенд-переводы добавляются в JSON-файл локали, передаваемый в FramePlugin.