Security improvements:
- Removed registration link from login page
- Disabled /auth/register route - redirects with error message
- Removed demo credentials from login page
- Added info message: 'New users are created by administrators'
UI improvements:
- Compacted all admin interface buttons (btn-sm)
- Reduced heading sizes (H2 → H4) for less visual dominance
- Shortened badge texts ('Administrator' → 'Admin', 'Benutzer' → 'User')
- Optimized spacing and reduced margins/paddings
- Cleaner, more professional admin interface
Access control:
- Only administrators can create new users via admin panel
- Self-registration completely disabled for security
- Maintains full admin functionality with improved UX
165 lines
8.3 KiB
HTML
165 lines
8.3 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">
|
|
<h4><i class="fas fa-users-cog"></i> Admin Dashboard</h4>
|
|
<a href="{{ url_for('main.dashboard') }}" class="btn btn-outline-secondary btn-sm">
|
|
<i class="fas fa-arrow-left"></i> Zurück
|
|
</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">
|
|
<h6><i class="fas fa-tachometer-alt"></i> Schnellzugriff</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6 mb-2">
|
|
<a href="{{ url_for('admin.users') }}" class="btn btn-outline-primary btn-sm w-100">
|
|
<i class="fas fa-users me-1"></i> Benutzerverwaltung
|
|
</a>
|
|
</div>
|
|
<div class="col-md-6 mb-2">
|
|
<a href="{{ url_for('admin.create_user') }}" class="btn btn-outline-success btn-sm w-100">
|
|
<i class="fas fa-user-plus me-1"></i> Neuen Benutzer erstellen
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Letzte Benutzer -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h6><i class="fas fa-clock"></i> Letzte Benutzer</h6>
|
|
</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 btn-sm">
|
|
Alle Benutzer <i class="fas fa-arrow-right"></i>
|
|
</a>
|
|
</div>
|
|
{% else %}
|
|
<div class="text-center text-muted py-3">
|
|
<i class="fas fa-users fa-2x mb-2"></i>
|
|
<h6>Keine Benutzer gefunden</h6>
|
|
<p class="small">Erstellen Sie den ersten Benutzer über den Button oben.</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %} |