Журнал событий
Модуль Журнал событий (Action Events) предоставляет полный аудит-лог действий пользователей: авторизация, создание, обновление, удаление записей и другие операции.
Возможности
- Таблица событий с фильтрацией, сортировкой и поиском
- Модальное окно с деталями события (измененные данные, метаданные, IP)
- Кнопка истории изменений в header каждого ресурса
- Сравнение значений "Было / Стало"
- Экспорт данных
- Контроль доступа через Gate
Установка
1. Composer
composer require frame/action-events
Для локальной разработки:
{
"repositories": [
{
"type": "path",
"url": "./packages/action-events",
"options": { "symlink": true }
}
],
"require": {
"frame/action-events": "*"
}
}
2. Frontend
В файле инициализации подключите модуль до FramePlugin:
import { registerActionLogModule } from './modules/action-log'
registerActionLogModule()
app.use(FramePlugin, { ... })
3. Конфигурация
php artisan vendor:publish --tag=action-events-config
Конфигурация
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.