Введение в проект
Приветствую тебя, путник, зашедший на страницу документации! Это чудо инженерной мысли было создано под чутким руководством одного человека (меня). Естественно, это всеми (нет) любимый Иван Васильевич Великий, ну или для своих — просто Ваня. Данный проект пишется для защиты диплома, и его имя — UranusMonitor.
Что это вообще такое и зачем оно нужно? В современном мире компьютеры имеют свойство зависать, перегреваться или просто тормозить из-за нехватки оперативной памяти. UranusMonitor — это система удаленного мониторинга, которая позволяет следить за «здоровьем» компьютера прямо из браузера, находясь в любой точке мира.
Система состоит из двух частей: WPF-приложения, которое живет на компьютере и собирает данные (нагрузка на процессор, видеокарту, память), и Веб-сайта, где эти данные красиво визуализируются. Стек технологий, на котором все это держится:
- ASP.NET Core 10 — бэкенд, принимающий HTTP-запросы.
- Entity Framework Core — магия работы с базой данных через C#.
- SQL Server — реляционная база данных (на хостинге Somee).
- WPF (C#) — десктопный клиент для Windows.
- HTML/CSS/JS + Chart.js — фронтенд без тяжелых фреймворков.
Рис. 1 – Главная страница системы (Дашборд)
Половина того, что здесь используется, было для меня новым. Пришлось разбираться с нуля: от того, как работает WPF и фоновые задачи, до того, как заставить Nginx/IIS правильно проксировать запросы. Здесь я постараюсь описать всё то, что скрыто за красивыми кнопками.
Дашборд (Лицо системы)
Когда пользователь заходит на сайт, он попадает на главную страницу, которая выполняет роль Дашборда. Мы отказались от скучных таблиц в пользу живого интерфейса.
Что здесь есть:
- KPI-карточки (Key Performance Indicators): Четыре блока сверху показывают общее количество устройств, количество замеров за последние 24 часа, число активных устройств за последний час и среднюю загрузку CPU по всей системе. Данные подтягиваются с публичного эндпоинта
/api/public/statsкаждые 30 секунд. - Живой график: С помощью библиотеки Chart.js мы рисуем линию активности системы. Данные агрегируются по часам на стороне сервера (C#), а на клиенте мы корректируем их под часовой пояс Екатеринбурга (UTC+5).
- Лента сообщений: Справа находится виджет карусели. Он раз в 8 секунд плавно перелистывает последние сообщения из базы данных (наша импровизированная гостевая книга).
Весь этот блок написан на чистом JavaScript с использованием fetch API для асинхронных запросов. Никаких перезагрузок страницы — всё обновляется в реальном времени.
Рис. 2 – Пример кода C#, генерирующего статистику для дашборда
WPF-Клиент (Сборщик данных)
Как система узнает, что происходит с компьютером? Для этого была написана программа на WPF (Windows Presentation Foundation). Это не просто окно с кнопками, внутри скрыта серьезная работа:
1. Фоновая работа и сбор метрик.
Клиент использует Win32 API (низкоуровневые системные вызовы Windows) для получения точных данных о загрузке процессора, оперативной памяти и диска. Также он опрашивает датчики видеокарты и сетевые интерфейсы.
Рис. 3 – Вкладка со сбором метрик в десктопном клиенте
2. Фоновый планировщик.
Программа умеет работать из системного трея (возле часов). Раз в несколько минут она просыпается, собирает пачку метрик и отправляет их на сервер. При этом она не нагружает компьютер пользователя, работая в отдельном потоке (Task-based asynchronous pattern).
3. Офлайн-очередь.
А что, если интернет пропал? Данные не потеряются! Клиент сохраняет их в локальный файл queue.json. Как только связь восстанавливается, программа автоматически «выстреливает» накопленные данные в API. Это делает систему устойчивой к сбоям.
4. Инвентаризация железа.
При регистрации устройства клиент сканирует железо (процессор, материнскую плату, модули оперативной памяти) через WMI и отправляет этот «паспорт ПК» на сервер, чтобы вы могли любоваться характеристиками своего железа в веб-интерфейсе.
Рис. 4 – Вкладка регистрации устройства с автоопределением характеристик
Профиль и Ролевая модель
Сайт не был бы системой без разграничения прав доступа. На странице профиля реализована сложная RBAC (Role-Based Access Control) модель.
Есть три основные роли:
- User (Пользователь): Обычный смертный. Видит только свои устройства, может менять им имена, удалять их и смотреть только свои метрики.
- Admin (Администратор): Бог системы. Видит все устройства всех пользователей, может читать метрики любого ПК, менять роли другим пользователям и банить их (удалять).
- Guest (Гость): Скрытая роль. Создана для тех, кто не прошел авторизацию. Не может писать сообщения и не видит данных.
Рис. 5 – Личный кабинет с таблицей метрик и расшифровкой аббревиатур
В интерфейсе реализована адаптивная верстка (Flexbox и CSS Grid). В таблицах метрик используется наведение мыши (тултипы), чтобы расшифровать страшные аббревиатуры вроде CPU, RAM или VRAM. Время работы сервера (Uptime) автоматически переводится из секунд в часы, если значение большое.
Рис. 6 – Панель управления пользователями (доступна только роли Admin)
Бэкенд и API (Мозг)
Серверная часть написана на ASP.NET Core 10. Это легковесный и очень быстрый веб-сервер (Kestrel), который обрабатывает десятки запросов в секунду.
Общение между клиентами (WPF и Сайтом) происходит по архитектуре REST API с использованием JSON-формата. Например:
POST /api/devices— регистрация нового ПК.POST /api/metrics— отправка пачки собранных данных.GET /api/metrics/user— получение метрик конкретного пользователя.
Как система понимает, кто прислал запрос? При авторизации клиенту выдается его userId. При каждом запросе к API он передает его в заголовке X-User-ID. Контроллеры (C#-классы) перехватывают этот заголовок, проверяют права в базе данных и только потом выполняют операцию.
Для защиты от просмотра «лишних» данных (например, паролей) и бесконечных циклов в JSON, мы используем DTO (Data Transfer Objects) — специальные «урезанные» классы, которые передаются наружу вместо реальных сущностей базы данных.
База данных и EF Core
Сердце системы — реляционная база данных SQL Server. В ней хранятся таблицы Users (пользователи), Devices (устройства) и Metrics (сами замеры).
Взаимодействие с базой происходит через Entity Framework Core (подход Code First). Мы не пишем SQL-запросы вручную (типа SELECT * FROM Metrics). Мы описываем классы на C#, а EF Core сам генерирует оптимальные SQL-запросы под капотом.
Кроме того, используется механизм Миграций. Если завтра мы решим добавить в таблицу `Metrics` новую колонку (например, температуру видеокарты), нам достаточно добавить свойство в C#-класс и применить миграцию. База данных на хостинге обновится автоматически при следующем запуске приложения (через метод dbContext.Database.Migrate()).
Рис. 7 – Таблицы в SQL Server Management Studio
База данных размещена на удаленном хостинге (Somee.com), поэтому WPF-клиент и Веб-сайт могут работать с ней одновременно, находясь в разных сетях.
Почему это отличный курсовой проект?
Многие курсовые работы — это просто CRUD-приложения с парой кнопок. UranusMonitor — это сложная распределенная система, которая включает в себя:
- Разработку десктопного клиента (WPF) с фоновыми процессами и очередью.
- Разработку REST API с аутентификацией и ролевой моделью.
- Проектирование базы данных с внешними ключами и связями.
- Разработку адаптивного Web-интерфейса с графиками и асинхронными запросами.
- Деплой проекта на реальный хостинг.
Всего этого достаточно, чтобы с уверенностью защитить курсовой проект на отличную оценку. А главное — это не просто «код ради кода», а реально работающий продукт!
Надеюсь, вам было интересно. Если остались вопросы, Ваня всегда на связи!