Это веб-приложение для анализа данных образовательной платформы. Представьте, что у вас есть онлайн-школа с курсами: люди регистрируются, покупают курсы, изучают их. Эта система собирает всю эту информацию и показывает вам красивые графики и цифры о том:
- Сколько у вас активных пользователей
- Сколько денег вы зарабатываете
- Какие курсы продаются лучше всего
- Как часто пользователи возвращаются (ретенция)
Представьте дом: есть фундамент, стены, крыша, комнаты. В программе похоже - есть разные "слои", которые выполняют свои задачи.
Это как разделение ролей в ресторане:
- Controller (контроллер) - как официант: принимает заказы от клиентов (браузер) и передаёт их на кухню
- Service (сервис) - как повар: выполняет основную работу - считает метрики, обрабатывает данные
- Repository (репозиторий) - как склад: хранит и выдаёт данные из базы данных
- Model (модель) - как форма заказа: описывает, как выглядят данные (пользователь, курс, заказ)
Класс MetricsFacadeService работает как единая "точка входа" - вместо того чтобы вызывать 5 разных сервисов отдельно, вы вызываете один, а он внутри собирает все метрики вместе.
Spring автоматически "вставляет" нужные компоненты туда, где они нужны. Например, если сервису нужен репозиторий, Spring сам его передаёт.
Почему Java?
- Надёжный и проверенный временем язык
- Отличная поддержка больших корпоративных проектов
- Богатая экосистема библиотек
- Java 21 - современная версия с улучшенной производительностью
Что это? Готовый набор инструментов для создания веб-приложений.
Почему Spring Boot?
- Автоматическая настройка всего необходимого
- Встроенный веб-сервер (не нужно настраивать отдельно)
- Упрощает разработку в разы
- Огромное сообщество и документация
Что делает в проекте?
- Запускает веб-сервер на порту 8080
- Управляет всеми компонентами приложения
- Обеспечивает работу REST API
Что это? Инструменты для удобной работы с базой данных.
Почему JPA?
- Не нужно писать все SQL запросы вручную (только сложные)
- Автоматическое создание таблиц на основе классов
- Удобные методы для поиска данных
Что делает в проекте?
- Создаёт таблицы
users,courses,ordersв базе данных - Предоставляет методы для поиска пользователей, заказов, курсов
- Выполняет сложные SQL-запросы для расчёта метрик
Что это? Лёгкая база данных, которая хранит данные прямо в памяти компьютера (или в файле).
Почему H2?
- Не требует установки отдельного сервера БД
- Идеально для разработки, тестирования и простейших приложений
- Быстрая и простая в использовании
- Можно переключиться на PostgreSQL/MySQL без особых изменений в коде
Что делает в проекте?
- Хранит всех пользователей, курсы и заказы
- Доступна через веб-консоль по адресу
/h2-console
Что это? Инструмент, который берёт HTML-шаблон и "подставляет" туда данные из Java.
Почему Thymeleaf?
- Интеграция с Spring Boot из коробки
- Позволяет динамически генерировать HTML
- Безопасная обработка данных
Что делает в проекте?
- Формирует страницу дашборда (
dashboard.html) - Передаёт данные из Java (метрики, статистика) в HTML
Что это? Библиотека, которая автоматически генерирует стандартный код (геттеры, сеттеры, конструкторы).
Почему Lombok?
- Меньше кода = меньше ошибок
- Чище и читабельнее
- Меньше рутинной работы
Что делает в проекте?
- Автоматически создаёт геттеры/сеттеры для классов (
@Getter,@Setter) - Создаёт конструкторы (
@RequiredArgsConstructor,@AllArgsConstructor) - Убирает необходимость писать
get/setметоды вручную
Что это? Готовая библиотека красивых стилей для веб-страниц.
Почему Bootstrap?
- Красивый современный дизайн из коробки
- Адаптивность (работает на телефонах и планшетах)
- Много готовых компонентов (кнопки, карточки, таблицы)
Что это? Библиотека для создания красивых интерактивных графиков.
Почему 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
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 чтобы увидеть данные.
Что делает? Принимает HTTP-запросы от браузера и возвращает ответы.
Методы:
dashboard()- показывает главную страницу с графикамиgetMetrics()- возвращает метрики в формате JSON (для AJAX-запросов)
Как работает?
- Получает запрос от браузера (например, "покажи дашборд за последние 30 дней")
- Вызывает
MetricsFacadeServiceдля получения всех метрик - Передаёт данные в шаблон HTML (
dashboard.html) - Браузер показывает красивую страницу с графиками
Что делает? Собирает все метрики в одном месте. Это "фасад" - упрощённый интерфейс.
Почему нужен? Вместо того чтобы вызывать 4 разных сервиса, вызываем один, и он сам всё собирает.
Методы:
getCompleteMetrics()- собирает ВСЕ метрики сразуgetDashboardStats()- базовая статистика (количество пользователей, курсов, заказов)
Что делает? Считает деньги: сколько зарабатываем, сколько тратим на привлечение клиентов.
Метрики:
- LTV (Lifetime Value) - сколько денег приносит один пользователь за всё время
- CAC (Customer Acquisition Cost) - сколько стоит привлечь одного нового клиента
- ARPPU (Average Revenue Per Paying User) - средний чек платящего пользователя
Как считает?
- LTV = Общая выручка / Количество всех пользователей
- CAC = Затраты на маркетинг за период / Количество новых пользователей
- ARPPU = Выручка за период / Количество платящих пользователей
Что делает? Считает активность пользователей.
Метрики:
- DAU (Daily Active Users) - сколько пользователей активны каждый день
- WAU (Weekly Active Users) - сколько пользователей активны каждую неделю
- MAU (Monthly Active Users) - сколько пользователей активны каждый месяц
Как работает?
- Смотрит на дату последней активности пользователя
- Группирует по дням/неделям/месяцам
- Считает уникальных пользователей в каждом периоде
Что делает? Считает, сколько пользователей возвращаются.
Метрики:
- Retention Rate - процент пользователей, которые сделали больше одного заказа
- Retention Trend - динамика ретенции по времени
Как считает?
- Находит всех пользователей, которые когда-либо делали заказы
- Считает, сколько из них сделали повторные заказы
- Выражает в процентах
Что делает? Анализирует, какие курсы продаются лучше всего.
Что показывает?
- Топ-5 курсов по количеству продаж
- Выручка с каждого курса
Как работает?
- Группирует заказы по курсам
- Считает количество продаж и сумму выручки
- Сортирует по количеству продаж (от большего к меньшему)
Что это? Интерфейсы для работы с базой данных. Spring автоматически создаёт классы, которые реализуют эти интерфейсы.
Что делает? Работает с таблицей пользователей.
Методы:
getDailyActiveUsers()- получает список активных пользователей по днямcountByLastActivityDateBetween()- считает пользователей по дате активностиcountByRegistrationDateBetween()- считает новых пользователей за периодgetWeeklyRetentionTrend()- получает тренд ретенции по неделям (через SQL)getMonthlyRetentionTrend()- получает тренд ретенции по месяцам
Особенность: Использует как методы Spring Data JPA (автоматически генерируются), так и собственные SQL-запросы через @Query.
Что делает? Работает с таблицей заказов.
Методы:
getTotalRevenue()- общая выручка за всё времяgetTotalRevenueBetween()- выручка за периодcountDistinctPayingUsersBetween()- количество уникальных платящих пользователейgetProductPerformance()- статистика по курсам (какой курс сколько продаж и выручки)findByOrderDateBetween()- заказы за периодfindByUser()- все заказы конкретного пользователя
Что делает? Работает с таблицей курсов.
Методы:
count()- количество курсов (стандартный метод JPA)
Поля:
id- уникальный номерname- имя пользователяregistrationDate- дата регистрацииlastActivityDate- дата последней активностиorders- список заказов пользователя (связь один-ко-многим)
Связи: Один пользователь может иметь много заказов (@OneToMany)
Поля:
id- уникальный номерname- название курсаprice- цена курса
Поля:
id- уникальный номерuser- пользователь, который сделал заказ (связь многие-к-одному)course- курс, который купили (связь многие-к-одному)orderDate- дата заказаamount- сумма заказа
Связи:
- Много заказов относятся к одному пользователю (
@ManyToOne) - Много заказов относятся к одному курсу (
@ManyToOne)
Что это? Контейнер для всех метрик, которые отправляются на фронтенд. Группирует все полученные данные для упрощения работы с метриками в других слоях проекта (кнотроллеры)
Содержит:
dashboardStats- базовая статистикаaudienceMetrics- метрики аудитории (DAU, WAU, MAU)retentionRate- процент ретенцииltv,cac,arppu- финансовые метрикиproductPerformance- топ курсовretentionTrend- тренд ретенции
Что это? Базовая статистика для дашборда.
Содержит:
userCount- количество пользователейcourseCount- количество курсовorderCount- количество заказовtotalRevenue- общая выручка
Что это? Данные о производительности одного курса.
Содержит:
courseId- ID курсаcourseName- название курсаsalesCount- количество продажrevenue- выручка с курса
Что это? Простая запись (record) для хранения периода времени.
Содержит:
start- начало периодаend- конец периода
Что это? HTML-шаблон главной страницы.
Что показывает?
- Карточки с основными метриками (LTV, CAC, ARPPU, Retention)
- Графики аудитории (DAU, WAU, MAU)
- График ретенции
- Таблица топ-5 курсов
- Фильтр по периоду (7 дней, 30 дней, 90 дней, год)
Как работает?
- Использует Thymeleaf для подстановки данных из Java
- Использует Bootstrap для красивого оформления
- Использует Chart.js для графиков
Что делает? Основная логика дашборда.
Функции:
init()- инициализация дашборда при загрузке страницыhandlePeriodChange()- обработка смены периода (AJAX-запрос)loadDataForPeriod()- загрузка данных через APIupdateDashboard()- обновление всех графиков и карточекexportData()- экспорт данных в JSON или CSV
Что делает? Создание и обновление графиков Chart.js.
Что делает? Форматирование метрик для отображения (например, добавление знака рубля, округление).
Что делает? Вспомогательные функции (например, debounce - задержка выполнения функции).
dashboard.css- стили для дашбордаcharts.css- стили для графиковcomponents.css- стили для компонентов (кнопки, карточки)
-
Пользователь открывает браузер → вводит
http://localhost:8080 -
Браузер отправляет HTTP-запрос → Spring получает запрос
-
Spring направляет запрос в
DashboardController→ методdashboard() -
Controller вызывает
MetricsFacadeService.getCompleteMetrics() -
Facade собирает данные из всех сервисов:
FinancialMetricsService→ считает LTV, CAC, ARPPUAudienceMetricsService→ считает DAU, WAU, MAURetentionMetricsService→ считает ретенциюProductMetricsService→ получает топ курсов
-
Каждый сервис обращается к Repository:
UserRepository→ запросы к таблицеusersOrderRepository→ запросы к таблицеordersCourseRepository→ запросы к таблицеcourses
-
Hibernate выполняет SQL-запросы → получает данные из H2
-
Данные возвращаются обратно:
- Repository → Service → Facade → Controller
-
Controller передаёт данные в Thymeleaf → генерируется HTML
-
HTML отправляется в браузер → пользователь видит страницу
-
JavaScript загружается → создаёт графики на основе данных
- Java 21 или выше
- Maven (или используйте встроенный
mvnw)
-
Откройте терминал в папке проекта
-
Запустите приложение:
# Windows mvnw.cmd spring-boot:run # Linux/Mac ./mvnw spring-boot:run
-
Откройте браузер:
http://localhost:8080 -
Для просмотра базы данных:
http://localhost:8080/h2-console- JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password: (пустое)
- JDBC URL:
В проекте есть тесты для проверки работоспособности:
- Тесты репозиториев
- Тесты сервисов
- Тесты контроллера
- Интеграционные тесты
Запуск тестов:
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)
Вместо того чтобы Controller вызывал 4 разных сервиса, он вызывает один MetricsFacadeService, который внутри сам всё координирует. Это упрощает код и делает его более поддерживаемым.
В зависимости от выбранного периода, данные агрегируются по-разному:
- До 30 дней → по дням
- 30-180 дней → по неделям
- Больше 180 дней → по месяцам
Это делает графики читабельными независимо от периода.
При смене периода страница не перезагружается полностью - данные загружаются через AJAX, что делает интерфейс быстрее и отзывчивее.
Для сложных метрик (например, ретенция по когортам) используются нативные SQL-запросы, что позволяет эффективно работать с данными прямо в базе.
- Spring Boot Documentation
- Hibernate Documentation
- Thymeleaf Documentation
- Chart.js Documentation
- Bootstrap Documentation
- MVC паттерн
- FACADE паттерн
- JPA/Hibernate
- видео про API
- Видео про HTTP
- Видео про Spring boot
- Видео про Hibernate