Система логирования активности автоматически записывает все действия пользователей в системе, предоставляя полный аудит всех операций для администраторов.
- ✅ Автоматическое логирование всех CRUD операций
- ✅ Логирование изменений настроек системы
- ✅ Запись IP адресов пользователей
- ✅ Детали изменений (до/после) для UPDATE операций
- ✅ Отслеживание результатов (успех/ошибка)
- ✅ Фильтрация и поиск по множеству параметров
- ✅ Пагинация для больших объемов данных
- ✅ Детальный просмотр изменений в модальном окне
-
CREATE - создание новых сущностей
- Пользователи
- Группы
- Предметы
- Расписание
- Домашние задания
-
UPDATE - обновление существующих сущностей
- Все изменения с сохранением состояния до и после
- Автоматическое вычисление измененных полей
-
DELETE - удаление сущностей (мягкое удаление)
- Сохранение состояния перед удалением
- SETTINGS_CHANGE - изменения конфигурации системы
- Настройки Telegram бота
- Параметры уведомлений
- Конфигурация системы
interface ActivityLog {
id: string // Уникальный идентификатор
userId: string // ID пользователя, выполнившего действие
action: string // Тип действия (CREATE, UPDATE, DELETE, SETTINGS_CHANGE)
entityType: string | null // Тип сущности (User, Group, Subject, Schedule, Homework, BotSettings)
entityId: string | null // ID затронутой сущности
ipAddress: string | null // IP адрес пользователя
details: { // Детали изменений
before?: Record<string, any> // Состояние до изменения
after?: Record<string, any> // Состояние после изменения
changes?: Array<{ // Список измененных полей
field: string
oldValue: any
newValue: any
}>
error?: string // Сообщение об ошибке (если result = FAILURE)
}
result: 'SUCCESS' | 'FAILURE' // Результат операции
createdAt: DateTime // Время выполнения действия
}{
"id": "clx123...",
"userId": "user456",
"action": "UPDATE",
"entityType": "User",
"entityId": "user789",
"ipAddress": "192.168.1.100",
"details": {
"before": {
"id": "user789",
"name": "Иван Иванов",
"email": "ivan@example.com",
"role": "student",
"groupId": "group1"
},
"after": {
"id": "user789",
"name": "Иван Петров",
"email": "ivan@example.com",
"role": "student",
"groupId": "group2"
},
"changes": [
{
"field": "name",
"oldValue": "Иван Иванов",
"newValue": "Иван Петров"
},
{
"field": "groupId",
"oldValue": "group1",
"newValue": "group2"
}
]
},
"result": "SUCCESS",
"createdAt": "2025-11-03T20:10:57Z"
}- Войдите как администратор
- Перейдите в раздел "Лог активности" (
/admin/activity-log) - Используйте фильтры для поиска нужных записей
- По пользователю - введите ID пользователя
- По действию - выберите тип действия (CREATE, UPDATE, DELETE, SETTINGS_CHANGE)
- По типу сущности - выберите тип (User, Group, Subject, Schedule, Homework, BotSettings)
- По дате - укажите период (начало и конец)
- Нажмите на кнопку "Просмотр" у нужной записи
- Откроется модальное окно с полными деталями
- Просмотрите изменения в формате JSON
Получить список логов активности с фильтрацией и пагинацией.
Права: admin
Параметры запроса:
userId- Фильтр по ID пользователяaction- Фильтр по типу действия (CREATE, UPDATE, DELETE, SETTINGS_CHANGE)entityType- Фильтр по типу сущностиstartDate- Дата начала периода (YYYY-MM-DD)endDate- Дата окончания периода (YYYY-MM-DD)page- Номер страницы (по умолчанию 1)limit- Количество записей на странице (по умолчанию 50)
Пример запроса:
GET /api/activity-logs?action=UPDATE&entityType=User&startDate=2025-11-01&page=1&limit=50Ответ:
{
"logs": [
{
"id": "clx123...",
"userId": "user456",
"action": "UPDATE",
"entityType": "User",
"entityId": "user789",
"ipAddress": "192.168.1.100",
"details": { ... },
"result": "SUCCESS",
"createdAt": "2025-11-03T20:10:57Z",
"user": {
"id": "user456",
"name": "Администратор",
"email": "admin@example.com",
"role": "admin"
}
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"pages": 3
}
}Система автоматически логирует все действия в следующих API endpoints:
POST /api/users- создание пользователяPUT /api/users- обновление пользователяDELETE /api/users- удаление пользователяPOST /api/groups- создание группыPUT /api/groups- обновление группыDELETE /api/groups- удаление группыPOST /api/subjects- создание предметаPUT /api/subjects- обновление предметаDELETE /api/subjects- удаление предметаPOST /api/schedules- создание расписанияPUT /api/schedules- обновление расписанияDELETE /api/schedules- удаление расписанияPOST /api/homework- создание домашнего заданияPOST /api/telegram/config- изменение настроек Telegram бота
import { logActivity } from '@/lib/activity-log'
// Логирование успешной операции
await logActivity({
userId: session.user.id,
action: 'CREATE',
entityType: 'User',
entityId: newUser.id,
request,
details: {
after: {
id: newUser.id,
email: newUser.email,
role: newUser.role
}
},
result: 'SUCCESS'
})
// Логирование ошибки
await logActivity({
userId: session.user.id,
action: 'CREATE',
entityType: 'User',
request,
details: {
error: error.message
},
result: 'FAILURE'
})- Пароли не логируются - автоматически удаляются из логов
- Чувствительные данные фильтруются перед сохранением
- Только администраторы имеют доступ к логам
- IP адреса записываются для аудита безопасности
- Индексы на часто используемых полях (userId, action, entityType, createdAt)
- Пагинация для больших объемов данных
- Асинхронное логирование - не блокирует основную операцию
- Обработка ошибок - сбои логирования не прерывают основную операцию
model ActivityLog {
id String @id @default(cuid())
userId String
action String // CREATE, UPDATE, DELETE, LOGIN, LOGOUT, SETTINGS_CHANGE
entityType String? // User, Group, Subject, Schedule, Homework, Settings
entityId String? // ID затронутой сущности
ipAddress String?
details Json? // { before: {...}, after: {...}, changes: [...] }
result String @default("SUCCESS") // SUCCESS, FAILURE
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([action])
@@index([entityType])
@@index([createdAt])
@@map("activity_logs")
}npx prisma migrate dev --name add_activity_log- Только администраторы могут просматривать логи
- Логи не удаляются автоматически (нужно периодически очищать старые записи)
- IP адрес может быть недоступен за прокси-сервером
- Детали изменений хранятся в JSON формате
Рекомендуется периодически очищать старые логи (старше 90 дней) для оптимизации производительности:
DELETE FROM activity_logs
WHERE created_at < NOW() - INTERVAL '90 days';- Регулярно проверяйте логи на наличие ошибок
- Анализируйте активность пользователей
- Отслеживайте подозрительные действия
- Используйте фильтры для быстрого поиска
Документация обновлена: 19 ноября 2025
Версия системы: 0.4.0-alpha