Скриншот архива с проектом


Задание
Разработать систему автоматизированной регистрации входящей корреспонденции (АИС), обеспечивающую:
-
Учёт сотрудников, отправителей и получателей с использованием Entity Framework Core для работы с базой данных.
-
Регистрацию новых писем с указанием типа (электронное или бумажное) и даты регистрации.
-
Возможность фильтрации писем по типу и зарплатным параметрам сотрудников.
-
Отображение статистики в виде дашборда:
-
общее количество сотрудников, отправителей, получателей и писем;
-
круговая диаграмма соотношения писем по типу;
-
гистограмма количества писем по дате регистрации;
-
таблица последних зарегистрированных писем.
-
Требуемый стек технологий: C#, ASP.NET Core WebAPI, Blazor WebAssembly, Entity Framework Core, SQL Server.
Функционал программы
-
Учёт сотрудников — добавление, редактирование и удаление сотрудников организации.
-
Учёт отправителей и получателей — создание и ведение базы отправителей и получателей писем.
-
Регистрация писем — добавление новых писем с указанием типа (электронное или бумажное) и даты регистрации.
-
Фильтры и поиск — фильтрация писем по типу и зарплатным параметрам сотрудников.
-
Статистика и дашборд:
-
общее количество сотрудников, отправителей, получателей и писем;
-
круговая диаграмма соотношения писем по типу;
-
гистограмма количества писем по дате регистрации;
-
график зарплат сотрудников с автоматической сортировкой по возрастанию через LINQ;
-
таблица последних зарегистрированных писем.
-
-
Визуализация данных — графики автоматически обновляются при добавлении новых данных.
-
Гибкая настройка базы данных — поддержка LocalDB или подключение к SQL Server с указанием собственного имени сервера.
Фрагмент программного кода
@code {
private bool loading = true;
private bool chartRendered = false;
private int employeeCount;
private int senderCount;
private int recipientCount;
private int letterCount;
private List<Letter>? latestLetters;
private List<Employee>? employees;
private List<Letter> allLetters = new();
private int digital = 0;
private int paper = 0;
[Inject] private SalaryFilterService? SalaryFilter { get; set; }
// Данные для диаграммы по дате
private List<string> datesLabels = new();
private List<int> digitalByDate = new();
private List<int> paperByDate = new();
// Данные для зарплатной диаграммы
private string[] employeeNames = Array.Empty<string>();
private decimal[] salaries = Array.Empty<decimal>();
protected override async Task OnInitializedAsync()
{
loading = true;
employees = await Http.GetFromJsonAsync<List<Employee>>("https://localhost:7276/api/Employees");
var senders = await Http.GetFromJsonAsync<List<Sender>>("https://localhost:7276/api/Senders");
var recipients = await Http.GetFromJsonAsync<List<Recipient>>("https://localhost:7276/api/Recipients");
var letters = await Http.GetFromJsonAsync<List<Letter>>("https://localhost:7276/api/Letters");
employeeCount = employees?.Count ?? 0;
senderCount = senders?.Count ?? 0;
recipientCount = recipients?.Count ?? 0;
letterCount = letters?.Count ?? 0;
allLetters = letters ?? new List<Letter>();
latestLetters = allLetters.OrderByDescending(x => x.RegistrationDate).ToList();
digital = allLetters.Count(l => l.TypeLetter == TypeLetter.Electronic);
paper = allLetters.Count(l => l.TypeLetter == TypeLetter.Paper);
UpdateDateChart(allLetters);
UpdateSalaryChart();
// Подписка на изменения фильтра зарплаты
SalaryFilter.OnChange += UpdateSalaryChart;
loading = false;
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!loading && !chartRendered)
{
chartRendered = true;
await RenderLettersCharts();
await RenderSalaryChart();
}
}
private void UpdateDateChart(List<Letter> letters)
{
datesLabels.Clear();
digitalByDate.Clear();
paperByDate.Clear();
var grouped = letters
.GroupBy(l => l.RegistrationDate?.ToString("yyyy-MM-dd") ?? "")
.OrderBy(g => g.Key);
foreach (var g in grouped)
{
datesLabels.Add(g.Key);
digitalByDate.Add(g.Count(l => l.TypeLetter == TypeLetter.Electronic));
paperByDate.Add(g.Count(l => l.TypeLetter == TypeLetter.Paper));
}
}
private void UpdateSalaryChart()
{
if (employees == null || employees.Count == 0) return;
var (min, max) = SalaryFilter.GetFilter();
// Фильтруем и сразу сортируем по зарплате по возрастанию
var filtered = employees
.Where(e => (!min.HasValue || e.Salary >= min.Value) &&
(!max.HasValue || e.Salary <= max.Value))
.OrderBy(e => e.Salary) // Сортировка LINQ
.ToList();
// Формируем массивы для графика
employeeNames = filtered.Select(e => e.FullName).ToArray();
salaries = filtered.Select(e => e.Salary).ToArray();
// Перерисовываем только зарплатный график
InvokeAsync(RenderSalaryChart);
}
private async Task RenderLettersCharts()
{
await JS.InvokeVoidAsync("drawPieChartWithPercent", "lettersPie", new[] { "Электронные", "Бумажные" }, new[] { digital, paper });
await JS.InvokeVoidAsync("drawBarChartByDate", "lettersByDate", datesLabels.ToArray(), digitalByDate.ToArray(), paperByDate.ToArray());
}
private async Task RenderSalaryChart()
{
await JS.InvokeVoidAsync("drawSalaryChart", employeeNames, salaries);
}
public void Dispose()
{
SalaryFilter.OnChange -= UpdateSalaryChart;
}
}
Пояснения по запуску программы
-
Установка Visual Studio 2022 Community
-
Скачайте и установите Visual Studio 2022 Community с официального сайта.
-
При установке выберите рабочие нагрузки:
-
Разработка веб-приложений
-
Разработка классических .NET приложений на C# и Visual Basic
-
-
В разделе Дополнительно отметьте: .NET 8 и 9, .NET Framework 4.7.2 и 4.8, ASP.NET MVC 4.
-
-
Установка SQL Server Management Studio (SSMS)
-
Скачайте и установите SSMS с официального сайта.
-
Настройка подключения к серверу: используйте (LocalDB)\MSSQLLocalDB или укажите своё имя сервера.
-
-
Запуск проекта через Visual Studio 2022 Community
-
Откройте решение проекта.
-
-
Проверка строки подключения
-
В файле
appsettings.jsonпроверьте строку подключения: "DefaultConnection": "Server=(LocalDB)\\MSSQLLocalDB;Database=EmailTrackingDB;Trusted_Connection=True;MultipleActiveResultSets=true" - Если используете своё имя сервера, замените
(LocalDB)\MSSQLLocalDBна него.
-
-
Миграции базы данных
-
Удалите папку
Migrationsв проекте (для чистой базы). -
Через Visual Studio → Package Manager Console выполните команды: Add-Migration InitialCreate и Update-Database
- Это создаст пустую базу данных с нужными таблицами.
-
-
Запуск проекта и заполнение данными
-
Запустите проект (F5 или Ctrl+F5).
-
В открывшемся браузере можно добавлять сотрудников, отправителей и получателей, регистрировать письма и просматривать статистику.
-
Телеграм
-