From 6ba2b66dfcd451f410435ab14e723c1acc3ce1e2 Mon Sep 17 00:00:00 2001 From: Danil Markov Date: Fri, 19 May 2023 14:46:02 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D0=BA=20=D0=BF=D0=BE=20"=D0=A1=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=81=20=D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20-=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=BE=20=D1=81?= =?UTF-8?q?=D1=82=D1=83=D0=B4=D0=B5=D0=BD=D1=82=D0=BE=D0=B2",=20=D0=B4?= =?UTF-8?q?=D1=83=D0=BC=D0=B0=D1=8E=20=D0=BD=D0=B0=D0=B4=20=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=BC=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/EducationStatusLogic.cs | 5 ++ .../IEducationStatusLogic.cs | 1 + .../IEducationStatusStorage.cs | 1 + .../StoragesContracts/IStreamStorage.cs | 2 +- .../EducationStatusStudentsCountViewModel.cs | 15 ++++ .../Implements/EducationStatusStorage.cs | 18 ++++ .../Controllers/EducationStatusController.cs | 10 +++ UniversityProvider/Views/Home/Diagram.cshtml | 28 +----- .../wwwroot/js/diagram/diagram.js | 85 +++++++++++++++++++ .../Controllers/EducationStatusController.cs | 13 +++ 10 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 UniversityContracts/ViewModels/EducationStatusStudentsCountViewModel.cs create mode 100644 UniversityProvider/wwwroot/js/diagram/diagram.js diff --git a/UniversityBusinessLogic/BusinessLogics/EducationStatusLogic.cs b/UniversityBusinessLogic/BusinessLogics/EducationStatusLogic.cs index 844df6e..428dc12 100644 --- a/UniversityBusinessLogic/BusinessLogics/EducationStatusLogic.cs +++ b/UniversityBusinessLogic/BusinessLogics/EducationStatusLogic.cs @@ -71,6 +71,11 @@ namespace UniversityBusinessLogic.BusinessLogics return list; } + public List GetEducationStatusStudents() + { + return _esStorage.GetEducationStatusStudents() ?? new List(); + } + public int GetNumberOfPages(int userId, int pageSize = 10) { return _esStorage.GetNumberOfPages(userId, pageSize); diff --git a/UniversityContracts/BusinessLogicContracts/IEducationStatusLogic.cs b/UniversityContracts/BusinessLogicContracts/IEducationStatusLogic.cs index 5c5a1a5..e570fe4 100644 --- a/UniversityContracts/BusinessLogicContracts/IEducationStatusLogic.cs +++ b/UniversityContracts/BusinessLogicContracts/IEducationStatusLogic.cs @@ -16,6 +16,7 @@ namespace UniversityContracts.BusinessLogicContracts bool Delete(EducationStatusBindingModel model); List? ReadList(EducationStatusSearchModel? model); EducationStatusViewModel? ReadElement(EducationStatusSearchModel model); + List GetEducationStatusStudents(); int GetNumberOfPages(int userId, int pageSize = 10); } } diff --git a/UniversityContracts/StoragesContracts/IEducationStatusStorage.cs b/UniversityContracts/StoragesContracts/IEducationStatusStorage.cs index 7d1661f..80eda43 100644 --- a/UniversityContracts/StoragesContracts/IEducationStatusStorage.cs +++ b/UniversityContracts/StoragesContracts/IEducationStatusStorage.cs @@ -17,6 +17,7 @@ namespace UniversityContracts.StoragesContracts EducationStatusViewModel? Insert(EducationStatusBindingModel model); EducationStatusViewModel? Update(EducationStatusBindingModel model); EducationStatusViewModel? Delete(EducationStatusBindingModel model); + List? GetEducationStatusStudents(); int GetNumberOfPages(int userId, int pageSize = 10); } } diff --git a/UniversityContracts/StoragesContracts/IStreamStorage.cs b/UniversityContracts/StoragesContracts/IStreamStorage.cs index ab5e822..60d3d0f 100644 --- a/UniversityContracts/StoragesContracts/IStreamStorage.cs +++ b/UniversityContracts/StoragesContracts/IStreamStorage.cs @@ -18,6 +18,6 @@ namespace UniversityContracts.StoragesContracts StreamViewModel? Update(StreamBindingModel model); StreamViewModel? Delete(StreamBindingModel model); List GetStreamDisciplines(StreamSearchModel model); - List GetStreamStudents(StreamSearchModel model); + List GetStreamStudents(StreamSearchModel model); } } diff --git a/UniversityContracts/ViewModels/EducationStatusStudentsCountViewModel.cs b/UniversityContracts/ViewModels/EducationStatusStudentsCountViewModel.cs new file mode 100644 index 0000000..d1421f1 --- /dev/null +++ b/UniversityContracts/ViewModels/EducationStatusStudentsCountViewModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UniversityContracts.ViewModels +{ + public class EducationStatusStudentsCountViewModel + { + public int Count { get; set; } + public string Name { get; set; } = string.Empty; + } +} diff --git a/UniversityDataBaseImplemet/Implements/EducationStatusStorage.cs b/UniversityDataBaseImplemet/Implements/EducationStatusStorage.cs index 97c1055..0a60dd7 100644 --- a/UniversityDataBaseImplemet/Implements/EducationStatusStorage.cs +++ b/UniversityDataBaseImplemet/Implements/EducationStatusStorage.cs @@ -118,6 +118,24 @@ namespace UniversityDataBaseImplemet.Implements return educationStatus.GetViewModel; } + public List? GetEducationStatusStudents() + { + using var context = new Database(); + var result = context.EducationStatuses + .GroupJoin( + context.Students, + status => status.Id, + student => student.EducationStatusId, + (status, students) => new EducationStatusStudentsCountViewModel + { + Name = status.Name, + Count = students.Count() + }) + .ToList(); + + return result; + } + public int GetNumberOfPages(int userId, int pageSize) { using var context = new Database(); diff --git a/UniversityProvider/Controllers/EducationStatusController.cs b/UniversityProvider/Controllers/EducationStatusController.cs index b6f77fa..40df9e2 100644 --- a/UniversityProvider/Controllers/EducationStatusController.cs +++ b/UniversityProvider/Controllers/EducationStatusController.cs @@ -90,6 +90,16 @@ namespace UniversityProvider.Controllers return educationstatus ?? new(); } + public List GetEducationStatusStudents() + { + if (APIClient.User == null) + { + return new(); + } + List? educationstatuscount = APIClient.GetRequest>($"api/educationstatus/geteducationstatusstudents"); + return educationstatuscount ?? new(); + } + public EducationStatusViewModel? Get(int id) { if (APIClient.User == null) diff --git a/UniversityProvider/Views/Home/Diagram.cshtml b/UniversityProvider/Views/Home/Diagram.cshtml index 414da93..3adb064 100644 --- a/UniversityProvider/Views/Home/Diagram.cshtml +++ b/UniversityProvider/Views/Home/Diagram.cshtml @@ -1,28 +1,8 @@ -
+ + +
- - + diff --git a/UniversityProvider/wwwroot/js/diagram/diagram.js b/UniversityProvider/wwwroot/js/diagram/diagram.js new file mode 100644 index 0000000..3628601 --- /dev/null +++ b/UniversityProvider/wwwroot/js/diagram/diagram.js @@ -0,0 +1,85 @@ +var btnFlow = document.getElementById('btnFlow'); +var btnStatus = document.getElementById('btnStatus'); +var educationStatusStats = []; + +window.addEventListener('load', async () => { + await $.ajax({ + url: "/educationstatus/geteducationstatusstudents", + type: "GET", + contentType: "json" + }).done((result) => { + educationStatusStats = result; + console.log(educationStatusStats); + }); +}) + + var ctx = document.getElementById('myChart').getContext('2d'); + var chart; + + function drawFlowChart() { + var flowData = { + labels: ['Поток 1', 'Поток 2', 'Поток 3'], + datasets: [{ + label: 'Распределение студентов', + data: [80, 120, 100], + backgroundColor: ['#FF6384', '#36A2EB', '#FFCE56'] + }] + }; + + // Clear the previous chart if it exists + if (chart) { + chart.destroy(); + } + + chart = new Chart(ctx, { + type: 'bar', + data: flowData, + options: { + responsive: true, + scales: { + y: { + beginAtZero: true + } + } + } + }); + } + +function drawStatusChart() { + var edStatus = []; + var edCount = []; + educationStatusStats.forEach((item) => { + edStatus.push(item.name); + }); + educationStatusStats.forEach((item) => { + edCount.push(item.count); + }); + var statusData = { + labels: edStatus, + datasets: [{ + data: edCount + }] + }; + + // Clear the previous chart if it exists + if (chart) { + chart.destroy(); + } + + chart = new Chart(ctx, { + type: 'pie', + data: statusData, + options: { + responsive: true + } + }); +} + + btnFlow.addEventListener('click', function () { + drawFlowChart(); + }); + + btnStatus.addEventListener('click', function () { + drawStatusChart(); + }); + diff --git a/UniversityRestAPI/Controllers/EducationStatusController.cs b/UniversityRestAPI/Controllers/EducationStatusController.cs index cfca77f..0ff3f26 100644 --- a/UniversityRestAPI/Controllers/EducationStatusController.cs +++ b/UniversityRestAPI/Controllers/EducationStatusController.cs @@ -69,6 +69,19 @@ namespace UniversityRestAPI.Controllers } } + [HttpGet] + public List GetEducationStatusStudents() + { + try + { + return _educationStatusLogic.GetEducationStatusStudents(); + } + catch (Exception ex) + { + throw; + } + } + [HttpPost] public void Create(EducationStatusBindingModel model) {