Compare commits
3 Commits
Visor
..
e37b03f072
| Author | SHA1 | Date | |
|---|---|---|---|
| e37b03f072 | |||
| 0bc6db2430 | |||
| 7286b1a4b0 |
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
+22
-85
@@ -6,91 +6,28 @@ namespace DahuaIPCRename
|
|||||||
{
|
{
|
||||||
public static Dictionary<string, string> listIPC = new Dictionary<string, string>
|
public static Dictionary<string, string> listIPC = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{"172.22.10.135","Этаж 2|Пом. 264"},
|
{"172.16.54.18","Ворота 35"},
|
||||||
{"172.22.10.136","Этаж 2|Эвак.выход лев"},
|
{"172.16.54.20","Ворота 36"},
|
||||||
{"172.22.10.137","Этаж 2|Ресепшн"},
|
{"172.16.54.21","Ворота 31"},
|
||||||
{"172.22.10.138","Этаж 2|Пом. 269-1"},
|
{"172.16.54.22","Ворота 32"},
|
||||||
{"172.22.10.139","Этаж 2|Пом. 268-2"},
|
{"172.16.54.23","Ворота 33"},
|
||||||
{"172.22.10.140","Этаж 2|Пом. 271"},
|
{"172.16.54.24","Ворота 34"},
|
||||||
{"172.22.10.141","Этаж 2|Пом. 269-3"},
|
{"172.16.54.28","Ворота 16"},
|
||||||
{"172.22.10.142","Этаж 2|Пом. 272"},
|
{"172.16.54.29","Ворота 26"},
|
||||||
{"172.22.10.143","Этаж 2|Пом. 228-1"},
|
{"172.16.54.30","Ворота 20"},
|
||||||
{"172.22.10.144","Этаж 2|Пом. 269-2"},
|
{"172.16.54.31","Ворота 22"},
|
||||||
{"172.22.10.145","Этаж 2|Пом. 228-2"},
|
{"172.16.54.32","Ворота 18"},
|
||||||
{"172.22.10.146","Этаж 2|Пом. 255"},
|
{"172.16.54.33","Ворота 21"},
|
||||||
{"172.22.10.147","Этаж 2|Пом. 229-3"},
|
{"172.16.54.34","Ворота 24"},
|
||||||
{"172.22.10.148","Этаж 2|Эвак.выход прав"},
|
{"172.16.54.35","Ворота 27"},
|
||||||
{"172.22.10.149","Этаж 2|Пом. 229-2"},
|
{"172.16.54.36","Ворота 29"},
|
||||||
{"172.22.10.150","Этаж 2|Пом. 254"},
|
{"172.16.54.37","Ворота 25"},
|
||||||
{"172.22.10.151","Этаж 2|Пом. 229-1"},
|
{"172.16.54.38","Ворота 23"},
|
||||||
{"172.22.10.152","Этаж 2|Пом. 248-7"},
|
{"172.16.54.39","Ворота 15"},
|
||||||
{"172.22.10.93","Этаж 3|Пом.319-столовая"},
|
{"172.16.54.40","Ворота 17"},
|
||||||
{"172.22.10.94","Этаж 3|Пом.313-1"},
|
{"172.16.54.41","Ворота 37"},
|
||||||
{"172.22.10.95","Этаж 3|Пом.321-1"},
|
{"172.16.54.42","Ворота 19"},
|
||||||
{"172.22.10.96","Этаж 3|Коридор от лифт. холла"},
|
{"172.16.54.43","Ворота 28"}
|
||||||
{"172.22.10.97","Этаж 3|Пом.321-2"},
|
|
||||||
{"172.22.10.98","Этаж 3|Коридор к лифт. холлу"},
|
|
||||||
{"172.22.10.99","Этаж 3|Пом.313-2"},
|
|
||||||
{"172.22.10.100","Этаж 3|Пом.323-2"},
|
|
||||||
{"172.22.10.101","Этаж 3|Пом.323-1"},
|
|
||||||
{"172.22.10.102","Этаж 3|Эвак. Выход"},
|
|
||||||
{"172.22.10.103","Этаж 3|Кроссовая"},
|
|
||||||
{"172.22.10.104","Этаж 3|Пом.304-1"},
|
|
||||||
{"172.22.10.105","Этаж 3|Пом.304-2"},
|
|
||||||
{"172.22.10.106","Этаж 3|Пом.312"},
|
|
||||||
{"172.22.10.107","Этаж 2|Пом.237"},
|
|
||||||
{"172.22.10.108","Этаж 5|Пом.519-2"},
|
|
||||||
{"172.22.10.109","Этаж 2|Пом.244-1"},
|
|
||||||
{"172.22.10.110","Этаж 2|Пом.244-2"},
|
|
||||||
{"172.22.10.111","Этаж 2|Пом.245(окно)"},
|
|
||||||
{"172.22.10.112","Этаж 2|Пом.245-2"},
|
|
||||||
{"172.22.10.113","Этаж 2|Пом.245-1"},
|
|
||||||
{"172.22.10.114","Этаж 1|Склад-2"},
|
|
||||||
{"172.22.10.115","Этаж 5|Пом.544"},
|
|
||||||
{"172.22.10.116","Этаж 1|Пом.ЦОД-1"},
|
|
||||||
{"172.22.10.117","Этаж 2|Пом.239-1"},
|
|
||||||
{"172.22.10.118","Этаж 1|Пом.ЦОД-2"},
|
|
||||||
{"172.22.10.119","Этаж 1|Пом.ИБП"},
|
|
||||||
{"172.22.10.120","Этаж 1|Склад-1"},
|
|
||||||
{"172.22.10.121","Этаж 2|Пом.239-2"},
|
|
||||||
{"172.22.10.122","Этаж 2|Пом. 247"},
|
|
||||||
{"172.22.10.123","Этаж 2|Пом. 248-4"},
|
|
||||||
{"172.22.10.124","Этаж 2|Пом. 248-5"},
|
|
||||||
{"172.22.10.125","Этаж 2|Пом. 248-2"},
|
|
||||||
{"172.22.10.126","Этаж 2|Пом. 248-6"},
|
|
||||||
{"172.22.10.127","Этаж 2|Пом. 248-3"},
|
|
||||||
{"172.22.10.128","Этаж 2|Пом. 237-1"},
|
|
||||||
{"172.22.10.129","Этаж 2|Пом. 268-1"},
|
|
||||||
{"172.22.10.130","Этаж 2|Пом. 237-2"},
|
|
||||||
{"172.22.10.131","Улица-2"},
|
|
||||||
{"172.22.10.132","Улица-3"},
|
|
||||||
{"172.22.10.133","Улица-1"},
|
|
||||||
{"172.22.10.134","Улица-4-PTZ"},
|
|
||||||
{"172.22.10.51","Этаж 5|Пом.545-2"},
|
|
||||||
{"172.22.10.52","Этаж 5|Пом.519-1"},
|
|
||||||
{"172.22.10.53","Этаж 5|Пом.511-1"},
|
|
||||||
{"172.22.10.54","Этаж 5|Пом.517-2"},
|
|
||||||
{"172.22.10.55","Этаж 5|Эвак. Выход-3"},
|
|
||||||
{"172.22.10.56","Этаж 5|Пом.545-коридор"},
|
|
||||||
{"172.22.10.57","Этаж 5|Ресепшн-1"},
|
|
||||||
{"172.22.10.58","Этаж 5|Пом.545-3"},
|
|
||||||
{"172.22.10.59","Этаж 5|Пом.521-3"},
|
|
||||||
{"172.22.10.60","Этаж 5|Пом.535 к лифтам"},
|
|
||||||
{"172.22.10.61","Этаж 5|Пом.515-2"},
|
|
||||||
{"172.22.10.62","Этаж 5|Пом.511-2"},
|
|
||||||
{"172.22.10.63","Этаж 5|Пом.517-1"},
|
|
||||||
{"172.22.10.64","Этаж 5|Пом.521-1"},
|
|
||||||
{"172.22.10.65","Этаж 5|Пом.535-коридор"},
|
|
||||||
{"172.22.10.66","Этаж 5|Пом.526-столовая"},
|
|
||||||
{"172.22.10.67","Этаж 5|Пом.545-4"},
|
|
||||||
{"172.22.10.68","Этаж 5|Пом.532-2"},
|
|
||||||
{"172.22.10.69","Этаж 5|Пом.515-1"},
|
|
||||||
{"172.22.10.70","Этаж 5|Пом.535-1"},
|
|
||||||
{"172.22.10.71","Этаж 5|Эвак. Выход-2"},
|
|
||||||
{"172.22.10.72","Этаж 5|Пом.545-1"},
|
|
||||||
{"172.22.10.73","Этаж 5|Ресепшн-2"},
|
|
||||||
{"172.22.10.74","Этаж 5|Пом.521-2"},
|
|
||||||
{"172.22.10.75","Этаж 2|ВРУ"}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static async Task Main(string[] args)
|
static async Task Main(string[] args)
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Emgu.CV" Version="4.13.0.5924" />
|
|
||||||
<PackageReference Include="Emgu.CV.runtime.windows" Version="4.13.0.5924" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.11" />
|
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.9" />
|
|
||||||
<PackageReference Include="System.Drawing.Common" Version="10.0.9" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Update="haarcascade_frontalface_default.xml">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.SignalR;
|
|
||||||
|
|
||||||
namespace FaceRecognitionApp.Hubs;
|
|
||||||
|
|
||||||
public class FaceHub : Hub
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
namespace FaceRecognitionApp.Models;
|
|
||||||
|
|
||||||
public class Employee
|
|
||||||
{
|
|
||||||
public int Id { get; set; }
|
|
||||||
public string Name { get; set; } = string.Empty;
|
|
||||||
public string? Department { get; set; }
|
|
||||||
public byte[] FaceDescriptor { get; set; } = Array.Empty<byte>();
|
|
||||||
public byte[]? Photo { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DetectedFace
|
|
||||||
{
|
|
||||||
public byte[] ImageData { get; set; } = Array.Empty<byte>();
|
|
||||||
public bool IsRecognized { get; set; }
|
|
||||||
public Employee? MatchedEmployee { get; set; }
|
|
||||||
public double Confidence { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
using FaceRecognitionApp.Hubs;
|
|
||||||
using FaceRecognitionApp.Services;
|
|
||||||
using Microsoft.AspNetCore.SignalR;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
// Регистрация сервисов
|
|
||||||
builder.Services.AddSingleton<DatabaseService>();
|
|
||||||
builder.Services.AddSingleton<FaceRecognitionService>();
|
|
||||||
builder.Services.AddSignalR();
|
|
||||||
|
|
||||||
var app = builder.Build();
|
|
||||||
|
|
||||||
// 1. Включаем поиск файлов по умолчанию (index.html, default.html и т.д.)
|
|
||||||
app.UseDefaultFiles();
|
|
||||||
|
|
||||||
// 2. Включаем раздачу статических файлов (css, js, картинки)
|
|
||||||
app.UseStaticFiles();
|
|
||||||
|
|
||||||
// 3. Подключаем SignalR хаб
|
|
||||||
app.MapHub<FaceHub>("/faceHub");
|
|
||||||
|
|
||||||
// Инициализация камеры и распознавания
|
|
||||||
var db = app.Services.GetRequiredService<DatabaseService>();
|
|
||||||
var faceService = app.Services.GetRequiredService<FaceRecognitionService>();
|
|
||||||
|
|
||||||
// URL камеры (замените на свой или используйте тестовый видеофайл)
|
|
||||||
var cameraUrl = Environment.GetEnvironmentVariable("CAMERA_URL") ?? "rtsp://admin:4NUDZhJ7@172.22.10.101:554/cam/realmonitor?channel=1&subtype=1";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Connecting to camera: {cameraUrl}...");
|
|
||||||
var camera = new CameraService(cameraUrl, faceService, async (face) => {
|
|
||||||
var hub = app.Services.GetRequiredService<IHubContext<FaceHub>>();
|
|
||||||
await hub.Clients.All.SendAsync("NewFace", new
|
|
||||||
{
|
|
||||||
image = Convert.ToBase64String(face.ImageData),
|
|
||||||
isRecognized = face.IsRecognized,
|
|
||||||
name = face.MatchedEmployee?.Name ?? "Unknown"
|
|
||||||
});
|
|
||||||
});
|
|
||||||
camera.Start();
|
|
||||||
Console.WriteLine("✅ Camera service started.");
|
|
||||||
|
|
||||||
// Корректное завершение работы камеры при остановке приложения
|
|
||||||
app.Lifetime.ApplicationStopping.Register(() => {
|
|
||||||
Console.WriteLine("Shutting down camera...");
|
|
||||||
camera.Dispose();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"⚠️ Camera Error: {ex.Message}");
|
|
||||||
Console.WriteLine("Application will run without camera monitoring.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine("🚀 Application is ready. Open http://localhost:5290 in your browser.");
|
|
||||||
app.Run();
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "http://localhost:43065",
|
|
||||||
"sslPort": 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
|
||||||
"http": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"applicationUrl": "http://localhost:5290",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"IIS Express": {
|
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
using Emgu.CV;
|
|
||||||
using FaceRecognitionApp.Models;
|
|
||||||
|
|
||||||
namespace FaceRecognitionApp.Services;
|
|
||||||
|
|
||||||
public class CameraService : IDisposable
|
|
||||||
{
|
|
||||||
private VideoCapture? _capture;
|
|
||||||
private readonly FaceRecognitionService _recognition;
|
|
||||||
private readonly Action<DetectedFace> _onDetected;
|
|
||||||
private CancellationTokenSource? _cts;
|
|
||||||
private Task? _task;
|
|
||||||
private DateTime _lastTime = DateTime.MinValue;
|
|
||||||
private bool _isDisposed = false;
|
|
||||||
|
|
||||||
public CameraService(string url, FaceRecognitionService recognition, Action<DetectedFace> onDetected)
|
|
||||||
{
|
|
||||||
_recognition = recognition;
|
|
||||||
_onDetected = onDetected;
|
|
||||||
|
|
||||||
Console.WriteLine($"Initializing camera with URL: {url}");
|
|
||||||
_capture = new VideoCapture(url);
|
|
||||||
|
|
||||||
// Даем камере время на инициализацию потока
|
|
||||||
Thread.Sleep(1000);
|
|
||||||
|
|
||||||
if (!_capture.IsOpened)
|
|
||||||
throw new Exception("Camera failed to open. Check URL and network connection.");
|
|
||||||
|
|
||||||
Console.WriteLine("Camera hardware initialized.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Start()
|
|
||||||
{
|
|
||||||
if (_isDisposed) return;
|
|
||||||
|
|
||||||
_cts = new CancellationTokenSource();
|
|
||||||
_task = Task.Run(() => Loop(_cts.Token));
|
|
||||||
Console.WriteLine("Camera processing loop started.");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task Loop(CancellationToken token)
|
|
||||||
{
|
|
||||||
Console.WriteLine("🎥 Frame processing loop active...");
|
|
||||||
|
|
||||||
while (!token.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var frame = new Mat();
|
|
||||||
|
|
||||||
// Читаем кадр с таймаутом
|
|
||||||
if (_capture!.Read(frame))
|
|
||||||
{
|
|
||||||
if (!frame.IsEmpty && frame.Width > 0 && frame.Height > 0)
|
|
||||||
{
|
|
||||||
var face = _recognition.ProcessFrame(frame);
|
|
||||||
|
|
||||||
if (face != null)
|
|
||||||
{
|
|
||||||
// Лимит частоты отправок (не чаще раза в 2 секунды)
|
|
||||||
if ((DateTime.Now - _lastTime).TotalMilliseconds > 2000)
|
|
||||||
{
|
|
||||||
_lastTime = DateTime.Now;
|
|
||||||
_onDetected(face);
|
|
||||||
|
|
||||||
string status = face.IsRecognized
|
|
||||||
? $"✅ Recognized: {face.MatchedEmployee?.Name}"
|
|
||||||
: "❌ Unknown face";
|
|
||||||
|
|
||||||
Console.WriteLine($"{DateTime.Now:HH:mm:ss} - {status}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Если Read вернул false, возможно потеря связи
|
|
||||||
Console.WriteLine("⚠️ Failed to read frame, retrying...");
|
|
||||||
await Task.Delay(500, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Небольшая задержка, чтобы не грузить процессор на 100%
|
|
||||||
await Task.Delay(50, token);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// Это нормальная ситуация при остановке
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"⚠️ Error in camera loop: {ex.Message}");
|
|
||||||
await Task.Delay(1000, token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine("🛑 Camera loop finished.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (_cts == null) return;
|
|
||||||
|
|
||||||
Console.WriteLine("Stopping camera service...");
|
|
||||||
_cts.Cancel();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Ждем завершения задачи, но не бесконечно
|
|
||||||
if (_task != null)
|
|
||||||
{
|
|
||||||
_task.Wait(TimeSpan.FromSeconds(5));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (AggregateException ex)
|
|
||||||
{
|
|
||||||
// Игнорируем ошибки отмены задачи
|
|
||||||
foreach (var inner in ex.InnerExceptions)
|
|
||||||
{
|
|
||||||
if (!(inner is TaskCanceledException || inner is OperationCanceledException))
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Unexpected error during stop: {inner.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error stopping task: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_isDisposed) return;
|
|
||||||
|
|
||||||
Stop();
|
|
||||||
_capture?.Dispose();
|
|
||||||
_cts?.Dispose();
|
|
||||||
_isDisposed = true;
|
|
||||||
|
|
||||||
Console.WriteLine("Camera resources released.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
using Microsoft.Data.Sqlite;
|
|
||||||
using FaceRecognitionApp.Models;
|
|
||||||
|
|
||||||
namespace FaceRecognitionApp.Services;
|
|
||||||
|
|
||||||
public class DatabaseService
|
|
||||||
{
|
|
||||||
private readonly string _connectionString = "Data Source=faces.db";
|
|
||||||
|
|
||||||
public DatabaseService()
|
|
||||||
{
|
|
||||||
InitializeDatabase();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InitializeDatabase()
|
|
||||||
{
|
|
||||||
using var connection = new SqliteConnection(_connectionString);
|
|
||||||
connection.Open();
|
|
||||||
var cmd = connection.CreateCommand();
|
|
||||||
cmd.CommandText = @"
|
|
||||||
CREATE TABLE IF NOT EXISTS Employees (
|
|
||||||
Id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
Name TEXT NOT NULL,
|
|
||||||
Department TEXT,
|
|
||||||
FaceDescriptor BLOB,
|
|
||||||
Photo BLOB
|
|
||||||
)";
|
|
||||||
cmd.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddEmployee(string name, string? dept, byte[] descriptor, byte[] photo)
|
|
||||||
{
|
|
||||||
using var connection = new SqliteConnection(_connectionString);
|
|
||||||
connection.Open();
|
|
||||||
var cmd = connection.CreateCommand();
|
|
||||||
cmd.CommandText = "INSERT INTO Employees (Name, Department, FaceDescriptor, Photo) VALUES (@n, @d, @desc, @p)";
|
|
||||||
cmd.Parameters.AddWithValue("@n", name);
|
|
||||||
cmd.Parameters.AddWithValue("@d", (object?)dept ?? DBNull.Value);
|
|
||||||
cmd.Parameters.AddWithValue("@desc", descriptor);
|
|
||||||
cmd.Parameters.AddWithValue("@p", photo);
|
|
||||||
cmd.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Employee> GetAllEmployees()
|
|
||||||
{
|
|
||||||
var list = new List<Employee>();
|
|
||||||
using var connection = new SqliteConnection(_connectionString);
|
|
||||||
connection.Open();
|
|
||||||
var cmd = connection.CreateCommand();
|
|
||||||
cmd.CommandText = "SELECT * FROM Employees";
|
|
||||||
using var reader = cmd.ExecuteReader();
|
|
||||||
while (reader.Read())
|
|
||||||
{
|
|
||||||
list.Add(new Employee
|
|
||||||
{
|
|
||||||
Id = reader.GetInt32(0),
|
|
||||||
Name = reader.GetString(1),
|
|
||||||
Department = reader.IsDBNull(2) ? null : reader.GetString(2),
|
|
||||||
FaceDescriptor = (byte[])reader[3],
|
|
||||||
Photo = reader.IsDBNull(4) ? null : (byte[])reader[4]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,234 +0,0 @@
|
|||||||
using Emgu.CV;
|
|
||||||
using Emgu.CV.CvEnum;
|
|
||||||
using Emgu.CV.Face;
|
|
||||||
using Emgu.CV.Structure;
|
|
||||||
using Emgu.CV.Util;
|
|
||||||
using FaceRecognitionApp.Models;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace FaceRecognitionApp.Services;
|
|
||||||
|
|
||||||
public class FaceRecognitionService : IDisposable
|
|
||||||
{
|
|
||||||
private readonly LBPHFaceRecognizer _recognizer;
|
|
||||||
private readonly CascadeClassifier _cascade;
|
|
||||||
private readonly DatabaseService _db;
|
|
||||||
private List<Employee> _employees = new();
|
|
||||||
private bool _isTrained = false;
|
|
||||||
|
|
||||||
// Коэффициент уменьшения кадра для ускорения поиска
|
|
||||||
private const double ResizeScale = 0.5;
|
|
||||||
private const int OriginalMinSize = 30;
|
|
||||||
private readonly Size _scaledMinSize;
|
|
||||||
|
|
||||||
public FaceRecognitionService(DatabaseService db)
|
|
||||||
{
|
|
||||||
_db = db;
|
|
||||||
var cascadePath = Path.Combine(AppContext.BaseDirectory, "haarcascade_frontalface_default.xml");
|
|
||||||
if (!File.Exists(cascadePath))
|
|
||||||
throw new FileNotFoundException($"Cascade file missing at: {cascadePath}");
|
|
||||||
|
|
||||||
_cascade = new CascadeClassifier(cascadePath);
|
|
||||||
_recognizer = new LBPHFaceRecognizer(1, 8, 8, 8, 80.0);
|
|
||||||
|
|
||||||
// Вычисляем минимальный размер лица для уменьшенного кадра
|
|
||||||
int scaledMin = (int)(OriginalMinSize * ResizeScale);
|
|
||||||
_scaledMinSize = new Size(Math.Max(scaledMin, 10), Math.Max(scaledMin, 10));
|
|
||||||
|
|
||||||
TrainModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TrainModel()
|
|
||||||
{
|
|
||||||
_employees = _db.GetAllEmployees();
|
|
||||||
if (!_employees.Any()) return;
|
|
||||||
|
|
||||||
using var images = new VectorOfMat();
|
|
||||||
using var labels = new VectorOfInt();
|
|
||||||
|
|
||||||
foreach (var emp in _employees)
|
|
||||||
{
|
|
||||||
if (emp.Photo == null || emp.Photo.Length == 0) continue;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var ms = new MemoryStream(emp.Photo);
|
|
||||||
using var bmp = new Bitmap(ms);
|
|
||||||
using var mat = BitmapToMat(bmp);
|
|
||||||
using var gray = new Mat();
|
|
||||||
|
|
||||||
CvInvoke.CvtColor(mat, gray, ColorConversion.Bgr2Gray);
|
|
||||||
|
|
||||||
// Ищем лицо на фото сотрудника для обрезки
|
|
||||||
var rects = _cascade.DetectMultiScale(gray, 1.1, 5, new Size(30, 30));
|
|
||||||
|
|
||||||
if (rects.Length > 0)
|
|
||||||
{
|
|
||||||
using var faceMat = new Mat(gray, rects[0]);
|
|
||||||
using var resized = new Mat();
|
|
||||||
CvInvoke.Resize(faceMat, resized, new Size(100, 100));
|
|
||||||
|
|
||||||
images.Push(resized);
|
|
||||||
labels.Push(new int[] { emp.Id });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Training error for {emp.Name}: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (images.Size > 0)
|
|
||||||
{
|
|
||||||
_recognizer.Train(images, labels);
|
|
||||||
_isTrained = true;
|
|
||||||
Console.WriteLine($"✅ Trained on {images.Size} faces.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine("⚠️ No valid faces found for training.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DetectedFace? ProcessFrame(Mat frame)
|
|
||||||
{
|
|
||||||
if (frame == null || frame.IsEmpty) return null;
|
|
||||||
|
|
||||||
// === УСКОРЕНИЕ: Уменьшаем кадр для поиска лиц ===
|
|
||||||
using var smallFrame = new Mat();
|
|
||||||
CvInvoke.Resize(frame, smallFrame, new Size(), ResizeScale, ResizeScale, Inter.Linear);
|
|
||||||
|
|
||||||
using var gray = new Mat();
|
|
||||||
CvInvoke.CvtColor(smallFrame, gray, ColorConversion.Bgr2Gray);
|
|
||||||
|
|
||||||
// Ищем лица на уменьшенном кадре
|
|
||||||
var rects = _cascade.DetectMultiScale(gray, 1.1, 5, _scaledMinSize);
|
|
||||||
|
|
||||||
if (rects.Length == 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var smallRect = rects[0];
|
|
||||||
|
|
||||||
// === ВОССТАНОВЛЕНИЕ координат к оригинальному размеру ===
|
|
||||||
int invScale = (int)(1.0 / ResizeScale);
|
|
||||||
var originalRect = new Rectangle(
|
|
||||||
smallRect.X * invScale,
|
|
||||||
smallRect.Y * invScale,
|
|
||||||
smallRect.Width * invScale,
|
|
||||||
smallRect.Height * invScale
|
|
||||||
);
|
|
||||||
|
|
||||||
// Проверка границ по оригинальному кадру
|
|
||||||
if (originalRect.X < 0 || originalRect.Y < 0 ||
|
|
||||||
originalRect.Right > frame.Width || originalRect.Bottom > frame.Height)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// Вырезаем лицо из ОРИГИНАЛЬНОГО кадра (лучшее качество для распознавания)
|
|
||||||
using var faceMat = new Mat(frame, originalRect);
|
|
||||||
using var faceGray = new Mat();
|
|
||||||
CvInvoke.CvtColor(faceMat, faceGray, ColorConversion.Bgr2Gray);
|
|
||||||
|
|
||||||
using var resized = new Mat();
|
|
||||||
CvInvoke.Resize(faceGray, resized, new Size(100, 100));
|
|
||||||
|
|
||||||
var result = new DetectedFace();
|
|
||||||
|
|
||||||
if (_isTrained)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var prediction = _recognizer.Predict(resized);
|
|
||||||
|
|
||||||
int label = prediction.Label;
|
|
||||||
double confidence = prediction.Distance;
|
|
||||||
|
|
||||||
if (label != -1 && confidence < 80)
|
|
||||||
{
|
|
||||||
result.IsRecognized = true;
|
|
||||||
result.MatchedEmployee = _employees.FirstOrDefault(e => e.Id == label);
|
|
||||||
result.Confidence = confidence;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Prediction error: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Конвертация в JPEG для веб-интерфейса
|
|
||||||
using var ms = new MemoryStream();
|
|
||||||
using var bmp = MatToBitmap(resized);
|
|
||||||
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
|
|
||||||
result.ImageData = ms.ToArray();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Безопасная конвертация Bitmap → Mat через промежуточный буфер
|
|
||||||
/// </summary>
|
|
||||||
private static Mat BitmapToMat(Bitmap bitmap)
|
|
||||||
{
|
|
||||||
var mat = new Mat(bitmap.Height, bitmap.Width, DepthType.Cv8U, 3);
|
|
||||||
|
|
||||||
var data = bitmap.LockBits(
|
|
||||||
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
|
||||||
System.Drawing.Imaging.ImageLockMode.ReadOnly,
|
|
||||||
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int length = Math.Abs(data.Stride) * bitmap.Height;
|
|
||||||
byte[] buffer = new byte[length];
|
|
||||||
Marshal.Copy(data.Scan0, buffer, 0, length);
|
|
||||||
Marshal.Copy(buffer, 0, mat.DataPointer, length);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bitmap.UnlockBits(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Безопасная конвертация Mat → Bitmap через промежуточный буфер
|
|
||||||
/// </summary>
|
|
||||||
private static Bitmap MatToBitmap(Mat mat)
|
|
||||||
{
|
|
||||||
var colorMat = new Mat();
|
|
||||||
if (mat.NumberOfChannels == 1)
|
|
||||||
CvInvoke.CvtColor(mat, colorMat, ColorConversion.Gray2Bgr);
|
|
||||||
else
|
|
||||||
mat.CopyTo(colorMat);
|
|
||||||
|
|
||||||
var bmp = new Bitmap(colorMat.Width, colorMat.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
||||||
|
|
||||||
var data = bmp.LockBits(
|
|
||||||
new Rectangle(0, 0, bmp.Width, bmp.Height),
|
|
||||||
System.Drawing.Imaging.ImageLockMode.WriteOnly,
|
|
||||||
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int length = Math.Abs(data.Stride) * colorMat.Height;
|
|
||||||
byte[] buffer = new byte[length];
|
|
||||||
Marshal.Copy(colorMat.DataPointer, buffer, 0, length);
|
|
||||||
Marshal.Copy(buffer, 0, data.Scan0, length);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bmp.UnlockBits(data);
|
|
||||||
colorMat.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
return bmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_cascade?.Dispose();
|
|
||||||
_recognizer?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AllowedHosts": "*",
|
|
||||||
"Camera": {
|
|
||||||
"Url": "rtsp://admin:4NUDZhJ7@172.22.10.101:554/cam/realmonitor?channel=1&subtype=0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,73 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Face Recognition</title>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: sans-serif;
|
|
||||||
background: #222;
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#gallery {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 10px;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
background: #333;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 8px;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 100%;
|
|
||||||
border: 3px solid red;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.known img {
|
|
||||||
border-color: green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.name {
|
|
||||||
margin-top: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time {
|
|
||||||
font-size: 0.8em;
|
|
||||||
color: #aaa;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Live Face Detection</h1>
|
|
||||||
<div id="gallery"></div>
|
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script>
|
|
||||||
<script>
|
|
||||||
const connection = new signalR.HubConnectionBuilder().withUrl("/faceHub").build();
|
|
||||||
|
|
||||||
connection.on("NewFace", (data) => {
|
|
||||||
const div = document.createElement('div');
|
|
||||||
div.className = data.isRecognized ? 'card known' : 'card';
|
|
||||||
div.innerHTML = `
|
|
||||||
<img src="data:image/jpeg;base64,${data.image}" />
|
|
||||||
<div class="name">${data.isRecognized ? data.name : 'Unknown'}</div>
|
|
||||||
<div class="time">${new Date().toLocaleTimeString()}</div>
|
|
||||||
`;
|
|
||||||
const gallery = document.getElementById('gallery');
|
|
||||||
gallery.insertBefore(div, gallery.firstChild);
|
|
||||||
if (gallery.children.length > 20) gallery.lastChild.remove();
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.start().catch(console.error);
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="10.0.10" />
|
<PackageReference Include="System.Text.Encoding.CodePages" Version="10.0.8" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.10" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.5" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.3" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.6" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.OpenApi" Version="3.8.0" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
|
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
|
||||||
<PackageReference Include="Telegram.Bot" Version="19.0.0" />
|
<PackageReference Include="Telegram.Bot" Version="19.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ApplicationIcon>LCS_logo.ico</ApplicationIcon>
|
<ApplicationIcon>LCS_logo.ico</ApplicationIcon>
|
||||||
@@ -13,10 +13,10 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.10" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.6" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.3" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
|
||||||
<PackageReference Include="Selenium.WebDriver" Version="4.46.0" />
|
<PackageReference Include="Selenium.WebDriver" Version="4.21.0" />
|
||||||
<PackageReference Include="Telegram.Bot" Version="22.10.1.1" />
|
<PackageReference Include="Telegram.Bot" Version="19.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.10" newVersion="10.0.0.10" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.10" newVersion="10.0.0.10" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
@@ -27,20 +27,16 @@
|
|||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.10" newVersion="10.0.0.10" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.10" newVersion="10.0.0.10" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
|
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.10" newVersion="10.0.0.10" />
|
|
||||||
</dependentAssembly>
|
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="..\packages\Selenium.WebDriver.4.46.0\build\Selenium.WebDriver.props" Condition="Exists('..\packages\Selenium.WebDriver.4.46.0\build\Selenium.WebDriver.props')" />
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@@ -68,26 +67,20 @@
|
|||||||
<SignManifests>true</SignManifests>
|
<SignManifests>true</SignManifests>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.10\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.5\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Selenium.WebDriver, Version=4.0.0.0, Culture=neutral, PublicKeyToken=1c2bd1631853048f, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Selenium.WebDriver.4.46.0\lib\net462\Selenium.WebDriver.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
|
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Collections.Immutable, Version=10.0.0.10, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\System.Collections.Immutable.10.0.10\lib\net462\System.Collections.Immutable.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.IO.Compression" />
|
<Reference Include="System.IO.Compression" />
|
||||||
<Reference Include="System.IO.Pipelines, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.IO.Pipelines, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.IO.Pipelines.10.0.10\lib\net462\System.IO.Pipelines.dll</HintPath>
|
<HintPath>..\packages\System.IO.Pipelines.10.0.5\lib\net462\System.IO.Pipelines.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
|
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
|
||||||
@@ -99,14 +92,14 @@
|
|||||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Text.Encodings.Web.10.0.10\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
<HintPath>..\packages\System.Text.Encodings.Web.10.0.5\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Text.Json, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Text.Json, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Text.Json.10.0.10\lib\net462\System.Text.Json.dll</HintPath>
|
<HintPath>..\packages\System.Text.Json.10.0.5\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Threading.Channels, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Threading.Channels, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Threading.Channels.10.0.10\lib\net462\System.Threading.Channels.dll</HintPath>
|
<HintPath>..\packages\System.Threading.Channels.10.0.5\lib\net462\System.Threading.Channels.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
@@ -121,6 +114,9 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="WebDriver, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Selenium.WebDriver.4.41.0\lib\net462\WebDriver.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Form1.cs">
|
<Compile Include="Form1.cs">
|
||||||
@@ -176,12 +172,13 @@
|
|||||||
</BootstrapperPackage>
|
</BootstrapperPackage>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="..\packages\Selenium.WebDriver.4.41.0\build\Selenium.WebDriver.targets" Condition="Exists('..\packages\Selenium.WebDriver.4.41.0\build\Selenium.WebDriver.targets')" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
|
<ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\packages\Selenium.WebDriver.4.41.0\build\Selenium.WebDriver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Selenium.WebDriver.4.41.0\build\Selenium.WebDriver.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets'))" />
|
<Error Condition="!Exists('..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\Selenium.WebDriver.4.46.0\build\Selenium.WebDriver.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Selenium.WebDriver.4.46.0\build\Selenium.WebDriver.props'))" />
|
|
||||||
</Target>
|
</Target>
|
||||||
<Import Project="..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets" Condition="Exists('..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets')" />
|
<Import Project="..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets" Condition="Exists('..\packages\System.ValueTuple.4.6.2\build\net471\System.ValueTuple.targets')" />
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.10" targetFramework="net48" />
|
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net48" />
|
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net48" />
|
||||||
<package id="Selenium.WebDriver" version="4.46.0" targetFramework="net48" />
|
<package id="Selenium.WebDriver" version="4.41.0" targetFramework="net48" />
|
||||||
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
|
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
|
||||||
<package id="System.Collections.Immutable" version="10.0.10" targetFramework="net48" />
|
<package id="System.IO.Pipelines" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.IO.Pipelines" version="10.0.10" targetFramework="net48" />
|
|
||||||
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
|
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
|
||||||
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
|
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
|
||||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
|
||||||
<package id="System.Text.Encodings.Web" version="10.0.10" targetFramework="net48" />
|
<package id="System.Text.Encodings.Web" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Text.Json" version="10.0.10" targetFramework="net48" />
|
<package id="System.Text.Json" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Threading.Channels" version="10.0.10" targetFramework="net48" />
|
<package id="System.Threading.Channels" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" />
|
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" />
|
||||||
<package id="System.ValueTuple" version="4.6.2" targetFramework="net48" />
|
<package id="System.ValueTuple" version="4.6.2" targetFramework="net48" />
|
||||||
</packages>
|
</packages>
|
||||||
+10
-10
@@ -63,22 +63,22 @@
|
|||||||
<SignManifests>true</SignManifests>
|
<SignManifests>true</SignManifests>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.10\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.5\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
|
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.IO.Pipelines, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.IO.Pipelines, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.IO.Pipelines.10.0.10\lib\net462\System.IO.Pipelines.dll</HintPath>
|
<HintPath>..\packages\System.IO.Pipelines.10.0.5\lib\net462\System.IO.Pipelines.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
|
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Net.Http.Json, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Net.Http.Json, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Net.Http.Json.10.0.10\lib\net462\System.Net.Http.Json.dll</HintPath>
|
<HintPath>..\packages\System.Net.Http.Json.10.0.5\lib\net462\System.Net.Http.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Numerics" />
|
<Reference Include="System.Numerics" />
|
||||||
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
@@ -87,11 +87,11 @@
|
|||||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Text.Encodings.Web.10.0.10\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
<HintPath>..\packages\System.Text.Encodings.Web.10.0.5\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Text.Json, Version=10.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Text.Json, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Text.Json.10.0.10\lib\net462\System.Text.Json.dll</HintPath>
|
<HintPath>..\packages\System.Text.Json.10.0.5\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.10" targetFramework="net48" />
|
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
|
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
|
||||||
<package id="System.IO.Pipelines" version="10.0.10" targetFramework="net48" />
|
<package id="System.IO.Pipelines" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
|
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
|
||||||
<package id="System.Net.Http.Json" version="10.0.10" targetFramework="net48" />
|
<package id="System.Net.Http.Json" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
|
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
|
||||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
|
||||||
<package id="System.Text.Encodings.Web" version="10.0.10" targetFramework="net48" />
|
<package id="System.Text.Encodings.Web" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Text.Json" version="10.0.10" targetFramework="net48" />
|
<package id="System.Text.Json" version="10.0.5" targetFramework="net48" />
|
||||||
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" />
|
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" />
|
||||||
<package id="System.ValueTuple" version="4.6.2" targetFramework="net48" />
|
<package id="System.ValueTuple" version="4.6.2" targetFramework="net48" />
|
||||||
</packages>
|
</packages>
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<base href="/" />
|
<base href="/" />
|
||||||
<link rel="stylesheet" href="~/bootstrap/css/bootstrap.css" />
|
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
|
||||||
<link rel="stylesheet" href="app.css" />
|
<link rel="stylesheet" href="app.css" />
|
||||||
<link rel="stylesheet" href="Ministreliy.styles.css" />
|
<link rel="stylesheet" href="Ministreliy.styles.css" />
|
||||||
<link rel="icon" type="image/png" href="favicon.png" />
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
@@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<Routes @rendermode="InteractiveServer" />
|
<Routes @rendermode="InteractiveServer" />
|
||||||
<script src="~/bootstrap/js/bootstrap.bundle.min.js"></script>
|
|
||||||
<script src="_framework/blazor.web.js"></script>
|
<script src="_framework/blazor.web.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
@page "/database"
|
@page "/database"
|
||||||
@using Ministreliy.Models
|
|
||||||
@using Newtonsoft.Json
|
|
||||||
@using System.Text
|
|
||||||
@inject IJSRuntime JS
|
|
||||||
@inject NavigationManager NavManager
|
|
||||||
|
|
||||||
<PageTitle>База данных</PageTitle>
|
<PageTitle>База данных</PageTitle>
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="row justify-content-between">
|
|
||||||
<div class="col-10">
|
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" aria-current="page" href="database">Сводные данные</a>
|
<a class="nav-link active" aria-current="page" href="database">Сводные данные</a>
|
||||||
@@ -17,56 +9,15 @@
|
|||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="database/type">Типы устройств</a>
|
<a class="nav-link" href="database/type">Типы устройств</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="database/device">Устройства</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
|
||||||
<div class="col-2">
|
|
||||||
@* <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addtype">
|
|
||||||
Добавить тип
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#deltype">
|
|
||||||
Удалить тип
|
|
||||||
</button> *@
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
@if (listDeviceTypes.Count == 0 || listDeviceItems.Count == 0)
|
|
||||||
{
|
|
||||||
<p>@messageStatus</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
public static List<DeviceType>? listDeviceTypes = new();
|
private int currentCount = 0;
|
||||||
public static List<DeviceItem>? listDeviceItems = new();
|
|
||||||
public static HttpClient httpClient = new();
|
|
||||||
|
|
||||||
string? messageStatus = "Получаю данные...";
|
private void IncrementCount()
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
{
|
||||||
httpClient.BaseAddress = new Uri("http://localhost:5262/api/");
|
currentCount++;
|
||||||
var devicetype = await httpClient.GetAsync("Device/GetTypes");
|
|
||||||
var deviceitem = await httpClient.GetAsync("Device/GetDevices");
|
|
||||||
listDeviceTypes = JsonConvert.DeserializeObject<List<DeviceType>>(await devicetype.Content.ReadAsStringAsync());
|
|
||||||
listDeviceItems = JsonConvert.DeserializeObject<List<DeviceItem>>(await deviceitem.Content.ReadAsStringAsync());
|
|
||||||
messageStatus = string.Empty;
|
|
||||||
if (listDeviceTypes.Count == 0)
|
|
||||||
{
|
|
||||||
messageStatus += $"нет типов устройств\r\n";
|
|
||||||
}
|
|
||||||
if (listDeviceItems.Count == 0)
|
|
||||||
{
|
|
||||||
messageStatus += $"нет устройств\r\n";
|
|
||||||
}
|
|
||||||
DataStore.ListDeviceTypesStore = listDeviceTypes;
|
|
||||||
DataStore.ListDeviceItemsStore = listDeviceItems;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
@page "/database/addtype"
|
||||||
|
@using Ministreliy.Models
|
||||||
|
|
||||||
|
<PageTitle>База данных</PageTitle>
|
||||||
|
|
||||||
|
@if (listDT == null)
|
||||||
|
{
|
||||||
|
<p><em>Получаю данные...</em></p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<ul class="nav nav-tabs">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" aria-current="page" href="database">Active</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="database/addtype">Добавить Тип</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
}
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private DeviceType dt;
|
||||||
|
private List<DeviceType> listDT;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
await Task.Delay(1000);
|
||||||
|
HttpClient http = new();
|
||||||
|
http.BaseAddress = new Uri("http://localhost:5262/api/");
|
||||||
|
var t = await http.GetAsync("Device/GetTypes");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
@page "/database/device"
|
|
||||||
@using Ministreliy.Models
|
|
||||||
@using System.Text.Json
|
|
||||||
@using Newtonsoft.Json
|
|
||||||
@using System.Text
|
|
||||||
@inject IJSRuntime JS
|
|
||||||
@inject NavigationManager NavManager
|
|
||||||
|
|
||||||
<PageTitle>База данных</PageTitle>
|
|
||||||
|
|
||||||
<ul class="nav nav-tabs">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" aria-current="page" href="database">Сводные данные</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="database/type">Типы устройств</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" href="database/device">Устройства</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div class="modal fade modal1" id="addtype" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="addtypeLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h1 class="modal-title fs-5" id="addtypeLabel">Заголовок</h1>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="typeID" class="form-label">id типа</label>
|
|
||||||
<input type="number" class="form-control" id="typeID" @bind="id_type" />
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="typeName" class="form-label">Имя типа</label>
|
|
||||||
<textarea class="form-control" id="typeName" rows="3" @bind="name_type"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-primary" @onclick="SaveType">Сохранить</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
@if (listDT.Count == 0 || listDT == null)
|
|
||||||
{
|
|
||||||
<p>@msg</p>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@* <ul class="nav nav-tabs">
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<a class="nav-link" aria-current="page" href="database">Сводные данные</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<a class="nav-link active"
|
|
||||||
id="addtype-tab"
|
|
||||||
data-bs-toggle="tab"
|
|
||||||
data-bs-target="#addtype"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="addtype"
|
|
||||||
aria-selected="true"
|
|
||||||
href="database/addtype">Добавить Тип</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul> *@
|
|
||||||
<br>
|
|
||||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addtype">
|
|
||||||
Добавить тип
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#deltype">
|
|
||||||
Удалить тип
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div class="card-body p-0">
|
|
||||||
<div class="tab-content" id="myTabContent">
|
|
||||||
<!-- Панель 1: Главная -->
|
|
||||||
<div class="tab-pane fade show active" id="addtype" role="tabpanel" aria-labelledby="addtype-tab">
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">#</th>
|
|
||||||
<th scope="col">Название</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var item in listDT)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<th scope="row">@item.Id</th>
|
|
||||||
<td>@item.Name</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="modal fade modal2" id="deltype" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="deltypeLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h1 class="modal-title fs-5" id="deltypeLabel">Заголовок</h1>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="mb-3">
|
|
||||||
<select class="form-select" @bind="selected_type" aria-label="Вибрать тип">
|
|
||||||
@foreach (var item in listDT)
|
|
||||||
{
|
|
||||||
<option value="@item.Id">@item.Name</option>
|
|
||||||
}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-primary" @onclick="DelType">Удалить</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@code {
|
|
||||||
//HttpClient http = new();
|
|
||||||
|
|
||||||
private DeviceType dt;
|
|
||||||
private List<DeviceType> listDT = new();
|
|
||||||
|
|
||||||
private string msg = "-= ПОЛУЧАЮ ДАННЫЕ =-", name_type = "";
|
|
||||||
private int id_type = 1, selected_type = 0;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
HttpClient http = new();
|
|
||||||
await Task.Delay(1000);
|
|
||||||
http.BaseAddress = new Uri("http://localhost:5262/api/");
|
|
||||||
var t = await http.GetAsync("Device/GetTypes");
|
|
||||||
if (t.StatusCode == System.Net.HttpStatusCode.NoContent)
|
|
||||||
{
|
|
||||||
msg = "-= ДАННЫХ НЕТ =-";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listDT = JsonConvert.DeserializeObject<List<DeviceType>>(await t.Content.ReadAsStringAsync());
|
|
||||||
//id_type = listDT.Count + 1;
|
|
||||||
var a = listDT.Select(listDT => listDT.Id).ToList();
|
|
||||||
id_type = Enumerable.Range(1, int.MaxValue).FirstOrDefault(i => !a.Contains(i));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private async Task SaveType()
|
|
||||||
{
|
|
||||||
HttpClient http = new();
|
|
||||||
dt = new();
|
|
||||||
dt.Id = id_type;
|
|
||||||
dt.Name = name_type;
|
|
||||||
http.BaseAddress = new Uri("http://localhost:5262/api/");
|
|
||||||
using StringContent content = new StringContent(
|
|
||||||
JsonConvert.SerializeObject(dt),
|
|
||||||
Encoding.UTF8,
|
|
||||||
"application/json"
|
|
||||||
);
|
|
||||||
var r = await http.PostAsync("Device/AddType", content);
|
|
||||||
if (r.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
await JS.InvokeVoidAsync("eval", $"var myModal = bootstrap.Modal.getInstance(document.querySelector('.modal1')); myModal.hide();");
|
|
||||||
await Task.Delay(150);
|
|
||||||
id_type = listDT.Count+1;
|
|
||||||
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private async Task DelType()
|
|
||||||
{
|
|
||||||
HttpClient http = new();
|
|
||||||
http.BaseAddress = new Uri("http://localhost:5262/api/");
|
|
||||||
var r = await http.DeleteAsync($"Device/DelType?id={selected_type}");
|
|
||||||
if (r.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
await JS.InvokeVoidAsync("eval", $"var myModal = bootstrap.Modal.getInstance(document.querySelector('.modal2')); myModal.hide();");
|
|
||||||
await Task.Delay(250);
|
|
||||||
id_type = listDT.Count + 1;
|
|
||||||
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,69 +3,19 @@
|
|||||||
@using System.Text.Json
|
@using System.Text.Json
|
||||||
@using Newtonsoft.Json
|
@using Newtonsoft.Json
|
||||||
@using System.Text
|
@using System.Text
|
||||||
|
|
||||||
@inject IJSRuntime JS
|
@inject IJSRuntime JS
|
||||||
@inject NavigationManager NavManager
|
@inject NavigationManager NavManager
|
||||||
|
|
||||||
<PageTitle>База данных</PageTitle>
|
<PageTitle>База данных</PageTitle>
|
||||||
<div class="row justify-content-between">
|
|
||||||
<div class="col-10">
|
|
||||||
<ul class="nav nav-tabs">
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" aria-current="page" href="database">Сводные данные</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link active" href="database/type">Типы устройств</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="database/device">Устройства</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col-2">
|
|
||||||
<button type="button" class="btn btn-primary" @onclick="OpenModal">
|
|
||||||
Добавить тип
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-primary" @onclick="DelModal">
|
|
||||||
Удалить тип
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@if (listDT.Count == 0)
|
|
||||||
{
|
|
||||||
<p>@msg</p>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<div class="card-body p-0">
|
|
||||||
<div class="tab-content" id="myTabContent">
|
|
||||||
<!-- Панель 1: Главная -->
|
|
||||||
<div class="tab-pane fade show active" id="addtype" role="tabpanel" aria-labelledby="addtype-tab">
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">#</th>
|
|
||||||
<th scope="col">Название</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var item in Database.listDeviceTypes)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<th scope="row">@item.Id</th>
|
|
||||||
<td>@item.Name</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<div class="modal fade modal1" id="addtype" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="addtypeLabel" aria-hidden="true">
|
||||||
}
|
|
||||||
<div class="modal fade modal1" id="addtype" tabindex="-1" aria-labelledby="addtypeLabel" aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="addtypeLabel">Заголовок</h1>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="typeID" class="form-label">id типа</label>
|
<label for="typeID" class="form-label">id типа</label>
|
||||||
@@ -83,7 +33,64 @@ else
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal fade modal2" id="deltype" tabindex="-1" aria-labelledby="deltypeLabel" aria-hidden="true">
|
|
||||||
|
|
||||||
|
@if (listDT.Count == 0 || listDT == null)
|
||||||
|
{
|
||||||
|
<p>@msg</p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<ul class="nav nav-tabs">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link" aria-current="page" href="database">Сводные данные</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link active"
|
||||||
|
id="addtype-tab"
|
||||||
|
data-bs-toggle="tab"
|
||||||
|
data-bs-target="#addtype"
|
||||||
|
role="tab"
|
||||||
|
aria-controls="addtype"
|
||||||
|
aria-selected="true"
|
||||||
|
href="database/addtype">Добавить Тип</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="card-body p-0">
|
||||||
|
<div class="tab-content" id="myTabContent">
|
||||||
|
<!-- Панель 1: Главная -->
|
||||||
|
<div class="tab-pane fade show active" id="addtype" role="tabpanel" aria-labelledby="addtype-tab">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">Название</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var item in listDT)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<th scope="row">@item.Id</th>
|
||||||
|
<td>@item.Name</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#deltype">
|
||||||
|
Удалить тип
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="modal fade modal2" id="deltype" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="deltypeLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
@@ -107,43 +114,36 @@ else
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
|
||||||
// Функции для работы с модальными окнами
|
|
||||||
window.openModal = function (modalId) {
|
|
||||||
const modalElement = document.getElementById(modalId);
|
|
||||||
if (modalElement) {
|
|
||||||
const modal = new bootstrap.Modal(modalElement);
|
|
||||||
modal.show();
|
|
||||||
} else {
|
|
||||||
console.error('Модальное окно с id "' + modalId + '" не найдено');
|
|
||||||
}
|
}
|
||||||
};
|
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addtype">
|
||||||
</script>
|
Добавить тип
|
||||||
|
</button>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
//HttpClient http = new();
|
//HttpClient http = new();
|
||||||
|
|
||||||
private DeviceType dt;
|
private DeviceType dt;
|
||||||
private List<DeviceType> listDT;
|
private List<DeviceType> listDT = new();
|
||||||
|
|
||||||
private string msg = "-= ПОЛУЧАЮ ДАННЫЕ =-", name_type = "";
|
private string msg = "-= ПОЛУЧАЮ ДАННЫЕ =-", name_type = "";
|
||||||
private int id_type = 1, selected_type = 0;
|
private int id_type = 1, selected_type = 0;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
listDT = Database.listDeviceTypes;
|
HttpClient http = new();
|
||||||
if (listDT.Count == 0)
|
await Task.Delay(1000);
|
||||||
|
http.BaseAddress = new Uri("http://localhost:5262/api/");
|
||||||
|
var t = await http.GetAsync("Device/GetTypes");
|
||||||
|
if (t.StatusCode == System.Net.HttpStatusCode.NoContent)
|
||||||
{
|
{
|
||||||
msg = "-= ДАННЫХ НЕТ =-";
|
msg = "-= ДАННЫХ НЕТ =-";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
listDT = JsonConvert.DeserializeObject<List<DeviceType>>(await t.Content.ReadAsStringAsync());
|
||||||
//id_type = listDT.Count + 1;
|
//id_type = listDT.Count + 1;
|
||||||
var a = listDT.Select(listDT => listDT.Id).ToList();
|
var a = listDT.Select(listDT => listDT.Id).ToList();
|
||||||
//id_type = Enumerable.Range(1, int.MaxValue).FirstOrDefault(i => !a.Contains(i));
|
id_type = Enumerable.Range(1, int.MaxValue).FirstOrDefault(i => !a.Contains(i));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private async Task SaveType()
|
private async Task SaveType()
|
||||||
@@ -180,9 +180,6 @@ else
|
|||||||
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
|
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OpenModal() => await JS.InvokeVoidAsync("openModal", "addtype");
|
|
||||||
private async Task DelModal() => await JS.InvokeVoidAsync("openModal", "deltype");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
@page "/weather"
|
||||||
|
|
||||||
|
<PageTitle>Weather</PageTitle>
|
||||||
|
|
||||||
|
<h1>Weather</h1>
|
||||||
|
|
||||||
|
<p>This component demonstrates showing data.</p>
|
||||||
|
|
||||||
|
@if (forecasts == null)
|
||||||
|
{
|
||||||
|
<p><em>Loading...</em></p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Temp. (C)</th>
|
||||||
|
<th>Temp. (F)</th>
|
||||||
|
<th>Summary</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var forecast in forecasts)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td>@forecast.Date.ToShortDateString()</td>
|
||||||
|
<td>@forecast.TemperatureC</td>
|
||||||
|
<td>@forecast.TemperatureF</td>
|
||||||
|
<td>@forecast.Summary</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private WeatherForecast[]? forecasts;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
// Simulate asynchronous loading to demonstrate a loading indicator
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
var startDate = DateOnly.FromDateTime(DateTime.Now);
|
||||||
|
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
|
||||||
|
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||||
|
{
|
||||||
|
Date = startDate.AddDays(index),
|
||||||
|
TemperatureC = Random.Shared.Next(-20, 55),
|
||||||
|
Summary = summaries[Random.Shared.Next(summaries.Length)]
|
||||||
|
}).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class WeatherForecast
|
||||||
|
{
|
||||||
|
public DateOnly Date { get; set; }
|
||||||
|
public int TemperatureC { get; set; }
|
||||||
|
public string? Summary { get; set; }
|
||||||
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,8 +7,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Blazorise.Bootstrap5" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
namespace Ministreliy.Models
|
|
||||||
{
|
|
||||||
public class DataStore
|
|
||||||
{
|
|
||||||
public static List<DeviceType>? ListDeviceTypesStore;
|
|
||||||
public static List<DeviceItem>? ListDeviceItemsStore;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
namespace Ministreliy.Models
|
|
||||||
{
|
|
||||||
public class DeviceItem
|
|
||||||
{
|
|
||||||
public int Id { get; set; }
|
|
||||||
public string Ip { get; set; }
|
|
||||||
public string Mac { get; set; }
|
|
||||||
public string? Description { get; set; }
|
|
||||||
public string? Name { get; set; }
|
|
||||||
public string? Location { get; set; }
|
|
||||||
public List<DeviceItem> Devises { get; set; }
|
|
||||||
public DeviceType DeviceType { get; set; }
|
|
||||||
public int ConnectedToSwitchId { get; set; }
|
|
||||||
public int ConnectedToPortOnSwitch { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Unknown = 0,
|
|
||||||
//SwitchCore = 1,
|
|
||||||
//SwitchAccess = 2,
|
|
||||||
//Camera = 3,
|
|
||||||
//Server = 4,
|
|
||||||
//WorkStation = 5,
|
|
||||||
//PDU_AVR = 6,
|
|
||||||
}
|
|
||||||
@@ -12,18 +12,11 @@ internal class Program
|
|||||||
args[2] = "admin";
|
args[2] = "admin";
|
||||||
args[3] = "4NUDZhJ7";
|
args[3] = "4NUDZhJ7";
|
||||||
#endif
|
#endif
|
||||||
string? server = null, login, password;
|
string server, login, password;
|
||||||
if (args.Length != 4)
|
if (args.Length != 4) return;
|
||||||
{
|
|
||||||
login = args[1];
|
|
||||||
password = args[2];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
server = args[1];
|
server = args[1];
|
||||||
login = args[2];
|
login = args[2];
|
||||||
password = args[3];
|
password = args[3];
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
switch (args[0])
|
switch (args[0])
|
||||||
@@ -142,8 +135,8 @@ internal class Program
|
|||||||
$"SNMP.WriteCommon=private";
|
$"SNMP.WriteCommon=private";
|
||||||
var response2 = await httpClient.GetAsync(requestUrl2);
|
var response2 = await httpClient.GetAsync(requestUrl2);
|
||||||
var r2 = await response2.Content.ReadAsStringAsync();
|
var r2 = await response2.Content.ReadAsStringAsync();
|
||||||
if (r2.StartsWith("OK")) Console.WriteLine($"{host} - OK");
|
if (r2.StartsWith("OK")) Console.WriteLine("0");
|
||||||
else Console.WriteLine($"{host} - !!!BAD!!!");
|
else Console.WriteLine("1");
|
||||||
}
|
}
|
||||||
else Console.WriteLine("1");
|
else Console.WriteLine("1");
|
||||||
}
|
}
|
||||||
|
|||||||
+255
-60
@@ -1,60 +1,255 @@
|
|||||||
172.22.10.93
|
172.16.54.1
|
||||||
172.22.10.94
|
172.16.54.2
|
||||||
172.22.10.95
|
172.16.54.3
|
||||||
172.22.10.96
|
172.16.54.4
|
||||||
172.22.10.97
|
172.16.54.5
|
||||||
172.22.10.98
|
172.16.54.6
|
||||||
172.22.10.99
|
172.16.54.7
|
||||||
172.22.10.100
|
172.16.54.8
|
||||||
172.22.10.101
|
172.16.54.9
|
||||||
172.22.10.102
|
172.16.54.10
|
||||||
172.22.10.103
|
172.16.54.11
|
||||||
172.22.10.104
|
172.16.54.12
|
||||||
172.22.10.105
|
172.16.54.13
|
||||||
172.22.10.106
|
172.16.54.14
|
||||||
172.22.10.107
|
172.16.54.15
|
||||||
172.22.10.108
|
172.16.54.16
|
||||||
172.22.10.109
|
172.16.54.17
|
||||||
172.22.10.110
|
172.16.54.18
|
||||||
172.22.10.111
|
172.16.54.19
|
||||||
172.22.10.112
|
172.16.54.20
|
||||||
172.22.10.113
|
172.16.54.21
|
||||||
172.22.10.114
|
172.16.54.22
|
||||||
172.22.10.115
|
172.16.54.23
|
||||||
172.22.10.116
|
172.16.54.24
|
||||||
172.22.10.117
|
172.16.54.25
|
||||||
172.22.10.118
|
172.16.54.26
|
||||||
172.22.10.119
|
172.16.54.27
|
||||||
172.22.10.120
|
172.16.54.28
|
||||||
172.22.10.121
|
172.16.54.29
|
||||||
172.22.10.122
|
172.16.54.30
|
||||||
172.22.10.123
|
172.16.54.31
|
||||||
172.22.10.124
|
172.16.54.32
|
||||||
172.22.10.125
|
172.16.54.33
|
||||||
172.22.10.126
|
172.16.54.34
|
||||||
172.22.10.127
|
172.16.54.35
|
||||||
172.22.10.128
|
172.16.54.36
|
||||||
172.22.10.129
|
172.16.54.37
|
||||||
172.22.10.130
|
172.16.54.38
|
||||||
172.22.10.131
|
172.16.54.39
|
||||||
172.22.10.132
|
172.16.54.40
|
||||||
172.22.10.133
|
172.16.54.41
|
||||||
172.22.10.134
|
172.16.54.42
|
||||||
172.22.10.135
|
172.16.54.43
|
||||||
172.22.10.136
|
172.16.54.44
|
||||||
172.22.10.137
|
172.16.54.45
|
||||||
172.22.10.138
|
172.16.54.46
|
||||||
172.22.10.139
|
172.16.54.47
|
||||||
172.22.10.140
|
172.16.54.48
|
||||||
172.22.10.141
|
172.16.54.49
|
||||||
172.22.10.142
|
172.16.54.50
|
||||||
172.22.10.143
|
172.16.54.51
|
||||||
172.22.10.144
|
172.16.53.52
|
||||||
172.22.10.145
|
172.16.53.53
|
||||||
172.22.10.146
|
172.16.53.54
|
||||||
172.22.10.147
|
172.16.53.55
|
||||||
172.22.10.148
|
172.16.53.56
|
||||||
172.22.10.149
|
172.16.53.57
|
||||||
172.22.10.150
|
172.16.53.58
|
||||||
172.22.10.151
|
172.16.53.59
|
||||||
172.22.10.152
|
172.16.53.60
|
||||||
|
172.16.53.61
|
||||||
|
172.16.53.62
|
||||||
|
172.16.53.63
|
||||||
|
172.16.53.64
|
||||||
|
172.16.53.65
|
||||||
|
172.16.53.66
|
||||||
|
172.16.53.67
|
||||||
|
172.16.53.68
|
||||||
|
172.16.53.69
|
||||||
|
172.16.53.70
|
||||||
|
172.16.53.71
|
||||||
|
172.16.53.72
|
||||||
|
172.16.53.73
|
||||||
|
172.16.53.74
|
||||||
|
172.16.53.75
|
||||||
|
172.16.53.76
|
||||||
|
172.16.53.77
|
||||||
|
172.16.53.78
|
||||||
|
172.16.53.79
|
||||||
|
172.16.53.80
|
||||||
|
172.16.53.81
|
||||||
|
172.16.53.82
|
||||||
|
172.16.53.83
|
||||||
|
172.16.53.84
|
||||||
|
172.16.53.85
|
||||||
|
172.16.53.86
|
||||||
|
172.16.53.87
|
||||||
|
172.16.53.88
|
||||||
|
172.16.53.89
|
||||||
|
172.16.53.90
|
||||||
|
172.16.53.91
|
||||||
|
172.16.53.92
|
||||||
|
172.16.53.93
|
||||||
|
172.16.53.94
|
||||||
|
172.16.53.95
|
||||||
|
172.16.53.96
|
||||||
|
172.16.53.97
|
||||||
|
172.16.53.98
|
||||||
|
172.16.53.99
|
||||||
|
172.16.53.100
|
||||||
|
172.16.53.101
|
||||||
|
172.16.53.102
|
||||||
|
172.16.53.103
|
||||||
|
172.16.53.104
|
||||||
|
172.16.53.105
|
||||||
|
172.16.53.106
|
||||||
|
172.16.53.107
|
||||||
|
172.16.53.108
|
||||||
|
172.16.53.109
|
||||||
|
172.16.53.110
|
||||||
|
172.16.53.111
|
||||||
|
172.16.53.112
|
||||||
|
172.16.53.113
|
||||||
|
172.16.53.114
|
||||||
|
172.16.53.115
|
||||||
|
172.16.53.116
|
||||||
|
172.16.53.117
|
||||||
|
172.16.53.118
|
||||||
|
172.16.53.119
|
||||||
|
172.16.53.120
|
||||||
|
172.16.53.121
|
||||||
|
172.16.53.122
|
||||||
|
172.16.53.123
|
||||||
|
172.16.53.124
|
||||||
|
172.16.53.125
|
||||||
|
172.16.53.126
|
||||||
|
172.16.53.127
|
||||||
|
172.16.53.128
|
||||||
|
172.16.53.129
|
||||||
|
172.16.53.130
|
||||||
|
172.16.53.131
|
||||||
|
172.16.53.132
|
||||||
|
172.16.53.133
|
||||||
|
172.16.53.134
|
||||||
|
172.16.53.135
|
||||||
|
172.16.53.136
|
||||||
|
172.16.53.137
|
||||||
|
172.16.53.138
|
||||||
|
172.16.53.139
|
||||||
|
172.16.53.140
|
||||||
|
172.16.53.141
|
||||||
|
172.16.53.142
|
||||||
|
172.16.53.143
|
||||||
|
172.16.53.144
|
||||||
|
172.16.53.145
|
||||||
|
172.16.53.146
|
||||||
|
172.16.53.147
|
||||||
|
172.16.53.148
|
||||||
|
172.16.53.149
|
||||||
|
172.16.53.150
|
||||||
|
172.16.53.151
|
||||||
|
172.16.53.152
|
||||||
|
172.16.53.153
|
||||||
|
172.16.53.154
|
||||||
|
172.16.53.155
|
||||||
|
172.16.53.156
|
||||||
|
172.16.53.157
|
||||||
|
172.16.53.158
|
||||||
|
172.16.53.159
|
||||||
|
172.16.53.160
|
||||||
|
172.16.53.161
|
||||||
|
172.16.53.162
|
||||||
|
172.16.53.163
|
||||||
|
172.16.53.164
|
||||||
|
172.16.53.165
|
||||||
|
172.16.53.166
|
||||||
|
172.16.53.167
|
||||||
|
172.16.53.168
|
||||||
|
172.16.53.169
|
||||||
|
172.16.53.170
|
||||||
|
172.16.53.171
|
||||||
|
172.16.53.172
|
||||||
|
172.16.53.173
|
||||||
|
172.16.53.174
|
||||||
|
172.16.53.175
|
||||||
|
172.16.53.176
|
||||||
|
172.16.53.177
|
||||||
|
172.16.53.178
|
||||||
|
172.16.53.179
|
||||||
|
172.16.53.180
|
||||||
|
172.16.53.181
|
||||||
|
172.16.53.182
|
||||||
|
172.16.53.183
|
||||||
|
172.16.53.184
|
||||||
|
172.16.53.185
|
||||||
|
172.16.53.186
|
||||||
|
172.16.53.187
|
||||||
|
172.16.53.188
|
||||||
|
172.16.53.189
|
||||||
|
172.16.53.190
|
||||||
|
172.16.53.191
|
||||||
|
172.16.53.192
|
||||||
|
172.16.53.193
|
||||||
|
172.16.53.194
|
||||||
|
172.16.53.195
|
||||||
|
172.16.53.196
|
||||||
|
172.16.53.197
|
||||||
|
172.16.53.198
|
||||||
|
172.16.53.199
|
||||||
|
172.16.53.200
|
||||||
|
172.16.53.201
|
||||||
|
172.16.53.202
|
||||||
|
172.16.53.203
|
||||||
|
172.16.53.204
|
||||||
|
172.16.53.205
|
||||||
|
172.16.53.206
|
||||||
|
172.16.53.207
|
||||||
|
172.16.53.208
|
||||||
|
172.16.53.209
|
||||||
|
172.16.53.210
|
||||||
|
172.16.53.211
|
||||||
|
172.16.53.212
|
||||||
|
172.16.53.213
|
||||||
|
172.16.53.214
|
||||||
|
172.16.53.215
|
||||||
|
172.16.53.216
|
||||||
|
172.16.53.217
|
||||||
|
172.16.53.218
|
||||||
|
172.16.53.219
|
||||||
|
172.16.53.220
|
||||||
|
172.16.53.221
|
||||||
|
172.16.53.222
|
||||||
|
172.16.53.223
|
||||||
|
172.16.53.224
|
||||||
|
172.16.53.225
|
||||||
|
172.16.53.226
|
||||||
|
172.16.53.227
|
||||||
|
172.16.53.228
|
||||||
|
172.16.53.229
|
||||||
|
172.16.53.230
|
||||||
|
172.16.53.231
|
||||||
|
172.16.53.232
|
||||||
|
172.16.53.233
|
||||||
|
172.16.53.234
|
||||||
|
172.16.53.235
|
||||||
|
172.16.53.236
|
||||||
|
172.16.53.237
|
||||||
|
172.16.53.238
|
||||||
|
172.16.53.239
|
||||||
|
172.16.53.240
|
||||||
|
172.16.53.241
|
||||||
|
172.16.53.242
|
||||||
|
172.16.53.243
|
||||||
|
172.16.53.244
|
||||||
|
172.16.53.245
|
||||||
|
172.16.53.246
|
||||||
|
172.16.53.247
|
||||||
|
172.16.53.248
|
||||||
|
172.16.53.249
|
||||||
|
172.16.53.250
|
||||||
|
172.16.53.251
|
||||||
|
172.16.53.252
|
||||||
|
172.16.53.253
|
||||||
|
172.16.53.254
|
||||||
|
172.16.53.255
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Strela.Models;
|
using Strela.Models;
|
||||||
using Strela.Services;
|
using Strela.Services;
|
||||||
@@ -8,21 +9,31 @@ namespace Strela.Controllers;
|
|||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class DeviceController : ControllerBase
|
public class DeviceController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly ILogger<DeviceController> _logger;
|
private readonly ILogger<UserController> _logger;
|
||||||
|
|
||||||
public DeviceController(ILogger<DeviceController> logger)
|
public DeviceController(ILogger<UserController> logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================== GET =================================//
|
//=========================== GET =================================//
|
||||||
#region GET
|
[HttpGet("GetTypes")]
|
||||||
|
[ProducesResponseType<List<DeviceType>>(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||||
|
public IActionResult GetList()
|
||||||
|
{
|
||||||
|
using (var db = new SQLiteService())
|
||||||
|
{
|
||||||
|
var tps = db.DeviceTypes.ToList();
|
||||||
|
if (tps.Count != 0)
|
||||||
|
return Ok(tps);
|
||||||
|
else return NoContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("GetDevice")]
|
||||||
[HttpGet("GetDeviceById")]
|
|
||||||
[ProducesResponseType<DeviceItem>(StatusCodes.Status200OK)]
|
[ProducesResponseType<DeviceItem>(StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||||
public IActionResult GetById(Guid id) // Получить устройство по id
|
public IActionResult GetById(int id)
|
||||||
{
|
{
|
||||||
using (var db = new SQLiteService())
|
using (var db = new SQLiteService())
|
||||||
{
|
{
|
||||||
@@ -33,25 +44,9 @@ public class DeviceController : ControllerBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("GetDevices")]
|
|
||||||
[ProducesResponseType<DeviceItem>(StatusCodes.Status200OK)]
|
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
||||||
public IActionResult GetAll() // Получить все устройства
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var d = db.Devices.ToList();
|
|
||||||
//if (d.Count != 0)
|
|
||||||
return Ok(d);
|
|
||||||
//else return NoContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
//========================= POST ====================================//
|
//========================= POST ====================================//
|
||||||
#region POST
|
|
||||||
[HttpPost("AddDevice")]
|
[HttpPost("AddDevice")]
|
||||||
public IActionResult AddDevice(DeviceItem d) // Добавить одно устройство
|
public IActionResult AddDevice(DeviceItem d)
|
||||||
{
|
{
|
||||||
using (var db = new SQLiteService())
|
using (var db = new SQLiteService())
|
||||||
{
|
{
|
||||||
@@ -61,22 +56,14 @@ public class DeviceController : ControllerBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost("AddType")]
|
||||||
#endregion
|
public IActionResult AddType(DeviceType d)
|
||||||
|
|
||||||
//========================= DELETE ====================================//
|
|
||||||
#region DELETE
|
|
||||||
|
|
||||||
[HttpDelete("DelDevice")]
|
|
||||||
public IActionResult DelDevice(Guid id) //Удалить устройство по id
|
|
||||||
{
|
{
|
||||||
using (var db = new SQLiteService())
|
using (var db = new SQLiteService())
|
||||||
{
|
{
|
||||||
var deldev = db.Devices.Where(u => u.Id == id).FirstOrDefault();
|
db.DeviceTypes.Add(d);//.Where(u => u.Name == name).FirstOrDefault();
|
||||||
db.Devices.Remove(deldev);
|
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
return Ok();
|
return Created();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Strela.Models;
|
|
||||||
using Strela.Services;
|
|
||||||
|
|
||||||
namespace Strela.Controllers;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/[controller]")]
|
|
||||||
public class ObjectController : ControllerBase
|
|
||||||
{
|
|
||||||
private readonly ILogger<ObjectController> _logger;
|
|
||||||
|
|
||||||
public ObjectController(ILogger<ObjectController> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================== GET =================================//
|
|
||||||
[HttpGet("GetObject")]
|
|
||||||
public IActionResult GetList()
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var oi = db.ObjectItems.ToList();
|
|
||||||
return Ok(oi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("GetObjectById")]
|
|
||||||
[ProducesResponseType<ObjectItem>(StatusCodes.Status200OK)]
|
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
||||||
public IActionResult GetById(Guid id)
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var o = db.ObjectItems.Where(o => o.Id == id).FirstOrDefault();
|
|
||||||
if (o != null)
|
|
||||||
return Ok(o);
|
|
||||||
else return NoContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("GetObjectByName")]
|
|
||||||
[ProducesResponseType<ObjectItem>(StatusCodes.Status200OK)]
|
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
||||||
public IActionResult GetByName(string name)
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var o = db.ObjectItems.Where(ob => ob.NameObject == name).FirstOrDefault();
|
|
||||||
if (o != null)
|
|
||||||
return Ok(o);
|
|
||||||
else return NoContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//========================= POST ====================================//
|
|
||||||
[HttpPost("AddObject")]
|
|
||||||
public IActionResult AddObject(ObjectItem o)
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
db.ObjectItems.Add(o);
|
|
||||||
db.SaveChanges();
|
|
||||||
return Created();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//========================= DELETE ====================================//
|
|
||||||
[HttpDelete("DelObject")]
|
|
||||||
public IActionResult DelObject(Guid id)
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var delobj = db.ObjectItems.Where(o => o.Id == id).FirstOrDefault();
|
|
||||||
db.ObjectItems.Remove(delobj);
|
|
||||||
db.SaveChanges();
|
|
||||||
return Ok();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Strela.Models;
|
|
||||||
using Strela.Services;
|
|
||||||
|
|
||||||
namespace Strela.Controllers;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/[controller]")]
|
|
||||||
public class TypeController : ControllerBase
|
|
||||||
{
|
|
||||||
private readonly ILogger<TypeController> _logger;
|
|
||||||
|
|
||||||
public TypeController(ILogger<TypeController> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================== GET =================================//
|
|
||||||
#region GET
|
|
||||||
[HttpGet("GetTypes")]
|
|
||||||
public IActionResult GetList()// Получить лист типов устройств
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var tps = db.DeviceTypes.ToList();
|
|
||||||
return Ok(tps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("GetTypeById")]
|
|
||||||
[ProducesResponseType<DeviceItem>(StatusCodes.Status200OK)]
|
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
||||||
public IActionResult GetById(Guid id) // Получить устройство по id
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var d = db.DeviceTypes.Where(d => d.Id == id).FirstOrDefault();
|
|
||||||
if (d != null)
|
|
||||||
return Ok(d);
|
|
||||||
else return NoContent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
//========================= POST ====================================//
|
|
||||||
#region POST
|
|
||||||
|
|
||||||
[HttpPost("AddType")]
|
|
||||||
public IActionResult AddType(DeviceType d) //Добавить один тип устройства
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
db.DeviceTypes.Add(d);//.Where(u => u.Name == name).FirstOrDefault();
|
|
||||||
db.SaveChanges();
|
|
||||||
return Created();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
//========================= DELETE ====================================//
|
|
||||||
#region DELETE
|
|
||||||
[HttpDelete("DelType")]
|
|
||||||
public IActionResult DelType(Guid id) //Удалить тип устройства по id
|
|
||||||
{
|
|
||||||
using (var db = new SQLiteService())
|
|
||||||
{
|
|
||||||
var deldevtype = db.DeviceTypes.Where(u => u.Id == id).FirstOrDefault();
|
|
||||||
db.DeviceTypes.Remove(deldevtype);
|
|
||||||
db.SaveChanges();
|
|
||||||
return Ok();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
@@ -2,18 +2,21 @@
|
|||||||
{
|
{
|
||||||
public class DeviceItem
|
public class DeviceItem
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public int Id { get; set; }
|
||||||
public string? Ip { get; set; }
|
public string Ip { get; set; }
|
||||||
public string? Mac { get; set; }
|
public string Mac { get; set; }
|
||||||
public string? Description { get; set; }
|
public string? Description { get; set; }
|
||||||
public string? Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public string? Location { get; set; }
|
public string? Location { get; set; }
|
||||||
public List<Guid>? ListDevices { get; set; }
|
public List<DeviceItem> Devises { get; set; }
|
||||||
public Guid? DeviceType { get; set; }
|
public DeviceType DeviceType { get; set; }
|
||||||
public Guid? DeviceObject { get; set; }
|
public int ConnectedToSwitchId { get; set; }
|
||||||
public Guid? ConnectedToSwitchId { get; set; }
|
|
||||||
public int ConnectedToPortOnSwitch { get; set; }
|
public int ConnectedToPortOnSwitch { get; set; }
|
||||||
|
|
||||||
|
//public DeviceItem(int type, string ip, string mac, string location)
|
||||||
|
//{
|
||||||
|
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Unknown = 0,
|
//Unknown = 0,
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
{
|
{
|
||||||
public class DeviceType
|
public class DeviceType
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public int Id { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string? Description { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Strela.Models
|
|
||||||
{
|
|
||||||
public class ObjectItem
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public string NameObject { get; set; } = "Unknown";
|
|
||||||
public string? DescriptionObject { get; set; } = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -9,13 +9,12 @@ namespace Strela.Services
|
|||||||
public virtual DbSet<User> Users { get; set; }
|
public virtual DbSet<User> Users { get; set; }
|
||||||
public virtual DbSet<DeviceItem> Devices { get; set; }
|
public virtual DbSet<DeviceItem> Devices { get; set; }
|
||||||
public virtual DbSet<DeviceType> DeviceTypes { get; set; }
|
public virtual DbSet<DeviceType> DeviceTypes { get; set; }
|
||||||
public virtual DbSet<ObjectItem> ObjectItems { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
{
|
{
|
||||||
optionsBuilder.UseNpgsql("Host=172.22.10.39;Port=5432;Database=strela;Username=postgres;Password=4NUDZhJ7");
|
//optionsBuilder.UseNpgsql("Host=172.24.12.201;Port=5432;Database=Notifications;Username=postgres;Password=4NUDZhJ7");
|
||||||
//optionsBuilder.UseSqlite("Data Source=Services/DataBase.db");
|
optionsBuilder.UseSqlite("Data Source=Services/DataBase.db");
|
||||||
}
|
}
|
||||||
|
|
||||||
//protected override void OnModelCreating(ModelBuilder modelBuilder)
|
//protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
|||||||
+11
-15
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<UserSecretsId>a4a5f63c-2231-4614-977a-c009c38846a3</UserSecretsId>
|
<UserSecretsId>a4a5f63c-2231-4614-977a-c009c38846a3</UserSecretsId>
|
||||||
@@ -9,26 +9,22 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Models\OTD\**" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.16" />
|
||||||
<Content Remove="Models\OTD\**" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.16" />
|
||||||
<EmbeddedResource Remove="Models\OTD\**" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.16">
|
||||||
<None Remove="Models\OTD\**" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.10" />
|
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.10">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.23.0" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.3" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
|
||||||
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.16.0" />
|
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.3" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\lsSoft.ServiceDefaults\lsSoft.ServiceDefaults.csproj" />
|
<ProjectReference Include="..\lsSoft.ServiceDefaults\lsSoft.ServiceDefaults.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Models\OTD\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Error",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Error",
|
"Microsoft.AspNetCore": "Warning"
|
||||||
"Microsoft.AspNetCore.Hosting.Diagnostics": "Information"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Urls": "http://0.0.0.0:5050",
|
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 1,
|
|
||||||
"isRoot": true,
|
|
||||||
"tools": {
|
|
||||||
"dotnet-ef": {
|
|
||||||
"version": "10.0.10",
|
|
||||||
"commands": [
|
|
||||||
"dotnet-ef"
|
|
||||||
],
|
|
||||||
"rollForward": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.4.32916.344
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Visor", "Visor\Visor.csproj", "{A1073A31-9C1C-4B5F-8752-F4397F84E210}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{A1073A31-9C1C-4B5F-8752-F4397F84E210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A1073A31-9C1C-4B5F-8752-F4397F84E210}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A1073A31-9C1C-4B5F-8752-F4397F84E210}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A1073A31-9C1C-4B5F-8752-F4397F84E210}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {C59BEA9D-058E-406A-BE53-A3BC184DCF72}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"servers": {
|
|
||||||
"blazorise-docs": {
|
|
||||||
"type": "http",
|
|
||||||
"url": "https://mcp.blazorise.com/mcp"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
<Blazorise.ThemeProvider Theme="@theme">
|
|
||||||
<Router AppAssembly="typeof(App).Assembly">
|
|
||||||
<Found Context="routeData">
|
|
||||||
<RouteView RouteData="routeData" DefaultLayout="typeof(Visor.Layouts.MainLayout)" />
|
|
||||||
</Found>
|
|
||||||
<NotFound>
|
|
||||||
<p>Sorry, there's nothing at this address.</p>
|
|
||||||
</NotFound>
|
|
||||||
</Router>
|
|
||||||
<MessageProvider />
|
|
||||||
<PageProgressProvider />
|
|
||||||
</Blazorise.ThemeProvider>
|
|
||||||
@code {
|
|
||||||
private Theme theme = new()
|
|
||||||
{
|
|
||||||
BarOptions = new()
|
|
||||||
{
|
|
||||||
HorizontalHeight = "72px"
|
|
||||||
},
|
|
||||||
ColorOptions = new()
|
|
||||||
{
|
|
||||||
Primary = "#0288D1",
|
|
||||||
Secondary = "#A65529",
|
|
||||||
Success = "#23C02E",
|
|
||||||
Info = "#9BD8FE",
|
|
||||||
Warning = "#F8B86C",
|
|
||||||
Danger = "#F95741",
|
|
||||||
Light = "#F0F0F0",
|
|
||||||
Dark = "#535353",
|
|
||||||
},
|
|
||||||
BackgroundOptions = new()
|
|
||||||
{
|
|
||||||
Primary = "#0288D1",
|
|
||||||
Secondary = "#A65529",
|
|
||||||
Success = "#23C02E",
|
|
||||||
Info = "#9BD8FE",
|
|
||||||
Warning = "#F8B86C",
|
|
||||||
Danger = "#F95741",
|
|
||||||
Light = "#F0F0F0",
|
|
||||||
Dark = "#535353",
|
|
||||||
},
|
|
||||||
InputOptions = new()
|
|
||||||
{
|
|
||||||
CheckColor = "#0288D1",
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
@using System.Reflection
|
|
||||||
<Bar Padding="Padding.Is1" Background="Background.Default">
|
|
||||||
<Heading TextAlignment="TextAlignment.Center" Width="Width.Is100" TextColor="TextColor.White" Size="HeadingSize.Is6">@($"{Assembly.GetExecutingAssembly().GetName().Name} v{Assembly.GetExecutingAssembly().GetName().Version}")</Heading>
|
|
||||||
</Bar>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<Bar Breakpoint="Breakpoint.Desktop" NavigationBreakpoint="Breakpoint.Tablet" ThemeContrast="ThemeContrast.Dark"
|
|
||||||
Mode="BarMode.VerticalInline" CollapseMode="BarCollapseMode.Small">
|
|
||||||
<BarToggler />
|
|
||||||
<BarBrand>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="">
|
|
||||||
<BarIcon IconName="customIcon" />
|
|
||||||
Visor
|
|
||||||
</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
</BarBrand>
|
|
||||||
<BarMenu>
|
|
||||||
<BarStart>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="/">
|
|
||||||
<BarIcon IconName="IconName.Dashboard" />
|
|
||||||
Дашборд
|
|
||||||
</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
</BarStart>
|
|
||||||
<BarEnd>
|
|
||||||
<BarItem>
|
|
||||||
<BarDropdown @bind-Visible="pagesBarVisible">
|
|
||||||
<BarDropdownToggle>
|
|
||||||
<BarIcon IconName="IconName.Edit" />
|
|
||||||
Настройка
|
|
||||||
</BarDropdownToggle>
|
|
||||||
<BarDropdownMenu>
|
|
||||||
<BarDropdownItem To="/setting/add_objects">Добавить объект</BarDropdownItem>
|
|
||||||
</BarDropdownMenu>
|
|
||||||
<BarDropdownMenu>
|
|
||||||
<BarDropdownItem To="/simple-datagrid">Simple DataGrid</BarDropdownItem>
|
|
||||||
</BarDropdownMenu>
|
|
||||||
</BarDropdown>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="/setting/wizard">
|
|
||||||
<BarIcon IconName="IconName.CaretSquareRight" />
|
|
||||||
Wizard
|
|
||||||
</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
</BarEnd>
|
|
||||||
</BarMenu>
|
|
||||||
</Bar>
|
|
||||||
@code {
|
|
||||||
private bool pagesBarVisible = false;
|
|
||||||
|
|
||||||
RenderFragment customIcon = @<img src="/brand-logo.png" style="width:32px; height: 32px" />;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<div>
|
|
||||||
@foreach ( var color in ThemeColors.Items.Values )
|
|
||||||
{
|
|
||||||
<div @key="color.Key">
|
|
||||||
@foreach ( var shade in color.Shades.Values )
|
|
||||||
{
|
|
||||||
var temp = shade.Value;
|
|
||||||
|
|
||||||
<div @key="shade.Key" class="demo-theme-color-item" style="background: @temp" @onclick="@(()=>OnThemeColorSelect(temp))"></div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
@code{
|
|
||||||
[Parameter]
|
|
||||||
public string? Value { get; set; }
|
|
||||||
|
|
||||||
[Parameter]
|
|
||||||
public EventCallback<string> ValueChanged { get; set; }
|
|
||||||
|
|
||||||
Task OnThemeColorSelect( string value )
|
|
||||||
{
|
|
||||||
Value = value;
|
|
||||||
return ValueChanged.InvokeAsync(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
.demo-theme-color-item {
|
|
||||||
display: table-cell;
|
|
||||||
width: 36px;
|
|
||||||
height: 36px;
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: center;
|
|
||||||
color: white;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.demo-theme-color-item .material-icons {
|
|
||||||
display: flex;
|
|
||||||
height: 100%;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
@using Blazorise.Localization
|
|
||||||
|
|
||||||
<Bar @bind-Visible="@topbarVisible" Breakpoint="Breakpoint.Desktop" Background="Background.Primary" ThemeContrast="ThemeContrast.Light">
|
|
||||||
<BarBrand>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="">
|
|
||||||
<BarIcon Margin="Margin.Is2.FromEnd" IconName="IconName.Dashboard" />
|
|
||||||
Visor
|
|
||||||
</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
</BarBrand>
|
|
||||||
<BarToggler />
|
|
||||||
<BarMenu>
|
|
||||||
<BarStart>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="/">Home</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="https://blazorise.com/docs/">Documentation</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarDropdown>
|
|
||||||
<BarDropdownToggle>More</BarDropdownToggle>
|
|
||||||
<BarDropdownMenu>
|
|
||||||
<BarDropdownItem To="https://blazorise.com/docs/start/">
|
|
||||||
Quick-Start Guide
|
|
||||||
</BarDropdownItem>
|
|
||||||
<BarDropdownDivider />
|
|
||||||
<BarDropdownItem To="https://blazorise.com/docs/usage/">
|
|
||||||
Usage
|
|
||||||
</BarDropdownItem>
|
|
||||||
</BarDropdownMenu>
|
|
||||||
</BarDropdown>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarDropdown>
|
|
||||||
<BarDropdownToggle>Layout</BarDropdownToggle>
|
|
||||||
<BarDropdownMenu>
|
|
||||||
<BarDropdownItem Clicked="@(()=>OnLayoutTypeChecked("fixed-header"))">
|
|
||||||
@if ( LayoutType == "fixed-header" )
|
|
||||||
{
|
|
||||||
<Icon Name="IconName.CheckCircle" TextColor="TextColor.Success" />
|
|
||||||
}
|
|
||||||
Fixed Header
|
|
||||||
</BarDropdownItem>
|
|
||||||
<BarDropdownItem Clicked="@(()=>OnLayoutTypeChecked("fixed-header-footer-only"))">
|
|
||||||
@if ( LayoutType == "fixed-header-footer-only" )
|
|
||||||
{
|
|
||||||
<Icon Name="IconName.CheckCircle" TextColor="TextColor.Success" />
|
|
||||||
}
|
|
||||||
Fixed Header and Footer only
|
|
||||||
</BarDropdownItem>
|
|
||||||
<BarDropdownItem Clicked="@(()=>OnLayoutTypeChecked("sider-with-header-on-top"))">
|
|
||||||
@if ( LayoutType == "sider-with-header-on-top" )
|
|
||||||
{
|
|
||||||
<Icon Name="IconName.CheckCircle" TextColor="TextColor.Success" />
|
|
||||||
}
|
|
||||||
Sider with Header on top
|
|
||||||
</BarDropdownItem>
|
|
||||||
</BarDropdownMenu>
|
|
||||||
</BarDropdown>
|
|
||||||
</BarItem>
|
|
||||||
|
|
||||||
|
|
||||||
</BarStart>
|
|
||||||
<BarEnd>
|
|
||||||
<BarItem>
|
|
||||||
<BarDropdown RightAligned>
|
|
||||||
<BarDropdownToggle><Icon Name="IconName.Language" /></BarDropdownToggle>
|
|
||||||
<BarDropdownMenu>
|
|
||||||
@foreach ( var cultureInfo in LocalizationService!.AvailableCultures )
|
|
||||||
{
|
|
||||||
<BarDropdownItem @key="@cultureInfo.Name" Clicked="@(()=>SelectCulture(cultureInfo.Name))">
|
|
||||||
@if ( cultureInfo.IsNeutralCulture )
|
|
||||||
{
|
|
||||||
@cultureInfo.EnglishName
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@cultureInfo.Parent.EnglishName
|
|
||||||
}
|
|
||||||
</BarDropdownItem>
|
|
||||||
}
|
|
||||||
</BarDropdownMenu>
|
|
||||||
</BarDropdown>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarDropdown RightAligned>
|
|
||||||
<BarDropdownToggle><Icon Name="IconName.Tint" /> Theme</BarDropdownToggle>
|
|
||||||
<BarDropdownMenu Style="padding: 15px; min-width:550px;">
|
|
||||||
<Row>
|
|
||||||
<Column Margin="Margin.Is2.FromBottom">
|
|
||||||
<Field>
|
|
||||||
<Switch TValue="bool" Value="@(Theme?.Enabled == true)" ValueChanged="@ThemeEnabledChanged">Theme enabled</Switch>
|
|
||||||
</Field>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
<Row>
|
|
||||||
<Column Margin="Margin.Is2.FromBottom">
|
|
||||||
<Field>
|
|
||||||
<Check TValue="bool" Value="@(Theme?.IsGradient == true)" ValueChanged="@ThemeGradientChanged">Gradient colors</Check>
|
|
||||||
</Field>
|
|
||||||
<Field>
|
|
||||||
<Check TValue="bool" Value="@(Theme?.IsRounded == true)" ValueChanged="@ThemeRoundedChanged">Rounded elements</Check>
|
|
||||||
</Field>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
<Row>
|
|
||||||
<Column>
|
|
||||||
<Container Fluid>
|
|
||||||
<ThemeColorSelector Value="@(Theme?.ColorOptions?.Primary)" ValueChanged="@ThemeColorChanged"></ThemeColorSelector>
|
|
||||||
</Container>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
</BarDropdownMenu>
|
|
||||||
</BarDropdown>
|
|
||||||
</BarItem>
|
|
||||||
<BarItem>
|
|
||||||
<BarLink To="https://github.com/Megabit/Blazorise">GitHub</BarLink>
|
|
||||||
</BarItem>
|
|
||||||
</BarEnd>
|
|
||||||
</BarMenu>
|
|
||||||
</Bar>
|
|
||||||
@code {
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await SelectCulture( "en-US" );
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task SelectCulture( string name )
|
|
||||||
{
|
|
||||||
LocalizationService!.ChangeLanguage( name );
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool topbarVisible = false;
|
|
||||||
|
|
||||||
Task OnLayoutTypeChecked( string layoutType )
|
|
||||||
{
|
|
||||||
LayoutType = layoutType;
|
|
||||||
|
|
||||||
return LayoutTypeChanged.InvokeAsync( layoutType );
|
|
||||||
}
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<bool> ThemeEnabledChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<bool> ThemeGradientChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<bool> ThemeRoundedChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<string> ThemeColorChanged { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public string? LayoutType { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<string> LayoutTypeChanged { get; set; }
|
|
||||||
|
|
||||||
[Inject] protected ITextLocalizerService? LocalizationService { get; set; }
|
|
||||||
|
|
||||||
[CascadingParameter] protected Theme? Theme { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
|
|
||||||
namespace Visor.Components.TodoApp
|
|
||||||
{
|
|
||||||
public abstract class BaseTodoItems : ComponentBase
|
|
||||||
{
|
|
||||||
protected Validations? validations;
|
|
||||||
|
|
||||||
protected string? description;
|
|
||||||
|
|
||||||
protected Filter filter = Filter.All;
|
|
||||||
|
|
||||||
protected List<Todo> todos = new()
|
|
||||||
{
|
|
||||||
new() { Description = "Buy milk" },
|
|
||||||
new() { Description = "Call John regarding the meeting" },
|
|
||||||
new() { Description = "Walk a dog" },
|
|
||||||
};
|
|
||||||
|
|
||||||
protected IEnumerable<Todo> Todos
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var query = from t in todos select t;
|
|
||||||
|
|
||||||
if (filter == Filter.Active)
|
|
||||||
query = from q in query where !q.Completed select q;
|
|
||||||
|
|
||||||
if (filter == Filter.Completed)
|
|
||||||
query = from q in query where q.Completed select q;
|
|
||||||
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetFilter(Filter filter)
|
|
||||||
{
|
|
||||||
this.filter = filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void OnCheckAll(bool isChecked)
|
|
||||||
{
|
|
||||||
todos.ForEach(x => x.Completed = isChecked);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task OnAddTodo()
|
|
||||||
{
|
|
||||||
if (await validations!.ValidateAll())
|
|
||||||
{
|
|
||||||
todos.Add(new() { Description = description });
|
|
||||||
description = null;
|
|
||||||
|
|
||||||
await validations.ClearAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void OnClearCompleted()
|
|
||||||
{
|
|
||||||
todos.RemoveAll(x => x.Completed);
|
|
||||||
filter = Filter.All;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Task OnTodoStatusChanged(bool isChecked)
|
|
||||||
{
|
|
||||||
return InvokeAsync(StateHasChanged);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Visor.Components.TodoApp
|
|
||||||
{
|
|
||||||
public enum Filter
|
|
||||||
{
|
|
||||||
All,
|
|
||||||
Active,
|
|
||||||
Completed,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Visor.Components.TodoApp
|
|
||||||
{
|
|
||||||
public class Todo
|
|
||||||
{
|
|
||||||
public bool Completed { get; set; }
|
|
||||||
|
|
||||||
public string? Description { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
@if (Todo is not null)
|
|
||||||
{
|
|
||||||
<ListGroupItem>
|
|
||||||
<Field Horizontal Padding="Padding.IsAuto.OnAll">
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is1">
|
|
||||||
<Check TValue="bool" Value="@Todo.Completed" ValueChanged="@OnCheckedChanged"></Check>
|
|
||||||
</FieldBody>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is11">
|
|
||||||
@Todo.Description
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</ListGroupItem>
|
|
||||||
}
|
|
||||||
@code {
|
|
||||||
Task OnCheckedChanged(bool isChecked)
|
|
||||||
{
|
|
||||||
Todo!.Completed = isChecked;
|
|
||||||
|
|
||||||
return StatusChanged?.Invoke(isChecked) ?? Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Parameter] public Todo? Todo { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public Func<bool, Task>? StatusChanged { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
@inherits BaseTodoItems
|
|
||||||
<Container Fluid>
|
|
||||||
<Row>
|
|
||||||
<Column>
|
|
||||||
<Card>
|
|
||||||
<CardHeader Padding="Padding.Is1.FromBottom">
|
|
||||||
<CardTitle Size="HeadingSize.Is4">Todo List</CardTitle>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody Padding="Padding.Is0.FromBottom">
|
|
||||||
<Fields>
|
|
||||||
<Column ColumnSize="ColumnSize.Is1">
|
|
||||||
<Check TValue="bool" Value="@Todos.All(x=>x.Completed)" ValueChanged="@OnCheckAll">All</Check>
|
|
||||||
</Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is11">
|
|
||||||
<Addons>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<Validations @ref="validations" Mode="ValidationMode.Manual">
|
|
||||||
<Validation Validator="@ValidationRule.IsNotEmpty">
|
|
||||||
<TextInput @bind-Value="@description" Placeholder="What needs to be done?"></TextInput>
|
|
||||||
</Validation>
|
|
||||||
</Validations>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.End">
|
|
||||||
<Button Color="Color.Primary" Clicked="@OnAddTodo">
|
|
||||||
<Icon Name="IconName.Add" />Add
|
|
||||||
</Button>
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
</Column>
|
|
||||||
</Fields>
|
|
||||||
</CardBody>
|
|
||||||
<CardBody Padding="Padding.Is0.OnY">
|
|
||||||
<ListGroup Flush>
|
|
||||||
@foreach ( var todo in Todos )
|
|
||||||
{
|
|
||||||
<TodoItem Todo="@todo" StatusChanged="@OnTodoStatusChanged" />
|
|
||||||
}
|
|
||||||
</ListGroup>
|
|
||||||
</CardBody>
|
|
||||||
<CardFooter Padding="Padding.Is3.FromBottom">
|
|
||||||
<Field Horizontal>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is10">
|
|
||||||
<Buttons Role="ButtonsRole.Addons">
|
|
||||||
<Button Color="Color.Info" Clicked="@(() => SetFilter( Filter.All ))" Active="@(filter == Filter.All)">All</Button>
|
|
||||||
<Button Color="Color.Info" Clicked="@(() => SetFilter( Filter.Active ))" Active="@(filter == Filter.Active)">Active</Button>
|
|
||||||
<Button Color="Color.Info" Clicked="@(() => SetFilter( Filter.Completed ))" Active="@(filter == Filter.Completed)">Completed</Button>
|
|
||||||
</Buttons>
|
|
||||||
</FieldBody>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is2">
|
|
||||||
<Button Color="Color.Warning" Float="Float.End" Clicked="@OnClearCompleted" Display="@(todos.Any(x=>x.Completed) ? Display.Always : Display.None)">Clear Completed</Button>
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</CardFooter>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
</Container>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
global using Blazorise;
|
|
||||||
global using Blazorise.DataGrid;
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
@using Visor.Components.Layout
|
|
||||||
|
|
||||||
@inherits LayoutComponentBase
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Layout Sider>
|
|
||||||
<LayoutSider>
|
|
||||||
<LayoutSiderContent>
|
|
||||||
<SideMenu />
|
|
||||||
</LayoutSiderContent>
|
|
||||||
</LayoutSider>
|
|
||||||
<Layout>
|
|
||||||
<LayoutContent Padding="Padding.Is4.OnX.Is4.FromTop">
|
|
||||||
@Body
|
|
||||||
</LayoutContent>
|
|
||||||
</Layout>
|
|
||||||
</Layout>
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
using Blazorise;
|
|
||||||
using Blazorise.Localization;
|
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
|
||||||
|
|
||||||
namespace Visor.Layouts
|
|
||||||
{
|
|
||||||
public partial class MainLayout
|
|
||||||
{
|
|
||||||
[Inject] protected ITextLocalizerService? LocalizationService { get; set; }
|
|
||||||
|
|
||||||
[CascadingParameter] protected Theme? Theme { get; set; }
|
|
||||||
|
|
||||||
protected string layoutType = "fixed-header";
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await SelectCulture("en-US");
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task SelectCulture(string name)
|
|
||||||
{
|
|
||||||
LocalizationService!.ChangeLanguage(name);
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
Task OnThemeEnabledChanged(bool value)
|
|
||||||
{
|
|
||||||
if (Theme is null)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
|
|
||||||
Theme.Enabled = value;
|
|
||||||
|
|
||||||
return InvokeAsync(Theme.ThemeHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
Task OnThemeGradientChanged(bool value)
|
|
||||||
{
|
|
||||||
if (Theme is null)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
|
|
||||||
Theme.IsGradient = value;
|
|
||||||
|
|
||||||
return InvokeAsync(Theme.ThemeHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
Task OnThemeRoundedChanged(bool value)
|
|
||||||
{
|
|
||||||
if (Theme is null)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
|
|
||||||
Theme.IsRounded = value;
|
|
||||||
|
|
||||||
return InvokeAsync(Theme.ThemeHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
Task OnThemeColorChanged(string value)
|
|
||||||
{
|
|
||||||
if (Theme is null)
|
|
||||||
return Task.CompletedTask;
|
|
||||||
|
|
||||||
Theme.ColorOptions ??= new();
|
|
||||||
|
|
||||||
Theme.BackgroundOptions ??= new();
|
|
||||||
|
|
||||||
Theme.TextColorOptions ??= new();
|
|
||||||
|
|
||||||
Theme.ColorOptions.Primary = value;
|
|
||||||
Theme.BackgroundOptions.Primary = value;
|
|
||||||
Theme.TextColorOptions.Primary = value;
|
|
||||||
|
|
||||||
Theme.InputOptions ??= new();
|
|
||||||
|
|
||||||
Theme.InputOptions.CheckColor = value;
|
|
||||||
Theme.InputOptions.SliderColor = value;
|
|
||||||
|
|
||||||
Theme.SpinKitOptions ??= new();
|
|
||||||
|
|
||||||
Theme.SpinKitOptions.Color = value;
|
|
||||||
|
|
||||||
return InvokeAsync(Theme.ThemeHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
namespace Visor.Models
|
|
||||||
{
|
|
||||||
public class AllPubData
|
|
||||||
{
|
|
||||||
public static List<ObjectItems> ListObjectItems { get; set; } = new();
|
|
||||||
public static List<DeviceItems> ListDeviceItems { get; set; } = new();
|
|
||||||
public static List<DeviceTypeItems> ListDeviceTypeItems { get; set; } = new();
|
|
||||||
public static HttpClient http { get; set; } = new()
|
|
||||||
{
|
|
||||||
BaseAddress = new Uri("http://172.22.10.31:5050/")
|
|
||||||
};
|
|
||||||
|
|
||||||
public static Task GetAll() => _GetAllData();
|
|
||||||
public static Task GetObjects() => _GetObject();
|
|
||||||
public static Task GetType() => _GetType();
|
|
||||||
public static Task GetDevice() => _GetDevice();
|
|
||||||
|
|
||||||
private static async Task _GetAllData()
|
|
||||||
{
|
|
||||||
var o = await _GetObject();
|
|
||||||
var t = await _GetType();
|
|
||||||
var d = await _GetDevice();
|
|
||||||
}
|
|
||||||
private static async Task<List<ObjectItems>> _GetObject()
|
|
||||||
{
|
|
||||||
return ListObjectItems = await http.GetFromJsonAsync<List<ObjectItems>>("api/Object/GetObject");
|
|
||||||
}
|
|
||||||
private static async Task<List<DeviceItems>> _GetDevice()
|
|
||||||
{
|
|
||||||
return ListDeviceItems = http.GetFromJsonAsync<List<DeviceItems>>("api/Device/GetDevices").Result.Take(100).ToList();
|
|
||||||
}
|
|
||||||
private static async Task<List<DeviceTypeItems>> _GetType()
|
|
||||||
{
|
|
||||||
return ListDeviceTypeItems = await http.GetFromJsonAsync<List<DeviceTypeItems>>("api/Type/GetTypes");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
namespace Visor.Models
|
|
||||||
{
|
|
||||||
public class DeviceItems
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public string? Ip { get; set; }
|
|
||||||
public string? Mac { get; set; }
|
|
||||||
public string? Description { get; set; }
|
|
||||||
public string? Name { get; set; }
|
|
||||||
public string? Location { get; set; }
|
|
||||||
public List<Guid>? ListDevices { get; set; }
|
|
||||||
public Guid? DeviceType { get; set; }
|
|
||||||
public Guid? DeviceObject { get; set; }
|
|
||||||
public Guid? ConnectedToSwitchId { get; set; }
|
|
||||||
public int ConnectedToPortOnSwitch { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Unknown = 0,
|
|
||||||
//SwitchCore = 1,
|
|
||||||
//SwitchAccess = 2,
|
|
||||||
//Camera = 3,
|
|
||||||
//Server = 4,
|
|
||||||
//WorkStation = 5,
|
|
||||||
//PDU_AVR = 6,
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Visor.Models
|
|
||||||
{
|
|
||||||
public class DeviceTypeItems
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string? Description { get; set; } = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
|
|
||||||
namespace Visor.Models
|
|
||||||
{
|
|
||||||
public class ObjectItems
|
|
||||||
{
|
|
||||||
[Key]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public string NameObject { get; set; } = "Unknown";
|
|
||||||
public string DescriptionObject { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
@page "/"
|
|
||||||
@using Visor.Models
|
|
||||||
@inject IVersionProvider VersionProvider
|
|
||||||
@inject NavigationManager Navigation
|
|
||||||
<Heading Size="HeadingSize.Is1" Margin="Margin.Is3.FromBottom">ДАШБОРД</Heading>
|
|
||||||
|
|
||||||
|
|
||||||
@if (_list_obj is null)
|
|
||||||
{
|
|
||||||
<p>Получаю данные...</p>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<CardDeck>
|
|
||||||
@foreach (var obj in _list_obj)
|
|
||||||
{
|
|
||||||
<Card>
|
|
||||||
@* <CardImage Source="/img/gallery/2.jpg" Alt="Card image cap 3"></CardImage> *@
|
|
||||||
<CardBody>
|
|
||||||
<CardTitle TextAlignment="TextAlignment.Center" Size="HeadingSize.Is3">@obj.NameObject (@obj.DescriptionObject)</CardTitle>
|
|
||||||
<CardText>
|
|
||||||
<Divider />
|
|
||||||
<b>Всего устройств: @_list_dev.Where(d => d.DeviceObject == obj.Id).Count()</b><br />
|
|
||||||
@foreach (var tp in _list_type)
|
|
||||||
{
|
|
||||||
<div> ☞ @tp.Name : @_list_dev.Where(d => d.DeviceObject == obj.Id && d.DeviceType == tp.Id).Count() <br /></div>
|
|
||||||
}
|
|
||||||
@* ˫ Коммутаторы: @_list_dev.Where(d => d.DeviceObject == obj.Id && d.DeviceType == _list_type.First(t => t.Name.Contains("Switch")).Id).Count()<br />
|
|
||||||
˫ Камеры: @_list_dev.Where(d => d.DeviceObject == obj.Id && d.DeviceType == _list_type.First(t => t.Name.Contains("Camera")).Id).Count() *@
|
|
||||||
</CardText>
|
|
||||||
<Button Color="Color.Primary" Clicked="@(() => GoToObj(obj.Id))">Перейти к объекту</Button>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
|
|
||||||
}
|
|
||||||
</CardDeck>
|
|
||||||
}
|
|
||||||
|
|
||||||
@code
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
List<ObjectItems> _list_obj;
|
|
||||||
List<DeviceItems> _list_dev;
|
|
||||||
List<DeviceTypeItems> _list_type;
|
|
||||||
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await AllPubData.GetAll();
|
|
||||||
_list_obj = AllPubData.ListObjectItems;
|
|
||||||
_list_type = AllPubData.ListDeviceTypeItems;
|
|
||||||
_list_dev = AllPubData.ListDeviceItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoToObj(Guid id)
|
|
||||||
{
|
|
||||||
Navigation.NavigateTo($"/object/{id}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
@page
|
|
||||||
@model Visor.Pages.ErrorModel
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
|
||||||
<title>Error</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1>Error.</h1>
|
|
||||||
<h2>An error occurred while processing your request.</h2>
|
|
||||||
|
|
||||||
@if (Model.ShowRequestId)
|
|
||||||
{
|
|
||||||
<p>
|
|
||||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
|
||||||
</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Development Mode</h3>
|
|
||||||
<p>
|
|
||||||
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
|
||||||
It can result in displaying sensitive information from exceptions to end users.
|
|
||||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
|
||||||
and restarting the app.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
|
||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
namespace Visor.Pages
|
|
||||||
{
|
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
|
||||||
[IgnoreAntiforgeryToken]
|
|
||||||
public class ErrorModel : PageModel
|
|
||||||
{
|
|
||||||
public string? RequestId { get; set; }
|
|
||||||
|
|
||||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
|
||||||
|
|
||||||
private readonly ILogger<ErrorModel> _logger;
|
|
||||||
|
|
||||||
public ErrorModel(ILogger<ErrorModel> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnGet()
|
|
||||||
{
|
|
||||||
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
@page "/object/{Id:guid}"
|
|
||||||
@using Visor.Models
|
|
||||||
<h3>ObjectInfo</h3>
|
|
||||||
|
|
||||||
@if (_obj != null)
|
|
||||||
{
|
|
||||||
<p>Название: @_obj.NameObject</p>
|
|
||||||
<p>Количество устройств: @_devs.Count</p>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<p>Загрузка данных или объект не найден...</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
|
|
||||||
private ObjectItems? _obj;
|
|
||||||
private List<DeviceItems> _devs = new();
|
|
||||||
|
|
||||||
protected override void OnInitialized()
|
|
||||||
{
|
|
||||||
_obj = AllPubData.ListObjectItems.FirstOrDefault(o => o.Id == Id);
|
|
||||||
_devs = AllPubData.ListDeviceItems.Where(d => d.DeviceObject == Id).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
@page "/setting/add_objects"
|
|
||||||
@using Visor.Models
|
|
||||||
|
|
||||||
@* @inject HttpClient Http *@
|
|
||||||
|
|
||||||
<LoadingIndicator Visible="@isLoading" FullScreen />
|
|
||||||
|
|
||||||
|
|
||||||
<Row Width="Width.Max100">
|
|
||||||
<Column ColumnSize="ColumnSize.Is10"></Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is2">
|
|
||||||
<Button Color="Color.Primary" Clicked="@ShowAddObjetc">
|
|
||||||
<Icon Name="IconName.Add" />
|
|
||||||
</Button>
|
|
||||||
<Button Color="Color.Primary" Outline Clicked="@ShowDelObjetc">
|
|
||||||
<Icon Name="IconName.Delete" />
|
|
||||||
</Button>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
<Divider />
|
|
||||||
<Div>
|
|
||||||
@if (isLoading || listObjects is null)
|
|
||||||
{
|
|
||||||
<Paragraph>@MessagePages</Paragraph>
|
|
||||||
}
|
|
||||||
else if (listObjects != null && listObjects.Any())
|
|
||||||
{
|
|
||||||
<Table>
|
|
||||||
<TableHeader>
|
|
||||||
<TableRow>
|
|
||||||
<TableHeaderCell>Название</TableHeaderCell>
|
|
||||||
<TableHeaderCell>Описание</TableHeaderCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
@foreach (var item in listObjects)
|
|
||||||
{
|
|
||||||
<TableRow>
|
|
||||||
<TableRowCell>@item.NameObject</TableRowCell>
|
|
||||||
<TableRowCell>@item.DescriptionObject</TableRowCell>
|
|
||||||
</TableRow>
|
|
||||||
}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<Alert Color="Color.Warning">@MessagePages</Alert>
|
|
||||||
<Paragraph>@MessagePages</Paragraph>
|
|
||||||
}
|
|
||||||
</Div>
|
|
||||||
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<ObjectItems>? listObjects = AllPubData.ListObjectItems;
|
|
||||||
private Modal modalAdd;
|
|
||||||
private Modal modalDel;
|
|
||||||
|
|
||||||
private Guid select_id { get; set; }
|
|
||||||
private int id_object { get; set; }
|
|
||||||
private string name_object { get; set; }
|
|
||||||
private string decript_object { get; set; }
|
|
||||||
|
|
||||||
private HttpClient Http = AllPubData.http;
|
|
||||||
|
|
||||||
|
|
||||||
private string? MessagePages;
|
|
||||||
bool isLoading = true;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
await AllPubData.GetObjects();
|
|
||||||
listObjects = AllPubData.ListObjectItems;
|
|
||||||
if (listObjects.Count == 0)
|
|
||||||
MessagePages = "Нет данных";
|
|
||||||
isLoading = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task ShowAddObjetc()
|
|
||||||
{
|
|
||||||
id_object = listObjects.Count;
|
|
||||||
return modalAdd.Show();
|
|
||||||
}
|
|
||||||
private async Task AddObject()
|
|
||||||
{
|
|
||||||
var obj = new ObjectItems()
|
|
||||||
{
|
|
||||||
NameObject = name_object,
|
|
||||||
DescriptionObject = decript_object
|
|
||||||
};
|
|
||||||
|
|
||||||
var post = await Http.PostAsJsonAsync("api/Object/AddObject", obj);
|
|
||||||
if (post.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
listObjects.Add(obj);
|
|
||||||
await modalAdd.Hide();
|
|
||||||
//await AllPubData.ReloadObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
private Task ShowDelObjetc() => modalDel.Show();
|
|
||||||
private async Task DelObject()
|
|
||||||
{
|
|
||||||
var del = await Http.DeleteAsync($"api/Object/DelObject?id={select_id}");
|
|
||||||
if (del.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
listObjects.Remove(listObjects.Where(i => i.Id == select_id).First());
|
|
||||||
await HideDelModal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private Task HideAddModal() => modalAdd.Hide();
|
|
||||||
private Task HideDelModal() => modalDel.Hide();
|
|
||||||
|
|
||||||
}
|
|
||||||
<Modal @ref="modalAdd" Centered>
|
|
||||||
<ModalContent>
|
|
||||||
<ModalHeader>
|
|
||||||
<ModalTitle>Добавить объект</ModalTitle>
|
|
||||||
</ModalHeader>
|
|
||||||
<ModalBody>
|
|
||||||
@* <Addons>
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel>Id</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<NumericInput Disabled Placeholder="Номер объекта" @bind-Value="@id_object" />
|
|
||||||
</Addon>
|
|
||||||
</Addons> *@
|
|
||||||
<Addons>
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel>Name</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<TextInput @bind-Value="@name_object" Placeholder="Имя объекта" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons>
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel>Описание</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<TextInput Placeholder="Дополнительная информация" @bind-Value="@decript_object" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<ModalFooter>
|
|
||||||
<Button Color="Color.Secondary" Clicked="@HideAddModal">Close</Button>
|
|
||||||
<Button Color="Color.Primary" Clicked="@AddObject">Добавить</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalBody>
|
|
||||||
</ModalContent>
|
|
||||||
</Modal>
|
|
||||||
|
|
||||||
<Modal @ref="modalDel" Centered>
|
|
||||||
<ModalContent>
|
|
||||||
<ModalHeader>
|
|
||||||
<ModalTitle>Удалить объект</ModalTitle>
|
|
||||||
</ModalHeader>
|
|
||||||
<ModalBody>
|
|
||||||
<Addons>
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel>Id</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<Select @bind-Value="@select_id">
|
|
||||||
<SelectItem Value="9999">Объект</SelectItem>
|
|
||||||
@foreach (var item in listObjects)
|
|
||||||
{
|
|
||||||
<SelectItem Value="@item.Id">@item.NameObject</SelectItem>
|
|
||||||
}
|
|
||||||
</Select>
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<ModalFooter>
|
|
||||||
<Button Color="Color.Secondary" Clicked="@HideDelModal">Close</Button>
|
|
||||||
<Button Color="Color.Primary" Clicked="@DelObject">Удалить</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalBody>
|
|
||||||
</ModalContent>
|
|
||||||
</Modal>
|
|
||||||
@@ -1,507 +0,0 @@
|
|||||||
@page "/setting/wizard"
|
|
||||||
@using Visor.Models
|
|
||||||
@using System.Text.Json
|
|
||||||
<h3>Wizard</h3>
|
|
||||||
|
|
||||||
<Toaster>
|
|
||||||
<Toast @bind-Visible="@toastError">
|
|
||||||
<ToastHeader>
|
|
||||||
<Strong Margin="Margin.IsAuto.FromEnd">@error_group</Strong>
|
|
||||||
<CloseButton />
|
|
||||||
</ToastHeader>
|
|
||||||
<ToastBody>
|
|
||||||
@error_msg
|
|
||||||
</ToastBody>
|
|
||||||
</Toast>
|
|
||||||
</Toaster>
|
|
||||||
|
|
||||||
<LoadingIndicator @bind-Visible="@visible">
|
|
||||||
<Steps @ref="stepsRef" @bind-SelectedStep="@selectedStep" NavigationAllowed="NavigationAllowed">
|
|
||||||
<Items>
|
|
||||||
<Step Name="1">Объекты</Step>
|
|
||||||
<Step Name="2">Типы</Step>
|
|
||||||
<Step Name="3">Устройства</Step>
|
|
||||||
<Step Name="4">Итог</Step>
|
|
||||||
</Items>
|
|
||||||
<Content>
|
|
||||||
<StepPanel Name="1">
|
|
||||||
<Row>
|
|
||||||
<Column ColumnSize="ColumnSize.Is3">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardText>
|
|
||||||
<Field>
|
|
||||||
<TextInput Autofocus="true" @bind-Value="obj_name" Placeholder="Название объекта">
|
|
||||||
<FieldHelp>Введите название объекта. Например: VNK, SPB...</FieldHelp>
|
|
||||||
</TextInput>
|
|
||||||
</Field>
|
|
||||||
<Field>
|
|
||||||
<TextInput @bind-Value="obj_desc" Placeholder="Описание объекта">
|
|
||||||
<FieldHelp>Введите текстовое описание объекта</FieldHelp>
|
|
||||||
</TextInput>
|
|
||||||
</Field>
|
|
||||||
<Field>
|
|
||||||
<Button Color="Color.Primary" Clicked="@AddNewObject">
|
|
||||||
<Icon Name="IconName.Add" />
|
|
||||||
</Button>
|
|
||||||
<Button Color="Color.Primary" Clicked="@GetCurrentObject">
|
|
||||||
<Icon Name="IconName.Redo" />
|
|
||||||
</Button>
|
|
||||||
<Button Color="Color.Primary" Clicked="@AddOnFile">
|
|
||||||
<Icon Name="IconName.FileUpload" />
|
|
||||||
</Button>
|
|
||||||
</Field>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is9">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardText>
|
|
||||||
<Table>
|
|
||||||
<TableHeader>
|
|
||||||
<TableRow>
|
|
||||||
<TableHeaderCell>Название объекта</TableHeaderCell>
|
|
||||||
<TableHeaderCell>Описание объекта</TableHeaderCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
@foreach (var item in _list_obj)
|
|
||||||
{
|
|
||||||
<TableRow>
|
|
||||||
<TableRowCell>@item.NameObject</TableRowCell>
|
|
||||||
<TableRowCell>@item.DescriptionObject</TableRowCell>
|
|
||||||
</TableRow>
|
|
||||||
}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
</StepPanel>
|
|
||||||
<StepPanel Name="2">
|
|
||||||
<Row>
|
|
||||||
<Column ColumnSize="ColumnSize.Is3">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardText>
|
|
||||||
<Field>
|
|
||||||
<TextInput Autofocus="true" @bind-Value="type_name" Placeholder="Название типа устройства">
|
|
||||||
<FieldHelp>Введите название типа. Например: Server, Switch...</FieldHelp>
|
|
||||||
</TextInput>
|
|
||||||
</Field>
|
|
||||||
<Field>
|
|
||||||
<TextInput @bind-Value="type_desc" Placeholder="Описание типа">
|
|
||||||
<FieldHelp>Введите текстовое описание типа устройства</FieldHelp>
|
|
||||||
</TextInput>
|
|
||||||
</Field>
|
|
||||||
<Field>
|
|
||||||
<Button Color="Color.Primary" Clicked="@AddNewType">
|
|
||||||
<Icon Name="IconName.Add" />
|
|
||||||
</Button>
|
|
||||||
</Field>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is9">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardText>
|
|
||||||
<Table>
|
|
||||||
<TableHeader>
|
|
||||||
<TableRow>
|
|
||||||
<TableHeaderCell>Тип устройства</TableHeaderCell>
|
|
||||||
<TableHeaderCell>Описание типа устройств</TableHeaderCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
@foreach (var item in _list_type)
|
|
||||||
{
|
|
||||||
<TableRow>
|
|
||||||
<TableRowCell>@item.Name</TableRowCell>
|
|
||||||
<TableRowCell>@item.Description</TableRowCell>
|
|
||||||
</TableRow>
|
|
||||||
}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
</StepPanel>
|
|
||||||
<StepPanel Name="3">
|
|
||||||
<Row>
|
|
||||||
<Column ColumnSize="ColumnSize.Is3">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardTitle Size="HeadingSize.Is2">
|
|
||||||
Добавление устройства
|
|
||||||
</CardTitle>
|
|
||||||
<CardText>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">IP</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<InputMask @bind-Value="dev_ip" Width="Width.Is50" Placeholder="Введите IP" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">MAC</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<InputMask @bind-Value="dev_mac" Width="Width.Is50" Placeholder="Введите MAC" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Название</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<TextInput @bind-Value="dev_name" Width="Width.Is50" Placeholder="Введите название устройства" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Описание</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<TextInput @bind-Value="dev_desc" Width="Width.Is50" Placeholder="Введите описание устройства" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Место установки</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<TextInput @bind-Value="dev_loc" Width="Width.Is50" Placeholder="Введите где установлено устройство" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Тип устройства</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_type">
|
|
||||||
<SelectItem Value="999">Тип устройства</SelectItem>
|
|
||||||
@foreach (var sel in _list_type)
|
|
||||||
{
|
|
||||||
<SelectItem Value="@sel.Id">@sel.Name</SelectItem>
|
|
||||||
}
|
|
||||||
</Select>
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Объект</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_obj">
|
|
||||||
<SelectItem Value="999">На объекте</SelectItem>
|
|
||||||
@foreach (var sel in _list_obj)
|
|
||||||
{
|
|
||||||
<SelectItem Value="@sel.Id">@sel.NameObject</SelectItem>
|
|
||||||
}
|
|
||||||
</Select>
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Подключен к</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<Select Width="Width.Is50" TValue="Guid" @bind-Value="@id_dev">
|
|
||||||
<SelectItem Value="999">Коммутатор</SelectItem>
|
|
||||||
@foreach (var sel in _list_switch)
|
|
||||||
{
|
|
||||||
<SelectItem Value="@sel.Id">@sel.Name</SelectItem>
|
|
||||||
}
|
|
||||||
</Select>
|
|
||||||
</Addon>
|
|
||||||
@* <Addon AddonType="AddonType.End">
|
|
||||||
<Button Clicked="@RefreshListSwitch">
|
|
||||||
<Icon Name="IconName.Undo" />
|
|
||||||
</Button>
|
|
||||||
</Addon> *@
|
|
||||||
</Addons>
|
|
||||||
<Addons Size="Size.Small">
|
|
||||||
<Addon AddonType="AddonType.Start">
|
|
||||||
<AddonLabel Width="Width.Is25">Порт подключения</AddonLabel>
|
|
||||||
</Addon>
|
|
||||||
<Addon AddonType="AddonType.Body">
|
|
||||||
<NumericInput @bind-Value="num_port" Min="1" Max="28" Width="Width.Is50" />
|
|
||||||
</Addon>
|
|
||||||
</Addons>
|
|
||||||
<Button Width="Width.Is100" Color="Color.Dark" Clicked="@AddNewDev">Добавить</Button>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is9">
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardText>
|
|
||||||
<Table>
|
|
||||||
<TableHeader>
|
|
||||||
<TableRow>
|
|
||||||
<TableHeaderCell>Имя</TableHeaderCell>
|
|
||||||
<TableHeaderCell>Адрес</TableHeaderCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
@foreach (var item in _list_dev)
|
|
||||||
{
|
|
||||||
<TableRow>
|
|
||||||
<TableRowCell>@item.Name</TableRowCell>
|
|
||||||
<TableRowCell>@item.Ip</TableRowCell>
|
|
||||||
</TableRow>
|
|
||||||
}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
</StepPanel>
|
|
||||||
<StepPanel Name="4">
|
|
||||||
<Row>
|
|
||||||
<CardDeck>
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardTitle TextAlignment="TextAlignment.Center">
|
|
||||||
ОБЪЕКТЫ
|
|
||||||
</CardTitle>
|
|
||||||
<CardText>
|
|
||||||
Объектов к добавлению - @_list_obj.Count
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardTitle TextAlignment="TextAlignment.Center">
|
|
||||||
ТИПЫ УСТРОЙСТВ
|
|
||||||
</CardTitle>
|
|
||||||
<CardText>
|
|
||||||
Типов к добавлению - @_list_type.Count
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
<Card>
|
|
||||||
<CardBody>
|
|
||||||
<CardTitle TextAlignment="TextAlignment.Center">
|
|
||||||
УСТРОЙСТВА
|
|
||||||
</CardTitle>
|
|
||||||
<CardText>
|
|
||||||
Устройств к добавлению - @_list_dev.Count
|
|
||||||
из них коммутаторов - @_list_switch.Count
|
|
||||||
</CardText>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</CardDeck>
|
|
||||||
</Row>
|
|
||||||
</StepPanel>
|
|
||||||
</Content>
|
|
||||||
</Steps>
|
|
||||||
<Div Flex="Flex.JustifyContent.Center">
|
|
||||||
<Button Color="Color.Secondary" Margin="Margin.Is2.FromEnd" Clicked="() => stepsRef.PreviousStep()">
|
|
||||||
Назад
|
|
||||||
</Button>
|
|
||||||
<Button Color="Color.Primary" Clicked="clickSave">
|
|
||||||
@nextButton
|
|
||||||
</Button>
|
|
||||||
</Div>
|
|
||||||
</LoadingIndicator>
|
|
||||||
|
|
||||||
<Progress Visibility="@visibleProgress" Indeterminate />
|
|
||||||
|
|
||||||
@code {
|
|
||||||
bool visible, toastError = false;
|
|
||||||
|
|
||||||
Visibility visibleProgress = Visibility.Invisible;
|
|
||||||
|
|
||||||
private Steps stepsRef;
|
|
||||||
private ObjectItems obj_item;
|
|
||||||
private DeviceTypeItems type_item;
|
|
||||||
private DeviceItems dev_item;
|
|
||||||
|
|
||||||
private List<ObjectItems> list_obj = new(), _list_obj = new();
|
|
||||||
private List<DeviceTypeItems> list_type = new(), _list_type = new();
|
|
||||||
private static List<DeviceItems> list_dev = new(), _list_dev = new();
|
|
||||||
private List<DeviceItems> _list_switch = new();
|
|
||||||
|
|
||||||
private string email, nextButton = "Далее";
|
|
||||||
private string selectedStep = "1";
|
|
||||||
|
|
||||||
private Guid id_type, id_obj, id_dev;
|
|
||||||
private int num_port;
|
|
||||||
private string obj_name, obj_desc;
|
|
||||||
private string type_name, type_desc;
|
|
||||||
private string error_msg, error_group;
|
|
||||||
private string dev_ip, dev_mac, dev_desc, dev_name, dev_loc;
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
visible = true;
|
|
||||||
_list_type = AllPubData.ListDeviceTypeItems;
|
|
||||||
_list_obj = AllPubData.ListObjectItems;
|
|
||||||
_list_dev = AllPubData.ListDeviceItems;
|
|
||||||
visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private Task<bool> NavigationAllowed(StepNavigationContext context)
|
|
||||||
{
|
|
||||||
if (context.CurrentStepIndex == 3 && context.NextStepIndex == 4)
|
|
||||||
{
|
|
||||||
nextButton = "Сохранить";
|
|
||||||
//return Task.FromResult(true);
|
|
||||||
}
|
|
||||||
if (context.CurrentStepIndex == 4 && context.NextStepIndex > 4)
|
|
||||||
{
|
|
||||||
//return Task.FromResult(false);
|
|
||||||
}
|
|
||||||
if (context.CurrentStepIndex == 4 && context.NextStepIndex < 4)
|
|
||||||
{
|
|
||||||
nextButton = "Далее";
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.FromResult(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void AddNewObject()
|
|
||||||
{
|
|
||||||
if (obj_name == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
obj_item = new()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
NameObject = obj_name,
|
|
||||||
DescriptionObject = obj_desc,
|
|
||||||
};
|
|
||||||
_list_obj.Add(obj_item);
|
|
||||||
obj_name = string.Empty;
|
|
||||||
obj_desc = string.Empty;
|
|
||||||
}
|
|
||||||
private async void AddNewType()
|
|
||||||
{
|
|
||||||
if (type_name == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
type_item = new()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Name = type_name,
|
|
||||||
Description = type_desc,
|
|
||||||
};
|
|
||||||
_list_type.Add(type_item);
|
|
||||||
type_name = string.Empty;
|
|
||||||
type_desc = string.Empty;
|
|
||||||
}
|
|
||||||
private async void AddNewDev()
|
|
||||||
{
|
|
||||||
if (dev_ip == null || dev_mac == null || dev_name == null) return;
|
|
||||||
|
|
||||||
dev_item = new()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Ip = dev_ip,
|
|
||||||
Mac = dev_mac,
|
|
||||||
Description = dev_desc,
|
|
||||||
Name = dev_name,
|
|
||||||
Location = dev_loc,
|
|
||||||
ListDevices = null,
|
|
||||||
DeviceType = _list_type.Single(t => t.Id == id_type).Id,
|
|
||||||
DeviceObject = _list_obj.Single(o => o.Id == id_obj).Id,
|
|
||||||
ConnectedToPortOnSwitch = num_port
|
|
||||||
};
|
|
||||||
_list_dev.Add(dev_item);
|
|
||||||
if (list_type.First(d => d.Id == dev_item.DeviceType).Name.Contains("Switch")) _list_switch.Add(dev_item);
|
|
||||||
dev_ip = string.Empty;
|
|
||||||
dev_mac = string.Empty;
|
|
||||||
dev_desc = string.Empty;
|
|
||||||
dev_name = string.Empty;
|
|
||||||
dev_loc = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void clickSave()
|
|
||||||
{
|
|
||||||
if (nextButton == "Далее") await stepsRef.NextStep();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
visibleProgress = Visibility.Visible;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await Task.Run(async () =>
|
|
||||||
{
|
|
||||||
foreach (var item in _list_obj)
|
|
||||||
{
|
|
||||||
var p = await AllPubData.http.PostAsJsonAsync("api/Object/AddObject", item);
|
|
||||||
if (!p.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
error_group = "ОБЪЕКТ";
|
|
||||||
error_msg = $"{item.NameObject} не добавлено.\r\nСтатус код: {p.StatusCode}";
|
|
||||||
toastError = true;
|
|
||||||
//await Task.Delay(500);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (var item in _list_type)
|
|
||||||
{
|
|
||||||
var p = await AllPubData.http.PostAsJsonAsync("api/Type/AddType", item);
|
|
||||||
if (!p.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
error_group = "ТИП";
|
|
||||||
error_msg = $"{item.Name} не добавлено.\r\nСтатус код: {p.StatusCode}";
|
|
||||||
toastError = true;
|
|
||||||
//await Task.Delay(500);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (var item in _list_dev)
|
|
||||||
{
|
|
||||||
var p = await AllPubData.http.PostAsJsonAsync("api/Device/AddDevice", item);
|
|
||||||
if (!p.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
error_group = "УСТРОЙСТВА";
|
|
||||||
error_msg = $"{item.Name} не добавлено.\r\nСтатус код: {p.StatusCode}";
|
|
||||||
toastError = true;
|
|
||||||
//await Task.Delay(500);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
error_group = "ПРОЦЕСС";
|
|
||||||
error_msg = $"Во время добавления произошел сбой.";
|
|
||||||
toastError = true;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
visibleProgress = Visibility.Invisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetCurrentObject()
|
|
||||||
{
|
|
||||||
_list_obj = AllPubData.ListObjectItems;
|
|
||||||
_list_type = AllPubData.ListDeviceTypeItems;
|
|
||||||
_list_dev = AllPubData.ListDeviceItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddOnFile()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
///TODO: Добавить возможность загрузить из файла
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
@page "/simple-datagrid"
|
|
||||||
<DataGrid TItem="Book"
|
|
||||||
Data="data"
|
|
||||||
Editable
|
|
||||||
Sortable
|
|
||||||
SortMode="DataGridSortMode.Single"
|
|
||||||
ShowPager
|
|
||||||
ShowPageSizes
|
|
||||||
Resizable
|
|
||||||
Responsive
|
|
||||||
Bordered
|
|
||||||
Hoverable
|
|
||||||
Narrow
|
|
||||||
Groupable
|
|
||||||
ShowGrouping
|
|
||||||
ResizeMode="TableResizeMode.Columns"
|
|
||||||
NewItemCreator="() => new Book(string.Empty, string.Empty, string.Empty, DateOnly.MinValue, string.Empty)">
|
|
||||||
<DataGridColumns>
|
|
||||||
<DataGridColumn Field="@nameof(Book.Title)" Caption="Title" Editable></DataGridColumn>
|
|
||||||
<DataGridColumn Field="@nameof(Book.Author)" Caption="Author" Editable Groupable></DataGridColumn>
|
|
||||||
<DataGridColumn Field="@nameof(Book.Isbn)" Caption="Isbn" Editable></DataGridColumn>
|
|
||||||
<DataGridColumn Field="@nameof(Book.PublicationDate)" Caption="Publication Date" Editable></DataGridColumn>
|
|
||||||
<DataGridColumn Field="@nameof(Book.Publisher)" Caption="Publisher" Editable></DataGridColumn>
|
|
||||||
<DataGridCommandColumn PreventRowClick>
|
|
||||||
<NewCommandTemplate>
|
|
||||||
<Button Color="Color.Success" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</NewCommandTemplate>
|
|
||||||
<EditCommandTemplate>
|
|
||||||
<Button Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</EditCommandTemplate>
|
|
||||||
<SaveCommandTemplate>
|
|
||||||
<Button Type="ButtonType.Submit" PreventDefaultOnSubmit Color="Color.Primary" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</SaveCommandTemplate>
|
|
||||||
<DeleteCommandTemplate>
|
|
||||||
<Button Color="Color.Danger" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</DeleteCommandTemplate>
|
|
||||||
<CancelCommandTemplate>
|
|
||||||
<Button Color="Color.Secondary" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</CancelCommandTemplate>
|
|
||||||
<ClearFilterCommandTemplate>
|
|
||||||
<Button Color="Color.Warning" Clicked="@context.Clicked">@context.LocalizationString</Button>
|
|
||||||
</ClearFilterCommandTemplate>
|
|
||||||
</DataGridCommandColumn>
|
|
||||||
</DataGridColumns>
|
|
||||||
</DataGrid>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
private List<Book> data = new()
|
|
||||||
{
|
|
||||||
new("Harry Potter and the Sorcerer's Stone", "J.K. Rowling","9780590353427", new(1997,6,26), "Scholastic Press" ),
|
|
||||||
new("To Kill a Mockingbird", "Harper Lee", "9780061120084", new(1960,7,11), "J.B. Lippincott & Co." ),
|
|
||||||
new("The Catcher in the Rye", "J.D. Salinger","9780316769488", new(1951,7,16), "Little, Brown and Company" ),
|
|
||||||
new("The Great Gatsby", "F. Scott Fitzgerald","9780743273565", new(1925,4,10), "Charles Scribner's Sons" ),
|
|
||||||
new("The Lord of the Rings", "J.R.R. Tolkien", "9780544003415", new(1954,7,29), "George Allen & Unwin"),
|
|
||||||
new("The Hobbit", "J.R.R. Tolkien", "9780547928227", new(1937,9,21), "George Allen & Unwin"),
|
|
||||||
new("The Chronicles of Narnia: The Lion, the Witch, and the Wardrobe", "C.S. Lewis", "9780064471073", new(1950,10,16), "Geoffrey Bles"),
|
|
||||||
new("Animal Farm", "George Orwell", "978451219811", new(1945,8,17), "Secker & Warburg"),
|
|
||||||
new("The Adventures of Huckleberry Finn", "Mark Twain", "9780142437254", new(1884,12,10), "Chatto & Windus"),
|
|
||||||
new("The Diary of a Young Girl", "Anne Frank", "9780385473788", new(1947,6,25), "Doubleday"),
|
|
||||||
new("The Hunger Games", "Suzanne Collins", "9780439023481", new(2008,9,14), "Scholastic Press"),
|
|
||||||
new("The Maze Runner", "James Dashner", "9780385737965", new(2009,10,6), "Delacorte Press"),
|
|
||||||
new("The Secret Life of Bees", "Sue Monk Kidd", "9780670034852", new(2002,5,5), "Viking Press"),
|
|
||||||
new("The Strange Case of Dr. Jekyll and Mr. Hyde", "Robert Louis Stevenson", "9781593080171", new(1886,1,5), "Longmans, Green and Co"),
|
|
||||||
new("Harry Potter and the Chamber of Secrets", "J.K. Rowling", "9780439064866", new(1998,7,2), "Scholastic Press"),
|
|
||||||
new("Harry Potter and the Prisoner of Azkaban", "J.K. Rowling", "9780439136365", new(1999,7,8), "Scholastic Press"),
|
|
||||||
new("Catching Fire", "Suzanne Collins", "9780439023498", new(2009,9,1), "Scholastic Press"),
|
|
||||||
new("Mockingjay", "Suzanne Collins", "9780439023528", new(2010,8,24), "Scholastic Press"),
|
|
||||||
new("The Children of Hurin", "J.R.R. Tolkien", "9780544003422", new(2007,4,17), "Houghton Mifflin Harcourt"),
|
|
||||||
new("Beren and Luthien", "J.R.R. Tolkien", "9780544116813", new(2017,5,23), "Houghton Mifflin Harcourt")
|
|
||||||
};
|
|
||||||
|
|
||||||
private record Book( string Title, string Author, string Isbn, DateOnly PublicationDate, string Publisher );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
@page "/simple-form"
|
|
||||||
<Row>
|
|
||||||
<Column ColumnSize="ColumnSize.Is6.OnDesktop">
|
|
||||||
<Card Margin="Margin.Is4.FromBottom">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle>Basic Example</CardTitle>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody>
|
|
||||||
<Validations @ref="validationsBasicExampleRef" Mode="ValidationMode.Auto" ValidateOnLoad="false">
|
|
||||||
<Validation Validator="@ValidationRule.IsEmail">
|
|
||||||
<Field>
|
|
||||||
<FieldLabel>Email address</FieldLabel>
|
|
||||||
<TextInput Placeholder="Enter email" />
|
|
||||||
<FieldHelp>We'll never share your email with anyone else.</FieldHelp>
|
|
||||||
</Field>
|
|
||||||
</Validation>
|
|
||||||
<Validation Validator="@ValidatePassword">
|
|
||||||
<Field>
|
|
||||||
<FieldLabel>Password</FieldLabel>
|
|
||||||
<TextInput Role="TextRole.Password" Placeholder="Password" />
|
|
||||||
</Field>
|
|
||||||
</Validation>
|
|
||||||
|
|
||||||
<Field>
|
|
||||||
<Check TValue="bool">Remember me?</Check>
|
|
||||||
</Field>
|
|
||||||
<Button Color="Color.Primary" Clicked="SubmitBasicExample">Submit</Button>
|
|
||||||
</Validations>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
<Column ColumnSize="ColumnSize.Is6.OnDesktop">
|
|
||||||
<Card Margin="Margin.Is4.FromBottom">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle>Horizontal Form</CardTitle>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody>
|
|
||||||
<Validations @ref="validationsHorizontalFormRef" Mode="ValidationMode.Auto" ValidateOnLoad="false">
|
|
||||||
<Validation Validator="@ValidationRule.IsEmail">
|
|
||||||
<Field Horizontal>
|
|
||||||
<FieldLabel ColumnSize="ColumnSize.IsFull.OnTablet.Is3.OnDesktop">Email address</FieldLabel>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.IsFull.OnTablet.Is9.OnDesktop">
|
|
||||||
<TextInput Placeholder="Email" />
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</Validation>
|
|
||||||
<Validation Validator="@ValidatePassword">
|
|
||||||
<Field Horizontal>
|
|
||||||
<FieldLabel ColumnSize="ColumnSize.IsFull.OnTablet.Is3.OnDesktop">Password</FieldLabel>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.IsFull.OnTablet.Is9.OnDesktop">
|
|
||||||
<TextInput Role="TextRole.Password" Placeholder="Password" @bind-Value="@password" />
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</Validation>
|
|
||||||
<Validation Validator="@ValidatePassword2">
|
|
||||||
<Field Horizontal>
|
|
||||||
<FieldLabel ColumnSize="ColumnSize.IsFull.OnTablet.Is3.OnDesktop">Re Password</FieldLabel>
|
|
||||||
<FieldBody ColumnSize="ColumnSize.IsFull.OnTablet.Is9.OnDesktop">
|
|
||||||
<TextInput Role="TextRole.Password" Placeholder="Retype password" />
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</Validation>
|
|
||||||
<Field Horizontal JustifyContent="JustifyContent.End">
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is9.Is3.WithOffset">
|
|
||||||
<Check TValue="bool">Remember me?</Check>
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
<Field Horizontal JustifyContent="JustifyContent.End">
|
|
||||||
<FieldBody ColumnSize="ColumnSize.Is9.Is3.WithOffset">
|
|
||||||
<Button Color="Color.Primary" Clicked="SubmitHorizontalForm">Submit</Button>
|
|
||||||
</FieldBody>
|
|
||||||
</Field>
|
|
||||||
</Validations>
|
|
||||||
</CardBody>
|
|
||||||
</Card>
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
@code {
|
|
||||||
Validations? validationsBasicExampleRef;
|
|
||||||
Validations? validationsHorizontalFormRef;
|
|
||||||
string? password;
|
|
||||||
|
|
||||||
void ValidatePassword( ValidatorEventArgs e )
|
|
||||||
{
|
|
||||||
e.Status = Convert.ToString( e.Value )?.Length >= 6 ? ValidationStatus.Success : ValidationStatus.Error;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ValidatePassword2( ValidatorEventArgs e )
|
|
||||||
{
|
|
||||||
var password2 = Convert.ToString( e.Value );
|
|
||||||
|
|
||||||
if ( password2?.Length < 6 )
|
|
||||||
{
|
|
||||||
e.Status = ValidationStatus.Error;
|
|
||||||
e.ErrorText = "Password must be at least 6 characters long!";
|
|
||||||
}
|
|
||||||
else if ( password2 != password )
|
|
||||||
{
|
|
||||||
e.Status = ValidationStatus.Error;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
e.Status = ValidationStatus.Success;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async Task SubmitBasicExample()
|
|
||||||
{
|
|
||||||
if ( await validationsBasicExampleRef!.ValidateAll() )
|
|
||||||
{
|
|
||||||
await validationsBasicExampleRef.ClearAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async Task SubmitHorizontalForm()
|
|
||||||
{
|
|
||||||
if ( await validationsHorizontalFormRef!.ValidateAll() )
|
|
||||||
{
|
|
||||||
await validationsHorizontalFormRef.ClearAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
@page "/"
|
|
||||||
@namespace Visor.Pages
|
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
|
||||||
@{
|
|
||||||
Layout = "_Layout";
|
|
||||||
}
|
|
||||||
|
|
||||||
<component type="typeof(App)" render-mode="Server" />
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
@using Microsoft.AspNetCore.Components.Web
|
|
||||||
@namespace Visor.Pages
|
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Visor</title>
|
|
||||||
|
|
||||||
<base href="~/" />
|
|
||||||
|
|
||||||
<component type="typeof(HeadOutlet)" render-mode="Server" />
|
|
||||||
|
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
|
|
||||||
<link href="_content/Blazorise.Icons.FontAwesome/v6/css/all.min.css" rel="stylesheet">
|
|
||||||
|
|
||||||
<link href="_content/Blazorise/blazorise.min.css?v=2.2.1.0" rel="stylesheet" />
|
|
||||||
<link href="_content/Blazorise.Bootstrap5/blazorise.bootstrap5.min.css?v=2.2.1.0" rel="stylesheet" />
|
|
||||||
|
|
||||||
<link href="Visor.Styles.css" rel="stylesheet" />
|
|
||||||
<link rel="stylesheet" href="css/blazor-ui.css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
@RenderBody()
|
|
||||||
|
|
||||||
<script src="_framework/blazor.server.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
using Blazorise.Bootstrap5;
|
|
||||||
using Blazorise.Icons.FontAwesome;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
// Add services to the container.
|
|
||||||
builder.Services.AddRazorPages();
|
|
||||||
builder.Services.AddServerSideBlazor();
|
|
||||||
|
|
||||||
AddBlazorise(builder.Services);
|
|
||||||
|
|
||||||
var app = builder.Build();
|
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
|
||||||
if (!app.Environment.IsDevelopment())
|
|
||||||
{
|
|
||||||
app.UseExceptionHandler("/Error");
|
|
||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
|
||||||
app.UseHsts();
|
|
||||||
}
|
|
||||||
|
|
||||||
app.UseHttpsRedirection();
|
|
||||||
|
|
||||||
app.UseStaticFiles();
|
|
||||||
|
|
||||||
app.UseRouting();
|
|
||||||
|
|
||||||
app.MapBlazorHub();
|
|
||||||
app.MapFallbackToPage("/_Host");
|
|
||||||
|
|
||||||
app.Run();
|
|
||||||
|
|
||||||
|
|
||||||
void AddBlazorise(IServiceCollection services)
|
|
||||||
{
|
|
||||||
services
|
|
||||||
.AddBlazorise();
|
|
||||||
services
|
|
||||||
.AddBootstrap5Providers()
|
|
||||||
.AddFontAwesomeIcons();
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "http://localhost:61646",
|
|
||||||
"sslPort": 44332
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
|
||||||
"Visor": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": false,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"applicationUrl": "https://localhost:7297;http://localhost:5255",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"IIS Express": {
|
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Version>2.2.1</Version>
|
|
||||||
<Authors>Megabit</Authors>
|
|
||||||
<Company>Megabit</Company>
|
|
||||||
<Description>
|
|
||||||
This is a Blazorise Template for a Blazor Server Application.
|
|
||||||
Blazorise is a component library built on top of Blazor and CSS frameworks like Bootstrap, FluentUI2, Tailwind, Bulma and Material.
|
|
||||||
</Description>
|
|
||||||
<Copyright>Copyright 2018-2026 Megabit</Copyright>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Remove=".mcp.json" />
|
|
||||||
<None Include=".mcp.json" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Blazorise" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.Bootstrap5" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.DataGrid" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.LoadingIndicator" Version="2.2.1" />
|
|
||||||
<PackageReference Include="Blazorise.SpinKit" Version="2.2.1" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
@using System.Net.Http
|
|
||||||
@using Microsoft.AspNetCore.Authorization
|
|
||||||
@using Microsoft.AspNetCore.Components.Authorization
|
|
||||||
@using Microsoft.AspNetCore.Components.Forms
|
|
||||||
@using Microsoft.AspNetCore.Components.Routing
|
|
||||||
@using Microsoft.AspNetCore.Components.Web
|
|
||||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
|
||||||
@using Microsoft.JSInterop
|
|
||||||
|
|
||||||
@using Visor
|
|
||||||
@using Blazorise
|
|
||||||
@using Blazorise.SpinKit
|
|
||||||
@using Blazorise.LoadingIndicator
|
|
||||||
@using Blazorise.DataGrid
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"DetailedErrors": true,
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AllowedHosts": "*"
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,28 +0,0 @@
|
|||||||
#blazor-error-ui {
|
|
||||||
background: #ffffe0;
|
|
||||||
bottom: 0;
|
|
||||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, .2);
|
|
||||||
display: none;
|
|
||||||
left: 0;
|
|
||||||
padding: .6rem 1.25rem .7rem 1.25rem;
|
|
||||||
position: fixed;
|
|
||||||
right: 0;
|
|
||||||
z-index: 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
#blazor-error-ui .dismiss {
|
|
||||||
cursor: pointer;
|
|
||||||
position: absolute;
|
|
||||||
right: .75rem;
|
|
||||||
top: .5rem
|
|
||||||
}
|
|
||||||
|
|
||||||
.blazor-error-boundary {
|
|
||||||
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
|
|
||||||
padding: 1rem 1rem 1rem 3.7rem;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blazor-error-boundary::after {
|
|
||||||
content: "An error has occurred."
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 8.8 KiB |
@@ -7,7 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.3" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -10,14 +10,13 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="10.8.0" />
|
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.9.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="10.8.0" />
|
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="9.5.0" />
|
||||||
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.16.0" />
|
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
|
||||||
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.16.0" />
|
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
|
||||||
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.16.0" />
|
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
|
||||||
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.16.0" />
|
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.9.0" />
|
||||||
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.16.0" />
|
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.9.0" />
|
||||||
<PackageReference Include="SQLitePCLRaw.lib.e_sqlite3" Version="3.53.3" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
+2
-1
@@ -2,7 +2,6 @@
|
|||||||
<Folder Name="/LC/">
|
<Folder Name="/LC/">
|
||||||
<Project Path="Ministreliy/Ministreliy.csproj" Id="ffd1e86c-d678-413c-a0fd-dd75b4ec1b2e" />
|
<Project Path="Ministreliy/Ministreliy.csproj" Id="ffd1e86c-d678-413c-a0fd-dd75b4ec1b2e" />
|
||||||
<Project Path="Strela/Strela.csproj" />
|
<Project Path="Strela/Strela.csproj" />
|
||||||
<Project Path="Visor/Visor/Visor.csproj" Id="6216dfd5-6fb1-4085-a72a-0afec7ee86c2" />
|
|
||||||
</Folder>
|
</Folder>
|
||||||
<Folder Name="/Zabbix/">
|
<Folder Name="/Zabbix/">
|
||||||
<Project Path="GenerateYAMLforZabbix/GenerateYAMLforZabbix.csproj" Id="b1c151d7-8be1-45e7-92f3-8420eb873b16" />
|
<Project Path="GenerateYAMLforZabbix/GenerateYAMLforZabbix.csproj" Id="b1c151d7-8be1-45e7-92f3-8420eb873b16" />
|
||||||
@@ -17,6 +16,7 @@
|
|||||||
<Project Path="ChekTimeDahua/ChekTimeDahua.csproj" Id="e570bdbe-62ad-476b-b36c-5f6ecf3028b1" />
|
<Project Path="ChekTimeDahua/ChekTimeDahua.csproj" Id="e570bdbe-62ad-476b-b36c-5f6ecf3028b1" />
|
||||||
<Project Path="DahuaIPCRename/DahuaIPCRename.csproj" Id="1e5671da-7b44-4818-8942-d73d2148c853" />
|
<Project Path="DahuaIPCRename/DahuaIPCRename.csproj" Id="1e5671da-7b44-4818-8942-d73d2148c853" />
|
||||||
<Project Path="LC_AddCheckToDb/LC_AddCheckToDb.csproj" />
|
<Project Path="LC_AddCheckToDb/LC_AddCheckToDb.csproj" />
|
||||||
|
<Project Path="LC_Api/LC_Api.csproj" />
|
||||||
<Project Path="LC_Bot/LC_Bot.csproj" />
|
<Project Path="LC_Bot/LC_Bot.csproj" />
|
||||||
<Project Path="LC_ConfigCamer/LC_ConfigCamer.csproj" Id="a07ea5c9-9e54-4455-a8ff-2f8d6dad7ed1" />
|
<Project Path="LC_ConfigCamer/LC_ConfigCamer.csproj" Id="a07ea5c9-9e54-4455-a8ff-2f8d6dad7ed1" />
|
||||||
<Project Path="LC_Error/LC_Error.csproj" Id="84dfc2ef-9a72-434e-a5fa-0e02f2bdcd16" />
|
<Project Path="LC_Error/LC_Error.csproj" Id="84dfc2ef-9a72-434e-a5fa-0e02f2bdcd16" />
|
||||||
@@ -25,5 +25,6 @@
|
|||||||
<Project Path="SettingSNMPDahua/SettingSNMPDahua.csproj" Id="6a5aeee0-a683-473f-87b7-2815c2144027" />
|
<Project Path="SettingSNMPDahua/SettingSNMPDahua.csproj" Id="6a5aeee0-a683-473f-87b7-2815c2144027" />
|
||||||
<Project Path="SetVideoDataHikvision/SetVideoDataHikvision.csproj" Id="c4e10081-462c-4be5-9f58-9e1926325c9d" />
|
<Project Path="SetVideoDataHikvision/SetVideoDataHikvision.csproj" Id="c4e10081-462c-4be5-9f58-9e1926325c9d" />
|
||||||
<Project Path="SwitchDahua/SwitchDahua.csproj" Id="12504b58-758f-444b-a79b-4ce2db8398cc" />
|
<Project Path="SwitchDahua/SwitchDahua.csproj" Id="12504b58-758f-444b-a79b-4ce2db8398cc" />
|
||||||
|
<Project Path="Web/Web.csproj" />
|
||||||
<Project Path="Wiking/Wiking.csproj" Id="fa0eb4bd-8bfb-4873-bb71-1c2a608ab911" />
|
<Project Path="Wiking/Wiking.csproj" Id="fa0eb4bd-8bfb-4873-bb71-1c2a608ab911" />
|
||||||
</Solution>
|
</Solution>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
Reference in New Issue
Block a user