Перейти к содержанию

8. Визуализация и модификации

Цель

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

Этот этап превращает типовой учебный проект в индивидуальную производственную работу. Базовая система мониторинга активности универсальна, но для защиты практики важно показать, что вы понимаете предметную область и умеете адаптировать модель данных под реальные задачи.

Визуализация не обязательна для backend-практики, но она помогает быстро показать результат: диаграмма по типам событий понятнее, чем сырой JSON.

Вариант визуализации Chart.js

Можно создать простую HTML-страницу, которая вызывает /api/analytics/summary и строит диаграмму. Для учебного стенда достаточно статического файла в отдельной папке client.

Этот пример не заменяет backend-часть проекта, а показывает, как уже готовый endpoint аналитики может быть использован внешним клиентом. HTML-страница запрашивает JWT, обращается к API и строит диаграмму по данным topEventTypes.

client/index.html:

<!doctype html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <title>Activity Analytics</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
  <canvas id="eventsChart" width="800" height="400"></canvas>

  <script>
    const token = prompt("JWT token");

    fetch("https://localhost:7000/api/analytics/summary", {
      headers: { Authorization: `Bearer ${token}` }
    })
      .then(response => response.json())
      .then(summary => {
        new Chart(document.getElementById("eventsChart"), {
          type: "bar",
          data: {
            labels: summary.topEventTypes.map(x => x.type),
            datasets: [{
              label: "Количество событий",
              data: summary.topEventTypes.map(x => x.count)
            }]
          }
        });
      });
  </script>
</body>
</html>

Задания на модификацию

Выберите одну из 30 предметных областей и измените проект.

Не нужно менять всё приложение сразу. Начните с минимальной адаптации: переименуйте сущность, добавьте одно предметное поле, измените типы событий и отчёт. После этого проект уже будет отличаться от базового варианта по смыслу, а не только по названию.

Минимальный набор изменений

  1. Переименуйте ActivityEvent в сущность своей области:
  2. интернет-магазин: OrderEvent;
  3. служба поддержки: TicketEvent;
  4. учёт посещаемости: VisitEvent.
  5. Добавьте новое поле:
  6. OrderId;
  7. TicketId;
  8. GroupId;
  9. DepartmentId;
  10. Location.
  11. Добавьте фильтр по новому полю в ActivityEventFilter.
  12. Измените генератор событий под реальные типы:
  13. OrderCreated, OrderPaid, OrderCancelled;
  14. TicketCreated, TicketAssigned, TicketClosed;
  15. VisitRegistered, LateVisit, Absence.
  16. Измените аналитику:
  17. количество заказов по статусам;
  18. среднее время закрытия обращений;
  19. посещаемость по группам.
  20. Измените CSV-отчёт, добавив новое поле.

Пример адаптации: служба поддержки

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

TicketEvent:

public class TicketEvent
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int TicketId { get; set; }
    public string Type { get; set; } = string.Empty;
    public string Status { get; set; } = string.Empty;
    public string Priority { get; set; } = "Normal";
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

Новая аналитика должна отвечать на вопрос предметной области. Для службы поддержки полезно видеть, сколько обращений находится в каждом статусе, поэтому пример группирует TicketEvent по полю Status.

var byStatus = await _db.TicketEvents
    .GroupBy(x => x.Status)
    .Select(g => new { Status = g.Key, Count = g.Count() })
    .ToListAsync(ct);

Требования к сдаче

Что показать Минимум
Код решение ASP.NET Core с 4 слоями
БД миграции и тестовые данные
API авторизация, события, аналитика, отчёты
Роли минимум 3 роли
Отчёт CSV с данными выбранной области
Адаптация описание предметной области и изменённых сущностей

Как описать адаптацию в отчёте

В итоговом описании укажите:

  1. Какая предметная область выбрана.
  2. Какая сущность заменила ActivityEvent.
  3. Какие новые поля добавлены.
  4. Какие роли пользователей используются.
  5. Какие аналитические показатели реализованы.
  6. Какой CSV-отчёт формируется.

Пример формулировки: “Базовая сущность события активности адаптирована под службу поддержки. Вместо общего события используется событие обращения, добавлено поле TicketId, типы событий заменены на TicketCreated, TicketAssigned, TicketClosed, аналитика показывает количество обращений по статусам”.

Контрольные вопросы

  1. Почему контроллер не должен напрямую обращаться к DbContext?
  2. Чем отличается Application от Infrastructure?
  3. Зачем нужен JWT и какие данные нельзя хранить в токене?
  4. Когда кэш аналитики может стать устаревшим?
  5. Как заменить SQLite на PostgreSQL?
  6. Какой паттерн используется для выбора разных алгоритмов аналитики?