201 Zeilen
8.2 KiB
HTML
201 Zeilen
8.2 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>Dashboard - Admin Panel</title>
|
||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||
<style>
|
||
.stat-card {
|
||
transition: transform 0.2s;
|
||
}
|
||
.stat-card:hover {
|
||
transform: translateY(-5px);
|
||
}
|
||
.status-aktiv { color: #28a745; }
|
||
.status-ablaufend { color: #ffc107; }
|
||
.status-abgelaufen { color: #dc3545; }
|
||
</style>
|
||
</head>
|
||
<body class="bg-light">
|
||
<nav class="navbar navbar-dark bg-dark">
|
||
<div class="container">
|
||
<span class="navbar-brand">🎛️ Lizenzverwaltung</span>
|
||
<div class="d-flex align-items-center">
|
||
<span class="text-white me-3">Angemeldet als: {{ username }}</span>
|
||
<a href="/logout" class="btn btn-outline-light btn-sm">Abmelden</a>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="container py-4">
|
||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||
<h1>Dashboard</h1>
|
||
<div>
|
||
<a href="/create" class="btn btn-primary">➕ Neue Lizenz</a>
|
||
<a href="/licenses" class="btn btn-secondary">📋 Lizenzen</a>
|
||
<a href="/customers" class="btn btn-secondary">👥 Kunden</a>
|
||
<a href="/sessions" class="btn btn-secondary">🟢 Sessions</a>
|
||
<a href="/audit" class="btn btn-secondary">📋 Audit</a>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Statistik-Karten -->
|
||
<div class="row g-3 mb-4">
|
||
<div class="col-md-3">
|
||
<div class="card stat-card h-100">
|
||
<div class="card-body text-center">
|
||
<h5 class="card-title">👥 Kunden</h5>
|
||
<h2 class="text-primary">{{ stats.total_customers }}</h2>
|
||
<p class="text-muted mb-0">Gesamt</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<div class="card stat-card h-100">
|
||
<div class="card-body text-center">
|
||
<h5 class="card-title">📋 Lizenzen</h5>
|
||
<h2 class="text-info">{{ stats.total_licenses }}</h2>
|
||
<p class="text-muted mb-0">Gesamt</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<div class="card stat-card h-100">
|
||
<div class="card-body text-center">
|
||
<h5 class="card-title">✅ Aktiv</h5>
|
||
<h2 class="text-success">{{ stats.active_licenses }}</h2>
|
||
<p class="text-muted mb-0">Gültige Lizenzen</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<div class="card stat-card h-100">
|
||
<div class="card-body text-center">
|
||
<h5 class="card-title">🟢 Sessions</h5>
|
||
<h2 class="text-success">{{ stats.active_sessions }}</h2>
|
||
<p class="text-muted mb-0">Aktive Nutzer</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Lizenztypen -->
|
||
<div class="row g-3 mb-4">
|
||
<div class="col-md-6">
|
||
<div class="card h-100">
|
||
<div class="card-body">
|
||
<h5 class="card-title">Lizenztypen</h5>
|
||
<div class="row">
|
||
<div class="col-6 text-center">
|
||
<h3 class="text-success">{{ stats.full_licenses }}</h3>
|
||
<p class="text-muted">Vollversionen</p>
|
||
</div>
|
||
<div class="col-6 text-center">
|
||
<h3 class="text-warning">{{ stats.test_licenses }}</h3>
|
||
<p class="text-muted">Testversionen</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<div class="card h-100">
|
||
<div class="card-body">
|
||
<h5 class="card-title">Lizenzstatus</h5>
|
||
<div class="row">
|
||
<div class="col-6 text-center">
|
||
<h3 class="text-success">{{ stats.active_licenses }}</h3>
|
||
<p class="text-muted">Aktiv</p>
|
||
</div>
|
||
<div class="col-6 text-center">
|
||
<h3 class="text-danger">{{ stats.expired_licenses }}</h3>
|
||
<p class="text-muted">Abgelaufen</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row g-3">
|
||
<!-- Bald ablaufende Lizenzen -->
|
||
<div class="col-md-6">
|
||
<div class="card">
|
||
<div class="card-header bg-warning text-dark">
|
||
<h5 class="mb-0">⏰ Bald ablaufende Lizenzen</h5>
|
||
</div>
|
||
<div class="card-body">
|
||
{% if stats.expiring_licenses %}
|
||
<div class="table-responsive">
|
||
<table class="table table-sm">
|
||
<thead>
|
||
<tr>
|
||
<th>Kunde</th>
|
||
<th>Lizenz</th>
|
||
<th>Tage</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for license in stats.expiring_licenses %}
|
||
<tr>
|
||
<td>{{ license[2] }}</td>
|
||
<td><small><code>{{ license[1][:8] }}...</code></small></td>
|
||
<td><span class="badge bg-warning">{{ license[4] }} Tage</span></td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% else %}
|
||
<p class="text-muted mb-0">Keine Lizenzen laufen in den nächsten 30 Tagen ab.</p>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Letzte Lizenzen -->
|
||
<div class="col-md-6">
|
||
<div class="card">
|
||
<div class="card-header bg-info text-white">
|
||
<h5 class="mb-0">🆕 Zuletzt erstellte Lizenzen</h5>
|
||
</div>
|
||
<div class="card-body">
|
||
{% if stats.recent_licenses %}
|
||
<div class="table-responsive">
|
||
<table class="table table-sm">
|
||
<thead>
|
||
<tr>
|
||
<th>Kunde</th>
|
||
<th>Lizenz</th>
|
||
<th>Status</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for license in stats.recent_licenses %}
|
||
<tr>
|
||
<td>{{ license[2] }}</td>
|
||
<td><small><code>{{ license[1][:8] }}...</code></small></td>
|
||
<td>
|
||
{% if license[4] == 'abgelaufen' %}
|
||
<span class="status-abgelaufen">⚠️ Abgelaufen</span>
|
||
{% elif license[4] == 'läuft bald ab' %}
|
||
<span class="status-ablaufend">⏰ Läuft bald ab</span>
|
||
{% else %}
|
||
<span class="status-aktiv">✅ Aktiv</span>
|
||
{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% else %}
|
||
<p class="text-muted mb-0">Noch keine Lizenzen erstellt.</p>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html> |