This commit is contained in:
2025-07-30 12:06:32 +02:00
parent f24e02c8b4
commit 8435fbfdae
4 changed files with 167 additions and 56 deletions

View File

@@ -25,7 +25,7 @@ public class Server
public int CpuCores { get; set; } = 0;
public string? GpuType { get; set; } = string.Empty;
public double RamSize { get; set; } = 0;
public string? DiskSpace { get; set; } = string.Empty;
// Database
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;

View File

@@ -28,6 +28,7 @@ public class ServerDetailsViewModel
public int CpuCores { get; set; } = 0;
public string? GpuType { get; set; } = string.Empty;
public double RamSize { get; set; } = 0;
public string? DiskSpace { get; set; } = string.Empty;
// Database
@@ -38,4 +39,16 @@ public class ServerDetailsViewModel
public DateTime LastSeen { get; set; }
public Boolean IsVerified { get; set; } = false;
// Display Properties for View
public string DisplayCpuType => !string.IsNullOrWhiteSpace(CpuType) ? CpuType : "-";
public string DisplayCpuCores => CpuCores > 0 ? CpuCores.ToString() : "-";
public string DisplayGpuType => !string.IsNullOrWhiteSpace(GpuType) ? GpuType : "-";
public string DisplayRamSize => RamSize > 0 ? $"{RamSize} GB" : "-";
//public string DisplayDiskSpace => !string.IsNullOrWhiteSpace(DiskSpace) ? DiskSpace : "-";
public string DisplayCreatedAt => CreatedAt.ToLocalTime().ToString("dd.MM.yyyy HH:mm");
public string DisplayLastSeen => LastSeen.ToLocalTime().ToString("dd.MM.yyyy HH:mm");
public string StatusBadgeClass => IsOnline ? "bg-success" : "bg-danger";
public string StatusIcon => IsOnline ? "bi-check-circle" : "bi-x-circle";
public string StatusText => IsOnline ? "Online" : "Offline";
}

View File

@@ -4,54 +4,93 @@
<div class="row g-4">
@foreach (var s in Model)
{
<div class="col-12 col-sm-6">
<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 border-secondary shadow-sm">
<div class="card-body d-flex flex-column gap-3">
<!-- Header mit Name und Status -->
<div class="d-flex justify-content-between align-items-center mb-3">
<h5 class="card-title text-dark mb-0">
<i class="bi bi-pc-display me-2 text-muted"></i>(#@s.Id) @s.Name
<i class="bi bi-server me-2 text-primary"></i>(#@s.Id) @s.Name
</h5>
<span class="badge
@(s.IsOnline ? "bg-success text-light" : "bg-danger text-light")">
<span class="badge @(s.IsOnline ? "bg-success" : "bg-danger")">
<i class="bi @(s.IsOnline ? "bi-check-circle" : "bi-x-circle") me-1"></i>
@(s.IsOnline ? "Online" : "Offline")
</span>
</div>
<!-- Server Details -->
<div class="row mb-3">
<div class="col-md-5 text-muted small">
<div><i class="bi bi-globe me-1"></i><strong>IP:</strong> @s.IPAddress</div>
<div><i class="bi bi-pc-display me-1"></i><strong>Typ:</strong> @s.Type</div>
<div><i class="bi bi-calendar-check me-1"></i><strong>Erstellt:</strong> @s.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy HH:mm")</div>
<div><i class="bi bi-clock me-1"></i><strong>Last-Seen:</strong> @s.LastSeen.ToLocalTime().ToString("dd.MM.yyyy HH:mm")</div>
<div><i class="bi bi-cpu me-1"></i><strong>CPU:</strong> @(s.CpuType ?? "not found") </div>
<div><i class="bi bi-cpu me-1"></i><strong>CPU-Kerne: </strong> @s.CpuCores </div>
<div><i class="bi bi-gpu-card me-1"></i><strong>GPU:</strong> @(s.GpuType ?? "not found") </div>
<div><i class="bi bi-memory me-1"></i><strong>RAM:</strong> @(s.RamSize) </div>
<div><i class="bi bi-hdd me-1"></i><strong>Disk Space:</strong> ... </div>
<div class="col-md-6 text-muted small">
<!-- Netzwerk -->
<div class="mb-2">
<i class="bi bi-globe me-1"></i>
<strong>IP:</strong> @s.IPAddress
</div>
<!-- Typ -->
<div class="mb-2">
<i class="bi bi-tag me-1"></i>
<strong>Typ:</strong> @s.Type
</div>
<!-- Zeiten -->
<div class="mb-2">
<i class="bi bi-calendar me-1"></i>
<strong>Erstellt:</strong> @s.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy")
</div>
<div class="mb-2">
<i class="bi bi-clock-history me-1"></i>
<strong>Last Seen:</strong> @s.LastSeen.ToLocalTime().ToString("HH:mm")
</div>
</div>
<div class="d-flex flex-wrap gap-2">
<div class="col-md-6 text-muted small">
<!-- Hardware -->
<div class="mb-2">
<i class="bi bi-cpu me-1"></i>
<strong>CPU:</strong> @(!string.IsNullOrEmpty(s.CpuType) ? s.CpuType : "-")
</div>
<a asp-action="EditServer" asp-route-id="@s.Id" class="btn btn-outline-primary">
<i class="bi bi-pencil-square me-1"></i> Bearbeiten
<div class="mb-2">
<i class="bi bi-cpu me-1"></i>
<strong>Kerne:</strong> @(s.CpuCores > 0 ? s.CpuCores.ToString() : "-")
</div>
<div class="mb-2">
<i class="bi bi-gpu-card me-1"></i>
<strong>GPU:</strong> @(!string.IsNullOrEmpty(s.GpuType) ? s.GpuType : "-")
</div>
<div class="mb-2">
<i class="bi bi-memory me-1"></i>
<strong>RAM:</strong> @(s.RamSize > 0 ? $"{s.RamSize} GB" : "-")
</div>
<div class="mb-2">
<i class="bi bi-hdd me-1"></i>
<strong>Disk:</strong> @(!string.IsNullOrEmpty(s.DiskSpace) ? s.DiskSpace : "-")
</div>
</div>
</div>
<!-- Action Buttons -->
<div class="d-flex flex-wrap gap-2 mt-auto">
<a asp-action="Details" asp-route-id="@s.Id" class="btn btn-sm btn-outline-primary flex-grow-1">
<i class="bi bi-info-circle me-1"></i> Details
</a>
<a asp-asp-controller="Server" asp-action="Details" asp-route-id="@s.Id" class="btn btn-outline-primary">
<i class="bi bi-bar-chart-fill me-1"></i> Metrics
<a asp-action="EditServer" asp-route-id="@s.Id"
class="btn btn-sm btn-outline-secondary flex-grow-1">
<i class="bi bi-pencil me-1"></i> Bearbeiten
</a>
<a asp-asp-controller="Container" asp-action="Overview" asp-route-id="@s.Id" class="btn btn-outline-primary">
<i class="bi bi-box-fill me-1"></i> Container
</a>
<form asp-action="Delete" asp-route-id="@s.Id" method="post" onsubmit="return confirm('Diesen Server wirklich löschen?');" class="m-0">
<button type="submit" class="btn btn-outline-danger">
<form asp-action="Delete" asp-route-id="@s.Id" method="post"
onsubmit="return confirm('Server @s.Name wirklich löschen?');" class="flex-grow-1">
<button type="submit" class="btn btn-sm btn-outline-danger w-100">
<i class="bi bi-trash me-1"></i> Löschen
</button>
</form>
</div>
</div>
</div>
@@ -59,3 +98,19 @@
}
</div>
</div>
<style>
.card {
transition: transform 0.2s, box-shadow 0.2s;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
}
.badge {
font-size: 0.8rem;
padding: 0.35em 0.65em;
}
</style>

View File

@@ -2,42 +2,85 @@
<div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">
<i class="bi bi-hdd-network me-2 text-primary"></i>Serverdetails: @Model.Name
<i class="bi bi-server me-2 text-primary"></i>Serverdetails: @Model.Name
</h5>
<span class="badge @(Model.IsOnline ? "bg-success" : "bg-danger")">
<i class="bi @(Model.IsOnline ? "bi-check-circle" : "bi-x-circle") me-1"></i>
@(Model.IsOnline ? "Online" : "Offline")
<span class="badge @Model.StatusBadgeClass">
<i class="bi @Model.StatusIcon me-1"></i>
@Model.StatusText
</span>
</div>
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-3">ID</dt>
<dd class="col-sm-9">@Model.Id</dd>
<div class="row">
<!-- System Information -->
<div class="col-md-6">
<h6><i class="bi bi-info-circle me-2"></i>Systeminformationen</h6>
<dl class="row">
<dt class="col-sm-4">ID</dt>
<dd class="col-sm-8">@Model.Id</dd>
<dt class="col-sm-3">IP-Adresse</dt>
<dd class="col-sm-9">@Model.IPAddress</dd>
<dt class="col-sm-4">IP-Adresse</dt>
<dd class="col-sm-8">@Model.IPAddress</dd>
<dt class="col-sm-3">Typ</dt>
<dd class="col-sm-9">@Model.Type</dd>
<dt class="col-sm-4">Typ</dt>
<dd class="col-sm-8">@Model.Type</dd>
<dt class="col-sm-3">Erstellt am</dt>
<dd class="col-sm-9">@Model.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy HH:mm")</dd>
<dt class="col-sm-4">Erstellt am</dt>
<dd class="col-sm-8">@Model.DisplayCreatedAt</dd>
<dt class="col-sm-3">Zuletzt gesehen</dt>
<dd class="col-sm-9">@Model.LastSeen.ToLocalTime().ToString("dd.MM.yyyy HH:mm")</dd>
<dt class="col-sm-4">Zuletzt online</dt>
<dd class="col-sm-8">@Model.DisplayLastSeen</dd>
</dl>
</div>
<div class="card-footer text-end">
<!-- Hardware Information -->
<div class="col-md-6">
<h6><i class="bi bi-cpu me-2"></i>Hardwareinformationen</h6>
<dl class="row">
<dt class="col-sm-4">CPU-Typ</dt>
<dd class="col-sm-8">@Model.DisplayCpuType</dd>
<dt class="col-sm-4">CPU-Kerne</dt>
<dd class="col-sm-8">@Model.DisplayCpuCores</dd>
<dt class="col-sm-4">GPU-Typ</dt>
<dd class="col-sm-8">@Model.DisplayGpuType</dd>
<dt class="col-sm-4">RAM</dt>
<dd class="col-sm-8">@Model.DisplayRamSize</dd>
<dt class="col-sm-4">Festplatte</dt>
<dd class="col-sm-8">@Model.DisplayDiskSpace</dd>
</dl>
</div>
</div>
<!-- Description -->
@if (!string.IsNullOrEmpty(Model.Description))
{
<div class="mt-4">
<h6><i class="bi bi-card-text me-2"></i>Beschreibung</h6>
<div class="alert alert-light">
@Model.Description
</div>
</div>
}
</div>
<!-- Card Footer with Actions -->
<div class="card-footer d-flex flex-wrap gap-2">
<a href="/Download/File/Linux/heartbeat" class="btn btn-success">
🖥️ Linux Agent
<i class="bi bi-download me-1"></i> Linux Agent
</a>
<a asp-action="EditServer" asp-route-id="@Model.Id" class="btn btn-outline-primary me-2">
<i class="bi bi-pencil"></i> Bearbeiten
<a asp-action="EditServer" asp-route-id="@Model.Id" class="btn btn-outline-primary">
<i class="bi bi-pencil me-1"></i> Bearbeiten
</a>
<form asp-action="Delete" asp-route-id="@Model.Id" method="post" class="d-inline"
onsubmit="return confirm('Diesen Server wirklich löschen?');">
<form asp-action="Delete" asp-route-id="@Model.Id" method="post"
onsubmit="return confirm('Diesen Server wirklich löschen?');" class="ms-auto">
<button type="submit" class="btn btn-outline-danger">
<i class="bi bi-trash"></i> Löschen
<i class="bi bi-trash me-1"></i> Löschen
</button>
</form>
</div>
@@ -63,5 +106,5 @@
<div class="bg-light border rounded p-4 text-center text-muted" style="height: 250px;">
<canvas id="uptimeChart"></canvas>
</div>
</div>
</div>
</div>