Skip to content

LinterProd/Edu-analytics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📊 Edu Analytics - Система аналитики образовательной платформы

🎯 Что это за проект?

Это веб-приложение для анализа данных образовательной платформы. Представьте, что у вас есть онлайн-школа с курсами: люди регистрируются, покупают курсы, изучают их. Эта система собирает всю эту информацию и показывает вам красивые графики и цифры о том:

  • Сколько у вас активных пользователей
  • Сколько денег вы зарабатываете
  • Какие курсы продаются лучше всего
  • Как часто пользователи возвращаются (ретенция)

🏗️ Архитектура проекта (как всё устроено)

Что такое архитектура?

Представьте дом: есть фундамент, стены, крыша, комнаты. В программе похоже - есть разные "слои", которые выполняют свои задачи.

Используемые архитектурные паттерны:

1. MVC (Model-View-Controller) - основной паттерн

Это как разделение ролей в ресторане:

  • Controller (контроллер) - как официант: принимает заказы от клиентов (браузер) и передаёт их на кухню
  • Service (сервис) - как повар: выполняет основную работу - считает метрики, обрабатывает данные
  • Repository (репозиторий) - как склад: хранит и выдаёт данные из базы данных
  • Model (модель) - как форма заказа: описывает, как выглядят данные (пользователь, курс, заказ)

2. Facade (Фасад) - упрощение сложности

Класс MetricsFacadeService работает как единая "точка входа" - вместо того чтобы вызывать 5 разных сервисов отдельно, вы вызываете один, а он внутри собирает все метрики вместе.

3. Dependency Injection (Внедрение зависимостей)

Spring автоматически "вставляет" нужные компоненты туда, где они нужны. Например, если сервису нужен репозиторий, Spring сам его передаёт.


💻 Технологический стек

Язык программирования: Java 21

Почему Java?

  • Надёжный и проверенный временем язык
  • Отличная поддержка больших корпоративных проектов
  • Богатая экосистема библиотек
  • Java 21 - современная версия с улучшенной производительностью

Основные технологии:

Spring Boot 3.5.7 - главный фреймворк

Что это? Готовый набор инструментов для создания веб-приложений.

Почему Spring Boot?

  • Автоматическая настройка всего необходимого
  • Встроенный веб-сервер (не нужно настраивать отдельно)
  • Упрощает разработку в разы
  • Огромное сообщество и документация

Что делает в проекте?

  • Запускает веб-сервер на порту 8080
  • Управляет всеми компонентами приложения
  • Обеспечивает работу REST API

Spring Data JPA / Hibernate - работа с базой данных

Что это? Инструменты для удобной работы с базой данных.

Почему JPA?

  • Не нужно писать все SQL запросы вручную (только сложные)
  • Автоматическое создание таблиц на основе классов
  • Удобные методы для поиска данных

Что делает в проекте?

  • Создаёт таблицы users, courses, orders в базе данных
  • Предоставляет методы для поиска пользователей, заказов, курсов
  • Выполняет сложные SQL-запросы для расчёта метрик

H2 Database - база данных в памяти

Что это? Лёгкая база данных, которая хранит данные прямо в памяти компьютера (или в файле).

Почему H2?

  • Не требует установки отдельного сервера БД
  • Идеально для разработки, тестирования и простейших приложений
  • Быстрая и простая в использовании
  • Можно переключиться на PostgreSQL/MySQL без особых изменений в коде

Что делает в проекте?

  • Хранит всех пользователей, курсы и заказы
  • Доступна через веб-консоль по адресу /h2-console

Thymeleaf - шаблонизатор HTML

Что это? Инструмент, который берёт HTML-шаблон и "подставляет" туда данные из Java.

Почему Thymeleaf?

  • Интеграция с Spring Boot из коробки
  • Позволяет динамически генерировать HTML
  • Безопасная обработка данных

Что делает в проекте?

  • Формирует страницу дашборда (dashboard.html)
  • Передаёт данные из Java (метрики, статистика) в HTML

Lombok - сокращение кода

Что это? Библиотека, которая автоматически генерирует стандартный код (геттеры, сеттеры, конструкторы).

Почему Lombok?

  • Меньше кода = меньше ошибок
  • Чище и читабельнее
  • Меньше рутинной работы

Что делает в проекте?

  • Автоматически создаёт геттеры/сеттеры для классов (@Getter, @Setter)
  • Создаёт конструкторы (@RequiredArgsConstructor, @AllArgsConstructor)
  • Убирает необходимость писать get/set методы вручную

Bootstrap 5.3.3 - стилизация интерфейса

Что это? Готовая библиотека красивых стилей для веб-страниц.

Почему Bootstrap?

  • Красивый современный дизайн из коробки
  • Адаптивность (работает на телефонах и планшетах)
  • Много готовых компонентов (кнопки, карточки, таблицы)

Chart.js 4.4.4 - графики и диаграммы

Что это? Библиотека для создания красивых интерактивных графиков.

Почему Chart.js?

  • Простое использование
  • Красивые анимации
  • Поддержка разных типов графиков (линейные, столбчатые, круговые)

📁 Структура проекта

Edu-analitycs/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/linter/eduanalitycs/
│   │   │       ├── controller/          # Контроллеры (принимают запросы)
│   │   │       ├── service/             # Сервисы (бизнес-логика)
│   │   │       ├── repository/          # Репозитории (работа с БД)
│   │   │       ├── model/               # Модели данных
│   │   │       │   ├── entity/          # Сущности (таблицы в БД)
│   │   │       │   └── dto/             # DTO (объекты для передачи данных)
│   │   │       └── EduAnalitycsApplication.java  # Главный класс
│   │   └── resources/
│   │       ├── application.yml          # Конфигурация
│   │       ├── templates/               # HTML шаблоны
│   │       └── static/                  # CSS, JS, изображения
│   └── test/                            # Тесты
└── pom.xml                              # Файл зависимостей Maven

⚙️ Конфигурация (application.yml)

Что такое YAML?

YAML - это формат файлов для хранения настроек. Он читабельный для человека и понятный для программ.

Разберём конфигурацию:

server:
  port: 8080

Что это значит? Приложение будет работать на порту 8080. Когда вы откроете браузер и введёте http://localhost:8080, вы увидите дашборд.

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password: ""

Что это значит?

  • Используем базу данных H2
  • mem:testdb - база в памяти (после перезапуска данные исчезнут)
  • sa - стандартное, автоматически настроенное имя пользователя H2
  • Пустой пароль
jpa:
  database-platform: org.hibernate.dialect.H2Dialect
  hibernate:
    ddl-auto: update

Что это значит?

  • Используем диалект H2 (способ общения с базами данных)
  • ddl-auto: update - Hibernate автоматически создаст/обновит таблицы при запуске
h2:
  console:
    enabled: true
    path: /h2-console

Что это значит? Включена веб-консоль для просмотра базы данных. Откройте http://localhost:8080/h2-console чтобы увидеть данные.


📦 Классы и их назначение

🎮 Controller (Контроллеры)

DashboardController

Что делает? Принимает HTTP-запросы от браузера и возвращает ответы.

Методы:

  • dashboard() - показывает главную страницу с графиками
  • getMetrics() - возвращает метрики в формате JSON (для AJAX-запросов)

Как работает?

  1. Получает запрос от браузера (например, "покажи дашборд за последние 30 дней")
  2. Вызывает MetricsFacadeService для получения всех метрик
  3. Передаёт данные в шаблон HTML (dashboard.html)
  4. Браузер показывает красивую страницу с графиками

🧠 Service (Сервисы - бизнес-логика)

MetricsFacadeService - главный координатор

Что делает? Собирает все метрики в одном месте. Это "фасад" - упрощённый интерфейс.

Почему нужен? Вместо того чтобы вызывать 4 разных сервиса, вызываем один, и он сам всё собирает.

Методы:

  • getCompleteMetrics() - собирает ВСЕ метрики сразу
  • getDashboardStats() - базовая статистика (количество пользователей, курсов, заказов)

FinancialMetricsService - финансовые метрики

Что делает? Считает деньги: сколько зарабатываем, сколько тратим на привлечение клиентов.

Метрики:

  • LTV (Lifetime Value) - сколько денег приносит один пользователь за всё время
  • CAC (Customer Acquisition Cost) - сколько стоит привлечь одного нового клиента
  • ARPPU (Average Revenue Per Paying User) - средний чек платящего пользователя

Как считает?

  • LTV = Общая выручка / Количество всех пользователей
  • CAC = Затраты на маркетинг за период / Количество новых пользователей
  • ARPPU = Выручка за период / Количество платящих пользователей

AudienceMetricsService - метрики аудитории

Что делает? Считает активность пользователей.

Метрики:

  • DAU (Daily Active Users) - сколько пользователей активны каждый день
  • WAU (Weekly Active Users) - сколько пользователей активны каждую неделю
  • MAU (Monthly Active Users) - сколько пользователей активны каждый месяц

Как работает?

  • Смотрит на дату последней активности пользователя
  • Группирует по дням/неделям/месяцам
  • Считает уникальных пользователей в каждом периоде

RetentionMetricsService - ретенция (удержание)

Что делает? Считает, сколько пользователей возвращаются.

Метрики:

  • Retention Rate - процент пользователей, которые сделали больше одного заказа
  • Retention Trend - динамика ретенции по времени

Как считает?

  • Находит всех пользователей, которые когда-либо делали заказы
  • Считает, сколько из них сделали повторные заказы
  • Выражает в процентах

ProductMetricsService - метрики продуктов (курсов)

Что делает? Анализирует, какие курсы продаются лучше всего.

Что показывает?

  • Топ-5 курсов по количеству продаж
  • Выручка с каждого курса

Как работает?

  • Группирует заказы по курсам
  • Считает количество продаж и сумму выручки
  • Сортирует по количеству продаж (от большего к меньшему)

💾 Repository (Репозитории - работа с БД)

Что это? Интерфейсы для работы с базой данных. Spring автоматически создаёт классы, которые реализуют эти интерфейсы.

UserRepository

Что делает? Работает с таблицей пользователей.

Методы:

  • getDailyActiveUsers() - получает список активных пользователей по дням
  • countByLastActivityDateBetween() - считает пользователей по дате активности
  • countByRegistrationDateBetween() - считает новых пользователей за период
  • getWeeklyRetentionTrend() - получает тренд ретенции по неделям (через SQL)
  • getMonthlyRetentionTrend() - получает тренд ретенции по месяцам

Особенность: Использует как методы Spring Data JPA (автоматически генерируются), так и собственные SQL-запросы через @Query.

OrderRepository

Что делает? Работает с таблицей заказов.

Методы:

  • getTotalRevenue() - общая выручка за всё время
  • getTotalRevenueBetween() - выручка за период
  • countDistinctPayingUsersBetween() - количество уникальных платящих пользователей
  • getProductPerformance() - статистика по курсам (какой курс сколько продаж и выручки)
  • findByOrderDateBetween() - заказы за период
  • findByUser() - все заказы конкретного пользователя

CourseRepository

Что делает? Работает с таблицей курсов.

Методы:

  • count() - количество курсов (стандартный метод JPA)

📊 Model (Модели данных)

Entity (Сущности - таблицы в БД)

User - пользователь

Поля:

  • id - уникальный номер
  • name - имя пользователя
  • registrationDate - дата регистрации
  • lastActivityDate - дата последней активности
  • orders - список заказов пользователя (связь один-ко-многим)

Связи: Один пользователь может иметь много заказов (@OneToMany)

Course - курс

Поля:

  • id - уникальный номер
  • name - название курса
  • price - цена курса
Order - заказ

Поля:

  • id - уникальный номер
  • user - пользователь, который сделал заказ (связь многие-к-одному)
  • course - курс, который купили (связь многие-к-одному)
  • orderDate - дата заказа
  • amount - сумма заказа

Связи:

  • Много заказов относятся к одному пользователю (@ManyToOne)
  • Много заказов относятся к одному курсу (@ManyToOne)

DTO (Data Transfer Object - объекты для передачи данных)

CompleteMetricsResponse

Что это? Контейнер для всех метрик, которые отправляются на фронтенд. Группирует все полученные данные для упрощения работы с метриками в других слоях проекта (кнотроллеры)

Содержит:

  • dashboardStats - базовая статистика
  • audienceMetrics - метрики аудитории (DAU, WAU, MAU)
  • retentionRate - процент ретенции
  • ltv, cac, arppu - финансовые метрики
  • productPerformance - топ курсов
  • retentionTrend - тренд ретенции
DashboardStats

Что это? Базовая статистика для дашборда.

Содержит:

  • userCount - количество пользователей
  • courseCount - количество курсов
  • orderCount - количество заказов
  • totalRevenue - общая выручка
ProductPerformanceDTO

Что это? Данные о производительности одного курса.

Содержит:

  • courseId - ID курса
  • courseName - название курса
  • salesCount - количество продаж
  • revenue - выручка с курса
PeriodInfo

Что это? Простая запись (record) для хранения периода времени.

Содержит:

  • start - начало периода
  • end - конец периода

🎨 Frontend (Веб-интерфейс)

dashboard.html

Что это? HTML-шаблон главной страницы.

Что показывает?

  • Карточки с основными метриками (LTV, CAC, ARPPU, Retention)
  • Графики аудитории (DAU, WAU, MAU)
  • График ретенции
  • Таблица топ-5 курсов
  • Фильтр по периоду (7 дней, 30 дней, 90 дней, год)

Как работает?

  • Использует Thymeleaf для подстановки данных из Java
  • Использует Bootstrap для красивого оформления
  • Использует Chart.js для графиков

JavaScript файлы:

dashboard.js

Что делает? Основная логика дашборда.

Функции:

  • init() - инициализация дашборда при загрузке страницы
  • handlePeriodChange() - обработка смены периода (AJAX-запрос)
  • loadDataForPeriod() - загрузка данных через API
  • updateDashboard() - обновление всех графиков и карточек
  • exportData() - экспорт данных в JSON или CSV

charts.js

Что делает? Создание и обновление графиков Chart.js.

metrics.js

Что делает? Форматирование метрик для отображения (например, добавление знака рубля, округление).

utils.js

Что делает? Вспомогательные функции (например, debounce - задержка выполнения функции).

CSS файлы:

  • dashboard.css - стили для дашборда
  • charts.css - стили для графиков
  • components.css - стили для компонентов (кнопки, карточки)

🔄 Как работает приложение (поток данных)

  1. Пользователь открывает браузер → вводит http://localhost:8080

  2. Браузер отправляет HTTP-запрос → Spring получает запрос

  3. Spring направляет запрос в DashboardController → метод dashboard()

  4. Controller вызывает MetricsFacadeService.getCompleteMetrics()

  5. Facade собирает данные из всех сервисов:

    • FinancialMetricsService → считает LTV, CAC, ARPPU
    • AudienceMetricsService → считает DAU, WAU, MAU
    • RetentionMetricsService → считает ретенцию
    • ProductMetricsService → получает топ курсов
  6. Каждый сервис обращается к Repository:

    • UserRepository → запросы к таблице users
    • OrderRepository → запросы к таблице orders
    • CourseRepository → запросы к таблице courses
  7. Hibernate выполняет SQL-запросы → получает данные из H2

  8. Данные возвращаются обратно:

    • Repository → Service → Facade → Controller
  9. Controller передаёт данные в Thymeleaf → генерируется HTML

  10. HTML отправляется в браузер → пользователь видит страницу

  11. JavaScript загружается → создаёт графики на основе данных


🚀 Как запустить проект

Требования:

  • Java 21 или выше
  • Maven (или используйте встроенный mvnw)

Шаги:

  1. Откройте терминал в папке проекта

  2. Запустите приложение:

    # Windows
    mvnw.cmd spring-boot:run
    
    # Linux/Mac
    ./mvnw spring-boot:run
  3. Откройте браузер:

    http://localhost:8080
    
  4. Для просмотра базы данных:

    http://localhost:8080/h2-console
    
    • JDBC URL: jdbc:h2:mem:testdb
    • Username: sa
    • Password: (пустое)

🧪 Тестирование

В проекте есть тесты для проверки работоспособности:

  • Тесты репозиториев
  • Тесты сервисов
  • Тесты контроллера
  • Интеграционные тесты

Запуск тестов:

mvnw test

📈 Какие метрики считаются?

Финансовые:

  • LTV (Lifetime Value) - пожизненная ценность клиента
  • CAC (Customer Acquisition Cost) - стоимость привлечения клиента
  • ARPPU (Average Revenue Per Paying User) - средняя выручка с платящего пользователя

Аудитория:

  • DAU (Daily Active Users) - ежедневно активные пользователи
  • WAU (Weekly Active Users) - еженедельно активные пользователи
  • MAU (Monthly Active Users) - ежемесячно активные пользователи

Продукт:

  • Retention Rate - процент возвращающихся пользователей
  • Product Performance - производительность курсов (топ-5)

🔧 Особенности реализации

1. Паттерн Facade

Вместо того чтобы Controller вызывал 4 разных сервиса, он вызывает один MetricsFacadeService, который внутри сам всё координирует. Это упрощает код и делает его более поддерживаемым.

2. Агрегация данных

В зависимости от выбранного периода, данные агрегируются по-разному:

  • До 30 дней → по дням
  • 30-180 дней → по неделям
  • Больше 180 дней → по месяцам

Это делает графики читабельными независимо от периода.

3. AJAX-загрузка данных

При смене периода страница не перезагружается полностью - данные загружаются через AJAX, что делает интерфейс быстрее и отзывчивее.

4. SQL-запросы для сложной аналитики

Для сложных метрик (например, ретенция по когортам) используются нативные SQL-запросы, что позволяет эффективно работать с данными прямо в базе.


📚 Полезные ссылки

Полезные видео


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published