Features added: - Admin authentication system with is_admin field - Complete admin dashboard with user statistics - User management (create, edit, delete, toggle admin) - Protected admin routes with @admin_required decorator - Security features (prevent self-deletion, last admin protection) - Responsive admin UI with Bootstrap integration - Database migration script for admin field - Admin navigation link for authorized users Technical improvements: - Enhanced 3-column dashboard layout (tables | editor | saved queries) - Removed plus button and made right sidebar more compact - Admin user (admin/admin123) automatically created with admin privileges - Full CRUD operations for user management - Flash messages for user feedback - Form validation and error handling
173 lines
8.8 KiB
HTML
173 lines
8.8 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Admin Dashboard{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2><i class="fas fa-users-cog"></i> Admin Dashboard</h2>
|
|
<a href="{{ url_for('main.dashboard') }}" class="btn btn-outline-secondary">
|
|
<i class="fas fa-arrow-left"></i> Zurück zum Dashboard
|
|
</a>
|
|
</div>
|
|
|
|
<!-- Statistiken -->
|
|
<div class="row mb-4">
|
|
<div class="col-md-3">
|
|
<div class="card bg-primary text-white">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h4>{{ users|length }}</h4>
|
|
<small>Benutzer gesamt</small>
|
|
</div>
|
|
<i class="fas fa-users fa-2x opacity-75"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card bg-success text-white">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h4>{{ users|selectattr('is_admin')|list|length }}</h4>
|
|
<small>Administratoren</small>
|
|
</div>
|
|
<i class="fas fa-user-shield fa-2x opacity-75"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card bg-info text-white">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h4>{{ users|rejectattr('is_admin')|list|length }}</h4>
|
|
<small>Standard-Benutzer</small>
|
|
</div>
|
|
<i class="fas fa-user fa-2x opacity-75"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card bg-warning text-white">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h4>{{ (users|selectattr('created_at')|map(attribute='created_at')|list|length) }}</h4>
|
|
<small>Aktive Benutzer</small>
|
|
</div>
|
|
<i class="fas fa-chart-line fa-2x opacity-75"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Schnellzugriff -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5><i class="fas fa-tachometer-alt"></i> Schnellzugriff</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<a href="{{ url_for('admin.users') }}" class="btn btn-outline-primary btn-lg w-100">
|
|
<i class="fas fa-users"></i>
|
|
<div class="mt-2">
|
|
<strong>Benutzerverwaltung</strong>
|
|
<br><small class="text-muted">Benutzer anzeigen, bearbeiten und erstellen</small>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<a href="{{ url_for('admin.create_user') }}" class="btn btn-outline-success btn-lg w-100">
|
|
<i class="fas fa-user-plus"></i>
|
|
<div class="mt-2">
|
|
<strong>Neuen Benutzer erstellen</strong>
|
|
<br><small class="text-muted">Schnell einen neuen Benutzer hinzufügen</small>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Letzte Benutzer -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5><i class="fas fa-clock"></i> Letzte Benutzer</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if users %}
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Benutzername</th>
|
|
<th>E-Mail</th>
|
|
<th>Rolle</th>
|
|
<th>Erstellt am</th>
|
|
<th>Aktionen</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for user in users[:5] %}
|
|
<tr>
|
|
<td>
|
|
<strong>{{ user.username }}</strong>
|
|
{% if user.id == current_user.id %}
|
|
<span class="badge bg-primary ms-1">Sie</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ user.email }}</td>
|
|
<td>
|
|
{% if user.is_admin %}
|
|
<span class="badge bg-danger"><i class="fas fa-user-shield"></i> Administrator</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary"><i class="fas fa-user"></i> Benutzer</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ user.created_at.strftime('%d.%m.%Y %H:%M') }}</td>
|
|
<td>
|
|
<a href="{{ url_for('admin.edit_user', user_id=user.id) }}"
|
|
class="btn btn-sm btn-outline-primary" title="Bearbeiten">
|
|
<i class="fas fa-edit"></i>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="text-center mt-3">
|
|
<a href="{{ url_for('admin.users') }}" class="btn btn-primary">
|
|
Alle Benutzer anzeigen <i class="fas fa-arrow-right"></i>
|
|
</a>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-4">
|
|
<i class="fas fa-users fa-3x mb-3"></i>
|
|
<h5>Keine Benutzer gefunden</h5>
|
|
<p>Erstellen Sie den ersten Benutzer über den Button oben.</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %} |