Welche Projekte besitze ich?

Dieses Bild zeigt eine vollständige Übersicht meiner virtuellen Maschinen (VMs) und Container (CTs) auf meinem Proxmox-Server. Jede Instanz repräsentiert ein eigenständiges Projekt oder System, das von mir aufgebaut, konfiguriert und verwaltet wird. Die Darstellung gibt einen Einblick in die Vielfalt meiner Projekte sowie in meine Fähigkeiten in den Bereichen Virtualisierung, Systemadministration und Infrastrukturmanagement.
Projekte Im Detail
Tailscale-Ad-Blocker
Dieser Container fungiert als zentraler Werbeblocker für alle meine Geräte. Über Tailscale VPN wird sämtlicher Datenverkehr durch diese Node geleitet und von Pi-hole, einem DNS-basierten Ad-Blocker, gründlich gefiltert, bevor er zurück an das jeweilige Gerät geleitet wird.
Die Architektur ist so optimiert, dass die Netzwerkgeschwindigkeit nicht beeinträchtigt wird. Eine Besonderheit dieses Containers – ebenso wie beim WordPress-Container – ist die automatische Überwachung und Neustartfunktion: Sollte der Container aus irgendeinem Grund stoppen oder einen Fehler haben, startet er innerhalb weniger Sekunden automatisch neu. Sollte ein Neustart fehlschlagen, erhalte ich sofort eine Warnung auf mein Smartphone. So ist sichergestellt, dass der Ad-Blocker dauerhaft zuverlässig arbeitet.
WordPress
Dieser Container hostet WordPress zusammen mit einer MariaDB-Datenbank und ist über Tailscale VPN erreichbar. Er dient als zentrale Plattform für mein Team in der Schule, auf der wir derzeit ein bankähnliches Webinterface entwickeln. Dieses Interface ermöglicht es, Konten anzulegen, Überweisungen durchzuführen und Transaktionen einzusehen.
Die Webseiten sind rollenbasiert geschützt, sodass nur autorisierte Benutzer Zugriff auf die jeweiligen Bereiche haben. Wie beim Tailscale-Ad-Blocker verfügt auch dieser Container über automatische Überwachung und Neustartfunktionen: Sollte er aus irgendeinem Grund stoppen oder einen Fehler haben, startet er selbstständig innerhalb weniger Sekunden neu, und bei Problemen, die einen Neustart verhindern, erhalte ich sofort Benachrichtigungen auf mein Smartphone. So ist der Container jederzeit zuverlässig und sicher im Einsatz.
Ollama-Bild-zu-Text
In diesem Container läuft ein Programm, das Bilder automatisch in Text umwandelt. Diese Funktion wird von Ollama genutzt, um empfangene Bilder direkt in Textinformationen zu konvertieren, sodass die Inhalte anschließend vom System analysiert und verarbeitet werden können.
Datenbank-n8n
Auf diesem Container läuft die PostgreSQL-Datenbank („Elefanten-DB“) für n8n, die als Langzeitspeicher dient. n8n kann auf diese Datenbank kontinuierlich zugreifen, Informationen speichern und neue Daten selbstständig ablegen.
Die Datenbank fungiert somit als Gedächtnis von n8n, das Workflows und Automatisierungen zuverlässig unterstützt und sicherstellt, dass alle Prozesse korrekt dokumentiert und abrufbar sind.
Kde-neon
Dieser Container dient als Netzwerkspeicher für mein KDE Neon-Betriebssystem, das auf einem USB-Stick installiert ist. Da der USB-Stick nur begrenzten Speicherplatz bietet, stellt der Container einen erweiterten Speicherort zur Verfügung, auf den das System automatisch zugreift.
Sobald KDE Neon startet, verbindet es sich mit dem Netzwerk und nutzt diesen Container als zentralen Arbeits- und Speicherort, wodurch das Arbeiten am System ohne Einschränkungen möglich wird.
Nodecast-tv
In diesem Container läuft ein System, das eine umfassende Datenbank von Fernsehsendern verwaltet. Über eine Weboberfläche kann ich auf diese Sender zugreifen und sie direkt ansehen.
Der Container ermöglicht somit eine zentrale und übersichtliche Verwaltung von TV-Inhalten und stellt sicher, dass der Zugriff auf die Sender jederzeit bequem über das Netzwerk möglich ist.
Ollama-ai-openclaw
Dieser Container war ein Experiment zur Entwicklung einer eigenständigen KI, die eng mit Kali-X-AI zusammenarbeitet. Die KI hatte Zugriff auf ein abgekapseltes Betriebssystem, wodurch sie theoretisch eigenständig Aufgaben ausführen und Prozesse steuern konnte.
Ziel war, dass die KI autonom agiert und gleichzeitig über Telegram mit mir kommunizieren kann, um Informationen, Statusmeldungen oder Ergebnisse direkt bereitzustellen. Der Container diente somit als Testumgebung für fortgeschrittene KI-Interaktionen und Systemintegration.
PydioCells
Dieser Container bildet meine private Cloud-Infrastruktur. Über ein Webportal können Dateien aller Art – von Bildern und PDFs bis hin zu ISOs – sicher gespeichert und verwaltet werden.
Alle Daten werden verschlüsselt in einer Datenbank abgelegt und sind nur für berechtigte Benutzer zugänglich. Dadurch stellt der Container eine sichere, zentrale Plattform für die Speicherung und den Zugriff auf meine Daten bereit.
RTSP
Dieser Container war ein früherer Versuch, Bildschirmaufnahmen eines Betriebssystems in einen RTSP-Stream umzuwandeln. Ziel war es, die Bildschirminhalte über ein Webportal live einsehen zu können.
Der Container diente als Testumgebung, um die Übertragung von Desktop-Inhalten in Echtzeit zu erproben und bildet die Grundlage für spätere, weiterentwickelte Streaming-Lösungen.
Jellyfin
Auf diesem Container läuft Jellyfin, mein zentraler Medienserver. Hier werden verschiedene digitale Dateien gespeichert, die zuvor nur auf CDs vorlagen. Diese Inhalte wurden eingescannt und in den Container hochgeladen, sodass sie nun über App oder Browser von jedem Gerät aus zugänglich sind.
Der Container ermöglicht somit eine übersichtliche, digitale Bibliothek, die jederzeit und von überall auf die Medien zugreifen lässt.
Minecraft Server
Dieser Container speichert die Welten meines Minecraft-Servers. Die Verwaltung des Servers erfolgt über einen separaten Container namens Pterodactyl, der die einfache Erstellung, Konfiguration und Verwaltung von Spieleservern ermöglicht.
Die Trennung der Minecraft-Welten in einen eigenen Container sorgt dafür, dass die Last effizient verteilt wird und die Server unabhängig voneinander laufen. So bleiben Performance und Stabilität der einzelnen Server gewährleistet.
N8N-AI
In diesem Container läuft n8n, ein Automatisierungsprogramm, das derzeit die Verwaltung meiner E-Mails übernimmt. n8n arbeitet dabei eng mit Ollama, einem Container mit meinen lokalen KI-Agenten, zusammen.
Die KI hat kontrollierten Zugriff auf mein Postfach: Sie kann E-Mails automatisch lesen, filtern und klassifizieren, darf jedoch nicht selbst löschen oder verfassen. Für meine drei Postfächer – ein Business-Postfach und zwei Standard-/Spam-Postfächer – werden unterschiedliche Aufgaben ausgeführt:
- Business-E-Mail: Bei neuen Nachrichten wird automatisch eine Benachrichtigung auf mein Smartphone gesendet, inklusive Absender, Inhalt und Relevanz. Die E-Mail erhält zusätzlich ein Label mit dem Namen der KI.
- Standard-/Spam-E-Mails: n8n filtert automatisch Spam, Login-Benachrichtigungen oder Kaufbestätigungen. Wichtige E-Mails werden ebenfalls direkt auf das Smartphone gemeldet und mit einem roten „Wichtig“-Label versehen, während Spam aus dem Posteingang entfernt wird.
Darüber hinaus experimentiere ich mit isolierten Containern, auf die die KI bei Bedarf Befehle ausführen kann – zum Beispiel das Erstellen einer Datei mit einem bestimmten Inhalt auf Anweisung. So kann die KI Aufgaben automatisiert ausführen, während die Kontrolle und Sicherheit vollständig gewährleistet bleibt.
Ollama
In diesem Container laufen mehrere lokale KI-Agenten, die vielseitig eingesetzt werden. Sie unterstützen beispielsweise n8n bei Automatisierungsaufgaben, arbeiten mit meiner Doomsday-VM oder können über ein Web-Interface ähnlich wie ChatGPT direkt genutzt werden, um mit ihnen zu interagieren.
Die Containerumgebung umfasst sowohl Standard-KIs als auch selbst konfigurierte, auf mich zugeschnittene KI-Agenten, die speziell für individuelle Aufgaben optimiert sind. So entsteht eine flexible Plattform für Automatisierung, Analyse und Interaktion, die komplett lokal und unter meiner Kontrolle läuft.
Test-Container
Dieser Container dient als Experimentierumgebung für Freunde. Darauf läuft Debian 12, wodurch Benutzer die Möglichkeit haben, Linux kennenzulernen und eigene Experimente durchzuführen, ohne dass dabei andere Systeme oder Daten beeinträchtigt werden.
Er bietet eine sichere, isolierte Umgebung, in der Lern- und Testzwecke jederzeit ohne Risiko umgesetzt werden können.
Bewerbung
Auf diesem Container läuft meine persönliche Bewerbungswebsite, inklusive aller Informationen, einer Datenbank und weiterer nützlicher Tools.
Der Zugriff auf diesen Container erfolgt über einen Tailscale-Funnel, wodurch er sicher und gezielt für autorisierte Personen freigegeben wird. So kann die Website jederzeit zuverlässig und geschützt genutzt werden.
MotionEye
In diesem Container laufen meine Kamerasysteme und Aufnahmen zusammen. Über ein Webinterface können sowohl meine beiden Monitore per RTSP als auch eine IP-Sicherheitskamera eingebunden werden, um mein System jederzeit im Blick zu behalten.
Die Aufnahmen können nach Anmeldung eingesehen werden. Zusätzlich überwacht der Container das Haus automatisch während meiner Abwesenheit und sendet bei erkannter Bewegung eine Benachrichtigung über Telegram, sodass Sicherheit und Kontrolle auch aus der Ferne gewährleistet sind.
Compreface
Dieser Container stellt ein Webinterface bereit, über das ich Benutzerklassen erstellen kann. In diese Klassen lade ich Bilder hoch, sodass ein Algorithmus Personen auf fremden Bildern erkennen kann.
Der Container ermöglicht so präzise Gesichtserkennung innerhalb definierter Benutzergruppen und bietet eine sichere, zentralisierte Plattform für die Verwaltung von Bild- und Erkennungsdaten.
Windows-AI
Dieser Container ist vergleichbar mit dem Ollama AI OpenClaw-Container, wurde jedoch so konzipiert, dass OpenClaw direkt auf ihm läuft und über Ollama sowie eine SSH-Verbindung auf meinen PC zugreifen kann, um dort spezifische Anweisungen auszuführen.
Die KI arbeitet ausschließlich auf Befehl: Sie analysiert die Anweisung, plant den Ablauf und informiert mich genau, bevor sie die Aktion ausführt. Es gibt strikte Sicherheitsregeln: Die KI darf nichts löschen oder irreparabel beschädigen, keinen Kontakt zu anderen Personen aufnehmen, keine Käufe tätigen und keine sensiblen Daten speichern, außer für die vorgesehenen Aufgaben.
Zusätzlich ist ein Notfall-System integriert, mit dem der Container sofort gestoppt und heruntergefahren werden kann, falls eine Sicherheitsmaßnahme notwendig ist. So bleibt die Nutzung der KI vollständig kontrolliert und sicher.
Home-Assistant
Auf diesem Container ist Home Assistant installiert, der als zentrale Smart-Home-Plattform dient. In meinem Setup wird er jedoch nicht primär genutzt, da ich zuvor bereits ein auf Alexa basierendes System eingerichtet hatte.
Meine Smart-Home-Geräte laufen in einem separaten, sicheren Subnetz, das sowohl eine bessere Internetverbindung gewährleistet als auch die Sicherheit erhöht, da Smart-Home-Geräte häufig anfällig für Angriffe sind. Der Home Assistant-Container dient somit als zusätzliche Test- und Erweiterungsplattform.
Ubuntu
Diese VM dient als isolierte Testumgebung für Linux-basierte Anwendungen und Befehle. Sie ermöglicht es, neue Software oder Skripte gefahrlos auszuprobieren, ohne dass das Hauptsystem oder andere Container beeinträchtigt werden.
So können Funktionen und Auswirkungen von Programmen sicher getestet und analysiert werden, bevor sie in produktiven Umgebungen eingesetzt werden.
Remote
Diese VM dient als Testumgebung für Freunde, die Linux kennenlernen möchten, ohne es selbst installieren zu müssen. Ähnlich wie beim Test-Container bietet sie eine sichere und isolierte Umgebung, in der Experimente, Lernübungen und Tests gefahrlos durchgeführt werden können.
So können Freunde den Umgang mit Linux praktisch erlernen, ohne bestehende Systeme oder Daten zu gefährden.
Windows-Server
Auf dieser VM läuft ein Windows Server, der als produktive Arbeitsumgebung für mich und meine Freunde dient. Er ermöglicht es, Windows-Anwendungen und -Aufgaben auszuführen, selbst wenn das lokale Gerät ein anderes Betriebssystem verwendet, z. B. Linux auf meinem Laptop.
Freunde, die keinen eigenen PC besitzen, können die VM über Tablet oder Smartphone nutzen und erhalten so vollständigen Zugriff auf eine Windows-Arbeitsumgebung, inklusive aller Funktionen eines echten PCs.
Arch
Auf dieser VM ist Arch Linux installiert, um den Umgang mit diesem speziellen Linux-Distribution zu erlernen. Arch verwendet eigene Paketverwaltungsbefehle – beispielsweise pacman anstelle von apt – und unterscheidet sich dadurch von den Linux-Systemen, die ich sonst nutze.
Die VM dient als isolierte Lernumgebung, in der ich sicher Erfahrungen sammeln kann, ohne andere Systeme zu beeinträchtigen.
Kali-X-AI
Auf dieser VM ist Kali Linux installiert. Sie wurde als Testumgebung für meine KI (Ollama AI OpenClaw) konzipiert, die in dieser Umgebung theoretisch vollständig selbstständig auf das Betriebssystem zugreifen und Aufgaben ausführen konnte.
Die VM dient als abgekapseltes System, in dem Experimente mit KI-gestützter Automatisierung und Systemkontrolle gefahrlos getestet werden können, ohne andere Systeme oder Daten zu gefährden.
Schul-Windows
Auf dieser VM ist ein einfaches Windows-System installiert, das alle Programme enthält, die ich für den Schulunterricht benötige. Die VM ist primär für meinen Laptop gedacht, da manche Schulsoftware nur unter Windows läuft und auf Linux nicht verfügbar ist.
Besonders praktisch ist die automatische Start- und Herunterfahrfunktion: Die VM startet pünktlich zu Schulbeginn und fährt nach Schulende selbstständig herunter. So ist sie optimal für den Schuleinsatz vorbereitet und jederzeit einsatzbereit.
Proxmox-Test
Auf dieser VM ist ein vollwertiger Proxmox-Server installiert, der als Testumgebung für Proxmox-Befehle dient. Die VM ermöglicht es, Befehle und Konfigurationen gefahrlos auszuprobieren, da ich bereits zweimal mein Hauptsystem irreparabel beschädigt habe.
So kann ich Erfahrungen sammeln und neue Funktionen testen, ohne das produktive System zu gefährden.
Alle meine VMs und Container werden in festen Intervallen gesichert und auf einer externen Festplatte gespeichert. Diese Festplatte behält die Daten für einen Monat sowie zusätzlich bestimmte, dauerhaft festgelegte Backups. Die Sicherungen können bei Bedarf einfach wiederhergestellt oder in andere Systeme eingebunden werden.
Coding Projekt Ausschnitte
<?php
// Plugin Name: 2.3. Kundenbereich_Formular_mit_INSERT
/*
Dieses Plugin ist ein Teil eines größeren Systems. Es wurde von mir und meiner Gruppe im Unterricht entworfen und stellt ein Formular einer Privatbank dar.
Mit diesem speziellen Formular können die Ausgaben des jeweiligen Kontos der eingeloggten Person sowie die letzten zehn Überweisungen angezeigt werden. Die dafür benötigten Daten werden in Echtzeit aus einer Live-Datenbank abgerufen und dargestellt.
Außerdem ermöglicht das Plugin, Überweisungen an ein eigenes Konto zu tätigen. Dabei sind mehrere Sicherheits- bzw. Schutzfunktionen integriert, um Fehlbedienungen zu vermeiden.
*/
// Filter einbinden und für den Seiteninhalt aktivieren
add_filter("the_content", "kundenfunktion");
// Filterfunktion als Hauptprogramm
function kundenfunktion($content){
// global verfügbare Klasse der WordPress Datenbank
global $wpdb;
// Aktuellen WordPress User holen
$current_user = wp_get_current_user();
// Kundendaten aus WPDB holen (String Ersetzung zur Sicherheit bzgl. SQL-Injection)
$sql = "SELECT * FROM wp_finterra_kunden WHERE wp_user_id = %d";
$kunde = $wpdb->get_row($wpdb->prepare($sql, $current_user->ID));
// Wenn Kundendaten leer EXIT (kein Finterra Kunde)
if (!$kunde) {
return $content;
}
// Überweisungsformular VOR der Anzeige verarbeiten (ansonsten keine Aktualisierung der DB sichtbar!)
$formular_speicher = ueberweisungVerarbeiten($kunde->kunde_nr);
// Persönliche Begrüßung
$output = '<h2>Willkommen ' . $kunde->vorname . ' ' . $kunde->nachname . '!</h2>';
// Alle Konten anzeigen (mit Hilfsfunktionen unten)
$output .= '<h2>Meine Konten:</h2>';
$output .= arrayToHtmlTabelle(getKonten($kunde->kunde_nr));
// Letzte 10 Transaktionen anzeigen (mit Hilfsfunktionen unten)
$output .= '<h2>Meine letzten 10 Transaktionen:</h2>';
$output .= arrayToHtmlTabelle(getTransaktionen($kunde->kunde_nr));
// NEUE FUNKTION: Überweisungsformular und -verarbeitung
$output .= '<h2>Interne Überweisung zwischen meinen Konten:</h2>';
$output .= $formular_speicher;
return str_replace("[kundencode]", $output, $content);
}
//Hilfsfunktionen
// Konten eines Kunden aus WPDB abfragen (String Ersetzung zur Sicherheit bzgl. SQL-Injection)
function getKonten($kunde_nr) {
global $wpdb;
$sql = "SELECT konto_nr AS Kontonummer, art_konto AS Kontoart, stand_konto_euro AS Kontostand_€ FROM wp_finterra_konten WHERE kunde_nr = %d ORDER BY Kontonummer";
return $wpdb->get_results($wpdb->prepare($sql, $kunde_nr), ARRAY_A);
}
// Transaktionen eines Kunden aus WPDB abfragen (String Ersetzung zur Sicherheit bzgl. SQL-Injection)
function getTransaktionen($kunde_nr) {
global $wpdb;
$sql = "SELECT tr.konto_nr AS Kontonummer, tr.datum_transaktion AS Datum, tr.uhrzeit_transaktion AS Uhrzeit, tr.betrag_euro AS Betrag, tr.typ_transaktion AS Typ,
tr.kategorie_verwendung AS Zweck FROM wp_finterra_transaktionen tr JOIN wp_finterra_konten ko ON tr.konto_nr = ko.konto_nr WHERE ko.kunde_nr = %d ORDER BY Datum DESC, Uhrzeit DESC LIMIT 10;";
return $wpdb->get_results($wpdb->prepare($sql, $kunde_nr), ARRAY_A);
}
//Umwandlung von Arrays zu HTML-Tabellen (vgl. Plugin zum Management Dashboard)
function arrayToHtmlTabelle($result) {
if (count($result) > 0) {
$table = '<table border="1">';
// Spaltenkopfzeile
$table .= '<tr>';
foreach ($result[0] as $key => $value) {
$table .= '<th>' . $key . '</th>';
}
$table .= '</tr>';
// Datensatzzeilen
foreach ($result as $row) {
$table .= '<tr>';
foreach ($row as $data) {
$table .= '<td>' . $data . '</td>';
}
$table .= '</tr>';
}
$table .= '</table>';
} else {
$table = '<p>Keine Daten gefunden.</p>';
}
return $table;
}
// NEUE FUNKTION: Überweisungsverarbeitung mit Formular
function ueberweisungVerarbeiten($kunde_nr) {
global $wpdb;
// Variablen initialisieren
$meldung = '';
$abbuchungskonto = '';
$empfaengerkonto = '';
$betrag = '';
$verwendungszweck = '';
// TEILSCHRITT 2: Auslesen / Speichern der Formulareingaben per $_POST
// Prüfen ob Formular abgeschickt wurde
if (isset($_POST['ueberweisung_absenden'])) {
// Formulareingaben in Variablen speichern
$abbuchungskonto = sanitize_text_field($_POST['abbuchungskonto']);
$empfaengerkonto = sanitize_text_field($_POST['empfaengerkonto']);
$betrag = sanitize_text_field($_POST['betrag']);
$verwendungszweck = sanitize_text_field($_POST['verwendungszweck']);
$sql = "SELECT stand_konto_euro FROM wp_finterra_konten WHERE konto_nr = %f";
$row = $wpdb->get_row($wpdb->prepare($sql, $abbuchungskonto));
$sql2 = "SELECT kono_nr FROM wp_finterra_konten WHERE konto_nr = %f";
$row2 = $wpdb->get_row($wpdb->prepare($sql2, $empfaengerkonto));
// Prüfung ob alle Felder ausgefüllt sind
if ($abbuchungskonto=='') {
$meldung = '<p style="color: red;">Bitte Abbuchungskonto auswählen.</p>';
} elseif ($empfaengerkonto=='') {
$meldung = '<p style="color: red;">Bitte Empfängerkonto auswählen.</p>';
} elseif ($betrag=='') {
$meldung = '<p style="color: red;">Bitte Betrag eingeben.</p>';
} elseif ($verwendungszweck=='') {
$meldung = '<p style="color: red;">Bitte Verwendungszweck eingeben.</p>';
} elseif ($abbuchungskonto==$empfaengerkonto) {
$meldung = '<p style="color: red;">Bitte Wählen sie ein anderes Empfängerkonto.</p>';
} elseif ($betrag > $row->stand_konto_euro ) {
$meldung = '<p style="color: red;">Bitte geben sie einen gültigen Betrag ein.</p>';
} elseif ($empfaengerkonto != $row2->konto_nr ) {
$meldung = '<p style="color: red;">Bitte geben sie einen gültigen Betrag ein.</p>';
}
else {
// TEILSCHRITT 3: Transaktionen in Datenbank durch Überweisung anlegen
// Aktuelle Datum und Uhrzeit ermitteln
$datum = date('Y-m-d');
$uhrzeit = date('H:i:s');
// Transaktion 1: Abbuchung vom Abbuchungskonto (negativer Betrag)
$sql = "INSERT INTO wp_finterra_transaktionen (konto_nr, datum_transaktion, uhrzeit_transaktion, typ_transaktion, betrag_euro, kategorie_verwendung)
VALUES (%d, %s, %s, %s, %f, %s)";
$wpdb->query($wpdb->prepare($sql, $abbuchungskonto, $datum, $uhrzeit, 'Auszahlung', -$betrag, $verwendungszweck));
//Minus Betrag Ermitteln
$sql = "SELECT stand_konto_euro FROM wp_finterra_konten WHERE konto_nr = %d";
$row = $wpdb->get_row($wpdb->prepare($sql, $abbuchungskonto));
$MinusKonto = $row->stand_konto_euro - $betrag;
//Update Befehl Um Betrag Zu entziehen
$sql = "UPDATE wp_finterra_konten SET stand_konto_euro = %f WHERE konto_nr = %f";
$wpdb->query($wpdb->prepare($sql,$MinusKonto, $abbuchungskonto));
// Transaktion 2: Gutschrift auf dem Empfängerkonto (positiver Betrag)
$sql = "INSERT INTO wp_finterra_transaktionen (konto_nr, datum_transaktion, uhrzeit_transaktion, typ_transaktion, betrag_euro, kategorie_verwendung)
VALUES (%d, %s, %s, %s, %f, %s)";
$wpdb->query($wpdb->prepare($sql, $empfaengerkonto, $datum, $uhrzeit, 'Einzahlung', $betrag, $verwendungszweck));
//Plus Betrag Ermitteln
$sql = "SELECT stand_konto_euro FROM wp_finterra_konten WHERE konto_nr = %d";
$row = $wpdb->get_row($wpdb->prepare($sql, $abbuchungskonto));
$PlusKonto = $row->stand_konto_euro + $betrag;
//Update Befehl Um Betrag Hinzuzufügen
$sql = "UPDATE wp_finterra_konten SET stand_konto_euro = %f WHERE konto_nr = %f";
$wpdb->query($wpdb->prepare($sql, $PlusKonto ,$empfaengerkonto));
// Teilschritt 4: Kontostände in Datenbank durch Überweisung anpassen (UPDATE)
//BITTE HIER ERGÄNZEN!
//BITTE HIER ERGÄNZEN!
// Erfolgsmeldung ausgeben
wp_redirect('Dieser Teil Des Codes Muss Leider Ausgeschnitten werden :)');
$meldung = '<p style="color: green;">Überweisung erfolgreich durchgeführt.</p>';
}
}
// TEILSCHRITT 1: Überweisungsformular mit Eingabef/eldern anlegen
// Alle Konten des Kunden für Dropdownlisten holen (nutzt vorhandene Hilfsfunktion)
$konten = getKonten($kunde_nr);
// Formular erstellen
$formular = '<form method="post">';
// Eingabefeld 1: Dropdownliste für Abbuchungskonto
$formular .= '<p><label>Abbuchungskonto:</label><br>';
$formular .= '<select name="abbuchungskonto">';
$formular .= '<option value="">-- Bitte wählen --</option>';
foreach ($konten as $konto) {
$formular .= '<option value="' . $konto['Kontonummer'] . '">' . $konto['Kontonummer'] . ' - ' . $konto['Kontoart'] . '</option>';
}
$formular .= '</select></p>';
// Eingabefeld 2: Dropdownliste für Empfängerkonto
$formular .= '<p><label>Empfängerkonto:</label><br>';
$formular .= '<select name="empfaengerkonto">';
$formular .= '<option value="">-- Bitte wählen --</option>';
foreach ($konten as $konto) {
$formular .= '<option value="' . $konto['Kontonummer'] . '">' . $konto['Kontonummer'] . ' - ' . $konto['Kontoart'] . '</option>';
}
$formular .= '</select></p>';
// Eingabefeld 3: Freifeld für Betrag
$formular .= '<p><label>Betrag in Euro:</label><br>';
$formular .= '<input type="text" name="betrag"></p>';
// Eingabefeld 4: Freifeld für Verwendungszweck
$formular .= '<p><label>Verwendungszweck:</label><br>';
$formular .= '<input type="text" name="verwendungszweck"></p>';
// Button zum Absenden
$formular .= '<p><input type="submit" name="ueberweisung_absenden" value="Überweisung durchführen"></p>';
$formular .= '</form>';
// Meldung unterhalb des Formulars anzeigen
$formular .= $meldung;
return $formular;
}
?>
<?php
// Plugin Name: plugin Vorstellung Dustin
/*
Dieses WordPress-Plugin von mir wurde als Mini-Projekt im Unterricht erstellt.
Es zeigt eine interaktive Tabelle der Top-20-Kunden an, basierend auf dem höchsten Kontostand.
Die Tabelle enthält Vorname, Nachname, Kundennummer, Risikoprofil, Kontostand und Beraternummer.
Ein Button ermöglicht es, die Tabelle zu schließen.
Die Daten werden dynamisch aus der Datenbank geladen und über den Shortcode [Beste_Kunden] auf der Seite angezeigt.
*/
add_filter("the_content", "abfragefunktion_Beste_Kunden");
function abfragefunktion_Beste_Kunden($content){
// Zustand aus POST laden
$tabelle = isset($_POST['tabelle_Beste_Kunden']) ? $_POST['tabelle_Beste_Kunden'] : '';
// Button nur anzeigen, wenn Tabelle aktiv ist
$buttons = '';
if ($tabelle === 'anzeigen') {
$buttons = '
<div style="display:flex; justify-content:center; margin-bottom:20px;">
<form method="POST">
<button type="submit" name="tabelle_Beste_Kunden" value="reset"
class="wp-block-button__link wp-element-button"
style="border-radius:12px; padding:10px 25px; text-align:center;">
Schließen
</button>
</form>
</div>';
}
// Tabelle nur anzeigen, wenn "anzeigen"
$table = '';
if ($tabelle === 'anzeigen') {
$table = '
<div style="display:flex; justify-content:center; margin-bottom:20px; flex-direction:column; align-items:center;">
<h3 style="text-align:center;">Beste Kunden Tabelle</h3>
' . arrayToHtmlTable_Beste_Kunden(get_Beste_Kunden()) . '
</div>';
}
// Ausgabe zusammensetzen
$output = $buttons . $table;
// Platzhalter ersetzen
return str_replace("[Beste_Kunden]", $output, $content);
}
function get_Beste_Kunden() {
global $wpdb;
$sql = "
SELECT
k.vorname,
k.nachname,
k.kunde_nr,
kt.profil_risiko,
kt.stand_konto_euro,
b.berater_nr
FROM wp_finterra_kunden AS k
INNER JOIN wp_finterra_konten AS kt
ON kt.kunde_nr = k.kunde_nr
INNER JOIN wp_finterra_berater AS b
ON b.berater_nr = k.berater_nr
ORDER BY kt.stand_konto_euro DESC
LIMIT 20
";
return $wpdb->get_results($sql, ARRAY_A);
}
function arrayToHtmlTable_Beste_Kunden($result) {
if (count($result) === 0) {
return '<p>Keine Daten gefunden.</p>';
}
// Übersetzung der Spaltennamen
$spalten_namen = array(
'vorname' => 'Vorname',
'nachname' => 'Nachname',
'kunden_nr' => 'Kunde',
'profil_risiko' => 'Risikoprofil',
'stand_konto_euro' => 'Kontostand',
'berater_nr' => 'Berater'
);
$table = '<table border="1" cellpadding="5" cellspacing="0">';
/* ===== Tabellenkopf (NUR EINMAL) ===== */
$table .= '<tr style="background-color:#4682B4; color:white;">';
foreach ($result[0] as $key => $value) {
$anzeige_name = $spalten_namen[$key] ?? $key;
$table .= '<th>' . htmlspecialchars($anzeige_name) . '</th>';
}
$table .= '</tr>';
/* ===== Datenzeilen ===== */
$zeile = 0;
foreach ($result as $row) {
$zeile++;
$farbe = ($zeile % 2 === 0) ? '#ADD8E6' : 'white';
$table .= '<tr style="background-color:' . $farbe . ';">';
foreach ($row as $key => $data) {
if ($key === 'stand_konto_euro') {
$formatierter_betrag = number_format((float)$data, 2, ',', '.');
$table .= '<td style="text-align:right;">' . htmlspecialchars($formatierter_betrag) . '</td>';
} else {
$table .= '<td>' . htmlspecialchars($data) . '</td>';
}
}
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
Dies war mein allererstes Mini-Coding-Projekt (Ausgaben erfolgen ebenfalls über die F12-Konsole)
Wie gesagt beschäftige ich mich nicht gerne mit Programmieraufgaben. Allerdings musste ich in der Vergangenheit einige Dinge programmieren, wodurch diese Beispiel-Codingaufgaben entstanden sind. Ich hoffe, Ihnen hat die detailliertere Beschreibung meiner Projekte gefallen.

