comments und quellen hinzufugt
This commit is contained in:
@@ -11,6 +11,7 @@ namespace SkyTeam
|
||||
{
|
||||
public AdminDashboard()
|
||||
{
|
||||
// Quelle: Im Unterricht gemacht
|
||||
InitializeComponent();
|
||||
LoadUsers();
|
||||
LoadFlights();
|
||||
@@ -19,12 +20,15 @@ namespace SkyTeam
|
||||
|
||||
private void LoadUsers()
|
||||
{
|
||||
// Quelle: Im Unterricht gemacht
|
||||
BindGrid("SELECT Id, Vorname, Nachname, Email, Rolle FROM users", AllUsersGrid);
|
||||
}
|
||||
|
||||
private void AllUsersGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (AllUsersGrid.SelectedItem == null) return;
|
||||
|
||||
// Quelle: Im Unterricht gemacht
|
||||
DataRowView row = (DataRowView)AllUsersGrid.SelectedItem;
|
||||
int userId = Convert.ToInt32(row["Id"]);
|
||||
BindGrid($"SELECT b.Id AS BuchungId, f.Flugnummer, f.Abflugort, f.Zielort, f.Abflugdatum FROM buchungen b JOIN fluege f ON b.FlugId = f.Id WHERE b.UserId = {userId}", UserBookingsGrid);
|
||||
@@ -38,6 +42,12 @@ namespace SkyTeam
|
||||
|
||||
if (MessageBox.Show($"User {uid} löschen?", "Confirm", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
|
||||
{
|
||||
// Quelle: AI Assistant (Claude ai)
|
||||
// Idee: Sicherheits Risiko Bewertung (Risk Assessment)
|
||||
// Die KI hat angemerkt, dass String Interpolation ($"DELETE... {uid}") bei SQL Queries
|
||||
// normalerweise ein No Go ist (SQL Injection Gefahr). Da wir hier aber sicherstellen, dass 'uid'
|
||||
// zwingend ein Integer (Convert.ToInt32) aus unserer eigenen Datenquelle ist, ist es in diesem
|
||||
// spezifischen Fall für ein Admin Tool vertretbar und spart Code.
|
||||
ExecuteSql($"DELETE FROM users WHERE Id={uid}");
|
||||
LoadUsers();
|
||||
UserBookingsGrid.ItemsSource = null;
|
||||
@@ -46,6 +56,7 @@ namespace SkyTeam
|
||||
|
||||
private void LoadFlights()
|
||||
{
|
||||
// Quelle: Im Unterricht gemacht
|
||||
string q = @"SELECT f.Id, f.Flugnummer, f.Abflugort, f.Zielort, f.Abflugdatum, f.Preis,
|
||||
z.Modell AS Plane, CONCAT(p.Vorname, ' ', p.Nachname) AS Pilot
|
||||
FROM fluege f
|
||||
@@ -68,7 +79,7 @@ namespace SkyTeam
|
||||
|
||||
private void AddFlight_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
// Quelle: Im Unterricht gemacht
|
||||
if (string.IsNullOrWhiteSpace(AddFromCombo.Text) ||
|
||||
string.IsNullOrWhiteSpace(AddToCombo.Text) ||
|
||||
AddDatePick.SelectedDate == null ||
|
||||
@@ -95,7 +106,12 @@ namespace SkyTeam
|
||||
cmd.Parameters.AddWithValue("@from", AddFromCombo.Text);
|
||||
cmd.Parameters.AddWithValue("@to", AddToCombo.Text);
|
||||
cmd.Parameters.AddWithValue("@date", AddDatePick.SelectedDate.Value);
|
||||
|
||||
// Quelle: Microsoft Learn
|
||||
// Wir nutzen die eingebaute AddHours-Methode von DateTime, um automatisch
|
||||
// ein fiktives Ankunftsdatum zu generieren (Abflug + 4 Stunden)
|
||||
cmd.Parameters.AddWithValue("@arr", AddDatePick.SelectedDate.Value.AddHours(4));
|
||||
|
||||
cmd.Parameters.AddWithValue("@fnum", flightNum);
|
||||
cmd.Parameters.AddWithValue("@price", AddPriceTxt.Text);
|
||||
cmd.Parameters.AddWithValue("@plane", PlaneCombo.SelectedValue);
|
||||
@@ -104,7 +120,7 @@ namespace SkyTeam
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
MessageBox.Show($"Flug {flightNum} erstellt!");
|
||||
LoadFlights();
|
||||
LoadFlights();
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); }
|
||||
@@ -116,11 +132,19 @@ namespace SkyTeam
|
||||
BindComboBox("SELECT Id, CONCAT(Vorname, ' ', Nachname) AS FullName FROM piloten WHERE IstVerfuegbar=1", PilotCombo, "FullName", "Id");
|
||||
}
|
||||
|
||||
// Quelle: AI Assistant (Gemini)
|
||||
// Idee: DRY Prinzip (Don't Repeat Yourself) / Refactoring
|
||||
// Die KI hat vorgeschlagen, die sehr repetitiven SQL-Verbindungs und Adapter Logiken
|
||||
// in universelle Hilfsmethoden (BindGrid, BindComboBox, ExecuteSql) auszulagern.
|
||||
// Das reduziert den Code der Hauptmethoden enorm und macht die Klasse wartbarer.
|
||||
private void BindGrid(string q, DataGrid g)
|
||||
{
|
||||
try { using (var c = new MySqlConnection(DatenbankServices.GetConnection())) { c.Open(); var a = new MySqlDataAdapter(q, c); var t = new DataTable(); a.Fill(t); g.ItemsSource = t.DefaultView; } } catch { }
|
||||
}
|
||||
|
||||
// Quelle: Microsoft Learn
|
||||
// Hier nutzen wir DisplayMemberPath für den Text, den der User sieht (z.B. das Flugzeugmodell)
|
||||
// und SelectedValuePath für den Wert, der im Hintergrund für die Datenbankabfrage genutzt wird (z.B. die Id).
|
||||
private void BindComboBox(string q, ComboBox b, string d, string v)
|
||||
{
|
||||
try { using (var c = new MySqlConnection(DatenbankServices.GetConnection())) { c.Open(); var a = new MySqlDataAdapter(q, c); var t = new DataTable(); a.Fill(t); b.ItemsSource = t.DefaultView; b.DisplayMemberPath = d; b.SelectedValuePath = v; } } catch { }
|
||||
@@ -131,6 +155,7 @@ namespace SkyTeam
|
||||
try { using (var c = new MySqlConnection(DatenbankServices.GetConnection())) { c.Open(); new MySqlCommand(s, c).ExecuteNonQuery(); } } catch (Exception ex) { MessageBox.Show(ex.Message); }
|
||||
}
|
||||
|
||||
// Quelle: Im Unterricht gemacht
|
||||
private void ShowUsers_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
UserManagementGrid.Visibility = Visibility.Visible;
|
||||
|
||||
Reference in New Issue
Block a user