+ */
+ public function definition(): array
+ {
+ return [
+ 'name' => fake()->name(),
+ 'email' => fake()->unique()->safeEmail(),
+ 'email_verified_at' => now(),
+ 'password' => static::$password ??= Hash::make('password'),
+ 'remember_token' => Str::random(10),
+ ];
+ }
+
+ /**
+ * Indicate that the model's email address should be unverified.
+ */
+ public function unverified(): static
+ {
+ return $this->state(fn (array $attributes) => [
+ 'email_verified_at' => null,
+ ]);
+ }
+}
diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php
new file mode 100755
index 0000000..05fb5d9
--- /dev/null
+++ b/database/migrations/0001_01_01_000000_create_users_table.php
@@ -0,0 +1,49 @@
+id();
+ $table->string('name');
+ $table->string('email')->unique();
+ $table->timestamp('email_verified_at')->nullable();
+ $table->string('password');
+ $table->rememberToken();
+ $table->timestamps();
+ });
+
+ Schema::create('password_reset_tokens', function (Blueprint $table) {
+ $table->string('email')->primary();
+ $table->string('token');
+ $table->timestamp('created_at')->nullable();
+ });
+
+ Schema::create('sessions', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->foreignId('user_id')->nullable()->index();
+ $table->string('ip_address', 45)->nullable();
+ $table->text('user_agent')->nullable();
+ $table->longText('payload');
+ $table->integer('last_activity')->index();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('users');
+ Schema::dropIfExists('password_reset_tokens');
+ Schema::dropIfExists('sessions');
+ }
+};
diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php
new file mode 100755
index 0000000..b9c106b
--- /dev/null
+++ b/database/migrations/0001_01_01_000001_create_cache_table.php
@@ -0,0 +1,35 @@
+string('key')->primary();
+ $table->mediumText('value');
+ $table->integer('expiration');
+ });
+
+ Schema::create('cache_locks', function (Blueprint $table) {
+ $table->string('key')->primary();
+ $table->string('owner');
+ $table->integer('expiration');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('cache');
+ Schema::dropIfExists('cache_locks');
+ }
+};
diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php
new file mode 100755
index 0000000..425e705
--- /dev/null
+++ b/database/migrations/0001_01_01_000002_create_jobs_table.php
@@ -0,0 +1,57 @@
+id();
+ $table->string('queue')->index();
+ $table->longText('payload');
+ $table->unsignedTinyInteger('attempts');
+ $table->unsignedInteger('reserved_at')->nullable();
+ $table->unsignedInteger('available_at');
+ $table->unsignedInteger('created_at');
+ });
+
+ Schema::create('job_batches', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->string('name');
+ $table->integer('total_jobs');
+ $table->integer('pending_jobs');
+ $table->integer('failed_jobs');
+ $table->longText('failed_job_ids');
+ $table->mediumText('options')->nullable();
+ $table->integer('cancelled_at')->nullable();
+ $table->integer('created_at');
+ $table->integer('finished_at')->nullable();
+ });
+
+ Schema::create('failed_jobs', function (Blueprint $table) {
+ $table->id();
+ $table->string('uuid')->unique();
+ $table->text('connection');
+ $table->text('queue');
+ $table->longText('payload');
+ $table->longText('exception');
+ $table->timestamp('failed_at')->useCurrent();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('jobs');
+ Schema::dropIfExists('job_batches');
+ Schema::dropIfExists('failed_jobs');
+ }
+};
diff --git a/database/migrations/2025_01_15_000000_create_manufacturers_table.php b/database/migrations/2025_01_15_000000_create_manufacturers_table.php
new file mode 100644
index 0000000..9bd1cb6
--- /dev/null
+++ b/database/migrations/2025_01_15_000000_create_manufacturers_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->string('name')->unique(); // Name des Herstellers (eindeutig)
+ $table->text('description')->nullable(); // Beschreibung des Herstellers
+ $table->string('website')->nullable(); // Website des Herstellers
+ $table->string('country')->nullable(); // Land des Herstellers
+ $table->timestamps();
+
+ // Index für schnelle Suche
+ $table->index('name');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('manufacturers');
+ }
+};
diff --git a/database/migrations/2025_08_10_020520_create_nail_polishes_table.php b/database/migrations/2025_08_10_020520_create_nail_polishes_table.php
new file mode 100755
index 0000000..b713687
--- /dev/null
+++ b/database/migrations/2025_08_10_020520_create_nail_polishes_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->string('name'); // Name des Nagellacks
+ $table->string('number'); // Nummer des Nagellacks
+ $table->string('image_path')->nullable(); // Pfad zum Bild
+ $table->timestamps();
+
+ // Index für schnelle Suche
+ $table->index(['name', 'number']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('nail_polishes');
+ }
+};
diff --git a/database/migrations/2025_08_10_020523_create_user_nail_polishes_table.php b/database/migrations/2025_08_10_020523_create_user_nail_polishes_table.php
new file mode 100755
index 0000000..6b1d9d2
--- /dev/null
+++ b/database/migrations/2025_08_10_020523_create_user_nail_polishes_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->foreignId('user_id')->constrained()->onDelete('cascade');
+ $table->foreignId('nail_polish_id')->constrained()->onDelete('cascade');
+ $table->timestamps();
+
+ // Verhindert doppelte Einträge
+ $table->unique(['user_id', 'nail_polish_id']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('user_nail_polishes');
+ }
+};
diff --git a/database/migrations/2025_08_10_020524_add_manufacturer_id_to_nail_polishes_table.php b/database/migrations/2025_08_10_020524_add_manufacturer_id_to_nail_polishes_table.php
new file mode 100644
index 0000000..0bda1dd
--- /dev/null
+++ b/database/migrations/2025_08_10_020524_add_manufacturer_id_to_nail_polishes_table.php
@@ -0,0 +1,29 @@
+foreignId('manufacturer_id')->nullable()->after('number')->constrained()->onDelete('set null');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('nail_polishes', function (Blueprint $table) {
+ $table->dropForeign(['manufacturer_id']);
+ $table->dropColumn('manufacturer_id');
+ });
+ }
+};
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
new file mode 100755
index 0000000..d01a0ef
--- /dev/null
+++ b/database/seeders/DatabaseSeeder.php
@@ -0,0 +1,23 @@
+create();
+
+ User::factory()->create([
+ 'name' => 'Test User',
+ 'email' => 'test@example.com',
+ ]);
+ }
+}
diff --git a/debug-405-error.php b/debug-405-error.php
new file mode 100644
index 0000000..b50d3b9
--- /dev/null
+++ b/debug-405-error.php
@@ -0,0 +1,118 @@
+query("SELECT COUNT(*) FROM users");
+ $userCount = $stmt->fetchColumn();
+ echo " - User in Datenbank: $userCount\n";
+
+} catch (Exception $e) {
+ echo " ❌ Datenbankfehler: " . $e->getMessage() . "\n";
+}
+
+// 3. Prüfe Laravel-Routes
+echo "\n3. Laravel-Routes:\n";
+try {
+ // Simuliere Laravel-Bootstrap
+ require_once 'vendor/autoload.php';
+
+ // Erstelle Laravel-App
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Hole Router
+ $router = $app->make('router');
+
+ // Prüfe spezifische Route
+ $routes = $router->getRoutes();
+ $foundRoute = false;
+
+ foreach ($routes as $route) {
+ if ($route->getName() === 'user-nail-polishes.store') {
+ echo " ✅ Route 'user-nail-polishes.store' gefunden\n";
+ echo " - URI: " . $route->uri() . "\n";
+ echo " - Method: " . implode('|', $route->methods()) . "\n";
+ echo " - Controller: " . $route->getActionName() . "\n";
+ $foundRoute = true;
+ break;
+ }
+ }
+
+ if (!$foundRoute) {
+ echo " ❌ Route 'user-nail-polishes.store' nicht gefunden\n";
+ }
+
+ // Zeige alle POST-Routes
+ echo "\n 📋 Alle POST-Routes:\n";
+ foreach ($routes as $route) {
+ if (in_array('POST', $route->methods())) {
+ echo " - " . $route->uri() . " -> " . $route->getName() . "\n";
+ }
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n";
+}
+
+// 4. Prüfe Dateisystem
+echo "\n4. Dateisystem:\n";
+$files = [
+ 'routes/web.php' => 'Route-Definitionen',
+ 'app/Http/Controllers/UserNailPolishController.php' => 'Controller',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create-View',
+ 'bootstrap/app.php' => 'Laravel-Bootstrap',
+ 'vendor/autoload.php' => 'Composer Autoload'
+];
+
+foreach ($files as $file => $description) {
+ if (file_exists($file)) {
+ echo " ✅ $description: $file\n";
+ } else {
+ echo " ❌ $description fehlt: $file\n";
+ }
+}
+
+// 5. Prüfe .htaccess
+echo "\n5. .htaccess-Konfiguration:\n";
+$htaccessFiles = [
+ '.htaccess' => 'Hauptverzeichnis',
+ 'public/.htaccess' => 'Public-Verzeichnis'
+];
+
+foreach ($htaccessFiles as $file => $location) {
+ if (file_exists($file)) {
+ echo " ✅ $location .htaccess gefunden\n";
+ $content = file_get_contents($file);
+ if (strpos($content, 'RewriteEngine On') !== false) {
+ echo " - RewriteEngine aktiviert\n";
+ }
+ if (strpos($content, 'index.php') !== false) {
+ echo " - index.php Weiterleitung konfiguriert\n";
+ }
+ } else {
+ echo " ❌ $location .htaccess fehlt\n";
+ }
+}
+
+echo "\n🔧 Nächste Schritte:\n";
+echo "1. Prüfen Sie die Laravel-Logs: storage/logs/laravel.log\n";
+echo "2. Aktivieren Sie APP_DEBUG=true in .env\n";
+echo "3. Leeren Sie den Cache: php artisan cache:clear\n";
+echo "4. Prüfen Sie die Apache-Logs für weitere Details\n";
+?>
diff --git a/debug-500-error.php b/debug-500-error.php
new file mode 100644
index 0000000..a91d391
--- /dev/null
+++ b/debug-500-error.php
@@ -0,0 +1,131 @@
+ 'Laravel Entry Point',
+ 'bootstrap/app.php' => 'Laravel Bootstrap',
+ 'vendor/autoload.php' => 'Composer Autoload',
+ 'config/app.php' => 'App Config',
+ '.env' => 'Environment File',
+ 'database.sqlite' => 'Database File'
+];
+
+foreach ($criticalFiles as $file => $description) {
+ if (file_exists($file)) {
+ $perms = substr(sprintf('%o', fileperms($file)), -4);
+ echo " ✅ $description: $file (Perms: $perms)\n";
+ } else {
+ echo " ❌ $description fehlt: $file\n";
+ }
+}
+
+// 5. Prüfe Verzeichnisberechtigungen
+echo "\n5. Verzeichnisberechtigungen prüfen:\n";
+$directories = [
+ 'storage' => 'Storage Directory',
+ 'storage/logs' => 'Logs Directory',
+ 'storage/framework' => 'Framework Directory',
+ 'storage/framework/cache' => 'Cache Directory',
+ 'storage/framework/sessions' => 'Sessions Directory',
+ 'storage/framework/views' => 'Views Directory',
+ 'bootstrap/cache' => 'Bootstrap Cache'
+];
+
+foreach ($directories as $dir => $description) {
+ if (is_dir($dir)) {
+ $perms = substr(sprintf('%o', fileperms($dir)), -4);
+ $writable = is_writable($dir) ? 'writable' : 'not writable';
+ echo " ✅ $description: $dir (Perms: $perms, $writable)\n";
+ } else {
+ echo " ❌ $description fehlt: $dir\n";
+ }
+}
+
+// 6. Prüfe Laravel-Bootstrap
+echo "\n6. Laravel-Bootstrap Test:\n";
+try {
+ require_once 'vendor/autoload.php';
+ echo " ✅ Composer Autoload erfolgreich\n";
+
+ $app = require_once 'bootstrap/app.php';
+ echo " ✅ Laravel App erstellt\n";
+
+ $kernel = $app->make('Illuminate\Contracts\Console\Kernel');
+ echo " ✅ Kernel erstellt\n";
+
+ $kernel->bootstrap();
+ echo " ✅ Laravel Bootstrap erfolgreich\n";
+
+} catch (Exception $e) {
+ echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n";
+ echo " 📍 Datei: " . $e->getFile() . ":" . $e->getLine() . "\n";
+}
+
+echo "\n🔧 Nächste Schritte:\n";
+echo "1. Prüfen Sie die Laravel-Logs für detaillierte Fehlermeldungen\n";
+echo "2. Aktivieren Sie APP_DEBUG=true in .env\n";
+echo "3. Prüfen Sie die Apache-Logs für Server-Fehler\n";
+echo "4. Stellen Sie sicher, dass alle Verzeichnisse beschreibbar sind\n";
+?>
diff --git a/debug-image-upload.php b/debug-image-upload.php
new file mode 100644
index 0000000..01fa643
--- /dev/null
+++ b/debug-image-upload.php
@@ -0,0 +1,194 @@
+ ini_get('upload_max_filesize'),
+ 'post_max_size' => ini_get('post_max_size'),
+ 'max_file_uploads' => ini_get('max_file_uploads'),
+ 'memory_limit' => ini_get('memory_limit'),
+ 'max_execution_time' => ini_get('max_execution_time'),
+ 'max_input_time' => ini_get('max_input_time'),
+ 'file_uploads' => ini_get('file_uploads'),
+ 'upload_tmp_dir' => ini_get('upload_tmp_dir')
+];
+
+foreach ($uploadSettings as $setting => $value) {
+ echo " - $setting: $value\n";
+}
+
+// 2. GD Extension prüfen
+echo "\n2. GD Extension prüfen:\n";
+if (extension_loaded('gd')) {
+ echo " ✅ GD Extension geladen\n";
+ $gdInfo = gd_info();
+ echo " - GD Version: " . $gdInfo['GD Version'] . "\n";
+ echo " - JPEG Support: " . ($gdInfo['JPEG Support'] ? 'Ja' : 'Nein') . "\n";
+ echo " - PNG Support: " . ($gdInfo['PNG Support'] ? 'Ja' : 'Nein') . "\n";
+ echo " - GIF Support: " . ($gdInfo['GIF Support'] ? 'Ja' : 'Nein') . "\n";
+} else {
+ echo " ❌ GD Extension nicht geladen\n";
+}
+
+// 3. Intervention Image prüfen
+echo "\n3. Intervention Image prüfen:\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ if (class_exists('Intervention\Image\ImageManager')) {
+ echo " ✅ Intervention Image verfügbar\n";
+
+ // Test ImageManager
+ $manager = new \Intervention\Image\ImageManager(new \Intervention\Image\Drivers\Gd\Driver());
+ echo " ✅ ImageManager funktioniert\n";
+ } else {
+ echo " ❌ Intervention Image nicht verfügbar\n";
+ }
+} catch (Exception $e) {
+ echo " ❌ Intervention Image Fehler: " . $e->getMessage() . "\n";
+}
+
+// 4. Storage-Verzeichnisse prüfen
+echo "\n4. Storage-Verzeichnisse prüfen:\n";
+$storagePaths = [
+ 'storage' => 'Storage Root',
+ 'storage/app' => 'Storage App',
+ 'storage/app/public' => 'Storage Public',
+ 'storage/app/public/nail_polishes' => 'Nail Polishes Storage',
+ 'public/storage' => 'Public Storage Link'
+];
+
+foreach ($storagePaths as $path => $description) {
+ if (file_exists($path)) {
+ $perms = substr(sprintf('%o', fileperms($path)), -4);
+ $writable = is_writable($path) ? 'writable' : 'not writable';
+ $type = is_dir($path) ? 'directory' : (is_link($path) ? 'symlink' : 'file');
+ echo " ✅ $description: $path ($type, perms: $perms, $writable)\n";
+ } else {
+ echo " ❌ $description: $path (nicht gefunden)\n";
+ }
+}
+
+// 5. Laravel Storage Link prüfen
+echo "\n5. Laravel Storage Link prüfen:\n";
+$publicStoragePath = 'public/storage';
+if (is_link($publicStoragePath)) {
+ $target = readlink($publicStoragePath);
+ echo " ✅ Storage Link existiert: $publicStoragePath -> $target\n";
+} else {
+ echo " ⚠️ Storage Link existiert nicht\n";
+
+ // Versuche Storage Link zu erstellen
+ try {
+ if (file_exists('storage/app/public')) {
+ if (is_dir('public/storage')) {
+ rmdir('public/storage');
+ }
+ symlink('../storage/app/public', 'public/storage');
+ echo " ✅ Storage Link erstellt\n";
+ } else {
+ echo " ❌ storage/app/public existiert nicht\n";
+ }
+ } catch (Exception $e) {
+ echo " ❌ Storage Link erstellen fehlgeschlagen: " . $e->getMessage() . "\n";
+ }
+}
+
+// 6. Laravel-Logs prüfen
+echo "\n6. Laravel-Logs prüfen:\n";
+$logFiles = [
+ 'storage/logs/laravel.log',
+ 'storage/logs/laravel-' . date('Y-m-d') . '.log'
+];
+
+foreach ($logFiles as $logFile) {
+ if (file_exists($logFile)) {
+ echo " 📋 $logFile gefunden\n";
+ $lines = file($logFile);
+ $lastLines = array_slice($lines, -5);
+ echo " 📄 Letzte 5 Zeilen:\n";
+ foreach ($lastLines as $line) {
+ if (strpos($line, 'error') !== false || strpos($line, 'Exception') !== false || strpos($line, 'upload') !== false) {
+ echo " " . trim($line) . "\n";
+ }
+ }
+ } else {
+ echo " ❌ $logFile nicht gefunden\n";
+ }
+}
+
+// 7. Test-Bild erstellen
+echo "\n7. Test-Bild erstellen:\n";
+try {
+ $testImagePath = 'storage/app/public/nail_polishes/test.jpg';
+
+ if (extension_loaded('gd')) {
+ // Erstelle ein einfaches Test-Bild
+ $image = imagecreate(100, 100);
+ $bgColor = imagecolorallocate($image, 255, 255, 255);
+ $textColor = imagecolorallocate($image, 0, 0, 0);
+ imagestring($image, 5, 10, 40, 'TEST', $textColor);
+
+ if (imagejpeg($image, $testImagePath, 80)) {
+ echo " ✅ Test-Bild erstellt: $testImagePath\n";
+
+ // Prüfe ob Bild über Web erreichbar ist
+ $webPath = 'public/storage/nail_polishes/test.jpg';
+ if (file_exists($webPath)) {
+ echo " ✅ Test-Bild über Web erreichbar\n";
+ } else {
+ echo " ❌ Test-Bild nicht über Web erreichbar\n";
+ }
+ } else {
+ echo " ❌ Test-Bild erstellen fehlgeschlagen\n";
+ }
+
+ imagedestroy($image);
+ } else {
+ echo " ❌ GD Extension nicht verfügbar für Test-Bild\n";
+ }
+} catch (Exception $e) {
+ echo " ❌ Test-Bild Fehler: " . $e->getMessage() . "\n";
+}
+
+// 8. Controller-Code prüfen
+echo "\n8. Controller-Code prüfen:\n";
+$controllerPath = 'app/Http/Controllers/UserNailPolishController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ // Prüfe ImageManager Import
+ if (strpos($content, 'use Intervention\\Image\\ImageManager') !== false) {
+ echo " ✅ ImageManager Import vorhanden\n";
+ } else {
+ echo " ❌ ImageManager Import fehlt\n";
+ }
+
+ // Prüfe Driver Import
+ if (strpos($content, 'use Intervention\\Image\\Drivers\\Gd\\Driver') !== false) {
+ echo " ✅ Driver Import vorhanden\n";
+ } else {
+ echo " ❌ Driver Import fehlt\n";
+ }
+
+ // Prüfe Bildverarbeitungscode
+ if (strpos($content, 'new ImageManager(new Driver())') !== false) {
+ echo " ✅ Bildverarbeitungscode vorhanden\n";
+ } else {
+ echo " ❌ Bildverarbeitungscode fehlt\n";
+ }
+} else {
+ echo " ❌ Controller nicht gefunden\n";
+}
+
+echo "\n✅ Bild-Upload Debug abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+echo "\n📋 Nächste Schritte:\n";
+echo "1. Prüfen Sie die Laravel-Logs für spezifische Fehlermeldungen\n";
+echo "2. Testen Sie mit einem kleinen Bild (< 1MB)\n";
+echo "3. Prüfen Sie Browser-Entwicklertools (F12) für Netzwerk-Fehler\n";
+echo "4. Schauen Sie in Apache-Logs für Server-Fehler\n";
+?>
diff --git a/debug-logout-detailed.php b/debug-logout-detailed.php
new file mode 100644
index 0000000..292656f
--- /dev/null
+++ b/debug-logout-detailed.php
@@ -0,0 +1,202 @@
+ $line) {
+ if (strpos($line, 'logout') !== false) {
+ $logoutLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ if (!empty($logoutLines)) {
+ echo " ✅ Logout-bezogene Zeilen gefunden:\n";
+ foreach ($logoutLines as $line) {
+ echo " 📋 $line\n";
+ }
+ } else {
+ echo " ❌ Keine Logout-bezogenen Zeilen gefunden\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 2. Routes prüfen
+echo "\n2. 🛣️ Routes prüfen...\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Zeige alle Logout-bezogenen Zeilen
+ $lines = explode("\n", $content);
+ $logoutLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ $logoutLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ if (!empty($logoutLines)) {
+ echo " ✅ Logout-Routes gefunden:\n";
+ foreach ($logoutLines as $line) {
+ echo " 📋 $line\n";
+ }
+ } else {
+ echo " ❌ Keine Logout-Routes gefunden\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 3. LoginController prüfen
+echo "\n3. 🔐 LoginController prüfen...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ if (strpos($content, 'public function logout') !== false) {
+ echo " ✅ Logout-Methode vorhanden\n";
+
+ // Zeige Logout-Methode
+ $lines = explode("\n", $content);
+ $inLogoutMethod = false;
+ $methodLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'public function logout') !== false) {
+ $inLogoutMethod = true;
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) {
+ $inLogoutMethod = false;
+ } elseif ($inLogoutMethod) {
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ echo " 📋 Logout-Methode:\n";
+ foreach ($methodLines as $line) {
+ echo " $line\n";
+ }
+
+ } else {
+ echo " ❌ Logout-Methode nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 4. Einfache Logout-Route erstellen
+echo "\n4. 🛣️ Einfache Logout-Route erstellen...\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Prüfe ob GET Logout-Route existiert
+ if (strpos($content, "Route::get('/logout', [LoginController::class, 'logout'])->name('logout');") === false) {
+ // Füge GET Logout-Route hinzu
+ $newRoute = "\n// Einfache Logout-Route für Debugging\nRoute::get('/logout', [App\\Http\\Controllers\\Auth\\LoginController::class, 'logout'])->name('logout');\n";
+
+ // Füge am Ende der Datei hinzu
+ $content .= $newRoute;
+ file_put_contents($routesPath, $content);
+ echo " ✅ GET Logout-Route hinzugefügt\n";
+ } else {
+ echo " ℹ️ GET Logout-Route bereits vorhanden\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 5. LoginController erweitern
+echo "\n5. 🔐 LoginController erweitern...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ // Prüfe ob Logout-Methode GET und POST unterstützt
+ if (strpos($content, 'public function logout(Request $request)') !== false) {
+ echo " ✅ Logout-Methode unterstützt bereits GET und POST\n";
+ } else {
+ echo " ℹ️ Logout-Methode prüfen...\n";
+ }
+
+ // Zeige aktuelle Logout-Methode
+ $lines = explode("\n", $content);
+ $inLogoutMethod = false;
+ $methodLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'public function logout') !== false) {
+ $inLogoutMethod = true;
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) {
+ $inLogoutMethod = false;
+ } elseif ($inLogoutMethod) {
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ echo " 📋 Aktuelle Logout-Methode:\n";
+ foreach ($methodLines as $line) {
+ echo " $line\n";
+ }
+
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 6. Cache leeren
+echo "\n6. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 7. Test-Logout-Links erstellen
+echo "\n7. 🧪 Test-Logout-Links erstellen...\n";
+$testLinks = [
+ 'https://neonail.vogt.de.com/logout (GET)',
+ 'https://neonail.vogt.de.com/logout (POST)',
+ 'https://neonail.vogt.de.com/',
+ 'https://neonail.vogt.de.com/login'
+];
+
+foreach ($testLinks as $link) {
+ echo " 🔗 $link\n";
+}
+
+// 8. Debug-Anleitung
+echo "\n8. 🔍 Debug-Anleitung...\n";
+echo " 📋 1. Öffnen Sie: https://neonail.vogt.de.com\n";
+echo " 📋 2. Melden Sie sich an\n";
+echo " 📋 3. Öffnen Sie Browser-Entwicklertools (F12)\n";
+echo " 📋 4. Gehen Sie zu Console-Tab\n";
+echo " 📋 5. Klicken Sie auf Ihren Benutzernamen\n";
+echo " 📋 6. Wählen Sie 'Abmelden'\n";
+echo " 📋 7. Schauen Sie nach JavaScript-Fehlern\n";
+echo " 📋 8. Gehen Sie zu Network-Tab\n";
+echo " 📋 9. Schauen Sie welche URL aufgerufen wird\n";
+echo " 📋 10. Testen Sie direkt: https://neonail.vogt.de.com/logout\n";
+
+echo "\n✅ Detailliertes Logout-Debug abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Das normale Logout über das Dropdown\n";
+echo "2. Den direkten Link: https://neonail.vogt.de.com/logout\n";
+echo "3. Teilen Sie alle Fehlermeldungen mit\n";
+?>
diff --git a/debug-logout.php b/debug-logout.php
new file mode 100644
index 0000000..1f4bbcb
--- /dev/null
+++ b/debug-logout.php
@@ -0,0 +1,218 @@
+ $line) {
+ if (strpos($line, 'logout') !== false) {
+ echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n";
+ }
+ }
+ } else {
+ echo " ❌ Logout-Form nicht gefunden\n";
+ }
+
+ // Prüfe Route-Verwendung
+ if (strpos($content, '{{ route("logout") }}') !== false) {
+ echo " ✅ Laravel Route wird verwendet\n";
+ } elseif (strpos($content, 'https://neonail.vogt.de.com/logout') !== false) {
+ echo " ❌ Hardcodierte URL wird verwendet\n";
+ } else {
+ echo " ❓ Unbekannte Logout-Konfiguration\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 2. Routes prüfen
+echo "\n2. 🛣️ Routes prüfen...\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Zeige alle Logout-bezogenen Zeilen
+ $lines = explode("\n", $content);
+ $logoutLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ $logoutLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ if (!empty($logoutLines)) {
+ echo " ✅ Logout-Routes gefunden:\n";
+ foreach ($logoutLines as $line) {
+ echo " 📋 $line\n";
+ }
+ } else {
+ echo " ❌ Keine Logout-Routes gefunden\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 3. LoginController prüfen
+echo "\n3. 🔐 LoginController prüfen...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ if (strpos($content, 'logout') !== false) {
+ echo " ✅ Logout-Methode gefunden\n";
+
+ // Zeige Logout-Methode
+ $lines = explode("\n", $content);
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n";
+ }
+ }
+ } else {
+ echo " ❌ Logout-Methode nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 4. Laravel Route-Liste generieren
+echo "\n4. 🛣️ Laravel Route-Liste generieren...\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ // Laravel Bootstrap
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Route-Liste abrufen
+ $routes = \Illuminate\Support\Facades\Route::getRoutes();
+
+ $logoutRoutes = [];
+ foreach ($routes as $route) {
+ $uri = $route->uri();
+ $methods = $route->methods();
+ $name = $route->getName();
+
+ if (strpos($uri, 'logout') !== false || strpos($name, 'logout') !== false) {
+ $logoutRoutes[] = [
+ 'uri' => $uri,
+ 'methods' => $methods,
+ 'name' => $name
+ ];
+ }
+ }
+
+ if (empty($logoutRoutes)) {
+ echo " ❌ Keine Logout-Routes in Laravel registriert\n";
+ } else {
+ echo " ✅ Logout-Routes in Laravel gefunden:\n";
+ foreach ($logoutRoutes as $route) {
+ $methods = implode('|', $route['methods']);
+ $name = $route['name'] ?: 'kein Name';
+ echo " 📋 $methods $uri ($name)\n";
+ }
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n";
+}
+
+// 5. Cache-Status prüfen
+echo "\n5. 🧹 Cache-Status prüfen...\n";
+$cacheFiles = [
+ 'bootstrap/cache/packages.php' => 'Packages Cache',
+ 'bootstrap/cache/services.php' => 'Services Cache',
+ 'bootstrap/cache/routes.php' => 'Routes Cache',
+ 'bootstrap/cache/config.php' => 'Config Cache'
+];
+
+foreach ($cacheFiles as $cacheFile => $description) {
+ if (file_exists($cacheFile)) {
+ echo " ⚠️ Cache vorhanden: $description\n";
+ } else {
+ echo " ✅ Cache geleert: $description\n";
+ }
+}
+
+// 6. Test-Logout-URLs generieren
+echo "\n6. 🔗 Test-Logout-URLs:\n";
+$testUrls = [
+ 'https://neonail.vogt.de.com/logout',
+ 'https://neonail.vogt.de.com/logout (POST)',
+ 'https://neonail.vogt.de.com/logout (GET)',
+ 'https://neonail.vogt.de.com/',
+ 'https://neonail.vogt.de.com/login'
+];
+
+foreach ($testUrls as $url) {
+ echo " 🔗 $url\n";
+}
+
+// 7. Layout korrigieren (falls nötig)
+echo "\n7. 🔧 Layout korrigieren...\n";
+$layoutPath = 'resources/views/layouts/app.blade.php';
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ // Ersetze alle hardcodierten Logout-URLs
+ $replacements = [
+ 'action="https://neonail.vogt.de.com/logout"' => 'action="{{ route("logout") }}"',
+ 'href="https://neonail.vogt.de.com/logout"' => 'href="{{ route("logout") }}"',
+ 'action="http://neonail.vogt.de.com/logout"' => 'action="{{ route("logout") }}"',
+ 'href="http://neonail.vogt.de.com/logout"' => 'href="{{ route("logout") }}"'
+ ];
+
+ $modified = false;
+ foreach ($replacements as $old => $new) {
+ if (strpos($content, $old) !== false) {
+ $content = str_replace($old, $new, $content);
+ $modified = true;
+ echo " ✅ Ersetzt: $old → $new\n";
+ }
+ }
+
+ if ($modified) {
+ file_put_contents($layoutPath, $content);
+ echo " ✅ Layout aktualisiert\n";
+ } else {
+ echo " ℹ️ Keine Änderungen nötig\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 8. Cache leeren
+echo "\n8. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+echo "\n✅ Logout-Debug abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n";
+echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n";
+echo "3. Falls das nicht funktioniert, versuchen Sie direkt:\n";
+echo " - https://neonail.vogt.de.com/logout\n";
+echo "\n📋 Falls Problem besteht:\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Teilen Sie die Debug-Ausgabe mit\n";
+?>
diff --git a/deploy-manufacturer-feature.sh b/deploy-manufacturer-feature.sh
new file mode 100755
index 0000000..754f525
--- /dev/null
+++ b/deploy-manufacturer-feature.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+# NeoNail DB - Hersteller-Feature Deployment Script
+# Führt die neuen Migrationen aus und aktualisiert die Anwendung
+
+echo "🎨 NeoNail DB - Hersteller-Feature Deployment"
+echo "=============================================="
+
+# Prüfe, ob wir im richtigen Verzeichnis sind
+if [ ! -f "artisan" ]; then
+ echo "❌ Fehler: artisan Datei nicht gefunden. Bitte führen Sie das Script im Laravel-Root-Verzeichnis aus."
+ exit 1
+fi
+
+echo "📋 Prüfe Migration-Reihenfolge..."
+# Stelle sicher, dass die manufacturer_id Migration nach der nail_polishes Migration kommt
+if [ -f "database/migrations/2025_01_15_000001_add_manufacturer_id_to_nail_polishes_table.php" ]; then
+ echo "🔄 Korrigiere Migration-Reihenfolge..."
+ mv database/migrations/2025_01_15_000001_add_manufacturer_id_to_nail_polishes_table.php \
+ database/migrations/2025_08_10_020524_add_manufacturer_id_to_nail_polishes_table.php
+ echo "✅ Migration-Reihenfolge korrigiert"
+fi
+
+echo "📋 Führe Migrationen aus..."
+php artisan migrate --force
+
+if [ $? -eq 0 ]; then
+ echo "✅ Migrationen erfolgreich ausgeführt"
+else
+ echo "❌ Fehler beim Ausführen der Migrationen"
+ exit 1
+fi
+
+echo "🔄 Cache leeren..."
+php artisan config:clear
+php artisan route:clear
+php artisan view:clear
+
+echo "📦 Composer Autoload aktualisieren..."
+composer dump-autoload
+
+echo "🔗 Storage-Link prüfen..."
+if [ ! -L "public/storage" ]; then
+ echo "📎 Storage-Link erstellen..."
+ php artisan storage:link
+else
+ echo "✅ Storage-Link bereits vorhanden"
+fi
+
+echo "🔒 Berechtigungen setzen..."
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+chmod 664 database.sqlite
+
+echo "✅ Hersteller-Feature erfolgreich deployed!"
+echo ""
+echo "🎯 Neue Features:"
+echo " - Hersteller-Verwaltung für alle User"
+echo " - Hersteller-Auswahl beim Erstellen von Nagellacken"
+echo " - Automatische Hersteller-Erstellung"
+echo " - Hersteller-Statistiken im Admin-Bereich"
+echo ""
+echo "🌐 Zugriff:"
+echo " - Hersteller-Übersicht: /manufacturers"
+echo " - Neuen Hersteller erstellen: /manufacturers/create"
+echo ""
+echo "🚀 Anwendung ist bereit!"
diff --git a/deploy-sqlite.sh b/deploy-sqlite.sh
new file mode 100755
index 0000000..e7ec256
--- /dev/null
+++ b/deploy-sqlite.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+# NeoNail DB SQLite Deployment Script
+echo "🚀 NeoNail DB SQLite Deployment gestartet..."
+
+# 1. SQLite-Datenbank erstellen (falls nicht vorhanden)
+echo "🗄️ SQLite-Datenbank erstellen..."
+if [ ! -f database.sqlite ]; then
+ touch database.sqlite
+ echo "✅ SQLite-Datenbank erstellt"
+else
+ echo "✅ SQLite-Datenbank bereits vorhanden"
+fi
+
+# 2. Berechtigungen für SQLite-Datenbank setzen
+echo "🔐 SQLite-Berechtigungen setzen..."
+chmod 664 database.sqlite
+if command -v chown &> /dev/null; then
+ chown www-data:www-data database.sqlite 2>/dev/null || echo "⚠️ chown nicht verfügbar"
+fi
+
+# 3. Composer Dependencies optimieren
+echo "📦 Composer Dependencies optimieren..."
+composer install --optimize-autoloader --no-dev
+
+# 4. Cache leeren
+echo "🧹 Cache leeren..."
+php artisan config:clear
+php artisan cache:clear
+php artisan view:clear
+php artisan route:clear
+
+# 5. Storage-Link erstellen
+echo "🔗 Storage-Link erstellen..."
+php artisan storage:link
+
+# 6. Berechtigungen setzen
+echo "🔐 Berechtigungen setzen..."
+chmod -R 755 storage/
+chmod -R 755 bootstrap/cache/
+chmod 644 .env
+
+# 7. Datenbank-Migrationen
+echo "🗄️ Datenbank-Migrationen..."
+php artisan migrate --force
+
+# 8. Cache optimieren
+echo "⚡ Cache optimieren..."
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+
+echo "✅ SQLite Deployment abgeschlossen!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Admin-User erstellen: php artisan tinker"
+echo "2. Testen der Anwendung"
+echo "3. HTTPS aktivieren"
+echo "4. Backup-Strategie einrichten"
+echo ""
+echo "💡 SQLite Vorteile:"
+echo "- Keine MySQL-Installation nötig"
+echo "- Einfaches Backup (nur eine Datei)"
+echo "- Minimaler Konfigurationsaufwand"
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 0000000..ab47a51
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+# NeoNail DB Deployment Script
+echo "🚀 NeoNail DB Deployment gestartet..."
+
+# 1. Composer Dependencies optimieren
+echo "📦 Composer Dependencies optimieren..."
+composer install --optimize-autoloader --no-dev
+
+# 2. Cache leeren
+echo "🧹 Cache leeren..."
+php artisan config:clear
+php artisan cache:clear
+php artisan view:clear
+php artisan route:clear
+
+# 3. Storage-Link erstellen
+echo "🔗 Storage-Link erstellen..."
+php artisan storage:link
+
+# 4. Berechtigungen setzen
+echo "🔐 Berechtigungen setzen..."
+chmod -R 755 storage/
+chmod -R 755 bootstrap/cache/
+chmod 644 .env
+
+# 5. Datenbank-Migrationen
+echo "🗄️ Datenbank-Migrationen..."
+php artisan migrate --force
+
+# 6. Cache optimieren
+echo "⚡ Cache optimieren..."
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+
+echo "✅ Deployment abgeschlossen!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Admin-User erstellen: php artisan tinker"
+echo "2. Testen der Anwendung"
+echo "3. HTTPS aktivieren"
+echo "4. Backup-Strategie einrichten"
diff --git a/deployment-checklist.md b/deployment-checklist.md
new file mode 100755
index 0000000..097f175
--- /dev/null
+++ b/deployment-checklist.md
@@ -0,0 +1,111 @@
+# NeoNail DB - Deployment Checklist
+
+## Vorbereitung (Lokal)
+
+### 1. Produktions-Umgebung konfigurieren
+```bash
+# .env.production erstellen
+cp .env .env.production
+
+# Produktions-Einstellungen in .env.production:
+APP_ENV=production
+APP_DEBUG=false
+APP_URL=https://ihre-domain.de
+
+# Datenbank-Einstellungen
+DB_CONNECTION=mysql
+DB_HOST=localhost
+DB_PORT=3306
+DB_DATABASE=ihre_datenbank
+DB_USERNAME=ihr_username
+DB_PASSWORD=ihr_passwort
+```
+
+### 2. Dependencies optimieren
+```bash
+composer install --optimize-autoloader --no-dev
+npm run build # falls vorhanden
+```
+
+### 3. Cache leeren und optimieren
+```bash
+php artisan config:clear
+php artisan cache:clear
+php artisan view:clear
+php artisan route:clear
+```
+
+### 4. Storage-Link erstellen
+```bash
+php artisan storage:link
+```
+
+## Upload zum Webspace
+
+### 1. Dateien hochladen
+- Alle Dateien außer `node_modules/`, `vendor/` (falls vorhanden)
+- `.env.production` als `.env` hochladen
+- `storage/` und `bootstrap/cache/` Ordner mit Schreibrechten
+
+### 2. Composer installieren (falls verfügbar)
+```bash
+composer install --optimize-autoloader --no-dev
+```
+
+### 3. Datenbank-Migrationen
+```bash
+php artisan migrate --force
+```
+
+### 4. Berechtigungen setzen
+```bash
+chmod -R 755 storage/
+chmod -R 755 bootstrap/cache/
+chmod 644 .env
+```
+
+## Nach dem Upload
+
+### 1. Cache optimieren
+```bash
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+```
+
+### 2. Admin-User erstellen
+```bash
+php artisan tinker
+```
+```php
+use App\Models\User;
+User::create([
+ 'name' => 'Admin',
+ 'email' => 'admin@neonail.com',
+ 'password' => bcrypt('ihr_admin_passwort')
+]);
+```
+
+### 3. Testen
+- Login mit admin@neonail.com
+- Neuen Lack erstellen
+- Bild-Upload testen
+- Mobile-Ansicht prüfen
+
+## Wichtige Hinweise
+
+### Sicherheit
+- APP_KEY muss gesetzt sein
+- Starke Passwörter verwenden
+- HTTPS verwenden
+- .env nicht öffentlich zugänglich
+
+### Performance
+- OPcache aktivieren (falls verfügbar)
+- Redis für Cache (optional)
+- CDN für Bilder (optional)
+
+### Backup
+- Regelmäßige Datenbank-Backups
+- Storage-Ordner sichern
+- Code-Backup
diff --git a/emergency-apache-fix.sh b/emergency-apache-fix.sh
new file mode 100755
index 0000000..c2791cf
--- /dev/null
+++ b/emergency-apache-fix.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+echo "🚨 EMERGENCY: Apache komplett reparieren"
+echo "======================================="
+
+# 1. Apache-Status prüfen
+echo "1. 🔍 Apache-Status prüfen..."
+systemctl status apache2 2>/dev/null || service apache2 status 2>/dev/null || echo " ⚠️ Apache-Status nicht verfügbar"
+
+# 2. Apache stoppen
+echo "2. 🛑 Apache stoppen..."
+systemctl stop apache2 2>/dev/null || service apache2 stop 2>/dev/null || echo " ⚠️ Apache stop fehlgeschlagen"
+
+# 3. .htaccess zurücksetzen
+echo "3. 🔄 .htaccess zurücksetzen..."
+if [ -f public/.htaccess.backup ]; then
+ cp public/.htaccess.backup public/.htaccess
+ echo " ✅ .htaccess aus Backup wiederhergestellt"
+elif [ -f public/.htaccess.simple ]; then
+ cp public/.htaccess.simple public/.htaccess
+ echo " ✅ .htaccess aus simple wiederhergestellt"
+else
+ # Erstelle minimale .htaccess
+ cat > public/.htaccess << 'EOF'
+
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+EOF
+ echo " ✅ Minimale .htaccess erstellt"
+fi
+
+# 4. Apache-Module zurücksetzen
+echo "4. 🔧 Apache-Module zurücksetzen..."
+a2dismod headers 2>/dev/null || echo " ⚠️ mod_headers deaktivieren fehlgeschlagen"
+a2enmod rewrite 2>/dev/null || echo " ⚠️ mod_rewrite aktivieren fehlgeschlagen"
+
+# 5. Apache-Konfiguration testen
+echo "5. 🧪 Apache-Konfiguration testen..."
+apache2ctl -t 2>/dev/null && echo " ✅ Apache-Konfiguration OK" || echo " ❌ Apache-Konfiguration fehlerhaft"
+
+# 6. Apache starten
+echo "6. 🚀 Apache starten..."
+systemctl start apache2 2>/dev/null || service apache2 start 2>/dev/null || echo " ⚠️ Apache start fehlgeschlagen"
+
+# 7. Apache-Status prüfen
+echo "7. 🔍 Apache-Status nach Start..."
+systemctl status apache2 2>/dev/null || service apache2 status 2>/dev/null || echo " ⚠️ Apache-Status nicht verfügbar"
+
+# 8. Test-Request
+echo "8. 🧪 Test-Request..."
+curl -I http://localhost/ 2>/dev/null && echo " ✅ Apache antwortet" || echo " ❌ Apache antwortet nicht"
+
+echo ""
+echo "✅ Emergency Apache Fix abgeschlossen!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. http://neonail.vogt.de.com"
+echo "2. https://neonail.vogt.de.com"
+echo ""
+echo "📝 Falls Problem besteht:"
+echo "- Prüfen Sie: systemctl status apache2"
+echo "- Schauen Sie in: /var/log/apache2/error.log"
+echo "- Führen Sie: apache2ctl -t"
diff --git a/env-production-example.txt b/env-production-example.txt
new file mode 100755
index 0000000..0fe2526
--- /dev/null
+++ b/env-production-example.txt
@@ -0,0 +1,55 @@
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs=
+APP_DEBUG=false
+APP_URL=http://192.168.30.81
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+DB_DATABASE=database.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
diff --git a/env-sqlite-example.txt b/env-sqlite-example.txt
new file mode 100755
index 0000000..27bdb00
--- /dev/null
+++ b/env-sqlite-example.txt
@@ -0,0 +1,64 @@
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:YOUR_APP_KEY_HERE
+APP_DEBUG=false
+APP_URL=https://ihre-domain.de
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=error
+
+# SQLite Konfiguration (Einfachste Option)
+DB_CONNECTION=sqlite
+DB_DATABASE=/path/to/database.sqlite
+
+# MySQL Konfiguration (Alternative)
+# DB_CONNECTION=mysql
+# DB_HOST=localhost
+# DB_PORT=3306
+# DB_DATABASE=ihre_datenbank
+# DB_USERNAME=ihr_username
+# DB_PASSWORD=ihr_passwort
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
diff --git a/fix-405-error.sh b/fix-405-error.sh
new file mode 100755
index 0000000..53d3a57
--- /dev/null
+++ b/fix-405-error.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+echo "🔧 Fix: HTTP 405 Method Not Allowed"
+echo "==================================="
+
+# 1. Debug-Script ausführen
+echo "1. 🔍 Diagnose ausführen..."
+php debug-405-error.php
+
+echo ""
+echo "2. 🧹 Laravel Cache leeren..."
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+
+echo ""
+echo "3. 🔄 Route-Cache neu generieren..."
+php artisan route:cache 2>/dev/null || echo "⚠️ route:cache übersprungen"
+
+echo ""
+echo "4. 📝 .env Debug aktivieren..."
+if [ -f .env ]; then
+ sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+ sed -i 's/APP_ENV=production/APP_ENV=local/' .env
+ echo "✅ Debug-Modus aktiviert"
+else
+ echo "❌ .env Datei nicht gefunden"
+fi
+
+echo ""
+echo "5. 🔍 Apache-Logs prüfen..."
+if [ -f /var/log/apache2/error.log ]; then
+ echo "📋 Letzte Apache-Fehler:"
+ tail -10 /var/log/apache2/error.log | grep -E "(405|Method|Not Allowed)" || echo "Keine 405-Fehler gefunden"
+else
+ echo "⚠️ Apache-Logs nicht verfügbar"
+fi
+
+echo ""
+echo "6. 🧪 Route-Test..."
+echo "📋 Teste POST-Route direkt:"
+curl -X POST https://neonail.vogt.de.com/create-nail-polish \
+ -H "Content-Type: application/x-www-form-urlencoded" \
+ -d "name=Test&number=123&_token=test" \
+ -w "\nHTTP-Status: %{http_code}\n" \
+ 2>/dev/null || echo "❌ curl nicht verfügbar"
+
+echo ""
+echo "✅ Fix abgeschlossen!"
+echo ""
+echo "🔧 Nächste Schritte:"
+echo "1. Testen Sie das Formular erneut"
+echo "2. Prüfen Sie die Browser-Entwicklertools (F12) für Details"
+echo "3. Schauen Sie in storage/logs/laravel.log für Laravel-Fehler"
+echo "4. Falls Problem besteht: php artisan route:list | grep store"
diff --git a/fix-admin-controller-email.php b/fix-admin-controller-email.php
new file mode 100644
index 0000000..d40f9ca
--- /dev/null
+++ b/fix-admin-controller-email.php
@@ -0,0 +1,284 @@
+take(5)->get();
+ $recentNailPolishes = NailPolish::latest()->take(5)->get();
+
+ return view("admin.dashboard", compact("totalUsers", "totalNailPolishes", "recentUsers", "recentNailPolishes"));
+ }
+
+ /**
+ * Liste aller Benutzer
+ */
+ public function users(Request $request)
+ {
+ $search = $request->get("search");
+
+ $users = User::when($search, function($query) use ($search) {
+ return $query->where("name", "like", "%{$search}%")
+ ->orWhere("email", "like", "%{$search}%");
+ })->orderBy("name")->paginate(20);
+
+ return view("admin.users.index", compact("users", "search"));
+ }
+
+ /**
+ * Formular zum Erstellen eines neuen Benutzers
+ */
+ public function createUser()
+ {
+ return view("admin.users.create");
+ }
+
+ /**
+ * Neuen Benutzer speichern
+ */
+ public function storeUser(Request $request)
+ {
+ $request->validate([
+ "name" => "required|string|max:255",
+ "email" => "required|string|email|max:255|unique:users",
+ "password" => "required|string|min:8|confirmed",
+ ]);
+
+ // Passwort für E-Mail speichern (wird nach dem Speichern gelöscht)
+ $plainPassword = $request->password;
+
+ // User erstellen
+ $user = User::create([
+ "name" => $request->name,
+ "email" => $request->email,
+ "password" => Hash::make($request->password),
+ "is_admin" => $request->has("is_admin"),
+ ]);
+
+ // Willkommens-E-Mail senden
+ try {
+ Mail::send("emails.welcome-user", [
+ "user" => $user,
+ "password" => $plainPassword
+ ], function($message) use ($user) {
+ $message->to($user->email, $user->name)
+ ->subject("🎨 Willkommen bei der NeoNail DB - Ihre Login-Daten")
+ ->from(config("mail.from.address"), config("mail.from.name"));
+ });
+
+ // Admin-Bestätigung senden
+ Mail::raw("Hallo Admin!
+
+Ein neuer User wurde erfolgreich erstellt und eine Willkommens-E-Mail gesendet.
+
+📋 User-Details:
+ - Name: {$user->name}
+ - E-Mail: {$user->email}
+ - Admin-Status: " . ($user->isAdmin() ? "Ja" : "Nein") . "
+ - Erstellt: " . now() . "
+
+Die Willkommens-E-Mail enthält:
+ - Login-Daten (Website, E-Mail, Passwort)
+ - Aufforderung zum Passwort-Ändern
+ - Feature-Übersicht
+ - Direkte Links zur Anwendung
+
+Viele Grüße,
+NeoNail DB System", function($message) {
+ $message->to("oliver@vogt.de.com", "Admin")
+ ->subject("✅ NeoNail DB - Neuer User erstellt")
+ ->from(config("mail.from.address"), config("mail.from.name"));
+ });
+
+ $successMessage = "Benutzer erfolgreich erstellt! Willkommens-E-Mail wurde gesendet.";
+
+ } catch (\Exception $e) {
+ // User wurde erstellt, aber E-Mail fehlgeschlagen
+ \Log::error("Fehler beim Senden der Willkommens-E-Mail: " . $e->getMessage());
+ $successMessage = "Benutzer erfolgreich erstellt! E-Mail konnte nicht gesendet werden.";
+ }
+
+ return redirect()->route("admin.users.index")
+ ->with("success", $successMessage);
+ }
+
+ /**
+ * Formular zum Bearbeiten eines Benutzers
+ */
+ public function editUser(User $user)
+ {
+ return view("admin.users.edit", compact("user"));
+ }
+
+ /**
+ * Benutzer aktualisieren
+ */
+ public function updateUser(Request $request, User $user)
+ {
+ $request->validate([
+ "name" => "required|string|max:255",
+ "email" => "required|string|email|max:255|unique:users,email," . $user->id,
+ "password" => "nullable|string|min:8|confirmed",
+ ]);
+
+ $user->name = $request->name;
+ $user->email = $request->email;
+ $user->is_admin = $request->has("is_admin");
+
+ if ($request->filled("password")) {
+ $user->password = Hash::make($request->password);
+ }
+
+ $user->save();
+
+ return redirect()->route("admin.users.index")
+ ->with("success", "Benutzer erfolgreich aktualisiert!");
+ }
+
+ /**
+ * Benutzer löschen
+ */
+ public function destroyUser(User $user)
+ {
+ $userName = $user->name;
+ $userEmail = $user->email;
+
+ $user->delete();
+
+ // Admin-Benachrichtigung über gelöschten User
+ try {
+ Mail::raw("Hallo Admin!
+
+Ein User wurde erfolgreich gelöscht.
+
+📋 Gelöschter User:
+ - Name: {$userName}
+ - E-Mail: {$userEmail}
+ - Gelöscht: " . now() . "
+
+Viele Grüße,
+NeoNail DB System", function($message) {
+ $message->to("oliver@vogt.de.com", "Admin")
+ ->subject("🗑️ NeoNail DB - User gelöscht")
+ ->from(config("mail.from.address"), config("mail.from.name"));
+ });
+ } catch (\Exception $e) {
+ \Log::error("Fehler beim Senden der Lösch-Benachrichtigung: " . $e->getMessage());
+ }
+
+ return redirect()->route("admin.users.index")
+ ->with("success", "Benutzer erfolgreich gelöscht!");
+ }
+
+ /**
+ * Statistiken anzeigen
+ */
+ public function statistics()
+ {
+ $totalUsers = User::count();
+ $totalNailPolishes = NailPolish::count();
+ $usersWithCollections = User::has("nailPolishes")->count();
+ $averageCollectionSize = User::withCount("nailPolishes")->avg("nail_polishes_count");
+
+ $topUsers = User::withCount("nailPolishes")
+ ->orderBy("nail_polishes_count", "desc")
+ ->take(10)
+ ->get();
+
+ return view("admin.statistics", compact(
+ "totalUsers",
+ "totalNailPolishes",
+ "usersWithCollections",
+ "averageCollectionSize",
+ "topUsers"
+ ));
+ }
+}';
+
+file_put_contents('app/Http/Controllers/AdminController.php', $controllerContent);
+echo " ✅ AdminController erweitert\n";
+
+// 2. E-Mail-Verzeichnis erstellen
+echo "2. 📁 E-Mail-Verzeichnis erstellen...\n";
+$emailDir = 'resources/views/emails';
+if (!is_dir($emailDir)) {
+ mkdir($emailDir, 0755, true);
+ echo " ✅ E-Mail-Verzeichnis erstellt: $emailDir\n";
+} else {
+ echo " ℹ️ E-Mail-Verzeichnis existiert bereits: $emailDir\n";
+}
+
+// 3. Cache leeren
+echo "3. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 4. Test-E-Mail senden
+echo "4. 📧 Test-E-Mail senden...\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ // Laravel Bootstrap
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Test-User erstellen
+ $testUser = new \App\Models\User();
+ $testUser->name = 'Test User';
+ $testUser->email = 'test@example.com';
+ $testUser->password = 'testpassword123';
+ $testUser->is_admin = false;
+
+ // Test-E-Mail senden
+ $result = \Illuminate\Support\Facades\Mail::send('emails.welcome-user', [
+ 'user' => $testUser,
+ 'password' => 'testpassword123'
+ ], function($message) use ($testUser) {
+ $message->to('oliver@vogt.de.com', 'Admin')
+ ->subject('🧪 Test: NeoNail DB Willkommens-E-Mail Template')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ Test-E-Mail erfolgreich gesendet!\n";
+
+} catch (Exception $e) {
+ echo " ❌ Test-E-Mail Fehler: " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ AdminController mit E-Mail-Versendung erweitert!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Gehen Sie zu: https://neonail.vogt.de.com/admin/users/create\n";
+echo "2. Erstellen Sie einen neuen User\n";
+echo "3. Der User erhält automatisch eine Willkommens-E-Mail\n";
+echo "4. Sie erhalten eine Admin-Bestätigung\n";
+echo "\n📧 Die Willkommens-E-Mail enthält:\n";
+echo "- Login-Daten (Website, E-Mail, Passwort)\n";
+echo "- Aufforderung zum Passwort-Ändern\n";
+echo "- Feature-Übersicht\n";
+echo "- Direkte Links zur Anwendung\n";
+echo "- Admin-spezifische Informationen (falls Admin)\n";
+?>
diff --git a/fix-admin-layout.php b/fix-admin-layout.php
new file mode 100644
index 0000000..daa8e46
--- /dev/null
+++ b/fix-admin-layout.php
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+ @yield("title", "NeoNail Datenbank")
+
+
+
+
+
+
+
+
+ @yield("styles")
+
+
+
+
+
+
+
+
+ @if(session("success"))
+
+ {{ session("success") }}
+
+
+ @endif
+
+ @if(session("error"))
+
+ {{ session("error") }}
+
+
+ @endif
+
+ @yield("content")
+
+
+
+
+
+
+ @yield("scripts")
+
+';
+
+file_put_contents('resources/views/layouts/app.blade.php', $layoutContent);
+echo " ✅ Layout-Datei korrigiert\n";
+
+// 2. User Model prüfen und korrigieren
+echo "2. 📋 User Model prüfen...\n";
+$userModelPath = 'app/Models/User.php';
+if (file_exists($userModelPath)) {
+ $content = file_get_contents($userModelPath);
+
+ // Prüfe ob isAdmin Methode korrekt ist
+ if (strpos($content, 'public function isAdmin()') !== false) {
+ echo " ✅ isAdmin() Methode vorhanden\n";
+
+ // Prüfe ob die Methode korrekt implementiert ist
+ if (strpos($content, '$this->is_admin || in_array($this->email') !== false) {
+ echo " ✅ isAdmin() Methode korrekt implementiert\n";
+ } else {
+ echo " ⚠️ isAdmin() Methode könnte inkorrekt sein\n";
+ }
+ } else {
+ echo " ❌ isAdmin() Methode fehlt\n";
+ }
+
+} else {
+ echo " ❌ User Model nicht gefunden\n";
+}
+
+// 3. Cache leeren
+echo "3. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 4. Admin-User Status prüfen
+echo "4. 👑 Admin-User Status prüfen...\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ // Laravel Bootstrap
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Alle User prüfen
+ $users = \App\Models\User::all();
+
+ foreach ($users as $user) {
+ $isAdmin = $user->isAdmin();
+ $isAdminColumn = $user->is_admin;
+ $email = $user->email;
+
+ echo " 📧 $email:\n";
+ echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n";
+ echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n";
+
+ if ($isAdminColumn && !$isAdmin) {
+ echo " ⚠️ WARNUNG: Spalte ist true, aber Methode gibt false zurück!\n";
+ } elseif (!$isAdminColumn && $isAdmin) {
+ echo " ℹ️ INFO: Spalte ist false, aber Methode gibt true zurück (Email-Check)\n";
+ }
+ echo "\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ Admin-Layout korrigiert!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Melden Sie sich als neuer Admin an\n";
+echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n";
+echo "3. Prüfen Sie ob Admin-Badge neben dem Namen steht\n";
+echo "4. Versuchen Sie auf /admin/users zuzugreifen\n";
+echo "5. Falls Problem besteht, führen Sie php fix-admin-view.php aus\n";
+?>
diff --git a/fix-admin-role-database.php b/fix-admin-role-database.php
new file mode 100644
index 0000000..9f735df
--- /dev/null
+++ b/fix-admin-role-database.php
@@ -0,0 +1,120 @@
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ echo "1. 🔍 Prüfe users-Tabelle...\n";
+
+ // Prüfe ob is_admin Spalte existiert
+ $stmt = $pdo->query("PRAGMA table_info(users)");
+ $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $hasAdminColumn = false;
+
+ echo " 📋 Aktuelle Spalten in users-Tabelle:\n";
+ foreach ($columns as $column) {
+ echo " - {$column['name']} ({$column['type']})\n";
+ if ($column['name'] === 'is_admin') {
+ $hasAdminColumn = true;
+ }
+ }
+
+ if (!$hasAdminColumn) {
+ echo "\n2. ➕ Füge is_admin Spalte hinzu...\n";
+
+ // Füge is_admin Spalte hinzu
+ $pdo->exec("ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0");
+ echo " ✅ is_admin Spalte hinzugefügt\n";
+
+ // Prüfe nochmal
+ $stmt = $pdo->query("PRAGMA table_info(users)");
+ $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $hasAdminColumn = false;
+
+ foreach ($columns as $column) {
+ if ($column['name'] === 'is_admin') {
+ $hasAdminColumn = true;
+ break;
+ }
+ }
+
+ if ($hasAdminColumn) {
+ echo " ✅ is_admin Spalte erfolgreich erstellt\n";
+ } else {
+ echo " ❌ is_admin Spalte konnte nicht erstellt werden\n";
+ exit;
+ }
+ } else {
+ echo "\n2. ℹ️ is_admin Spalte existiert bereits\n";
+ }
+
+ echo "\n3. 👑 Markiere bestehende Admin-User...\n";
+
+ // Markiere bestehende Admin-User
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE email IN (?, ?)");
+ $stmt->execute(['admin@neonail.com', 'neueradmin@neonail.com']);
+ $affectedRows = $stmt->rowCount();
+ echo " ✅ $affectedRows Admin-User aktualisiert\n";
+
+ echo "\n4. 📋 Zeige alle User mit Admin-Status...\n";
+
+ // Zeige alle User
+ $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users ORDER BY is_admin DESC, name");
+ $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ foreach ($users as $user) {
+ $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User';
+ echo " - {$user['name']} ({$user['email']}) - {$adminStatus}\n";
+ }
+
+ echo "\n5. 🧪 Test: Mache einen User zum Admin...\n";
+
+ // Finde einen User, der noch kein Admin ist
+ $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE is_admin = 0 LIMIT 1");
+ $stmt->execute();
+ $testUser = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($testUser) {
+ echo " 📝 Teste mit User: {$testUser['name']} ({$testUser['email']})\n";
+
+ // Mache User zum Admin
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+
+ echo " ✅ User zum Admin gemacht\n";
+
+ // Prüfe Änderung
+ $stmt = $pdo->prepare("SELECT is_admin FROM users WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ $result = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($result['is_admin']) {
+ echo " ✅ Admin-Status korrekt gesetzt\n";
+ } else {
+ echo " ❌ Admin-Status nicht korrekt gesetzt\n";
+ }
+
+ // Mache User wieder zurück
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 0 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ echo " 🔄 User-Status zurückgesetzt\n";
+
+ } else {
+ echo " ℹ️ Alle User sind bereits Admins\n";
+ }
+
+ echo "\n✅ Admin-Rolle erfolgreich zur Datenbank hinzugefügt!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n";
+ echo "📝 Sie können jetzt User zum Admin machen!\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: " . $e->getMessage() . "\n";
+ echo "📍 Datei: " . $e->getFile() . ":" . $e->getLine() . "\n";
+}
+?>
diff --git a/fix-admin-role.php b/fix-admin-role.php
new file mode 100755
index 0000000..67a864e
--- /dev/null
+++ b/fix-admin-role.php
@@ -0,0 +1,54 @@
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ echo "🔧 Admin-Rolle hinzufügen...\n";
+
+ // 1. Prüfe ob is_admin Spalte existiert
+ $stmt = $pdo->query("PRAGMA table_info(users)");
+ $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $hasAdminColumn = false;
+
+ foreach ($columns as $column) {
+ if ($column['name'] === 'is_admin') {
+ $hasAdminColumn = true;
+ break;
+ }
+ }
+
+ if (!$hasAdminColumn) {
+ // 2. Füge is_admin Spalte hinzu
+ $pdo->exec("ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0");
+ echo "✅ is_admin Spalte hinzugefügt\n";
+ } else {
+ echo "ℹ️ is_admin Spalte existiert bereits\n";
+ }
+
+ // 3. Markiere bestehende Admin-User
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE email IN (?, ?)");
+ $stmt->execute(['admin@neonail.com', 'neueradmin@neonail.com']);
+ echo "✅ Admin-User aktualisiert\n";
+
+ // 4. Zeige alle User
+ echo "\n📋 Alle User:\n";
+ $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users");
+ $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ foreach ($users as $user) {
+ $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User';
+ echo "- {$user['name']} ({$user['email']}) - {$adminStatus}\n";
+ }
+
+ echo "\n✅ Admin-Rolle erfolgreich aktiviert!\n";
+ echo "🔗 Gehen Sie zu: https://neonail.vogt.de.com/admin/users\n";
+ echo "📝 Bearbeiten Sie einen User und aktivieren Sie die 'Admin-Rechte gewähren' Checkbox\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: " . $e->getMessage() . "\n";
+}
+?>
diff --git a/fix-admin-routes.php b/fix-admin-routes.php
new file mode 100644
index 0000000..5be868b
--- /dev/null
+++ b/fix-admin-routes.php
@@ -0,0 +1,165 @@
+ $line) {
+ if (strpos($line, 'admin') !== false || strpos($line, 'Admin') !== false) {
+ $adminLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ echo " 📄 Admin-bezogene Zeilen in routes/web.php:\n";
+ foreach ($adminLines as $line) {
+ echo " $line\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 2. Route-Liste generieren
+echo "\n2. 🛣️ Route-Liste generieren:\n";
+try {
+ // Laravel Bootstrap
+ require_once 'vendor/autoload.php';
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Route-Liste abrufen
+ $routes = \Illuminate\Support\Facades\Route::getRoutes();
+
+ $adminRoutes = [];
+ foreach ($routes as $route) {
+ $uri = $route->uri();
+ $methods = $route->methods();
+ $name = $route->getName();
+
+ if (strpos($uri, 'admin') !== false || strpos($name, 'admin') !== false) {
+ $adminRoutes[] = [
+ 'uri' => $uri,
+ 'methods' => $methods,
+ 'name' => $name
+ ];
+ }
+ }
+
+ if (empty($adminRoutes)) {
+ echo " ⚠️ Keine Admin-Routes gefunden\n";
+ } else {
+ echo " ✅ Admin-Routes gefunden:\n";
+ foreach ($adminRoutes as $route) {
+ $methods = implode('|', $route['methods']);
+ $name = $route['name'] ?: 'kein Name';
+ echo " $methods $uri ($name)\n";
+ }
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n";
+}
+
+// 3. Admin-Routes manuell prüfen
+echo "\n3. 🔍 Admin-Routes manuell prüfen:\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Suche nach spezifischen Admin-Route-Patterns
+ $adminPatterns = [
+ 'admin/dashboard' => 'Dashboard Route',
+ 'admin/users' => 'Users Index Route',
+ 'admin/users/create' => 'Users Create Route',
+ 'admin/users/{user}/edit' => 'Users Edit Route',
+ 'admin/statistics' => 'Statistics Route',
+ 'admin/users/{user}' => 'Users Show/Edit Route',
+ 'nail-polishes' => 'Nail Polishes Route'
+ ];
+
+ foreach ($adminPatterns as $pattern => $description) {
+ if (strpos($content, $pattern) !== false) {
+ echo " ✅ Pattern gefunden: $pattern ($description)\n";
+ } else {
+ echo " ❌ Pattern fehlt: $pattern ($description)\n";
+ }
+ }
+
+ // Prüfe Route-Gruppen
+ if (strpos($content, "Route::middleware(['admin'])->prefix('admin')") !== false) {
+ echo " ✅ Admin Route-Gruppe gefunden\n";
+ } else {
+ echo " ❌ Admin Route-Gruppe nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 4. Cache leeren und Routes neu laden
+echo "\n4. 🧹 Cache leeren und Routes neu laden...\n";
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 5. Admin-User Status prüfen
+echo "\n5. 👑 Admin-User Status prüfen:\n";
+try {
+ // Alle User mit Admin-Rechten auflisten
+ $users = \App\Models\User::all();
+
+ foreach ($users as $user) {
+ $isAdmin = $user->isAdmin();
+ $isAdminColumn = $user->is_admin;
+ $email = $user->email;
+
+ if ($isAdmin || $isAdminColumn) {
+ echo " 📧 $email:\n";
+ echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n";
+ echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n";
+ echo " - Admin-Status: " . ($isAdmin ? '✅ Admin' : '❌ Kein Admin') . "\n";
+ echo "\n";
+ }
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n";
+}
+
+// 6. Test-URLs generieren
+echo "\n6. 🔗 Test-URLs für Admin-Zugriffe:\n";
+$baseUrl = 'https://neonail.vogt.de.com';
+$adminUrls = [
+ '/admin/dashboard' => 'Admin Dashboard',
+ '/admin/users' => 'Admin Users',
+ '/admin/users/create' => 'Admin Create User',
+ '/admin/statistics' => 'Admin Statistics',
+ '/nail-polishes' => 'Nail Polishes Management'
+];
+
+foreach ($adminUrls as $url => $description) {
+ echo " 🔗 $baseUrl$url ($description)\n";
+}
+
+echo "\n✅ Admin-Routes Analyse abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Melden Sie sich als Admin an (oliver@vogt.de.com)\n";
+echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n";
+echo "3. Klicken Sie auf 'Admin' → 'Benutzer'\n";
+echo "4. Oder versuchen Sie direkt: $baseUrl/admin/users\n";
+echo "5. Falls 403 Fehler: Prüfen Sie ob User wirklich Admin ist\n";
+echo "\n📋 Falls Probleme bestehen:\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Teilen Sie eventuelle Fehlermeldungen mit\n";
+?>
diff --git a/fix-admin-view.php b/fix-admin-view.php
new file mode 100644
index 0000000..08c1415
--- /dev/null
+++ b/fix-admin-view.php
@@ -0,0 +1,158 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Datenbankverbindung herstellen
+ $users = \App\Models\User::all();
+
+ foreach ($users as $user) {
+ $isAdmin = $user->isAdmin();
+ $isAdminColumn = $user->is_admin;
+ $email = $user->email;
+
+ echo " 📧 $email:\n";
+ echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n";
+ echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n";
+ echo " - Admin-Email Check: " . (in_array($email, ['admin@neonail.com', 'neueradmin@neonail.com']) ? 'Ja' : 'Nein') . "\n";
+ echo "\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n";
+}
+
+// 2. User Model prüfen
+echo "2. 📋 User Model prüfen:\n";
+$userModelPath = 'app/Models/User.php';
+if (file_exists($userModelPath)) {
+ $content = file_get_contents($userModelPath);
+
+ // Prüfe isAdmin Methode
+ if (strpos($content, 'public function isAdmin()') !== false) {
+ echo " ✅ isAdmin() Methode vorhanden\n";
+ } else {
+ echo " ❌ isAdmin() Methode fehlt\n";
+ }
+
+ // Prüfe is_admin in fillable
+ if (strpos($content, "'is_admin'") !== false) {
+ echo " ✅ is_admin in \$fillable vorhanden\n";
+ } else {
+ echo " ❌ is_admin nicht in \$fillable\n";
+ }
+
+ // Prüfe makeAdmin Methode
+ if (strpos($content, 'public function makeAdmin()') !== false) {
+ echo " ✅ makeAdmin() Methode vorhanden\n";
+ } else {
+ echo " ❌ makeAdmin() Methode fehlt\n";
+ }
+
+} else {
+ echo " ❌ User Model nicht gefunden\n";
+}
+
+// 3. AdminMiddleware prüfen
+echo "3. 🛡️ AdminMiddleware prüfen:\n";
+$middlewarePath = 'app/Http/Middleware/AdminMiddleware.php';
+if (file_exists($middlewarePath)) {
+ $content = file_get_contents($middlewarePath);
+
+ if (strpos($content, 'auth()->user()->isAdmin()') !== false) {
+ echo " ✅ AdminMiddleware verwendet isAdmin() Methode\n";
+ } else {
+ echo " ❌ AdminMiddleware verwendet nicht isAdmin() Methode\n";
+ }
+
+} else {
+ echo " ❌ AdminMiddleware nicht gefunden\n";
+}
+
+// 4. Routes prüfen
+echo "4. 🛣️ Admin-Routes prüfen:\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ $adminRoutes = [
+ 'admin/users',
+ 'admin/dashboard',
+ 'nail-polishes'
+ ];
+
+ foreach ($adminRoutes as $route) {
+ if (strpos($content, $route) !== false) {
+ echo " ✅ Route gefunden: $route\n";
+ } else {
+ echo " ❌ Route fehlt: $route\n";
+ }
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 5. Layout prüfen
+echo "5. 🎨 Layout prüfen:\n";
+$layoutPath = 'resources/views/layouts/app.blade.php';
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ if (strpos($content, 'auth()->user()->isAdmin()') !== false) {
+ echo " ✅ Layout verwendet isAdmin() für Admin-Menü\n";
+ } else {
+ echo " ❌ Layout verwendet nicht isAdmin() für Admin-Menü\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 6. Cache leeren
+echo "6. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 7. Test-Admin erstellen
+echo "7. 👑 Test-Admin erstellen...\n";
+try {
+ $testUser = \App\Models\User::where('email', 'testadmin@neonail.com')->first();
+
+ if (!$testUser) {
+ $testUser = new \App\Models\User();
+ $testUser->name = 'Test Admin';
+ $testUser->email = 'testadmin@neonail.com';
+ $testUser->password = bcrypt('password123');
+ $testUser->is_admin = true;
+ $testUser->save();
+ echo " ✅ Test-Admin erstellt: testadmin@neonail.com\n";
+ } else {
+ $testUser->is_admin = true;
+ $testUser->save();
+ echo " ✅ Test-Admin aktualisiert: testadmin@neonail.com\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Erstellen des Test-Admins: " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ Admin-Ansicht Problem Analyse abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Melden Sie sich als neuer Admin an\n";
+echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n";
+echo "3. Versuchen Sie auf /admin/users zuzugreifen\n";
+echo "4. Falls Problem besteht, teilen Sie die Ausgabe mit\n";
+?>
diff --git a/fix-all-405-errors.sh b/fix-all-405-errors.sh
new file mode 100644
index 0000000..a503001
--- /dev/null
+++ b/fix-all-405-errors.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+echo "🔧 Fix: Alle HTTP 405 Method Not Allowed Fehler"
+echo "=============================================="
+
+# 1. Laravel Cache leeren
+echo "1. 🧹 Laravel Cache leeren..."
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 2. Bootstrap Cache leeren
+echo "2. 🗂️ Bootstrap Cache leeren..."
+rm -f bootstrap/cache/*.php 2>/dev/null || echo "⚠️ bootstrap/cache/*.php nicht gefunden"
+
+# 3. Route-Tests ausführen
+echo "3. 🧪 Route-Tests ausführen..."
+echo " - Create-Route Test:"
+php test-route-fix.php 2>/dev/null || echo "⚠️ test-route-fix.php übersprungen"
+
+echo " - Remove-Route Test:"
+php test-remove-fix.php 2>/dev/null || echo "⚠️ test-remove-fix.php übersprungen"
+
+# 4. Debug-Modus aktivieren
+echo "4. 🐛 Debug-Modus aktivieren..."
+if [ -f .env ]; then
+ sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+ sed -i 's/APP_ENV=production/APP_ENV=local/' .env
+ echo " ✅ Debug-Modus aktiviert"
+else
+ echo " ❌ .env Datei nicht gefunden"
+fi
+
+# 5. Route-Liste anzeigen
+echo "5. 📋 Route-Liste prüfen..."
+php artisan route:list | grep -E "(create|remove|store)" 2>/dev/null || echo "⚠️ route:list übersprungen"
+
+echo ""
+echo "✅ Alle 405-Fehler behoben!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. Neuen Lack erstellen: https://neonail.vogt.de.com/create-nail-polish"
+echo "2. Lack entfernen: https://neonail.vogt.de.com/my-collection"
+echo "3. Admin-User verwalten: https://neonail.vogt.de.com/admin/users"
+echo ""
+echo "📝 Falls Probleme bestehen:"
+echo "- Prüfen Sie die Browser-Entwicklertools (F12)"
+echo "- Schauen Sie in storage/logs/laravel.log"
+echo "- Führen Sie php artisan route:list aus"
diff --git a/fix-all-forms-https.sh b/fix-all-forms-https.sh
new file mode 100755
index 0000000..810608d
--- /dev/null
+++ b/fix-all-forms-https.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+echo "🔒 Alle Formulare für HTTPS reparieren"
+echo "====================================="
+
+# 1. Laravel Cache komplett leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 2. .env für HTTPS erzwingen
+echo "📝 Erzwinge HTTPS in .env..."
+sed -i 's|APP_URL=http://|APP_URL=https://|' .env
+sed -i 's|APP_URL=https://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env
+
+# 3. Session-Konfiguration für HTTPS
+echo "🔐 Konfiguriere Session für HTTPS..."
+cat > config/session.php << 'EOF'
+ env('SESSION_DRIVER', 'file'),
+ 'lifetime' => env('SESSION_LIFETIME', 120),
+ 'expire_on_close' => false,
+ 'encrypt' => false,
+ 'files' => storage_path('framework/sessions'),
+ 'connection' => env('SESSION_CONNECTION'),
+ 'table' => 'sessions',
+ 'store' => env('SESSION_STORE'),
+ 'lottery' => [2, 100],
+ 'cookie' => env(
+ 'SESSION_COOKIE',
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
+ ),
+ 'path' => '/',
+ 'domain' => env('SESSION_DOMAIN'),
+ 'secure' => true,
+ 'http_only' => true,
+ 'same_site' => 'lax',
+];
+EOF
+
+# 4. AppServiceProvider für HTTPS erzwingen
+echo "⚙️ Konfiguriere AppServiceProvider für HTTPS..."
+cat > app/Providers/AppServiceProvider.php << 'EOF'
+";
+ });
+ }
+}
+EOF
+
+# 5. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 6. Test
+echo "🧪 Teste HTTPS-Konfiguration..."
+curl -I https://neonail.vogt.de.com
+
+echo ""
+echo "✅ Alle Formulare für HTTPS repariert!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
+echo ""
+echo "📋 Falls Warnung bleibt:"
+echo "1. Safari-Cache leeren (Cmd+Shift+R)"
+echo "2. Private-Fenster testen"
+echo "3. Safari-Einstellungen: Entwickler > Leere Caches"
+echo "4. Safari-Einstellungen: Datenschutz > Website-Daten verwalten"
+echo "5. Safari komplett neu starten"
diff --git a/fix-all-safari-warnings.sh b/fix-all-safari-warnings.sh
new file mode 100755
index 0000000..1e3c663
--- /dev/null
+++ b/fix-all-safari-warnings.sh
@@ -0,0 +1,189 @@
+#!/bin/bash
+
+echo "🛡️ Fix: Alle Safari Sicherheitswarnungen"
+echo "======================================="
+
+# 1. Alle Formulare mit HTTPS-URLs beheben
+echo "1. 🔒 Alle Formulare mit HTTPS beheben..."
+
+# Login-Formular
+if [ -f resources/views/auth/login.blade.php ]; then
+ sed -i 's|action="{{ route('\''login'\'') }}"|action="https://neonail.vogt.de.com/login"|' resources/views/auth/login.blade.php
+ echo " ✅ Login-Formular behoben"
+fi
+
+# Create Nail Polish Formular
+if [ -f resources/views/user-nail-polishes/create.blade.php ]; then
+ sed -i 's|action="{{ route('\''user-nail-polishes.store'\'') }}"|action="https://neonail.vogt.de.com/create-nail-polish"|' resources/views/user-nail-polishes/create.blade.php
+ echo " ✅ Create Nail Polish Formular behoben"
+fi
+
+# Remove Nail Polish Formular
+if [ -f resources/views/user-nail-polishes/index.blade.php ]; then
+ sed -i 's|action="https://neonail.vogt.de.com/user-nail-polishes/|action="https://neonail.vogt.de.com/remove-from-collection/|' resources/views/user-nail-polishes/index.blade.php
+ echo " ✅ Remove Nail Polish Formular behoben"
+fi
+
+# Admin Nail Polish Delete Formular
+if [ -f resources/views/nail-polishes/index.blade.php ]; then
+ sed -i 's|action="{{ route('\''nail-polishes.destroy'\'', $nailPolish) }}"|action="https://neonail.vogt.de.com/nail-polishes/{{ $nailPolish->id }}"|' resources/views/nail-polishes/index.blade.php
+ echo " ✅ Admin Nail Polish Delete Formular behoben"
+fi
+
+# Admin User Create Formular
+if [ -f resources/views/admin/users/create.blade.php ]; then
+ sed -i 's|action="{{ route('\''admin.users.store'\'') }}"|action="https://neonail.vogt.de.com/admin/users"|' resources/views/admin/users/create.blade.php
+ echo " ✅ Admin User Create Formular behoben"
+fi
+
+# Admin User Edit Formular
+if [ -f resources/views/admin/users/edit.blade.php ]; then
+ sed -i 's|action="{{ route('\''admin.users.update'\'', $user) }}"|action="https://neonail.vogt.de.com/admin/users/{{ $user->id }}"|' resources/views/admin/users/edit.blade.php
+ echo " ✅ Admin User Edit Formular behoben"
+fi
+
+# Admin User Delete Formular
+if [ -f resources/views/admin/users/index.blade.php ]; then
+ sed -i 's|action="{{ route('\''admin.users.destroy'\'', $user) }}"|action="https://neonail.vogt.de.com/admin/users/{{ $user->id }}"|' resources/views/admin/users/index.blade.php
+ echo " ✅ Admin User Delete Formular behoben"
+fi
+
+# 2. .env HTTPS-Einstellungen
+echo "2. 🔒 .env HTTPS-Einstellungen..."
+if [ -f .env ]; then
+ sed -i 's|APP_URL=.*|APP_URL=https://neonail.vogt.de.com|' .env
+ sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+ sed -i 's/APP_ENV=production/APP_ENV=local/' .env
+
+ # HTTPS-spezifische Einstellungen
+ grep -q "FORCE_HTTPS=true" .env || echo "FORCE_HTTPS=true" >> .env
+ grep -q "SECURE_COOKIES=true" .env || echo "SECURE_COOKIES=true" >> .env
+ grep -q "SESSION_SECURE_COOKIE=true" .env || echo "SESSION_SECURE_COOKIE=true" >> .env
+ grep -q "SESSION_SAME_SITE=lax" .env || echo "SESSION_SAME_SITE=lax" >> .env
+ grep -q "SESSION_HTTP_ONLY=true" .env || echo "SESSION_HTTP_ONLY=true" >> .env
+
+ echo " ✅ .env HTTPS-Einstellungen aktualisiert"
+else
+ echo " ❌ .env Datei nicht gefunden"
+fi
+
+# 3. Session-Konfiguration
+echo "3. 🍪 Session-Konfiguration..."
+if [ -f config/session.php ]; then
+ sed -i "s/'secure' => false/'secure' => true/" config/session.php
+ sed -i "s/'http_only' => false/'http_only' => true/" config/session.php
+ echo " ✅ Session-Konfiguration aktualisiert"
+else
+ echo " ❌ config/session.php nicht gefunden"
+fi
+
+# 4. CSRF-Konfiguration
+echo "4. 🔐 CSRF-Konfiguration..."
+if [ -f config/csrf.php ]; then
+ sed -i "s/'secure' => false/'secure' => true/" config/csrf.php
+ echo " ✅ CSRF-Konfiguration aktualisiert"
+else
+ echo " ❌ config/csrf.php nicht gefunden"
+fi
+
+# 5. Minimale .htaccess mit HTTPS-Force
+echo "5. 🌐 .htaccess HTTPS-Force..."
+cat > public/.htaccess << 'EOF'
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+EOF
+
+echo " ✅ .htaccess HTTPS-Force erstellt"
+
+# 6. Laravel Cache leeren
+echo "6. 🧹 Laravel Cache leeren..."
+php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"
+
+# 7. Test-Script erstellen
+echo "7. 🧪 Test-Script erstellen..."
+cat > test-all-forms.php << 'EOF'
+ 'Login-Formular',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish',
+ 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish',
+ 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish',
+ 'resources/views/admin/users/create.blade.php' => 'Admin Create User',
+ 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User',
+ 'resources/views/admin/users/index.blade.php' => 'Admin Delete User'
+];
+
+foreach ($forms as $file => $description) {
+ if (file_exists($file)) {
+ $content = file_get_contents($file);
+ if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) {
+ echo " ✅ $description: HTTPS-URL gefunden\n";
+ } else {
+ echo " ❌ $description: Keine HTTPS-URL gefunden\n";
+ }
+ } else {
+ echo " ❌ $description: Datei nicht gefunden\n";
+ }
+}
+
+echo "\n✅ Alle Formulare getestet!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n";
+?>
+EOF
+
+echo " ✅ Test-Script erstellt"
+
+echo ""
+echo "✅ Alle Safari Sicherheitswarnungen behoben!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. Login: https://neonail.vogt.de.com/login"
+echo "2. Admin-Panel: https://neonail.vogt.de.com/admin/users"
+echo "3. Lack erstellen: https://neonail.vogt.de.com/create-nail-polish"
+echo ""
+echo "📝 Falls Warnungen bestehen:"
+echo "- Führen Sie php test-all-forms.php aus"
+echo "- Leeren Sie Browser-Cache"
+echo "- Prüfen Sie Browser-Entwicklertools (F12)"
diff --git a/fix-apache-documentroot.sh b/fix-apache-documentroot.sh
new file mode 100755
index 0000000..fe60c76
--- /dev/null
+++ b/fix-apache-documentroot.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+echo "🌐 Apache DocumentRoot korrigieren"
+echo "================================="
+
+# 1. Standard-Site deaktivieren
+echo "🔧 Deaktiviere Standard-Site..."
+a2dissite 000-default.conf 2>/dev/null || echo "⚠️ Standard-Site bereits deaktiviert"
+
+# 2. NeoNail-Site neu erstellen
+echo "📝 Erstelle NeoNail-Site neu..."
+cat > /etc/apache2/sites-available/neonail.conf << 'EOF'
+
+ ServerName 192.168.30.81
+ DocumentRoot /var/www/html/public
+
+
+ AllowOverride All
+ Require all granted
+ Options Indexes FollowSymLinks
+
+
+ # Sicherheit für sensible Dateien
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ ErrorLog ${APACHE_LOG_DIR}/neonail_error.log
+ CustomLog ${APACHE_LOG_DIR}/neonail_access.log combined
+
+EOF
+
+# 3. NeoNail-Site aktivieren
+echo "✅ Aktiviere NeoNail-Site..."
+a2ensite neonail.conf
+
+# 4. Apache-Konfiguration testen
+echo "🔍 Teste Apache-Konfiguration..."
+apache2ctl configtest
+
+# 5. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 6. Status prüfen
+echo "📊 Apache-Status..."
+systemctl status apache2 --no-pager -l
+
+# 7. Test
+echo "🧪 Teste Anwendung..."
+curl -I http://192.168.30.81
+
+echo ""
+echo "✅ Apache DocumentRoot korrigiert!"
+echo "📋 Testen Sie: http://192.168.30.81"
+echo ""
+echo "📋 Falls es nicht funktioniert:"
+echo "1. Apache-Logs: tail -f /var/log/apache2/neonail_error.log"
+echo "2. DocumentRoot prüfen: apache2ctl -S"
diff --git a/fix-apache-headers.sh b/fix-apache-headers.sh
new file mode 100755
index 0000000..d3c0aa7
--- /dev/null
+++ b/fix-apache-headers.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+
+echo "🔧 Fix: Apache mod_headers aktivieren"
+echo "===================================="
+
+# 1. Prüfe verfügbare Apache-Module
+echo "1. 🔍 Verfügbare Apache-Module prüfen..."
+apache2ctl -M 2>/dev/null | grep -E "(headers|rewrite)" || echo " ⚠️ apache2ctl nicht verfügbar"
+
+# 2. Aktiviere mod_headers
+echo "2. 🔧 mod_headers aktivieren..."
+a2enmod headers 2>/dev/null || echo " ⚠️ a2enmod headers fehlgeschlagen"
+
+# 3. Aktiviere mod_rewrite (falls nicht aktiviert)
+echo "3. 🔧 mod_rewrite aktivieren..."
+a2enmod rewrite 2>/dev/null || echo " ⚠️ a2enmod rewrite fehlgeschlagen"
+
+# 4. Apache neu laden
+echo "4. 🔄 Apache neu laden..."
+systemctl reload apache2 2>/dev/null || service apache2 reload 2>/dev/null || echo " ⚠️ Apache reload fehlgeschlagen"
+
+# 5. Prüfe .htaccess Syntax
+echo "5. 🔍 .htaccess Syntax prüfen..."
+if [ -f public/.htaccess ]; then
+ echo " 📋 public/.htaccess gefunden"
+ echo " 📄 Header-Befehle in .htaccess:"
+ grep -n "Header" public/.htaccess || echo " ⚠️ Keine Header-Befehle gefunden"
+else
+ echo " ❌ public/.htaccess nicht gefunden"
+fi
+
+# 6. Alternative .htaccess ohne Header erstellen
+echo "6. 🔧 Alternative .htaccess erstellen..."
+cat > public/.htaccess.simple << 'EOF'
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+EOF
+
+echo " ✅ Alternative .htaccess erstellt"
+
+# 7. Backup und ersetze .htaccess
+echo "7. 🔄 .htaccess ersetzen..."
+if [ -f public/.htaccess ]; then
+ cp public/.htaccess public/.htaccess.backup
+ echo " ✅ Backup erstellt: public/.htaccess.backup"
+fi
+
+cp public/.htaccess.simple public/.htaccess
+echo " ✅ .htaccess ersetzt"
+
+# 8. Test Apache-Konfiguration
+echo "8. 🧪 Apache-Konfiguration testen..."
+apache2ctl -t 2>/dev/null && echo " ✅ Apache-Konfiguration OK" || echo " ❌ Apache-Konfiguration fehlerhaft"
+
+echo ""
+echo "✅ Apache mod_headers Fix abgeschlossen!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. https://neonail.vogt.de.com"
+echo "2. Admin-Panel: https://neonail.vogt.de.com/admin/users"
+echo ""
+echo "📝 Falls Problem besteht:"
+echo "- Prüfen Sie: apache2ctl -M | grep headers"
+echo "- Schauen Sie in: /var/log/apache2/error.log"
diff --git a/fix-appserviceprovider-syntax.sh b/fix-appserviceprovider-syntax.sh
new file mode 100644
index 0000000..52f2a0b
--- /dev/null
+++ b/fix-appserviceprovider-syntax.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+echo "🔧 Fix: AppServiceProvider Syntax-Fehler"
+echo "======================================="
+
+# 1. Syntax prüfen
+echo "1. 🔍 PHP Syntax prüfen..."
+php -l app/Providers/AppServiceProvider.php
+
+# 2. Laravel Cache leeren
+echo "2. 🧹 Laravel Cache leeren..."
+php artisan cache:clear
+php artisan config:clear
+php artisan route:clear
+php artisan view:clear
+
+# 3. HTTPS-Sicherheit testen
+echo "3. 🧪 HTTPS-Sicherheit testen..."
+php test-https-security.php
+
+echo ""
+echo "✅ AppServiceProvider Syntax-Fehler behoben!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. Admin-Panel: https://neonail.vogt.de.com/admin/users"
+echo "2. Lack löschen im Admin-Panel"
+echo "3. User bearbeiten/löschen"
diff --git a/fix-https-config.sh b/fix-https-config.sh
new file mode 100755
index 0000000..3074d27
--- /dev/null
+++ b/fix-https-config.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+echo "🔒 HTTPS-Konfiguration für NeoNail DB"
+echo "===================================="
+
+# 1. .env für HTTPS aktualisieren
+echo "📝 Aktualisiere .env für HTTPS..."
+sed -i 's|APP_URL=http://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env
+sed -i 's|APP_URL=http://neonail.vogt.de.com|APP_URL=https://neonail.vogt.de.com|' .env
+
+# 2. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+# 3. Trusted Proxies konfigurieren (falls hinter Proxy)
+echo "🔧 Konfiguriere Trusted Proxies..."
+cat > config/trusted-proxies.php << 'EOF'
+ [
+ '192.168.30.81',
+ 'neonail.vogt.de.com',
+ ],
+ 'headers' => [
+ 'X-Forwarded-For' => 'X_FORWARDED_FOR',
+ 'X-Forwarded-Host' => 'X_FORWARDED_HOST',
+ 'X-Forwarded-Proto' => 'X_FORWARDED_PROTO',
+ ],
+];
+EOF
+
+# 4. Session-Konfiguration für HTTPS
+echo "🔐 Konfiguriere Sessions für HTTPS..."
+sed -i 's|SESSION_SECURE_COOKIE=false|SESSION_SECURE_COOKIE=true|' .env 2>/dev/null || echo "⚠️ SESSION_SECURE_COOKIE nicht gefunden"
+
+# 5. Test
+echo "🧪 Teste HTTPS-Konfiguration..."
+curl -I https://neonail.vogt.de.com
+
+echo ""
+echo "✅ HTTPS-Konfiguration abgeschlossen!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
+echo ""
+echo "📋 Falls Probleme auftreten:"
+echo "1. Browser-Cache leeren"
+echo "2. Laravel-Logs prüfen: tail -f storage/logs/laravel.log"
diff --git a/fix-https-form-security.sh b/fix-https-form-security.sh
new file mode 100755
index 0000000..915a652
--- /dev/null
+++ b/fix-https-form-security.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+echo "🔒 HTTPS-Formular-Sicherheit beheben"
+echo "==================================="
+
+# 1. .env für HTTPS konfigurieren
+echo "📝 Konfiguriere .env für HTTPS..."
+sed -i 's|APP_URL=http://|APP_URL=https://|' .env
+sed -i 's|APP_URL=https://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env
+
+# 2. Session-Konfiguration für HTTPS
+echo "🔐 Konfiguriere Sessions für HTTPS..."
+cat >> .env << 'EOF'
+
+# HTTPS-Konfiguration
+SESSION_SECURE_COOKIE=true
+SESSION_SAME_SITE=lax
+EOF
+
+# 3. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+
+# 4. CSRF-Token für HTTPS konfigurieren
+echo "🛡️ Konfiguriere CSRF für HTTPS..."
+cat > config/csrf.php << 'EOF'
+ [
+ 'secure' => true,
+ 'same_site' => 'lax',
+ ],
+];
+EOF
+
+# 5. Trusted Proxies konfigurieren
+echo "🌐 Konfiguriere Trusted Proxies..."
+cat > config/trusted-proxies.php << 'EOF'
+ [
+ '192.168.30.81',
+ 'neonail.vogt.de.com',
+ '127.0.0.1',
+ '::1',
+ ],
+ 'headers' => [
+ 'X-Forwarded-For' => 'X_FORWARDED_FOR',
+ 'X-Forwarded-Host' => 'X_FORWARDED_HOST',
+ 'X-Forwarded-Proto' => 'X_FORWARDED_PROTO',
+ ],
+];
+EOF
+
+# 6. Test
+echo "🧪 Teste HTTPS-Konfiguration..."
+curl -I https://neonail.vogt.de.com
+
+echo ""
+echo "✅ HTTPS-Formular-Sicherheit behoben!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
+echo ""
+echo "📋 Falls Warnungen bleiben:"
+echo "1. Browser-Cache leeren (Strg+F5)"
+echo "2. Private/Inkognito-Modus testen"
+echo "3. HTTPS-Zertifikat prüfen"
diff --git a/fix-image-display.sh b/fix-image-display.sh
new file mode 100755
index 0000000..a7d10bb
--- /dev/null
+++ b/fix-image-display.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+echo "🖼️ Bild-Anzeige reparieren"
+echo "========================="
+
+# 1. Storage Link prüfen und neu erstellen
+echo "🔗 Prüfe Storage Link..."
+if [ -L "public/storage" ]; then
+ echo "✅ Storage Link existiert"
+ ls -la public/storage
+else
+ echo "❌ Storage Link fehlt - erstelle neu..."
+ rm -f public/storage
+ php artisan storage:link
+fi
+
+# 2. Storage-Verzeichnis-Berechtigungen
+echo "🔐 Setze Storage-Berechtigungen..."
+chmod -R 777 storage/
+chmod -R 755 public/storage/
+
+# 3. Bilder-Verzeichnis erstellen
+echo "📁 Erstelle Bilder-Verzeichnis..."
+mkdir -p storage/app/public/nail_polishes
+chmod -R 777 storage/app/public/nail_polishes
+
+# 4. Test-Bild erstellen (falls keine Bilder vorhanden)
+echo "🧪 Erstelle Test-Bild..."
+if [ ! -f "storage/app/public/nail_polishes/test.jpg" ]; then
+ # Einfaches Test-Bild erstellen
+ echo "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" | base64 -d > storage/app/public/nail_polishes/test.jpg
+ echo "✅ Test-Bild erstellt"
+fi
+
+# 5. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+# 6. Test-URL prüfen
+echo "🧪 Teste Bild-URL..."
+curl -I https://neonail.vogt.de.com/storage/nail_polishes/test.jpg 2>/dev/null || echo "⚠️ Test-URL nicht erreichbar"
+
+# 7. Datenbank-Bilder prüfen
+echo "🗄️ Prüfe Datenbank-Bilder..."
+sqlite3 database.sqlite "SELECT id, name, image_path FROM nail_polishes WHERE image_path IS NOT NULL;" 2>/dev/null || echo "⚠️ Keine Bilder in Datenbank gefunden"
+
+echo ""
+echo "✅ Bild-Anzeige repariert!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com/storage/nail_polishes/test.jpg"
+echo ""
+echo "📋 Falls Bilder immer noch nicht angezeigt werden:"
+echo "1. Browser-Cache leeren (Strg+F5)"
+echo "2. Private-Fenster testen"
+echo "3. Bild-URL direkt aufrufen"
diff --git a/fix-image-upload-fallback.php b/fix-image-upload-fallback.php
new file mode 100644
index 0000000..b0fa419
--- /dev/null
+++ b/fix-image-upload-fallback.php
@@ -0,0 +1,49 @@
+hasFile('image') && $request->file('image')->isValid()) {
+ $image = $request->file('image');
+ $filename = 'nail_polish_' . time() . '_' . uniqid() . '.jpg';
+ $path = 'nail_polishes/' . $filename;
+
+ $manager = new ImageManager(new Driver());
+ $img = $manager->read($image);
+ $img->resize(400, 400, function ($constraint) {
+ $constraint->aspectRatio();
+ $constraint->upsize();
+ });
+
+ $imageData = $img->toJpeg(80)->toString();
+ Storage::disk('public')->put($path, $imageData);
+ $nailPolish->image_path = $path;
+}
+*/
+
+// Fallback-Code (ohne GD):
+if ($request->hasFile('image') && $request->file('image')->isValid()) {
+ $image = $request->file('image');
+
+ // Prüfe Dateigröße (max 2MB)
+ if ($image->getSize() > 2 * 1024 * 1024) {
+ return back()->with('error', 'Das Bild darf maximal 2MB groß sein.')->withInput();
+ }
+
+ // Prüfe Dateityp
+ $allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
+ if (!in_array($image->getMimeType(), $allowedTypes)) {
+ return back()->with('error', 'Nur JPG, PNG und GIF Dateien sind erlaubt.')->withInput();
+ }
+
+ // Speichere Original-Bild ohne Verarbeitung
+ $filename = 'nail_polish_' . time() . '_' . uniqid() . '.' . $image->getClientOriginalExtension();
+ $path = 'nail_polishes/' . $filename;
+
+ Storage::disk('public')->put($path, file_get_contents($image));
+ $nailPolish->image_path = $path;
+}
+?>
diff --git a/fix-image-upload-final.php b/fix-image-upload-final.php
new file mode 100644
index 0000000..00b52b4
--- /dev/null
+++ b/fix-image-upload-final.php
@@ -0,0 +1,282 @@
+get("search");
+
+ $query = $user->nailPolishes();
+
+ if ($search) {
+ $query->where(function($q) use ($search) {
+ $q->where("name", "like", "%{$search}%")
+ ->orWhere("number", "like", "%{$search}%");
+ });
+ }
+
+ $nailPolishes = $query->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.index", compact("nailPolishes", "search"));
+ }
+
+ /**
+ * Zeigt alle verfügbaren Lacke an, die der User noch nicht hat
+ */
+ public function available(Request $request)
+ {
+ $user = Auth::user();
+ $search = $request->get("search");
+
+ $query = NailPolish::whereNotIn("id", $user->nailPolishes()->pluck("nail_polishes.id"));
+
+ if ($search) {
+ $query->search($search);
+ }
+
+ $nailPolishes = $query->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.available", compact("nailPolishes", "search"));
+ }
+
+ /**
+ * Fügt einen Lack zur Sammlung des Users hinzu
+ */
+ public function add(NailPolish $nailPolish)
+ {
+ $user = Auth::user();
+
+ // Prüfe, ob der Lack bereits in der Sammlung ist
+ if ($user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) {
+ return back()->with("warning", "Dieser Lack ist bereits in Ihrer Sammlung!");
+ }
+
+ $user->nailPolishes()->attach($nailPolish->id);
+
+ return back()->with("success", "Lack \"{$nailPolish->name}\" wurde zu Ihrer Sammlung hinzugefügt!");
+ }
+
+ /**
+ * Entfernt einen Lack aus der Sammlung des Users
+ */
+ public function remove(NailPolish $nailPolish)
+ {
+ try {
+ $user = Auth::user();
+
+ // Prüfe, ob der Lack in der Sammlung ist
+ if (!$user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) {
+ return back()->with("warning", "Dieser Lack ist nicht in Ihrer Sammlung!");
+ }
+
+ $user->nailPolishes()->detach($nailPolish->id);
+
+ return back()->with("success", "Lack \"{$nailPolish->name}\" wurde aus Ihrer Sammlung entfernt!");
+
+ } catch (\Exception $e) {
+ \Log::error("Fehler beim Entfernen des Lackes: " . $e->getMessage());
+ return back()->with("error", "Fehler beim Entfernen des Lackes. Bitte versuchen Sie es erneut.");
+ }
+ }
+
+ /**
+ * Zeigt das Formular zum Erstellen eines neuen Lackes
+ */
+ public function create()
+ {
+ return view("user-nail-polishes.create");
+ }
+
+ /**
+ * Speichert einen neuen Lack (wird automatisch zum Hauptkatalog hinzugefügt)
+ */
+ public function store(Request $request)
+ {
+ $request->validate([
+ "name" => "required|string|max:255",
+ "number" => "required|string|max:50",
+ "image" => "nullable|image|max:10240", // Max 10MB
+ ], [
+ "name.required" => "Der Name des Lackes ist erforderlich.",
+ "number.required" => "Die Nummer des Lackes ist erforderlich.",
+ "image.image" => "Die Datei muss ein Bild sein.",
+ "image.max" => "Das Bild darf maximal 10MB groß sein.",
+ ]);
+
+ try {
+ $nailPolish = new NailPolish();
+ $nailPolish->name = trim($request->name);
+ $nailPolish->number = trim($request->number);
+
+ // Vereinfachte Bildverarbeitung ohne Intervention Image
+ if ($request->hasFile("image") && $request->file("image")->isValid()) {
+ $image = $request->file("image");
+
+ // Erstelle einen eindeutigen Dateinamen
+ $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $image->getClientOriginalExtension();
+ $path = "nail_polishes/" . $filename;
+
+ // Speichere das Bild direkt ohne Verarbeitung
+ Storage::disk("public")->putFileAs("nail_polishes", $image, $filename);
+ $nailPolish->image_path = $path;
+
+ \Log::info("Bild erfolgreich gespeichert: " . $path);
+ }
+
+ $nailPolish->save();
+
+ // Füge den Lack automatisch zur Sammlung des Users hinzu
+ $user = Auth::user();
+ $user->nailPolishes()->attach($nailPolish->id);
+
+ return redirect()->route("user-nail-polishes.index")
+ ->with("success", "Lack \"{$nailPolish->name}\" wurde erfolgreich erstellt und zu Ihrer Sammlung hinzugefügt!");
+
+ } catch (\Exception $e) {
+ \Log::error("Fehler beim Erstellen des Lackes: " . $e->getMessage());
+ return back()->with("error", "Fehler beim Erstellen des Lackes: " . $e->getMessage())
+ ->withInput();
+ }
+ }
+
+ /**
+ * Zeigt die Sammlung eines bestimmten Users (für Admin)
+ */
+ public function showUserCollection(User $user)
+ {
+ $nailPolishes = $user->nailPolishes()->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.show-user", compact("user", "nailPolishes"));
+ }
+}';
+
+file_put_contents('app/Http/Controllers/UserNailPolishController.php', $controllerContent);
+echo " ✅ Controller mit vereinfachtem Upload erstellt\n";
+
+// 2. Storage-Verzeichnisse erstellen
+echo "2. 📁 Storage-Verzeichnisse erstellen...\n";
+$directories = [
+ 'storage/app/public',
+ 'storage/app/public/nail_polishes'
+];
+
+foreach ($directories as $dir) {
+ if (!is_dir($dir)) {
+ mkdir($dir, 0755, true);
+ echo " ✅ Verzeichnis erstellt: $dir\n";
+ } else {
+ echo " ℹ️ Verzeichnis existiert bereits: $dir\n";
+ }
+}
+
+// 3. Berechtigungen setzen
+echo "3. 🔐 Berechtigungen setzen...\n";
+system('chmod -R 755 storage/');
+system('chown -R www-data:www-data storage/ 2>/dev/null || echo " ⚠️ chown fehlgeschlagen"');
+echo " ✅ Berechtigungen gesetzt\n";
+
+// 4. Storage Link erstellen
+echo "4. 🔗 Storage Link erstellen...\n";
+if (file_exists('public/storage')) {
+ if (is_dir('public/storage')) {
+ system('rm -rf public/storage');
+ }
+}
+system('ln -sf ../storage/app/public public/storage');
+echo " ✅ Storage Link erstellt\n";
+
+// 5. Laravel Cache leeren
+echo "5. 🧹 Laravel Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 6. Test-Bild erstellen
+echo "6. 🖼️ Test-Bild erstellen...\n";
+$testImagePath = 'storage/app/public/nail_polishes/test.jpg';
+if (extension_loaded('gd')) {
+ $image = imagecreate(100, 100);
+ $bgColor = imagecolorallocate($image, 255, 255, 255);
+ $textColor = imagecolorallocate($image, 0, 0, 0);
+ imagestring($image, 5, 10, 40, 'TEST', $textColor);
+
+ if (imagejpeg($image, $testImagePath, 80)) {
+ echo " ✅ Test-Bild erstellt: $testImagePath\n";
+ } else {
+ echo " ❌ Test-Bild erstellen fehlgeschlagen\n";
+ }
+
+ imagedestroy($image);
+} else {
+ echo " ❌ GD Extension nicht verfügbar\n";
+}
+
+// 7. Upload-Limits in .htaccess prüfen
+echo "7. 📏 Upload-Limits prüfen...\n";
+$htaccessPath = 'public/.htaccess';
+if (file_exists($htaccessPath)) {
+ $htaccessContent = file_get_contents($htaccessPath);
+
+ $requiredSettings = [
+ 'upload_max_filesize 10M',
+ 'post_max_size 10M',
+ 'max_file_uploads 20',
+ 'memory_limit 256M'
+ ];
+
+ $missingSettings = [];
+ foreach ($requiredSettings as $setting) {
+ if (strpos($htaccessContent, $setting) === false) {
+ $missingSettings[] = $setting;
+ }
+ }
+
+ if (empty($missingSettings)) {
+ echo " ✅ Alle Upload-Limits in .htaccess vorhanden\n";
+ } else {
+ echo " ⚠️ Fehlende Upload-Limits: " . implode(', ', $missingSettings) . "\n";
+
+ // Füge fehlende Settings hinzu
+ $uploadSettings = "\n# Upload-Limits für Bild-Upload\n";
+ foreach ($missingSettings as $setting) {
+ $uploadSettings .= "php_value " . $setting . "\n";
+ }
+
+ $htaccessContent .= $uploadSettings;
+ file_put_contents($htaccessPath, $htaccessContent);
+ echo " ✅ Upload-Limits zu .htaccess hinzugefügt\n";
+ }
+} else {
+ echo " ❌ .htaccess nicht gefunden\n";
+}
+
+echo "\n✅ Finales Bild-Upload-System erstellt!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+echo "📝 Das System speichert Bilder jetzt direkt ohne Verarbeitung\n";
+echo "📋 Falls Upload immer noch fehlschlägt:\n";
+echo "- Prüfen Sie die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Testen Sie mit einem kleinen Bild (< 1MB)\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Netzwerk-Fehler\n";
+?>
diff --git a/fix-image-upload-simple.php b/fix-image-upload-simple.php
new file mode 100644
index 0000000..dfc9f9b
--- /dev/null
+++ b/fix-image-upload-simple.php
@@ -0,0 +1,222 @@
+get("search");
+
+ $query = $user->nailPolishes();
+
+ if ($search) {
+ $query->where(function($q) use ($search) {
+ $q->where("name", "like", "%{$search}%")
+ ->orWhere("number", "like", "%{$search}%");
+ });
+ }
+
+ $nailPolishes = $query->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.index", compact("nailPolishes", "search"));
+ }
+
+ /**
+ * Zeigt alle verfügbaren Lacke an, die der User noch nicht hat
+ */
+ public function available(Request $request)
+ {
+ $user = Auth::user();
+ $search = $request->get("search");
+
+ $query = NailPolish::whereNotIn("id", $user->nailPolishes()->pluck("nail_polishes.id"));
+
+ if ($search) {
+ $query->search($search);
+ }
+
+ $nailPolishes = $query->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.available", compact("nailPolishes", "search"));
+ }
+
+ /**
+ * Fügt einen Lack zur Sammlung des Users hinzu
+ */
+ public function add(NailPolish $nailPolish)
+ {
+ $user = Auth::user();
+
+ // Prüfe, ob der Lack bereits in der Sammlung ist
+ if ($user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) {
+ return back()->with("warning", "Dieser Lack ist bereits in Ihrer Sammlung!");
+ }
+
+ $user->nailPolishes()->attach($nailPolish->id);
+
+ return back()->with("success", "Lack \"{$nailPolish->name}\" wurde zu Ihrer Sammlung hinzugefügt!");
+ }
+
+ /**
+ * Entfernt einen Lack aus der Sammlung des Users
+ */
+ public function remove(NailPolish $nailPolish)
+ {
+ try {
+ $user = Auth::user();
+
+ // Prüfe, ob der Lack in der Sammlung ist
+ if (!$user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) {
+ return back()->with("warning", "Dieser Lack ist nicht in Ihrer Sammlung!");
+ }
+
+ $user->nailPolishes()->detach($nailPolish->id);
+
+ return back()->with("success", "Lack \"{$nailPolish->name}\" wurde aus Ihrer Sammlung entfernt!");
+
+ } catch (\Exception $e) {
+ \Log::error("Fehler beim Entfernen des Lackes: " . $e->getMessage());
+ return back()->with("error", "Fehler beim Entfernen des Lackes. Bitte versuchen Sie es erneut.");
+ }
+ }
+
+ /**
+ * Zeigt das Formular zum Erstellen eines neuen Lackes
+ */
+ public function create()
+ {
+ return view("user-nail-polishes.create");
+ }
+
+ /**
+ * Speichert einen neuen Lack (wird automatisch zum Hauptkatalog hinzugefügt)
+ */
+ public function store(Request $request)
+ {
+ $request->validate([
+ "name" => "required|string|max:255",
+ "number" => "required|string|max:50",
+ "image" => "nullable|image|max:10240", // Max 10MB
+ ], [
+ "name.required" => "Der Name des Lackes ist erforderlich.",
+ "number.required" => "Die Nummer des Lackes ist erforderlich.",
+ "image.image" => "Die Datei muss ein Bild sein.",
+ "image.max" => "Das Bild darf maximal 10MB groß sein.",
+ ]);
+
+ try {
+ $nailPolish = new NailPolish();
+ $nailPolish->name = trim($request->name);
+ $nailPolish->number = trim($request->number);
+
+ // Vereinfachte Bildverarbeitung ohne Intervention Image
+ if ($request->hasFile("image") && $request->file("image")->isValid()) {
+ $image = $request->file("image");
+
+ // Erstelle einen eindeutigen Dateinamen
+ $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $image->getClientOriginalExtension();
+ $path = "nail_polishes/" . $filename;
+
+ // Speichere das Bild direkt ohne Verarbeitung
+ Storage::disk("public")->putFileAs("nail_polishes", $image, $filename);
+ $nailPolish->image_path = $path;
+
+ \Log::info("Bild erfolgreich gespeichert: " . $path);
+ }
+
+ $nailPolish->save();
+
+ // Füge den Lack automatisch zur Sammlung des Users hinzu
+ $user = Auth::user();
+ $user->nailPolishes()->attach($nailPolish->id);
+
+ return redirect()->route("user-nail-polishes.index")
+ ->with("success", "Lack \"{$nailPolish->name}\" wurde erfolgreich erstellt und zu Ihrer Sammlung hinzugefügt!");
+
+ } catch (\Exception $e) {
+ \Log::error("Fehler beim Erstellen des Lackes: " . $e->getMessage());
+ return back()->with("error", "Fehler beim Erstellen des Lackes: " . $e->getMessage())
+ ->withInput();
+ }
+ }
+
+ /**
+ * Zeigt die Sammlung eines bestimmten Users (für Admin)
+ */
+ public function showUserCollection(User $user)
+ {
+ $nailPolishes = $user->nailPolishes()->orderBy("name")->paginate(12);
+
+ return view("user-nail-polishes.show-user", compact("user", "nailPolishes"));
+ }
+}';
+
+file_put_contents('app/Http/Controllers/UserNailPolishController.php', $controllerContent);
+echo " ✅ Controller mit vereinfachtem Upload erstellt\n";
+
+// 2. Storage-Verzeichnisse erstellen
+echo "2. 📁 Storage-Verzeichnisse erstellen...\n";
+$directories = [
+ 'storage/app/public',
+ 'storage/app/public/nail_polishes'
+];
+
+foreach ($directories as $dir) {
+ if (!is_dir($dir)) {
+ mkdir($dir, 0755, true);
+ echo " ✅ Verzeichnis erstellt: $dir\n";
+ } else {
+ echo " ℹ️ Verzeichnis existiert bereits: $dir\n";
+ }
+}
+
+// 3. Berechtigungen setzen
+echo "3. 🔐 Berechtigungen setzen...\n";
+system('chmod -R 755 storage/');
+system('chown -R www-data:www-data storage/ 2>/dev/null || echo " ⚠️ chown fehlgeschlagen"');
+echo " ✅ Berechtigungen gesetzt\n";
+
+// 4. Storage Link erstellen
+echo "4. 🔗 Storage Link erstellen...\n";
+if (file_exists('public/storage')) {
+ if (is_dir('public/storage')) {
+ system('rm -rf public/storage');
+ }
+}
+system('ln -sf ../storage/app/public public/storage');
+echo " ✅ Storage Link erstellt\n";
+
+// 5. Laravel Cache leeren
+echo "5. 🧹 Laravel Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+echo "\n✅ Vereinfachtes Bild-Upload-System erstellt!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+echo "📝 Das System speichert Bilder jetzt direkt ohne Verarbeitung\n";
+echo "📋 Falls Upload immer noch fehlschlägt:\n";
+echo "- Führen Sie php debug-image-upload.php aus\n";
+echo "- Prüfen Sie die Laravel-Logs\n";
+echo "- Testen Sie mit einem kleinen Bild (< 1MB)\n";
+?>
diff --git a/fix-image-urls.php b/fix-image-urls.php
new file mode 100644
index 0000000..b75346e
--- /dev/null
+++ b/fix-image-urls.php
@@ -0,0 +1,60 @@
+exists($imagePath)) {
+ return null;
+ }
+
+ // Erstelle die URL
+ $url = \Storage::disk('public')->url($imagePath);
+
+ // Stelle sicher, dass HTTPS verwendet wird
+ if (strpos($url, 'http://') === 0) {
+ $url = str_replace('http://', 'https://', $url);
+ }
+
+ return $url;
+ }
+
+ public static function getImageUrlOrPlaceholder($imagePath, $size = '400x400')
+ {
+ $url = self::getImageUrl($imagePath);
+
+ if ($url) {
+ return $url;
+ }
+
+ // Fallback zu einem Placeholder-Bild
+ return "https://via.placeholder.com/{$size}/cccccc/666666?text=Kein+Bild";
+ }
+}
+
+// In der View verwenden:
+// {{ \App\Helpers\ImageHelper::getImageUrlOrPlaceholder($nailPolish->image_path) }}
+
+// Oder als Blade-Directive in AppServiceProvider.php registrieren:
+/*
+public function boot()
+{
+ Blade::directive('nailPolishImage', function ($expression) {
+ return "";
+ });
+}
+*/
+
+// Dann in der View:
+// @nailPolishImage($nailPolish->image_path)
+?>
diff --git a/fix-laravel-setup.sh b/fix-laravel-setup.sh
new file mode 100755
index 0000000..5dc3db6
--- /dev/null
+++ b/fix-laravel-setup.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+echo "🔧 Laravel Setup Reparieren"
+echo "==========================="
+
+# 1. Vendor-Ordner prüfen
+echo "📦 Prüfe vendor/ Ordner..."
+if [ ! -d "vendor" ]; then
+ echo "❌ vendor/ Ordner nicht gefunden!"
+ echo "📋 Bitte laden Sie den vendor/ Ordner hoch oder führen Sie composer install aus"
+ exit 1
+fi
+
+# 2. Composer autoload neu generieren
+echo "🔄 Generiere Composer autoload neu..."
+if command -v composer &> /dev/null; then
+ composer dump-autoload --optimize
+elif [ -f "composer.phar" ]; then
+ php composer.phar dump-autoload --optimize
+else
+ echo "⚠️ Composer nicht verfügbar, überspringe autoload"
+fi
+
+# 3. Laravel Cache leeren
+echo "🗑️ Leere Laravel Cache..."
+php artisan config:clear
+php artisan route:clear
+php artisan view:clear
+php artisan cache:clear
+
+# 4. Laravel neu initialisieren
+echo "⚙️ Initialisiere Laravel neu..."
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+
+# 5. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 755 vendor/
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+
+# 6. .env prüfen
+echo "📝 Prüfe .env Datei..."
+if [ ! -f ".env" ]; then
+ echo "❌ .env Datei nicht gefunden!"
+ echo "📋 Kopieren Sie env-production-example.txt zu .env"
+ exit 1
+fi
+
+echo ""
+echo "✅ Laravel Setup repariert!"
+echo "📋 Testen Sie jetzt: php artisan --version"
diff --git a/fix-logout-final.php b/fix-logout-final.php
new file mode 100644
index 0000000..80c7290
--- /dev/null
+++ b/fix-logout-final.php
@@ -0,0 +1,110 @@
+/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 3. Layout nochmal prüfen
+echo "\n3. 🎨 Layout final prüfen...\n";
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ // Suche nach Logout-Form
+ if (strpos($content, 'logout-form') !== false) {
+ echo " ✅ Logout-Form gefunden\n";
+
+ // Zeige Logout-Form Details
+ $lines = explode("\n", $content);
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n";
+ }
+ }
+ } else {
+ echo " ❌ Logout-Form nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 4. JavaScript prüfen
+echo "\n4. 🔧 JavaScript prüfen...\n";
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ // Suche nach onclick Event
+ if (strpos($content, 'onclick="event.preventDefault(); document.getElementById("logout-form").submit();"') !== false) {
+ echo " ✅ JavaScript Event Handler gefunden\n";
+ } else {
+ echo " ❌ JavaScript Event Handler nicht gefunden\n";
+ }
+
+ // Suche nach Bootstrap JS
+ if (strpos($content, 'bootstrap.bundle.min.js') !== false) {
+ echo " ✅ Bootstrap JS geladen\n";
+ } else {
+ echo " ❌ Bootstrap JS nicht geladen\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 5. Test-Anleitung
+echo "\n5. 🧪 Test-Anleitung...\n";
+echo " 📋 1. Öffnen Sie: https://neonail.vogt.de.com\n";
+echo " 📋 2. Melden Sie sich an\n";
+echo " 📋 3. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n";
+echo " 📋 4. Wählen Sie 'Abmelden' aus dem Dropdown\n";
+echo " 📋 5. Sie sollten zur Login-Seite weitergeleitet werden\n";
+echo "\n 🔍 Falls Problem besteht:\n";
+echo " 📋 - Öffnen Sie Browser-Entwicklertools (F12)\n";
+echo " 📋 - Gehen Sie zu Console-Tab\n";
+echo " 📋 - Klicken Sie auf Abmelden\n";
+echo " 📋 - Schauen Sie nach JavaScript-Fehlern\n";
+echo " 📋 - Gehen Sie zu Network-Tab\n";
+echo " 📋 - Schauen Sie welche URL aufgerufen wird\n";
+
+echo "\n✅ Logout-Problem final behoben!\n";
+echo "🔗 Testen Sie jetzt das Logout und teilen Sie mit:\n";
+echo "1. Funktioniert das Logout jetzt?\n";
+echo "2. Werden Sie zur Login-Seite weitergeleitet?\n";
+echo "3. Falls nicht: Welche Fehlermeldungen sehen Sie?\n";
+?>
diff --git a/fix-logout-route.php b/fix-logout-route.php
new file mode 100644
index 0000000..51d989b
--- /dev/null
+++ b/fix-logout-route.php
@@ -0,0 +1,194 @@
+/dev/null || echo " ⚠️ composer dump-autoload übersprungen"');
+echo " ✅ Autoload neu generiert\n";
+
+// 3. Laravel Cache komplett leeren
+echo "\n3. 🧹 Laravel Cache komplett leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+system('php artisan optimize:clear 2>/dev/null || echo " ⚠️ optimize:clear übersprungen"');
+echo " ✅ Laravel Cache geleert\n";
+
+// 4. Routes-Datei prüfen und korrigieren
+echo "\n4. 🛣️ Routes-Datei prüfen...\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Zeige alle Logout-bezogenen Zeilen
+ $lines = explode("\n", $content);
+ $logoutLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ $logoutLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ if (!empty($logoutLines)) {
+ echo " ✅ Logout-Routes gefunden:\n";
+ foreach ($logoutLines as $line) {
+ echo " 📋 $line\n";
+ }
+ } else {
+ echo " ❌ Keine Logout-Routes gefunden\n";
+ }
+
+ // Prüfe ob die Route korrekt ist
+ if (strpos($content, "Route::post('/logout', [LoginController::class, 'logout'])->name('logout')->middleware('auth');") !== false) {
+ echo " ✅ Logout-Route ist korrekt definiert\n";
+ } else {
+ echo " ❌ Logout-Route ist nicht korrekt definiert\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 5. LoginController prüfen
+echo "\n5. 🔐 LoginController prüfen...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ if (strpos($content, 'public function logout') !== false) {
+ echo " ✅ Logout-Methode vorhanden\n";
+
+ // Zeige Logout-Methode
+ $lines = explode("\n", $content);
+ $inLogoutMethod = false;
+ $methodLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'public function logout') !== false) {
+ $inLogoutMethod = true;
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) {
+ $inLogoutMethod = false;
+ } elseif ($inLogoutMethod) {
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ echo " 📋 Logout-Methode:\n";
+ foreach ($methodLines as $line) {
+ echo " $line\n";
+ }
+
+ } else {
+ echo " ❌ Logout-Methode nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 6. Route-Liste neu generieren
+echo "\n6. 🛣️ Route-Liste neu generieren...\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ // Laravel Bootstrap
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Route-Liste abrufen
+ $routes = \Illuminate\Support\Facades\Route::getRoutes();
+
+ $logoutRoutes = [];
+ foreach ($routes as $route) {
+ $uri = $route->uri();
+ $methods = $route->methods();
+ $name = $route->getName();
+
+ if (strpos($uri, 'logout') !== false || strpos($name, 'logout') !== false) {
+ $logoutRoutes[] = [
+ 'uri' => $uri,
+ 'methods' => $methods,
+ 'name' => $name
+ ];
+ }
+ }
+
+ if (empty($logoutRoutes)) {
+ echo " ❌ Keine Logout-Routes in Laravel registriert\n";
+ } else {
+ echo " ✅ Logout-Routes in Laravel gefunden:\n";
+ foreach ($logoutRoutes as $route) {
+ $methods = implode('|', $route['methods']);
+ $name = $route['name'] ?: 'kein Name';
+ echo " 📋 $methods $uri ($name)\n";
+ }
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n";
+}
+
+// 7. Test-Logout-Form erstellen
+echo "\n7. 🧪 Test-Logout-Form erstellen...\n";
+$testForm = '
+
+
+ Logout Test
+
+
+
+ Logout Test
+
+ Route: {{ route("logout") }}
+
+';
+
+file_put_contents('public/logout-test.blade.php', $testForm);
+echo " ✅ Test-Form erstellt: public/logout-test.blade.php\n";
+
+// 8. Apache neu laden (falls möglich)
+echo "\n8. 🔄 Apache neu laden...\n";
+system('systemctl reload apache2 2>/dev/null || echo " ⚠️ Apache reload übersprungen"');
+echo " ✅ Apache neu geladen\n";
+
+echo "\n✅ Logout-Route Fix abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n";
+echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n";
+echo "3. Falls das nicht funktioniert:\n";
+echo " - Öffnen Sie Browser-Entwicklertools (F12)\n";
+echo " - Gehen Sie zu Network-Tab\n";
+echo " - Klicken Sie auf Abmelden\n";
+echo " - Schauen Sie welche URL aufgerufen wird\n";
+echo "\n📋 Falls Problem besteht:\n";
+echo "- Teilen Sie die Network-Tab Ausgabe mit\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Testen Sie direkt: https://neonail.vogt.de.com/logout\n";
+?>
diff --git a/fix-logout-simple-2.php b/fix-logout-simple-2.php
new file mode 100644
index 0000000..c0908db
--- /dev/null
+++ b/fix-logout-simple-2.php
@@ -0,0 +1,147 @@
+/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Laravel Cache geleert\n";
+
+// 3. Routes-Datei prüfen
+echo "\n3. 🛣️ Routes-Datei prüfen...\n";
+$routesPath = 'routes/web.php';
+if (file_exists($routesPath)) {
+ $content = file_get_contents($routesPath);
+
+ // Zeige alle Logout-bezogenen Zeilen
+ $lines = explode("\n", $content);
+ $logoutLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ $logoutLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ if (!empty($logoutLines)) {
+ echo " ✅ Logout-Routes gefunden:\n";
+ foreach ($logoutLines as $line) {
+ echo " 📋 $line\n";
+ }
+ } else {
+ echo " ❌ Keine Logout-Routes gefunden\n";
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 4. LoginController prüfen
+echo "\n4. 🔐 LoginController prüfen...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ if (strpos($content, 'public function logout') !== false) {
+ echo " ✅ Logout-Methode vorhanden\n";
+
+ // Zeige Logout-Methode
+ $lines = explode("\n", $content);
+ $inLogoutMethod = false;
+ $methodLines = [];
+
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'public function logout') !== false) {
+ $inLogoutMethod = true;
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) {
+ $inLogoutMethod = false;
+ } elseif ($inLogoutMethod) {
+ $methodLines[] = ($lineNumber + 1) . ": " . trim($line);
+ }
+ }
+
+ echo " 📋 Logout-Methode:\n";
+ foreach ($methodLines as $line) {
+ echo " $line\n";
+ }
+
+ } else {
+ echo " ❌ Logout-Methode nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 5. Layout prüfen
+echo "\n5. 🎨 Layout prüfen...\n";
+$layoutPath = 'resources/views/layouts/app.blade.php';
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ // Suche nach Logout-Form
+ if (strpos($content, 'logout-form') !== false) {
+ echo " ✅ Logout-Form gefunden\n";
+
+ // Zeige Logout-Form Details
+ $lines = explode("\n", $content);
+ foreach ($lines as $lineNumber => $line) {
+ if (strpos($line, 'logout') !== false) {
+ echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n";
+ }
+ }
+ } else {
+ echo " ❌ Logout-Form nicht gefunden\n";
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 6. Test-Logout-URL erstellen
+echo "\n6. 🧪 Test-Logout-URL erstellen...\n";
+$testUrl = 'https://neonail.vogt.de.com/logout';
+echo " 🔗 Test-URL: $testUrl\n";
+echo " 📋 Methode: POST\n";
+echo " 📋 CSRF-Token erforderlich\n";
+
+// 7. Einfacher Test
+echo "\n7. 🧪 Einfacher Test...\n";
+echo " 📋 Öffnen Sie: https://neonail.vogt.de.com\n";
+echo " 📋 Melden Sie sich an\n";
+echo " 📋 Klicken Sie auf Ihren Benutzernamen\n";
+echo " 📋 Wählen Sie 'Abmelden'\n";
+echo " 📋 Falls Fehler: Öffnen Sie Browser-Entwicklertools (F12)\n";
+echo " 📋 Gehen Sie zu Network-Tab\n";
+echo " 📋 Schauen Sie welche URL aufgerufen wird\n";
+
+echo "\n✅ Logout-Route Fix abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt das Logout und teilen Sie mit:\n";
+echo "1. Funktioniert das Logout?\n";
+echo "2. Falls nicht: Welche URL wird im Network-Tab angezeigt?\n";
+echo "3. Gibt es Fehlermeldungen in der Browser-Konsole?\n";
+?>
diff --git a/fix-logout-simple.php b/fix-logout-simple.php
new file mode 100644
index 0000000..c39288c
--- /dev/null
+++ b/fix-logout-simple.php
@@ -0,0 +1,81 @@
+/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 4. Alternative Logout-URL testen
+echo "\n4. 🔗 Alternative Logout-URLs:\n";
+echo " - https://neonail.vogt.de.com/logout\n";
+echo " - https://neonail.vogt.de.com/logout (POST)\n";
+
+echo "\n✅ Logout-Problem behoben!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n";
+echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n";
+echo "3. Sie sollten zur Login-Seite weitergeleitet werden\n";
+echo "\n📋 Falls Problem besteht:\n";
+echo "- Versuchen Sie direkt: https://neonail.vogt.de.com/logout\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+?>
diff --git a/fix-logout.php b/fix-logout.php
new file mode 100644
index 0000000..9a30494
--- /dev/null
+++ b/fix-logout.php
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+ @yield("title", "NeoNail Datenbank")
+
+
+
+
+
+
+
+
+ @yield("styles")
+
+
+
+
+
+
+
+
+ @if(session("success"))
+
+ {{ session("success") }}
+
+
+ @endif
+
+ @if(session("error"))
+
+ {{ session("error") }}
+
+
+ @endif
+
+ @yield("content")
+
+
+
+
+
+
+ @yield("scripts")
+
+';
+
+file_put_contents('resources/views/layouts/app.blade.php', $layoutContent);
+echo " ✅ Layout korrigiert\n";
+
+// 3. LoginController prüfen
+echo "\n3. 🔐 LoginController prüfen...\n";
+$controllerPath = 'app/Http/Controllers/Auth/LoginController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ if (strpos($content, 'logout') !== false) {
+ echo " ✅ Logout-Methode gefunden\n";
+ } else {
+ echo " ❌ Logout-Methode fehlt\n";
+ }
+} else {
+ echo " ❌ LoginController nicht gefunden\n";
+}
+
+// 4. Cache leeren
+echo "\n4. 🧹 Cache leeren...\n";
+system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"');
+system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"');
+system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"');
+system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"');
+echo " ✅ Cache geleert\n";
+
+// 5. Test-Logout-URL generieren
+echo "\n5. 🔗 Test-Logout-URL:\n";
+echo " https://neonail.vogt.de.com/logout\n";
+
+echo "\n✅ Logout-Problem behoben!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n";
+echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n";
+echo "3. Sie sollten zur Login-Seite weitergeleitet werden\n";
+echo "\n📋 Falls Problem besteht:\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Versuchen Sie direkt: https://neonail.vogt.de.com/logout\n";
+?>
diff --git a/fix-pail-cache.sh b/fix-pail-cache.sh
new file mode 100755
index 0000000..c05ceac
--- /dev/null
+++ b/fix-pail-cache.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+echo "🧹 Pail Cache Problem lösen"
+echo "=========================="
+
+# 1. Cache-Dateien löschen
+echo "🗑️ Lösche Cache-Dateien..."
+rm -f bootstrap/cache/packages.php
+rm -f bootstrap/cache/services.php
+rm -f bootstrap/cache/config.php
+
+# 2. Composer autoload neu generieren
+echo "🔄 Generiere autoload neu..."
+if command -v composer &> /dev/null; then
+ composer dump-autoload --optimize
+elif [ -f "composer.phar" ]; then
+ php composer.phar dump-autoload --optimize
+else
+ echo "⚠️ Composer nicht verfügbar"
+fi
+
+# 3. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 4. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 777 bootstrap/cache/
+
+echo ""
+echo "✅ Pail Cache Problem behoben!"
+echo "📋 Testen Sie: php artisan --version"
diff --git a/fix-pail-final.sh b/fix-pail-final.sh
new file mode 100755
index 0000000..c7048a5
--- /dev/null
+++ b/fix-pail-final.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+echo "🧹 Finale Pail-Problem Lösung"
+echo "============================="
+
+# 1. Alle Cache-Dateien löschen
+echo "🗑️ Lösche alle Cache-Dateien..."
+rm -f bootstrap/cache/packages.php
+rm -f bootstrap/cache/services.php
+rm -f bootstrap/cache/config.php
+rm -f bootstrap/cache/routes.php
+rm -f bootstrap/cache/views.php
+
+# 2. Composer autoload neu generieren
+echo "🔄 Generiere Composer autoload neu..."
+if command -v composer &> /dev/null; then
+ composer dump-autoload --optimize
+elif [ -f "composer.phar" ]; then
+ php composer.phar dump-autoload --optimize
+else
+ echo "⚠️ Composer nicht verfügbar, überspringe autoload"
+fi
+
+# 3. Laravel Cache komplett leeren
+echo "🧹 Leere Laravel Cache komplett..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 4. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 777 bootstrap/cache/
+chmod -R 777 storage/
+
+# 5. Debug deaktivieren (für Produktion)
+echo "🔧 Setze Debug-Modus zurück..."
+sed -i 's/APP_DEBUG=true/APP_DEBUG=false/' .env
+
+# 6. Test
+echo "🧪 Teste Anwendung..."
+curl -I http://192.168.30.81
+
+echo ""
+echo "✅ Pail-Problem behoben!"
+echo "📋 Testen Sie: http://192.168.30.81"
diff --git a/fix-permissions.sh b/fix-permissions.sh
new file mode 100755
index 0000000..cd9b5f8
--- /dev/null
+++ b/fix-permissions.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+# NeoNail DB - Berechtigungen korrigieren
+echo "🔧 NeoNail DB - Berechtigungen korrigieren..."
+
+# 1. Storage-Verzeichnisse erstellen (falls nicht vorhanden)
+echo "📁 Storage-Verzeichnisse erstellen..."
+mkdir -p storage/framework/views
+mkdir -p storage/framework/cache
+mkdir -p storage/framework/sessions
+mkdir -p storage/logs
+mkdir -p bootstrap/cache
+
+# 2. Berechtigungen für Storage setzen
+echo "🔐 Storage-Berechtigungen setzen..."
+chmod -R 777 storage/
+chmod -R 777 storage/framework/
+chmod -R 777 storage/framework/views/
+chmod -R 777 storage/framework/cache/
+chmod -R 777 storage/framework/sessions/
+chmod -R 777 storage/logs/
+
+# 3. Bootstrap/Cache-Berechtigungen
+echo "🔐 Bootstrap/Cache-Berechtigungen setzen..."
+chmod -R 777 bootstrap/cache/
+
+# 4. SQLite-Datenbank erstellen und Berechtigungen setzen
+echo "🗄️ SQLite-Datenbank erstellen..."
+if [ ! -f database.sqlite ]; then
+ touch database.sqlite
+ echo "✅ SQLite-Datenbank erstellt"
+else
+ echo "✅ SQLite-Datenbank bereits vorhanden"
+fi
+chmod 664 database.sqlite
+
+# 5. .env Berechtigungen
+echo "🔐 .env Berechtigungen setzen..."
+if [ -f .env ]; then
+ chmod 644 .env
+ echo "✅ .env Berechtigungen gesetzt"
+else
+ echo "⚠️ .env Datei nicht gefunden"
+fi
+
+# 6. Cache leeren
+echo "🧹 Cache leeren..."
+php artisan config:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar"
+php artisan cache:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar"
+php artisan view:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar"
+
+# 7. Storage-Link erstellen
+echo "🔗 Storage-Link erstellen..."
+php artisan storage:link 2>/dev/null || echo "⚠️ php artisan nicht verfügbar"
+
+echo "✅ Berechtigungen korrigiert!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Seite neu laden: http://192.168.30.81/neonail/"
+echo "2. Falls immer noch Fehler: Composer install ausführen"
+echo "3. Migrationen ausführen: php artisan migrate --force"
+echo "4. Admin-User erstellen: php artisan tinker"
+echo ""
+echo "💡 Falls Probleme bestehen:"
+echo "- Hosting-Provider kontaktieren"
+echo "- SSH-Zugang anfordern"
+echo "- Berechtigungen über Hosting-Panel prüfen"
diff --git a/fix-remaining-safari-warnings.sh b/fix-remaining-safari-warnings.sh
new file mode 100755
index 0000000..8d1550a
--- /dev/null
+++ b/fix-remaining-safari-warnings.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+echo "🛡️ Fix: Verbleibende Safari Sicherheitswarnungen"
+echo "==============================================="
+
+# 1. Logout-Formular beheben
+echo "1. 🔒 Logout-Formular beheben..."
+if [ -f resources/views/layouts/app.blade.php ]; then
+ sed -i 's|action="{{ route('\''logout'\'') }}"|action="https://neonail.vogt.de.com/logout"|' resources/views/layouts/app.blade.php
+ echo " ✅ Logout-Formular behoben"
+else
+ echo " ❌ layouts/app.blade.php nicht gefunden"
+fi
+
+# 2. Alle verbleibenden route() Aufrufe finden
+echo "2. 🔍 Alle verbleibenden route() Aufrufe finden..."
+grep -r "route(" resources/views/ --include="*.blade.php" | grep -E "(action|href)" || echo " ℹ️ Keine verbleibenden route() Aufrufe in action/href gefunden"
+
+# 3. Alle Formulare mit HTTPS-URLs prüfen
+echo "3. 🔒 Alle Formulare mit HTTPS prüfen..."
+php test-forms-fixed.php
+
+# 4. Laravel Cache leeren
+echo "4. 🧹 Laravel Cache leeren..."
+php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"
+
+# 5. Test-Script erstellen
+echo "5. 🧪 Test-Script erstellen..."
+cat > test-all-forms-final.php << 'EOF'
+ 'Login-Formular',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish',
+ 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish',
+ 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish',
+ 'resources/views/admin/users/create.blade.php' => 'Admin Create User',
+ 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User',
+ 'resources/views/admin/users/index.blade.php' => 'Admin Delete User',
+ 'resources/views/layouts/app.blade.php' => 'Logout-Formular'
+];
+
+$allFixed = true;
+
+foreach ($forms as $file => $description) {
+ if (file_exists($file)) {
+ $content = file_get_contents($file);
+ if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) {
+ echo " ✅ $description: HTTPS-URL gefunden\n";
+ } else {
+ echo " ❌ $description: Keine HTTPS-URL gefunden\n";
+ $allFixed = false;
+
+ // Zeige die aktuelle action
+ if (preg_match('/action="([^"]+)"/', $content, $matches)) {
+ echo " Aktuelle action: " . $matches[1] . "\n";
+ }
+ }
+ } else {
+ echo " ❌ $description: Datei nicht gefunden\n";
+ $allFixed = false;
+ }
+}
+
+echo "\n";
+if ($allFixed) {
+ echo "🎉 ALLE Formulare sind jetzt mit HTTPS-URLs konfiguriert!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n";
+ echo "📝 Safari-Sicherheitswarnungen sollten komplett verschwunden sein.\n";
+} else {
+ echo "⚠️ Einige Formulare müssen noch korrigiert werden.\n";
+ echo "🔧 Führen Sie das Fix-Script erneut aus.\n";
+}
+
+echo "\n✅ Finaler Formular-Test abgeschlossen!\n";
+?>
+EOF
+
+echo " ✅ Test-Script erstellt"
+
+# 6. Finalen Test ausführen
+echo "6. 🧪 Finalen Test ausführen..."
+php test-all-forms-final.php
+
+echo ""
+echo "✅ Verbleibende Safari Sicherheitswarnungen behoben!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. Login: https://neonail.vogt.de.com/login"
+echo "2. Logout: Klicken Sie auf Ihren Namen → Abmelden"
+echo "3. Admin-Panel: https://neonail.vogt.de.com/admin/users"
+echo "4. Lack erstellen: https://neonail.vogt.de.com/create-nail-polish"
+echo ""
+echo "📝 Falls Warnungen bestehen:"
+echo "- Führen Sie php test-all-forms-final.php aus"
+echo "- Leeren Sie Browser-Cache komplett"
+echo "- Prüfen Sie Browser-Entwicklertools (F12)"
+echo "- Testen Sie in einem Inkognito-Fenster"
diff --git a/fix-safari-form-security.sh b/fix-safari-form-security.sh
new file mode 100644
index 0000000..8a7777f
--- /dev/null
+++ b/fix-safari-form-security.sh
@@ -0,0 +1,207 @@
+#!/bin/bash
+
+echo "🍎 Safari Formular-Sicherheit beheben"
+echo "===================================="
+
+# 1. .env komplett für HTTPS konfigurieren
+echo "📝 Konfiguriere .env für HTTPS..."
+cat > .env << 'EOF'
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs=
+APP_DEBUG=false
+APP_URL=https://neonail.vogt.de.com
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+DB_DATABASE=database.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+SESSION_SECURE_COOKIE=true
+SESSION_SAME_SITE=lax
+SESSION_HTTP_ONLY=true
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+# HTTPS-Konfiguration
+FORCE_HTTPS=true
+SECURE_COOKIES=true
+EOF
+
+# 2. Session-Konfiguration für HTTPS
+echo "🔐 Konfiguriere Session für HTTPS..."
+cat > config/session.php << 'EOF'
+ env('SESSION_DRIVER', 'file'),
+ 'lifetime' => env('SESSION_LIFETIME', 120),
+ 'expire_on_close' => false,
+ 'encrypt' => false,
+ 'files' => storage_path('framework/sessions'),
+ 'connection' => env('SESSION_CONNECTION'),
+ 'table' => 'sessions',
+ 'store' => env('SESSION_STORE'),
+ 'lottery' => [2, 100],
+ 'cookie' => env(
+ 'SESSION_COOKIE',
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
+ ),
+ 'path' => '/',
+ 'domain' => env('SESSION_DOMAIN'),
+ 'secure' => true,
+ 'http_only' => true,
+ 'same_site' => 'lax',
+];
+EOF
+
+# 3. Laravel Cache komplett leeren
+echo "🧹 Leere Laravel Cache komplett..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 4. HTTPS-Force in .htaccess
+echo "🔒 Füge HTTPS-Force hinzu..."
+cat > public/.htaccess << 'EOF'
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Security Headers
+
+ Header always set X-Content-Type-Options nosniff
+ Header always set X-Frame-Options DENY
+ Header always set X-XSS-Protection "1; mode=block"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+ Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
+ Header always set Content-Security-Policy "upgrade-insecure-requests"
+ Header always set X-Forwarded-Proto https
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# Compression
+
+ AddOutputFilterByType DEFLATE text/plain
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+
+# Cache Control
+
+ ExpiresActive on
+ ExpiresByType text/css "access plus 1 year"
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType image/png "access plus 1 year"
+ ExpiresByType image/jpg "access plus 1 year"
+ ExpiresByType image/jpeg "access plus 1 year"
+ ExpiresByType image/gif "access plus 1 year"
+ ExpiresByType image/svg+xml "access plus 1 year"
+
+EOF
+
+# 5. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 6. Test
+echo "🧪 Teste HTTPS-Konfiguration..."
+curl -I https://neonail.vogt.de.com
+
+echo ""
+echo "✅ Safari Formular-Sicherheit behoben!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
+echo ""
+echo "📋 Falls Warnung bleibt:"
+echo "1. Safari-Cache leeren (Cmd+Shift+R)"
+echo "2. Private-Fenster testen"
+echo "3. Safari-Einstellungen: Entwickler > Leere Caches"
+echo "4. Safari-Einstellungen: Datenschutz > Website-Daten verwalten"
diff --git a/fix-safari-https.sh b/fix-safari-https.sh
new file mode 100644
index 0000000..a963c34
--- /dev/null
+++ b/fix-safari-https.sh
@@ -0,0 +1,171 @@
+#!/bin/bash
+
+echo "🍎 Safari HTTPS-Warnung beheben"
+echo "=============================="
+
+# 1. .env komplett für HTTPS konfigurieren
+echo "📝 Konfiguriere .env komplett für HTTPS..."
+cat > .env << 'EOF'
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs=
+APP_DEBUG=false
+APP_URL=https://neonail.vogt.de.com
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+DB_DATABASE=database.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+SESSION_SECURE_COOKIE=true
+SESSION_SAME_SITE=lax
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+EOF
+
+# 2. Laravel Cache komplett leeren
+echo "🧹 Leere Laravel Cache komplett..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 3. HTTPS-Header in .htaccess hinzufügen
+echo "🔒 Füge HTTPS-Header hinzu..."
+cat > public/.htaccess << 'EOF'
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Security Headers
+
+ Header always set X-Content-Type-Options nosniff
+ Header always set X-Frame-Options DENY
+ Header always set X-XSS-Protection "1; mode=block"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+ Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
+ Header always set Content-Security-Policy "upgrade-insecure-requests"
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# Compression
+
+ AddOutputFilterByType DEFLATE text/plain
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+
+# Cache Control
+
+ ExpiresActive on
+ ExpiresByType text/css "access plus 1 year"
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType image/png "access plus 1 year"
+ ExpiresByType image/jpg "access plus 1 year"
+ ExpiresByType image/jpeg "access plus 1 year"
+ ExpiresByType image/gif "access plus 1 year"
+ ExpiresByType image/svg+xml "access plus 1 year"
+
+EOF
+
+# 4. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 5. Test
+echo "🧪 Teste HTTPS-Konfiguration..."
+curl -I https://neonail.vogt.de.com
+
+echo ""
+echo "✅ Safari HTTPS-Warnung behoben!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
+echo ""
+echo "📋 Falls Warnung bleibt:"
+echo "1. Safari-Cache leeren (Cmd+Shift+R)"
+echo "2. Private-Fenster testen"
+echo "3. Safari-Einstellungen: Entwickler > Leere Caches"
diff --git a/fix-safari-security-warnings.sh b/fix-safari-security-warnings.sh
new file mode 100755
index 0000000..8b86c27
--- /dev/null
+++ b/fix-safari-security-warnings.sh
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+echo "🛡️ Fix: Safari Sicherheitswarnungen"
+echo "=================================="
+
+# 1. .env HTTPS-Einstellungen
+echo "1. 🔒 HTTPS-Einstellungen in .env..."
+if [ -f .env ]; then
+ # Setze alle HTTPS-Einstellungen
+ sed -i 's|APP_URL=.*|APP_URL=https://neonail.vogt.de.com|' .env
+ sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+ sed -i 's/APP_ENV=production/APP_ENV=local/' .env
+
+ # HTTPS-spezifische Einstellungen
+ echo "FORCE_HTTPS=true" >> .env
+ echo "SECURE_COOKIES=true" >> .env
+ echo "SESSION_SECURE_COOKIE=true" >> .env
+ echo "SESSION_SAME_SITE=lax" >> .env
+ echo "SESSION_HTTP_ONLY=true" >> .env
+
+ echo " ✅ .env HTTPS-Einstellungen aktualisiert"
+else
+ echo " ❌ .env Datei nicht gefunden"
+fi
+
+# 2. Session-Konfiguration
+echo "2. 🍪 Session-Konfiguration..."
+if [ -f config/session.php ]; then
+ sed -i "s/'secure' => false/'secure' => true/" config/session.php
+ sed -i "s/'http_only' => false/'http_only' => true/" config/session.php
+ echo " ✅ Session-Konfiguration aktualisiert"
+else
+ echo " ❌ config/session.php nicht gefunden"
+fi
+
+# 3. CSRF-Konfiguration
+echo "3. 🔐 CSRF-Konfiguration..."
+if [ -f config/csrf.php ]; then
+ sed -i "s/'secure' => false/'secure' => true/" config/csrf.php
+ sed -i "s/'same_site' => 'lax'/'same_site' => 'lax'/" config/csrf.php
+ echo " ✅ CSRF-Konfiguration aktualisiert"
+else
+ echo " ❌ config/csrf.php nicht gefunden"
+fi
+
+# 4. .htaccess HTTPS-Headers
+echo "4. 🌐 .htaccess HTTPS-Headers..."
+if [ -f public/.htaccess ]; then
+ # Füge HTTPS-Headers hinzu
+ if ! grep -q "Strict-Transport-Security" public/.htaccess; then
+ sed -i '/# Security Headers/a\
+Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"\
+Header always set Content-Security-Policy "upgrade-insecure-requests"' public/.htaccess
+ fi
+
+ # Force HTTPS
+ if ! grep -q "RewriteCond %{HTTPS} off" public/.htaccess; then
+ sed -i '/RewriteEngine On/a\
+RewriteCond %{HTTPS} off\
+RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]' public/.htaccess
+ fi
+
+ echo " ✅ .htaccess HTTPS-Headers aktualisiert"
+else
+ echo " ❌ public/.htaccess nicht gefunden"
+fi
+
+# 5. AppServiceProvider HTTPS-Force
+echo "5. 🔧 AppServiceProvider HTTPS-Force..."
+if [ -f app/Providers/AppServiceProvider.php ]; then
+ if ! grep -q "URL::forceScheme('https')" app/Providers/AppServiceProvider.php; then
+ sed -i "/public function boot(): void/a\\
+ if (config('app.env') === 'production') {\\
+ URL::forceScheme('https');\\
+ }" app/Providers/AppServiceProvider.php
+ fi
+ echo " ✅ AppServiceProvider HTTPS-Force aktualisiert"
+else
+ echo " ❌ AppServiceProvider nicht gefunden"
+fi
+
+# 6. Laravel Cache leeren
+echo "6. 🧹 Laravel Cache leeren..."
+php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"
+
+# 7. Test-Script erstellen
+echo "7. 🧪 Test-Script erstellen..."
+cat > test-https-security.php << 'EOF'
+ true") !== false) {
+ echo " ✅ Session secure: true\n";
+ } else {
+ echo " ❌ Session secure: false\n";
+ }
+ if (strpos($content, "'http_only' => true") !== false) {
+ echo " ✅ Session http_only: true\n";
+ } else {
+ echo " ❌ Session http_only: false\n";
+ }
+}
+
+// 3. Prüfe CSRF-Konfiguration
+echo "\n3. CSRF-Konfiguration:\n";
+if (file_exists('config/csrf.php')) {
+ $content = file_get_contents('config/csrf.php');
+ if (strpos($content, "'secure' => true") !== false) {
+ echo " ✅ CSRF secure: true\n";
+ } else {
+ echo " ❌ CSRF secure: false\n";
+ }
+}
+
+// 4. Prüfe .htaccess
+echo "\n4. .htaccess HTTPS-Headers:\n";
+if (file_exists('public/.htaccess')) {
+ $content = file_get_contents('public/.htaccess');
+ if (strpos($content, 'Strict-Transport-Security') !== false) {
+ echo " ✅ HSTS Header vorhanden\n";
+ } else {
+ echo " ❌ HSTS Header fehlt\n";
+ }
+ if (strpos($content, 'upgrade-insecure-requests') !== false) {
+ echo " ✅ CSP upgrade-insecure-requests vorhanden\n";
+ } else {
+ echo " ❌ CSP upgrade-insecure-requests fehlt\n";
+ }
+}
+
+echo "\n✅ HTTPS-Sicherheit Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n";
+?>
+EOF
+
+echo " ✅ Test-Script erstellt"
+
+echo ""
+echo "✅ Safari Sicherheitswarnungen behoben!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. Admin-Panel: https://neonail.vogt.de.com/admin/users"
+echo "2. Lack löschen im Admin-Panel"
+echo "3. User bearbeiten/löschen"
+echo ""
+echo "📝 Falls Warnungen bestehen:"
+echo "- Führen Sie php test-https-security.php aus"
+echo "- Prüfen Sie Browser-Entwicklertools (F12)"
+echo "- Leeren Sie Browser-Cache"
diff --git a/fix-sqlite-permissions.sh b/fix-sqlite-permissions.sh
new file mode 100755
index 0000000..a49d71b
--- /dev/null
+++ b/fix-sqlite-permissions.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+echo "🗄️ SQLite-Berechtigungen korrigieren"
+echo "==================================="
+
+# 1. Aktuelle Berechtigungen prüfen
+echo "🔍 Aktuelle Berechtigungen:"
+ls -la database.sqlite
+echo ""
+
+# 2. Berechtigungen korrigieren
+echo "🔐 Setze SQLite-Berechtigungen..."
+chown www-data:www-data database.sqlite
+chmod 664 database.sqlite
+
+# 3. Verzeichnis-Berechtigungen
+echo "📁 Setze Verzeichnis-Berechtigungen..."
+chown -R www-data:www-data /var/www/html
+chmod -R 755 /var/www/html
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+
+# 4. SQLite-Datei testen
+echo "🧪 Teste SQLite-Schreibzugriff..."
+if [ -w database.sqlite ]; then
+ echo "✅ SQLite-Datei ist schreibbar"
+else
+ echo "❌ SQLite-Datei ist NICHT schreibbar"
+fi
+
+# 5. Apache-User prüfen
+echo "👤 Apache-User:"
+ps aux | grep apache | head -1
+
+# 6. Test-Schreibzugriff
+echo "📝 Teste Schreibzugriff..."
+sqlite3 database.sqlite "CREATE TABLE IF NOT EXISTS test_write (id INTEGER); DROP TABLE test_write;" 2>/dev/null && echo "✅ SQLite-Schreibzugriff funktioniert" || echo "❌ SQLite-Schreibzugriff fehlgeschlagen"
+
+echo ""
+echo "✅ SQLite-Berechtigungen korrigiert!"
+echo "📋 Testen Sie jetzt das Erstellen eines Lackes"
diff --git a/fix-storage-link.sh b/fix-storage-link.sh
new file mode 100755
index 0000000..204c16b
--- /dev/null
+++ b/fix-storage-link.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+echo "🔗 Storage Link Problem lösen"
+echo "============================"
+
+# 1. Aktuellen Storage-Status prüfen
+echo "🔍 Aktueller Storage-Status:"
+ls -la public/storage
+echo ""
+
+# 2. Storage-Verzeichnis entfernen (falls es ein Verzeichnis ist)
+echo "🗑️ Entferne falsches Storage-Verzeichnis..."
+if [ -d "public/storage" ]; then
+ rm -rf public/storage
+ echo "✅ Storage-Verzeichnis entfernt"
+elif [ -L "public/storage" ]; then
+ rm public/storage
+ echo "✅ Storage-Link entfernt"
+fi
+
+# 3. Storage Link neu erstellen
+echo "🔗 Erstelle Storage Link neu..."
+php artisan storage:link
+
+# 4. Link prüfen
+echo "🔍 Prüfe neuen Storage Link:"
+ls -la public/storage
+echo ""
+
+# 5. Ziel-Verzeichnis prüfen
+echo "📁 Prüfe Ziel-Verzeichnis:"
+ls -la storage/app/public/
+echo ""
+
+# 6. Bilder-Verzeichnis prüfen
+echo "🖼️ Prüfe Bilder-Verzeichnis:"
+ls -la storage/app/public/nail_polishes/ 2>/dev/null || echo "⚠️ nail_polishes Verzeichnis nicht gefunden"
+
+# 7. Test-Bild erstellen
+echo "🧪 Erstelle Test-Bild..."
+mkdir -p storage/app/public/nail_polishes
+echo "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" | base64 -d > storage/app/public/nail_polishes/test.jpg
+chmod 644 storage/app/public/nail_polishes/test.jpg
+
+# 8. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 755 public/storage/
+chmod -R 777 storage/app/public/
+
+# 9. Test-URL
+echo "🧪 Teste Bild-URL..."
+curl -I https://neonail.vogt.de.com/storage/nail_polishes/test.jpg
+
+# 10. Echte Bilder testen
+echo "🖼️ Teste echte Bilder..."
+sqlite3 database.sqlite "SELECT image_path FROM nail_polishes WHERE image_path IS NOT NULL LIMIT 1;" | while read image_path; do
+ if [ ! -z "$image_path" ]; then
+ echo "Teste: $image_path"
+ if [ -f "storage/app/public/$image_path" ]; then
+ echo "✅ Bild existiert: $image_path"
+ curl -I "https://neonail.vogt.de.com/storage/$image_path"
+ else
+ echo "❌ Bild fehlt: $image_path"
+ fi
+ fi
+done
+
+echo ""
+echo "✅ Storage Link Problem behoben!"
+echo "📋 Testen Sie: https://neonail.vogt.de.com"
diff --git a/fix-upload-limits.php b/fix-upload-limits.php
new file mode 100644
index 0000000..c5fed06
--- /dev/null
+++ b/fix-upload-limits.php
@@ -0,0 +1,133 @@
+ ini_get('upload_max_filesize'),
+ 'post_max_size' => ini_get('post_max_size'),
+ 'max_file_uploads' => ini_get('max_file_uploads'),
+ 'memory_limit' => ini_get('memory_limit'),
+ 'max_execution_time' => ini_get('max_execution_time'),
+ 'max_input_time' => ini_get('max_input_time')
+];
+
+foreach ($limits as $setting => $value) {
+ echo " - $setting: $value\n";
+}
+
+// 2. Konvertiere zu Bytes für Vergleich
+function convertToBytes($sizeStr) {
+ $sizeStr = strtolower(trim($sizeStr));
+ $last = strtolower($sizeStr[strlen($sizeStr)-1]);
+ $size = (int)$sizeStr;
+
+ switch($last) {
+ case 'g': $size *= 1024;
+ case 'm': $size *= 1024;
+ case 'k': $size *= 1024;
+ }
+
+ return $size;
+}
+
+$uploadMaxBytes = convertToBytes($limits['upload_max_filesize']);
+$postMaxBytes = convertToBytes($limits['post_max_size']);
+$requiredBytes = 10 * 1024 * 1024; // 10MB
+
+echo "\n2. 📊 Größenvergleich:\n";
+echo " - Upload max filesize: " . number_format($uploadMaxBytes) . " Bytes\n";
+echo " - Post max size: " . number_format($postMaxBytes) . " Bytes\n";
+echo " - Benötigt für 10MB: " . number_format($requiredBytes) . " Bytes\n";
+
+if ($uploadMaxBytes < $requiredBytes) {
+ echo " ⚠️ upload_max_filesize ist zu klein für 10MB Uploads\n";
+} else {
+ echo " ✅ upload_max_filesize ist ausreichend\n";
+}
+
+if ($postMaxBytes < $requiredBytes) {
+ echo " ⚠️ post_max_size ist zu klein für 10MB Uploads\n";
+} else {
+ echo " ✅ post_max_size ist ausreichend\n";
+}
+
+// 3. .htaccess für Upload-Limits erstellen
+echo "\n3. 🔧 .htaccess Upload-Limits erstellen...\n";
+$htaccessContent = "
+# Upload-Limits für Bild-Upload
+php_value upload_max_filesize 10M
+php_value post_max_size 10M
+php_value max_file_uploads 20
+php_value memory_limit 256M
+php_value max_execution_time 300
+php_value max_input_time 300
+";
+
+if (file_exists('public/.htaccess')) {
+ $currentHtaccess = file_get_contents('public/.htaccess');
+
+ // Prüfe ob Upload-Limits bereits vorhanden sind
+ if (strpos($currentHtaccess, 'upload_max_filesize') === false) {
+ // Füge Upload-Limits hinzu
+ $newHtaccess = $currentHtaccess . "\n" . $htaccessContent;
+ file_put_contents('public/.htaccess', $newHtaccess);
+ echo " ✅ Upload-Limits zu .htaccess hinzugefügt\n";
+ } else {
+ echo " ℹ️ Upload-Limits bereits in .htaccess vorhanden\n";
+ }
+} else {
+ echo " ❌ public/.htaccess nicht gefunden\n";
+}
+
+// 4. Test-Upload-Funktionalität
+echo "\n4. 🧪 Test Upload-Funktionalität...\n";
+
+// Prüfe GD Extension
+if (extension_loaded('gd')) {
+ echo " ✅ GD Extension geladen\n";
+} else {
+ echo " ❌ GD Extension nicht geladen - Bildverarbeitung nicht möglich\n";
+}
+
+// Prüfe Storage-Verzeichnis
+$storagePath = 'storage/app/public/nail_polishes';
+if (is_dir($storagePath)) {
+ echo " ✅ Storage-Verzeichnis existiert: $storagePath\n";
+} else {
+ echo " ⚠️ Storage-Verzeichnis existiert nicht: $storagePath\n";
+ mkdir($storagePath, 0755, true);
+ echo " ✅ Storage-Verzeichnis erstellt\n";
+}
+
+// Prüfe Schreibrechte
+if (is_writable($storagePath)) {
+ echo " ✅ Storage-Verzeichnis beschreibbar\n";
+} else {
+ echo " ❌ Storage-Verzeichnis nicht beschreibbar\n";
+}
+
+// 5. Laravel Storage Link prüfen
+echo "\n5. 🔗 Laravel Storage Link prüfen...\n";
+$publicStoragePath = 'public/storage';
+if (is_link($publicStoragePath)) {
+ echo " ✅ Storage Link existiert\n";
+} else {
+ echo " ⚠️ Storage Link existiert nicht\n";
+ if (file_exists('public/storage')) {
+ echo " ℹ️ public/storage ist ein Verzeichnis, kein Link\n";
+ } else {
+ echo " ℹ️ public/storage existiert nicht\n";
+ }
+}
+
+echo "\n✅ Upload-Limits Fix abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+echo "📝 Versuchen Sie ein Handy-Foto hochzuladen (bis 10MB)\n";
+echo "\n📋 Falls Upload immer noch fehlschlägt:\n";
+echo "- Prüfen Sie die Browser-Entwicklertools (F12) für Details\n";
+echo "- Schauen Sie in storage/logs/laravel.log für Laravel-Fehler\n";
+echo "- Prüfen Sie die Apache-Logs für Server-Fehler\n";
+?>
diff --git a/force-upload-fix.sh b/force-upload-fix.sh
new file mode 100755
index 0000000..eb12120
--- /dev/null
+++ b/force-upload-fix.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+
+echo "🚨 Force Fix: Upload-Limits erzwingen"
+echo "===================================="
+
+# 1. Laravel Cache komplett leeren
+echo "1. 🧹 Laravel Cache komplett leeren..."
+php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"
+php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"
+php artisan config:cache 2>/dev/null || echo " ⚠️ config:cache übersprungen"
+
+# 2. Bootstrap Cache leeren
+echo "2. 🗂️ Bootstrap Cache leeren..."
+rm -f bootstrap/cache/*.php 2>/dev/null || echo " ⚠️ bootstrap/cache/*.php nicht gefunden"
+
+# 3. .htaccess Upload-Limits erzwingen
+echo "3. 🔧 .htaccess Upload-Limits erzwingen..."
+cat > public/.htaccess << 'EOF'
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Upload-Limits für Bild-Upload
+php_value upload_max_filesize 10M
+php_value post_max_size 10M
+php_value max_file_uploads 20
+php_value memory_limit 256M
+php_value max_execution_time 300
+php_value max_input_time 300
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+EOF
+
+echo " ✅ .htaccess mit Upload-Limits erstellt"
+
+# 4. PHP-Konfiguration prüfen
+echo "4. 🔍 PHP-Konfiguration prüfen..."
+php fix-upload-limits.php
+
+# 5. Apache neu laden
+echo "5. 🔄 Apache neu laden..."
+systemctl reload apache2 2>/dev/null || service apache2 reload 2>/dev/null || echo " ⚠️ Apache reload fehlgeschlagen"
+
+# 6. Test-Script erstellen
+echo "6. 🧪 Test-Script erstellen..."
+cat > test-upload-limits.php << 'EOF'
+ ini_get('upload_max_filesize'),
+ 'post_max_size' => ini_get('post_max_size'),
+ 'max_file_uploads' => ini_get('max_file_uploads'),
+ 'memory_limit' => ini_get('memory_limit')
+];
+
+foreach ($limits as $setting => $value) {
+ echo " - $setting: $value\n";
+}
+
+// 2. Laravel Validierungsregeln prüfen
+echo "\n2. Laravel Validierungsregeln:\n";
+$controllerPath = 'app/Http/Controllers/UserNailPolishController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+ if (preg_match('/image.*max:(\d+)/', $content, $matches)) {
+ $maxKB = $matches[1];
+ $maxMB = $maxKB / 1024;
+ echo " - Bild-Upload-Limit: {$maxKB}KB ({$maxMB}MB)\n";
+
+ if ($maxMB >= 10) {
+ echo " ✅ Upload-Limit ist ausreichend (>= 10MB)\n";
+ } else {
+ echo " ❌ Upload-Limit ist zu klein (< 10MB)\n";
+ }
+ } else {
+ echo " ❌ Keine Bild-Upload-Validierung gefunden\n";
+ }
+} else {
+ echo " ❌ Controller nicht gefunden\n";
+}
+
+// 3. View-Text prüfen
+echo "\n3. View-Text:\n";
+$viewPath = 'resources/views/user-nail-polishes/create.blade.php';
+if (file_exists($viewPath)) {
+ $content = file_get_contents($viewPath);
+ if (preg_match('/Maximale Größe: (\d+MB)/', $content, $matches)) {
+ echo " - Angezeigte Größe: {$matches[1]}\n";
+
+ if ($matches[1] === '10MB') {
+ echo " ✅ View zeigt korrekte Größe an\n";
+ } else {
+ echo " ❌ View zeigt falsche Größe an\n";
+ }
+ } else {
+ echo " ❌ Keine Größenangabe in View gefunden\n";
+ }
+} else {
+ echo " ❌ View nicht gefunden\n";
+}
+
+echo "\n✅ Upload-Limits Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+?>
+EOF
+
+echo " ✅ Test-Script erstellt"
+
+echo ""
+echo "✅ Force Upload-Limits Fix abgeschlossen!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. https://neonail.vogt.de.com/create-nail-polish"
+echo "2. Versuchen Sie ein Handy-Foto hochzuladen"
+echo ""
+echo "📝 Falls Problem besteht:"
+echo "- Führen Sie php test-upload-limits.php aus"
+echo "- Leeren Sie Browser-Cache"
+echo "- Testen Sie in einem Inkognito-Fenster"
diff --git a/htaccess-root.txt b/htaccess-root.txt
new file mode 100755
index 0000000..01f9743
--- /dev/null
+++ b/htaccess-root.txt
@@ -0,0 +1,24 @@
+# NeoNail DB - Hauptverzeichnis .htaccess
+# Umleitung auf public/ Ordner
+
+# Sicherheit
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# Umleitung auf public/
+RewriteEngine On
+RewriteRule ^$ public/ [L]
+RewriteRule (.*) public/$1 [L]
+
+# Fallback für direkte PHP-Dateien
+
+ Order allow,deny
+ Allow from all
+
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..5977fd8
--- /dev/null
+++ b/index.php
@@ -0,0 +1,18 @@
+ /dev/null; then
+ echo "❌ PHP nicht gefunden!"
+ exit 1
+fi
+
+if ! command -v curl &> /dev/null; then
+ echo "❌ curl nicht gefunden!"
+ exit 1
+fi
+
+# 2. Composer herunterladen
+echo "⬇️ Lade Composer herunter..."
+curl -sS https://getcomposer.org/installer | php
+
+# 3. Composer global verfügbar machen
+echo "🔗 Mache Composer global verfügbar..."
+sudo mv composer.phar /usr/local/bin/composer
+sudo chmod +x /usr/local/bin/composer
+
+# 4. Test
+echo "✅ Teste Composer..."
+composer --version
+
+echo ""
+echo "🎉 Composer erfolgreich installiert!"
+echo "📋 Jetzt können Sie ausführen:"
+echo " composer install --no-dev"
diff --git a/install-gd-extension.sh b/install-gd-extension.sh
new file mode 100755
index 0000000..c79a51d
--- /dev/null
+++ b/install-gd-extension.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+echo "🖼️ GD PHP Extension installieren"
+echo "==============================="
+
+# 1. System-Update
+echo "🔄 System-Update..."
+apt update
+
+# 2. GD Extension installieren
+echo "📦 Installiere GD Extension..."
+apt install -y php-gd
+
+# 3. Weitere nötige Extensions
+echo "📦 Installiere weitere Extensions..."
+apt install -y libpng-dev libjpeg-dev libfreetype6-dev
+
+# 4. PHP-Module neu laden
+echo "🔄 Lade PHP-Module neu..."
+systemctl reload apache2 2>/dev/null || echo "⚠️ Apache reload übersprungen"
+systemctl reload nginx 2>/dev/null || echo "⚠️ Nginx reload übersprungen"
+
+# 5. GD Extension testen
+echo "🧪 Teste GD Extension..."
+php -m | grep -i gd
+
+# 6. PHP-Info für GD
+echo "📋 GD PHP-Info:"
+php -r "if (extension_loaded('gd')) { echo '✅ GD Extension ist aktiviert\n'; echo 'Version: ' . gd_info()['GD Version'] . '\n'; } else { echo '❌ GD Extension ist NICHT aktiviert\n'; }"
+
+# 7. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+echo ""
+echo "✅ GD Extension installiert!"
+echo "📋 Testen Sie jetzt das Erstellen eines Lackes mit Bild"
diff --git a/install-sqlite.sh b/install-sqlite.sh
new file mode 100755
index 0000000..c2136a4
--- /dev/null
+++ b/install-sqlite.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+echo "🗄️ SQLite-Treiber Installation"
+echo "=============================="
+
+# 1. System-Update
+echo "🔄 System-Update..."
+apt update
+
+# 2. SQLite und PHP-SQLite installieren
+echo "📦 Installiere SQLite..."
+apt install -y sqlite3 php-sqlite3 php-pdo-sqlite
+
+# 3. PHP-Module neu laden
+echo "🔄 Lade PHP-Module neu..."
+systemctl reload apache2 2>/dev/null || echo "⚠️ Apache reload übersprungen"
+systemctl reload nginx 2>/dev/null || echo "⚠️ Nginx reload übersprungen"
+
+# 4. PHP-Info prüfen
+echo "🔍 Prüfe SQLite-Installation..."
+php -m | grep -i sqlite
+
+echo ""
+echo "✅ SQLite-Treiber installiert!"
+echo "📋 Testen Sie: php -m | grep sqlite"
diff --git a/laravel-test.php b/laravel-test.php
new file mode 100755
index 0000000..3e6bb76
--- /dev/null
+++ b/laravel-test.php
@@ -0,0 +1,114 @@
+Laravel-Test";
+
+// 1. Composer autoload testen
+echo "1. Composer Autoload: ";
+if (file_exists('vendor/autoload.php')) {
+ require_once 'vendor/autoload.php';
+ echo "✅ Autoload geladen ";
+} else {
+ echo "❌ vendor/autoload.php nicht gefunden ";
+ echo "Führen Sie 'composer install' aus ";
+ exit;
+}
+
+// 2. Laravel Bootstrap testen
+echo "2. Laravel Bootstrap: ";
+if (file_exists('bootstrap/app.php')) {
+ try {
+ $app = require_once 'bootstrap/app.php';
+ echo "✅ Laravel App geladen ";
+ } catch (Exception $e) {
+ echo "❌ Laravel Bootstrap Fehler: " . $e->getMessage() . " ";
+ }
+} else {
+ echo "❌ bootstrap/app.php nicht gefunden ";
+}
+
+// 3. .env laden testen
+echo "3. .env Konfiguration: ";
+if (file_exists('.env')) {
+ $env_content = file_get_contents('.env');
+ echo "✅ .env Datei gefunden ";
+
+ // Wichtige Einstellungen prüfen
+ $checks = [
+ 'APP_ENV' => 'production',
+ 'APP_DEBUG' => 'false',
+ 'DB_CONNECTION' => 'sqlite',
+ 'DB_DATABASE' => 'database.sqlite'
+ ];
+
+ foreach ($checks as $key => $expected) {
+ if (preg_match("/^$key=(.*)$/m", $env_content, $matches)) {
+ $value = trim($matches[1]);
+ $status = ($value === $expected) ? "✅" : "⚠️";
+ echo "$status $key = $value (erwartet: $expected) ";
+ } else {
+ echo "❌ $key nicht gefunden ";
+ }
+ }
+} else {
+ echo "❌ .env Datei nicht gefunden ";
+}
+
+// 4. SQLite-Verbindung testen
+echo "4. SQLite-Verbindung: ";
+if (file_exists('database.sqlite')) {
+ try {
+ $pdo = new PDO('sqlite:database.sqlite');
+ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ echo "✅ SQLite-Verbindung erfolgreich ";
+
+ // Tabellen prüfen
+ $tables = $pdo->query("SELECT name FROM sqlite_master WHERE type='table'")->fetchAll(PDO::FETCH_COLUMN);
+ echo "Gefundene Tabellen: " . implode(', ', $tables) . " ";
+
+ } catch (PDOException $e) {
+ echo "❌ SQLite-Fehler: " . $e->getMessage() . " ";
+ }
+} else {
+ echo "❌ database.sqlite nicht gefunden ";
+}
+
+// 5. Storage-Verzeichnis testen
+echo "5. Storage-Verzeichnis: ";
+if (is_dir('storage')) {
+ if (is_writable('storage')) {
+ echo "✅ storage/ ist schreibbar ";
+ } else {
+ echo "❌ storage/ ist nicht schreibbar ";
+ }
+
+ // Storage-Link prüfen
+ if (is_link('public/storage')) {
+ echo "✅ Storage-Link existiert ";
+ } else {
+ echo "⚠️ Storage-Link fehlt (php artisan storage:link) ";
+ }
+} else {
+ echo "❌ storage/ Verzeichnis nicht gefunden ";
+}
+
+// 6. Cache-Verzeichnis testen
+echo "6. Cache-Verzeichnis: ";
+if (is_dir('bootstrap/cache')) {
+ if (is_writable('bootstrap/cache')) {
+ echo "✅ bootstrap/cache/ ist schreibbar ";
+ } else {
+ echo "❌ bootstrap/cache/ ist nicht schreibbar ";
+ }
+} else {
+ echo "❌ bootstrap/cache/ Verzeichnis nicht gefunden ";
+}
+
+echo " ";
+echo "Empfohlene Aktionen: ";
+echo "1. Falls Composer fehlt: composer install ausführen ";
+echo "2. Falls .env falsch: env-sqlite-example.txt zu .env kopieren ";
+echo "3. Falls Berechtigungen falsch: chmod 755 storage/ bootstrap/cache/ ";
+echo "4. Falls SQLite fehlt: touch database.sqlite && chmod 664 database.sqlite ";
+echo "5. Falls Storage-Link fehlt: php artisan storage:link ";
+echo "6. Migrationen ausführen: php artisan migrate --force ";
+?>
diff --git a/make-existing-user-admin.php b/make-existing-user-admin.php
new file mode 100644
index 0000000..7ac4eac
--- /dev/null
+++ b/make-existing-user-admin.php
@@ -0,0 +1,71 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ echo "👑 User zum Admin machen ";
+
+ // Alle User anzeigen
+ echo "👥 Alle User: ";
+ $allUsers = User::all();
+
+ if ($allUsers->count() > 0) {
+ echo "";
+ echo "ID Name Email Erstellt Aktion ";
+
+ foreach ($allUsers as $user) {
+ $isAdmin = ($user->email === 'admin@neonail.com' || $user->email === 'neueradmin@neonail.com');
+ echo "";
+ echo "{$user->id} ";
+ echo "{$user->name} ";
+ echo "{$user->email} ";
+ echo "{$user->created_at} ";
+ echo "" . ($isAdmin ? "👑 Admin" : "👤 User") . " ";
+ echo " ";
+ }
+ echo "
";
+
+ // User zum Admin machen (Beispiel: User mit ID 2)
+ $userId = 2; // Ändern Sie diese ID
+ $user = User::find($userId);
+
+ if ($user) {
+ echo "🔧 User zum Admin machen: ";
+ echo "User: {$user->name} ({$user->email})
";
+
+ // Passwort ändern (optional)
+ $newPassword = 'admin123';
+ $user->password = bcrypt($newPassword);
+ $user->save();
+
+ echo "✅ User wurde zum Admin gemacht!
";
+ echo "Neues Passwort: {$newPassword}
";
+ echo "Login: {$user->email} / {$newPassword}
";
+ } else {
+ echo "❌ User mit ID {$userId} nicht gefunden
";
+ }
+
+ } else {
+ echo "❌ Keine User gefunden
";
+ }
+
+ echo "🔑 Admin-Login: ";
+ echo "Verwenden Sie eine der Admin-Emails:
";
+ echo "";
+ echo "admin@neonail.com ";
+ echo "neueradmin@neonail.com ";
+ echo " ";
+ echo "Passwort: admin123
";
+ echo "🚀 Zur Anwendung
";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: ";
+ echo "{$e->getMessage()}
";
+}
+?>
diff --git a/make-user-admin.php b/make-user-admin.php
new file mode 100644
index 0000000..54ce959
--- /dev/null
+++ b/make-user-admin.php
@@ -0,0 +1,65 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ echo "👑 Neuen Admin-User erstellen ";
+
+ // Prüfe ob User bereits existiert
+ $email = 'neueradmin@neonail.com';
+ $existingUser = User::where('email', $email)->first();
+
+ if ($existingUser) {
+ echo "✅ User existiert bereits! ";
+ echo "Name: {$existingUser->name}
";
+ echo "Email: {$existingUser->email}
";
+ echo "ID: {$existingUser->id}
";
+ echo "Erstellt: {$existingUser->created_at}
";
+ } else {
+ // Neuen Admin-User erstellen
+ $newAdmin = User::create([
+ 'name' => 'Neuer Admin',
+ 'email' => $email,
+ 'password' => bcrypt('admin123')
+ ]);
+
+ echo "✅ Neuer Admin-User erstellt! ";
+ echo "Name: {$newAdmin->name}
";
+ echo "Email: {$newAdmin->email}
";
+ echo "Passwort: admin123
";
+ echo "ID: {$newAdmin->id}
";
+ }
+
+ // Alle Admin-User anzeigen
+ echo "👑 Alle Admin-User: ";
+ $allUsers = User::all();
+
+ echo "";
+ echo "ID Name Email Erstellt ";
+
+ foreach ($allUsers as $user) {
+ echo "";
+ echo "{$user->id} ";
+ echo "{$user->name} ";
+ echo "{$user->email} ";
+ echo "{$user->created_at} ";
+ echo " ";
+ }
+ echo "
";
+
+ echo "🔑 Login-Daten: ";
+ echo "Email: neueradmin@neonail.com
";
+ echo "Passwort: admin123
";
+ echo "🚀 Zur Anwendung
";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: ";
+ echo "{$e->getMessage()}
";
+}
+?>
diff --git a/monitor-logs.php b/monitor-logs.php
new file mode 100644
index 0000000..8b3b10b
--- /dev/null
+++ b/monitor-logs.php
@@ -0,0 +1,137 @@
+
diff --git a/package.json b/package.json
new file mode 100755
index 0000000..a5707d8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite"
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "^4.0.0",
+ "axios": "^1.11.0",
+ "concurrently": "^9.0.1",
+ "laravel-vite-plugin": "^2.0.0",
+ "tailwindcss": "^4.0.0",
+ "vite": "^7.0.4"
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100755
index 0000000..5fd5bcf
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,34 @@
+
+
+
+
+ tests/Unit
+
+
+ tests/Feature
+
+
+
+
+ app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100755
index 0000000..ebe59fc
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,76 @@
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Security Headers
+
+ Header always set X-Content-Type-Options nosniff
+ Header always set X-Frame-Options DENY
+ Header always set X-XSS-Protection "1; mode=block"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# Compression
+
+ AddOutputFilterByType DEFLATE text/plain
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+
+# Cache Control
+
+ ExpiresActive on
+ ExpiresByType text/css "access plus 1 year"
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType image/png "access plus 1 year"
+ ExpiresByType image/jpg "access plus 1 year"
+ ExpiresByType image/jpeg "access plus 1 year"
+ ExpiresByType image/gif "access plus 1 year"
+ ExpiresByType image/svg+xml "access plus 1 year"
+
+
+# Upload-Limits für Bild-Upload
+php_value upload_max_filesize 10M
+php_value post_max_size 10M
+php_value max_file_uploads 20
+php_value memory_limit 256M
diff --git a/public/.htaccess.backup b/public/.htaccess.backup
new file mode 100755
index 0000000..7ac69b1
--- /dev/null
+++ b/public/.htaccess.backup
@@ -0,0 +1,70 @@
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Security Headers
+
+ Header always set X-Content-Type-Options nosniff
+ Header always set X-Frame-Options DENY
+ Header always set X-XSS-Protection "1; mode=block"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# Compression
+
+ AddOutputFilterByType DEFLATE text/plain
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+
+# Cache Control
+
+ ExpiresActive on
+ ExpiresByType text/css "access plus 1 year"
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType image/png "access plus 1 year"
+ ExpiresByType image/jpg "access plus 1 year"
+ ExpiresByType image/jpeg "access plus 1 year"
+ ExpiresByType image/gif "access plus 1 year"
+ ExpiresByType image/svg+xml "access plus 1 year"
+
diff --git a/public/.htaccess.simple b/public/.htaccess.simple
new file mode 100644
index 0000000..93dcc04
--- /dev/null
+++ b/public/.htaccess.simple
@@ -0,0 +1,41 @@
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Force HTTPS
+ RewriteCond %{HTTPS} off
+ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+
+# Protect sensitive files
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100755
index 0000000..e69de29
diff --git a/public/index.php b/public/index.php
new file mode 100755
index 0000000..ee8f07e
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,20 @@
+handleRequest(Request::capture());
diff --git a/public/logout-test.blade.php b/public/logout-test.blade.php
new file mode 100644
index 0000000..0b99b36
--- /dev/null
+++ b/public/logout-test.blade.php
@@ -0,0 +1,15 @@
+
+
+
+ Logout Test
+
+
+
+ Logout Test
+
+ Route: {{ route("logout") }}
+
+
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100755
index 0000000..eb05362
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/quick-500-fix.sh b/quick-500-fix.sh
new file mode 100755
index 0000000..ac8a467
--- /dev/null
+++ b/quick-500-fix.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+echo "🚨 Quick Fix: HTTP 500 Internal Server Error"
+echo "==========================================="
+
+# 1. Debug aktivieren
+echo "1. 🐛 Debug aktivieren..."
+if [ -f .env ]; then
+ sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+ sed -i 's/APP_ENV=production/APP_ENV=local/' .env
+ echo " ✅ Debug-Modus aktiviert"
+else
+ echo " ❌ .env Datei nicht gefunden"
+fi
+
+# 2. Berechtigungen reparieren
+echo "2. 🔐 Berechtigungen reparieren..."
+chmod -R 755 storage/
+chmod -R 755 bootstrap/cache/
+chown -R www-data:www-data storage/
+chown -R www-data:www-data bootstrap/cache/
+echo " ✅ Berechtigungen repariert"
+
+# 3. Cache leeren
+echo "3. 🧹 Cache leeren..."
+rm -f bootstrap/cache/*.php 2>/dev/null || echo " ⚠️ bootstrap/cache/*.php nicht gefunden"
+rm -f storage/framework/cache/* 2>/dev/null || echo " ⚠️ storage/framework/cache/* nicht gefunden"
+rm -f storage/framework/views/* 2>/dev/null || echo " ⚠️ storage/framework/views/* nicht gefunden"
+echo " ✅ Cache geleert"
+
+# 4. Log-Dateien erstellen
+echo "4. 📝 Log-Dateien erstellen..."
+mkdir -p storage/logs/
+touch storage/logs/laravel.log
+chmod 666 storage/logs/laravel.log
+chown www-data:www-data storage/logs/laravel.log
+echo " ✅ Log-Dateien erstellt"
+
+# 5. Debug-Script ausführen
+echo "5. 🔍 Debug-Script ausführen..."
+php debug-500-error.php
+
+echo ""
+echo "✅ Quick Fix abgeschlossen!"
+echo ""
+echo "🔗 Testen Sie jetzt:"
+echo "1. https://neonail.vogt.de.com"
+echo "2. Falls Fehler bestehen, prüfen Sie die Debug-Ausgabe oben"
+echo "3. Schauen Sie in storage/logs/laravel.log für Details"
diff --git a/quick-debug.sh b/quick-debug.sh
new file mode 100755
index 0000000..2cf2de3
--- /dev/null
+++ b/quick-debug.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+echo "🔧 Schnelle Debug-Aktivierung"
+echo "============================"
+
+# 1. Debug aktivieren
+echo "📝 Aktiviere Debug-Modus..."
+sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env
+echo "✅ APP_DEBUG=true gesetzt"
+
+# 2. Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+# 3. Berechtigungen prüfen
+echo "🔐 Prüfe Berechtigungen..."
+chmod -R 777 storage/ 2>/dev/null
+chmod -R 777 bootstrap/cache/ 2>/dev/null
+
+# 4. Test
+echo "🧪 Teste Anwendung..."
+curl -s http://192.168.30.81 | head -20
+
+echo ""
+echo "✅ Debug aktiviert!"
+echo "📋 Öffnen Sie: http://192.168.30.81"
+echo "📋 Fehlermeldung wird jetzt angezeigt"
diff --git a/resources/css/app.css b/resources/css/app.css
new file mode 100755
index 0000000..3e6abea
--- /dev/null
+++ b/resources/css/app.css
@@ -0,0 +1,11 @@
+@import 'tailwindcss';
+
+@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
+@source '../../storage/framework/views/*.php';
+@source '../**/*.blade.php';
+@source '../**/*.js';
+
+@theme {
+ --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
+ 'Segoe UI Symbol', 'Noto Color Emoji';
+}
diff --git a/resources/js/app.js b/resources/js/app.js
new file mode 100755
index 0000000..e59d6a0
--- /dev/null
+++ b/resources/js/app.js
@@ -0,0 +1 @@
+import './bootstrap';
diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js
new file mode 100755
index 0000000..5f1390b
--- /dev/null
+++ b/resources/js/bootstrap.js
@@ -0,0 +1,4 @@
+import axios from 'axios';
+window.axios = axios;
+
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php
new file mode 100755
index 0000000..8261e29
--- /dev/null
+++ b/resources/views/admin/dashboard.blade.php
@@ -0,0 +1,141 @@
+@extends('layouts.app')
+
+@section('title', 'Admin Dashboard - NeoNail DB')
+
+@section('content')
+
+
+
+ Admin Dashboard
+
+
+
+
+
+
+
+
+
+
+
{{ $totalUsers }}
+
Benutzer
+
+
+
+
+
+
+
+
{{ $totalNailPolishes }}
+
Nagellacke
+
+
+
+
+
+
+
+
{{ $recentUsers->count() }}
+
Neue Benutzer
+
+
+
+
+
+
+
+
{{ $recentNailPolishes->count() }}
+
Neue Lacke
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if($recentUsers->count() > 0)
+
+ @foreach($recentUsers as $user)
+
+
+
{{ $user->name }}
+ {{ $user->email }}
+
+
{{ $user->created_at->diffForHumans() }}
+
+ @endforeach
+
+ @else
+
Keine Benutzer vorhanden
+ @endif
+
+
+
+
+
+
+
+
+ @if($recentNailPolishes->count() > 0)
+
+ @foreach($recentNailPolishes as $nailPolish)
+
+
+
{{ $nailPolish->name }}
+ Nr. {{ $nailPolish->number }}
+
+
{{ $nailPolish->created_at->diffForHumans() }}
+
+ @endforeach
+
+ @else
+
Keine Nagellacke vorhanden
+ @endif
+
+
+
+
+@endsection
diff --git a/resources/views/admin/statistics.blade.php b/resources/views/admin/statistics.blade.php
new file mode 100755
index 0000000..ab68dbf
--- /dev/null
+++ b/resources/views/admin/statistics.blade.php
@@ -0,0 +1,128 @@
+@extends('layouts.app')
+
+@section('title', 'Statistiken - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+
+
+
+
{{ $totalUsers }}
+
Gesamte Benutzer
+
+
+
+
+
+
+
+
{{ $totalNailPolishes }}
+
Gesamte Nagellacke
+
+
+
+
+
+
+
+
{{ $usersWithCollections }}
+
Benutzer mit Sammlung
+
+
+
+
+
+
+
+
{{ round($averageCollectionSize, 1) }}
+
Ø Sammlungsgröße
+
+
+
+
+
+
+
+
+
+
+
+ @if($topUsers->count() > 0)
+
+
+
+
+ Rang
+ Benutzer
+ E-Mail
+ Sammlung
+ Registriert
+ Aktionen
+
+
+
+ @foreach($topUsers as $index => $user)
+
+
+ @if($index === 0)
+
+ @elseif($index === 1)
+
+ @elseif($index === 2)
+
+ @else
+ {{ $index + 1 }}
+ @endif
+
+
+
+
+
+ {{ $user->name }}
+ @if($user->email === 'admin@neonail.com')
+ Admin
+ @endif
+
+
+
+ {{ $user->email }}
+
+
+ {{ $user->nail_polishes_count }} Lacke
+
+
+ {{ $user->created_at->format('d.m.Y') }}
+
+
+ Sammlung
+
+
+
+ @endforeach
+
+
+
+ @else
+
+
+
Noch keine Daten verfügbar
+
+ @endif
+
+
+
+
+@endsection
diff --git a/resources/views/admin/users/create.blade.php b/resources/views/admin/users/create.blade.php
new file mode 100755
index 0000000..be91bbb
--- /dev/null
+++ b/resources/views/admin/users/create.blade.php
@@ -0,0 +1,99 @@
+@extends('layouts.app')
+
+@section('title', 'Neuen User erstellen - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+ @if ($errors->any())
+
+
+ @foreach ($errors->all() as $error)
+ {{ $error }}
+ @endforeach
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+ Der neue User kann sich sofort mit der Email-Adresse und dem Passwort anmelden
+ Der User kann eigene Lacke erstellen und verwalten
+ Der User kann Lacke aus dem Hauptkatalog zu seiner Sammlung hinzufügen
+ Sie können den User später bearbeiten oder löschen
+
+
+
+
+
+@endsection
diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php
new file mode 100755
index 0000000..91bb0fa
--- /dev/null
+++ b/resources/views/admin/users/edit.blade.php
@@ -0,0 +1,131 @@
+@extends('layouts.app')
+
+@section('title', 'User bearbeiten - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+ @if ($errors->any())
+
+
+ @foreach ($errors->all() as $error)
+ {{ $error }}
+ @endforeach
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+
User-ID: {{ $user->id }}
+
Erstellt: {{ $user->created_at->format('d.m.Y H:i') }}
+
Letzte Änderung: {{ $user->updated_at->format('d.m.Y H:i') }}
+
+
+
Sammlung: {{ $user->nailPolishes()->count() }} Lacke
+
Status:
+ @if($user->email === 'admin@neonail.com' || $user->email === 'neueradmin@neonail.com')
+ Admin
+ @else
+ User
+ @endif
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php
new file mode 100755
index 0000000..0bdd6e5
--- /dev/null
+++ b/resources/views/admin/users/index.blade.php
@@ -0,0 +1,137 @@
+@extends('layouts.app')
+
+@section('title', 'User-Verwaltung - NeoNail DB')
+
+@section('content')
+
+
+
+
+ User-Verwaltung
+
+
Verwalten Sie alle Benutzer der Anwendung
+
+
+
+
+
+
+
+
+
+ {{ $users->total() }} User{{ $users->total() != 1 ? 's' : '' }} gefunden
+
+
+
+
+ @if($users->count() > 0)
+
+
+
+
+
+
+ ID
+ Name
+ Email
+ Erstellt
+ Sammlung
+ Aktionen
+
+
+
+ @foreach($users as $user)
+
+ {{ $user->id }}
+
+ {{ $user->name }}
+ @if($user->isAdmin())
+ Admin
+ @endif
+
+ {{ $user->email }}
+ {{ $user->created_at->format('d.m.Y H:i') }}
+
+ @php $collectionCount = $user->nailPolishes()->count(); @endphp
+ {{ $collectionCount }} Lack{{ $collectionCount != 1 ? 'e' : '' }}
+
+
+
+
+
+
+
+
+
+ @if($user->email !== 'admin@neonail.com')
+
+ @endif
+
+
+
+ @endforeach
+
+
+
+
+
+
+
+ @if($users->hasPages())
+
+
+
+ {{ $users->appends(['search' => $search])->links() }}
+
+
+
+ @endif
+ @else
+
+
+
Keine User gefunden
+
+ @if($search)
+ Keine User gefunden, die "{{ $search }}" entsprechen.
+ @else
+ Es sind noch keine User in der Anwendung registriert.
+ @endif
+
+
+ Ersten User erstellen
+
+
+ @endif
+
+@endsection
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
new file mode 100755
index 0000000..e6a5913
--- /dev/null
+++ b/resources/views/auth/login.blade.php
@@ -0,0 +1,68 @@
+@extends('layouts.app')
+
+@section('title', 'Anmelden - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+
+
NeoNail DB
+
Anmelden um Ihre Sammlung zu verwalten
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/emails/welcome-user.blade.php b/resources/views/emails/welcome-user.blade.php
new file mode 100644
index 0000000..019d16b
--- /dev/null
+++ b/resources/views/emails/welcome-user.blade.php
@@ -0,0 +1,221 @@
+
+
+
+
+ Willkommen bei der NeoNail DB
+
+
+
+
+
+
+
+
+
Hallo {{ $user->name }}!
+
Willkommen bei der NeoNail Datenbank! Ihr Account wurde erfolgreich erstellt.
+
+
+
+
🔐 Ihre Login-Daten:
+
+ Website:
+ https://neonail.vogt.de.com
+
+
+ E-Mail:
+ {{ $user->email }}
+
+
+ Passwort:
+ {{ $password }}
+
+
+
+
+
⚠️ Wichtig: Passwort ändern
+
Aus Sicherheitsgründen bitten wir Sie, Ihr Passwort nach dem ersten Login zu ändern. Sie können dies in Ihren Account-Einstellungen tun.
+
+
+
+
+
+
🎯 Was Sie mit der NeoNail DB machen können:
+
+ Ihre persönliche Nagellack-Sammlung verwalten
+ Neue Lacke hinzufügen und fotografieren
+ Nach Lacken suchen (Name oder Nummer)
+ Mobile-optimierte Benutzeroberfläche
+ Kollaborativer Katalog mit anderen Usern
+
+
+
+ @if($user->isAdmin())
+
+
👑 Admin-Account
+
Sie haben Admin-Rechte und können andere User verwalten sowie den Nagellack-Katalog administrieren.
+
+ @endif
+
+
+ Bei Fragen oder Problemen wenden Sie sich bitte an den Administrator.
+
+
+
+
+
+
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
new file mode 100755
index 0000000..49d34a0
--- /dev/null
+++ b/resources/views/layouts/app.blade.php
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+ @yield("title", "NeoNail Datenbank")
+
+
+
+
+
+
+
+
+ @yield("styles")
+
+
+
+
+
+
+
+
+ @if(session("success"))
+
+ {{ session("success") }}
+
+
+ @endif
+
+ @if(session("error"))
+
+ {{ session("error") }}
+
+
+ @endif
+
+ @yield("content")
+
+
+
+
+
+
+
+
+
+ @yield("scripts")
+
+
\ No newline at end of file
diff --git a/resources/views/manufacturers/create.blade.php b/resources/views/manufacturers/create.blade.php
new file mode 100644
index 0000000..0d43cd0
--- /dev/null
+++ b/resources/views/manufacturers/create.blade.php
@@ -0,0 +1,120 @@
+@extends('layouts.app')
+
+@section('title', 'Neuer Hersteller')
+
+@section('content')
+
+
+
+
+
+
+
+ @if($errors->any())
+
+
+
Fehler:
+
+ @foreach($errors->all() as $error)
+ {{ $error }}
+ @endforeach
+
+
+
+ @endif
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/manufacturers/edit.blade.php b/resources/views/manufacturers/edit.blade.php
new file mode 100644
index 0000000..bd84c20
--- /dev/null
+++ b/resources/views/manufacturers/edit.blade.php
@@ -0,0 +1,121 @@
+@extends('layouts.app')
+
+@section('title', 'Hersteller bearbeiten')
+
+@section('content')
+
+
+
+
+
+
+
+ @if($errors->any())
+
+
+
Fehler:
+
+ @foreach($errors->all() as $error)
+ {{ $error }}
+ @endforeach
+
+
+
+ @endif
+
+
+ @csrf
+ @method('PUT')
+
+
+
+ Name *
+
+
+ @error('name')
+
{{ $message }}
+ @enderror
+
+ Der Name des Herstellers. Dieser muss eindeutig sein.
+
+
+
+
+
+ Beschreibung
+
+
{{ old('description', $manufacturer->description) }}
+ @error('description')
+
{{ $message }}
+ @enderror
+
+ Optionale Beschreibung des Herstellers.
+
+
+
+
+
+ Website
+
+
+ @error('website')
+
{{ $message }}
+ @enderror
+
+ Die offizielle Website des Herstellers (optional).
+
+
+
+
+
+ Land
+
+
+ @error('country')
+
{{ $message }}
+ @enderror
+
+ Das Herkunftsland des Herstellers (optional).
+
+
+
+
+
+ Zurück
+
+
+ Änderungen speichern
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/manufacturers/index.blade.php b/resources/views/manufacturers/index.blade.php
new file mode 100644
index 0000000..7784f63
--- /dev/null
+++ b/resources/views/manufacturers/index.blade.php
@@ -0,0 +1,163 @@
+@extends('layouts.app')
+
+@section('title', 'Hersteller')
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+ @if(session('success'))
+
+
+ {{ session('success') }}
+
+
+ @endif
+
+ @if(session('error'))
+
+
+ {{ session('error') }}
+
+
+ @endif
+
+ @if($manufacturers->count() > 0)
+
+
+
+
+ Name
+ Land
+ Website
+ Nagellacke
+ Erstellt
+ Aktionen
+
+
+
+ @foreach($manufacturers as $manufacturer)
+
+
+ {{ $manufacturer->name }}
+ @if($manufacturer->description)
+
+ {{ Str::limit($manufacturer->description, 50) }}
+ @endif
+
+
+ @if($manufacturer->country)
+ {{ $manufacturer->country }}
+ @else
+ -
+ @endif
+
+
+ @if($manufacturer->website)
+
+
+ Website
+
+ @else
+ -
+ @endif
+
+
+ {{ $manufacturer->nail_polishes_count }}
+
+
+
+ {{ $manufacturer->created_at->format('d.m.Y') }}
+
+
+
+
+
+
+
+
+
+
+ @if(!$manufacturer->hasNailPolishes())
+
+ @csrf
+ @method('DELETE')
+
+
+
+
+ @endif
+
+
+
+ @endforeach
+
+
+
+
+
+
+ {{ $manufacturers->appends(['search' => $search])->links() }}
+
+ @else
+
+
+
Keine Hersteller gefunden
+ @if($search)
+
Keine Hersteller für "{{ $search }}" gefunden.
+
+ Alle Hersteller anzeigen
+
+ @else
+
Erstellen Sie den ersten Hersteller.
+
+ Ersten Hersteller erstellen
+
+ @endif
+
+ @endif
+
+
+
+
+
+@endsection
diff --git a/resources/views/manufacturers/show.blade.php b/resources/views/manufacturers/show.blade.php
new file mode 100644
index 0000000..7c1ea40
--- /dev/null
+++ b/resources/views/manufacturers/show.blade.php
@@ -0,0 +1,153 @@
+@extends('layouts.app')
+
+@section('title', $manufacturer->name)
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
Informationen
+
+ Name:
+ {{ $manufacturer->name }}
+
+ @if($manufacturer->country)
+ Land:
+
+ {{ $manufacturer->country }}
+
+ @endif
+
+ @if($manufacturer->website)
+ Website:
+
+
+
+ {{ $manufacturer->website }}
+
+
+ @endif
+
+ Nagellacke:
+
+ {{ $manufacturer->nailPolishes->count() }}
+
+
+ Erstellt:
+ {{ $manufacturer->created_at->format('d.m.Y H:i') }}
+
+ Aktualisiert:
+ {{ $manufacturer->updated_at->format('d.m.Y H:i') }}
+
+
+
+
+ @if($manufacturer->description)
+
Beschreibung
+
{{ $manufacturer->description }}
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+
{{ $manufacturer->nailPolishes->count() }}
+
Nagellacke
+
+
+
+
+
+
+ @if($manufacturer->nailPolishes->count() > 0)
+
+
+
+
+
+
+ @foreach($manufacturer->nailPolishes as $nailPolish)
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
{{ $nailPolish->name }}
+
{{ $nailPolish->number }}
+
+ Anzeigen
+
+
+
+
+ @endforeach
+
+
+
+
+
+ @else
+
+ @endif
+
+@endsection
diff --git a/resources/views/nail-polishes/create.blade.php b/resources/views/nail-polishes/create.blade.php
new file mode 100755
index 0000000..d79ced2
--- /dev/null
+++ b/resources/views/nail-polishes/create.blade.php
@@ -0,0 +1,75 @@
+@extends('layouts.app')
+
+@section('title', 'Neuen Nagellack hinzufügen - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+
+ @csrf
+
+
+
Name des Nagellacks *
+
+ @error('name')
+
{{ $message }}
+ @enderror
+
+
+
+
Nummer *
+
+ @error('number')
+
{{ $message }}
+ @enderror
+
+
+
+
Bild (optional)
+
+
+
+ Sie können ein Bild von Ihrer Kamera aufnehmen oder eine Datei auswählen.
+
+ @error('image')
+
{{ $message }}
+ @enderror
+
+
+
+
+
+
+
+
+@endsection
+
+@section('scripts')
+
+@endsection
diff --git a/resources/views/nail-polishes/edit.blade.php b/resources/views/nail-polishes/edit.blade.php
new file mode 100755
index 0000000..071f88d
--- /dev/null
+++ b/resources/views/nail-polishes/edit.blade.php
@@ -0,0 +1,70 @@
+@extends('layouts.app')
+
+@section('title', 'Nagellack bearbeiten - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+
+ @csrf
+ @method('PUT')
+
+
+
Name des Nagellacks *
+
+ @error('name')
+
{{ $message }}
+ @enderror
+
+
+
+
Nummer *
+
+ @error('number')
+
{{ $message }}
+ @enderror
+
+
+
+
Bild (optional)
+ @if($nailPolish->image_path)
+
+
+
Aktuelles Bild
+
+ @endif
+
+
+
+ Sie können ein neues Bild von Ihrer Kamera aufnehmen oder eine Datei auswählen.
+
+ @error('image')
+
{{ $message }}
+ @enderror
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/nail-polishes/index.blade.php b/resources/views/nail-polishes/index.blade.php
new file mode 100755
index 0000000..ec8b41c
--- /dev/null
+++ b/resources/views/nail-polishes/index.blade.php
@@ -0,0 +1,121 @@
+@extends('layouts.app')
+
+@section('title', 'Nagellack-Verwaltung - NeoNail DB')
+
+@section('content')
+
+
+
+
+ NeoNail-Lacke verwalten
+
+
Verwalten Sie alle verfügbaren NeoNail-Lacke im System
+
+
+
+
+ @if(session('success'))
+
+ {{ session('success') }}
+
+
+ @endif
+
+ @if(session('error'))
+
+ {{ session('error') }}
+
+
+ @endif
+
+ @if($nailPolishes->count() > 0)
+
+ @foreach($nailPolishes as $nailPolish)
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
+
{{ $nailPolish->name }}
+
Nr. {{ $nailPolish->number }}
+ @if($nailPolish->manufacturer)
+
+ {{ $nailPolish->manufacturer->name }}
+
+ @endif
+
+
+ @php
+ $userCount = $nailPolish->users()->count();
+ @endphp
+
+
+ {{ $userCount }} User{{ $userCount != 1 ? 's' : '' }} haben diesen Lack
+
+
+
+
+
+ User anzeigen
+
+
+ Bearbeiten
+
+
+ @csrf
+ @method('DELETE')
+ 0 ? 'disabled' : '' }}
+ title="{{ $userCount > 0 ? 'Lack wird noch von ' . $userCount . ' User(s) verwendet' : '' }}">
+ Löschen
+
+
+
+
+
+
+
+ @endforeach
+
+
+
+ @if($nailPolishes->hasPages())
+
+
+
+ {{ $nailPolishes->links() }}
+
+
+
+ @endif
+ @else
+
+
+
Noch keine Lacke vorhanden
+
+ Erstellen Sie den ersten NeoNail-Lack im System!
+
+
+ Ersten Lack erstellen
+
+
+ @endif
+
+@endsection
diff --git a/resources/views/nail-polishes/show-users.blade.php b/resources/views/nail-polishes/show-users.blade.php
new file mode 100755
index 0000000..a8fd944
--- /dev/null
+++ b/resources/views/nail-polishes/show-users.blade.php
@@ -0,0 +1,97 @@
+@extends('layouts.app')
+
+@section('title', 'User mit diesem Lack - NeoNail DB')
+
+@section('content')
+
+
+
+
+ User mit "{{ $nailPolish->name }}"
+
+
Benutzer, die diesen Lack in ihrer Sammlung haben
+
+
+
+
+
+
+
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
+
{{ $nailPolish->name }}
+
Nummer: {{ $nailPolish->number }}
+
+ {{ $users->total() }} User{{ $users->total() != 1 ? 's' : '' }}
+
+
+
+
+
+
+ @if($users->count() > 0)
+
+
+
+
+
+
+
+ Name
+ E-Mail
+ Registriert am
+ Aktionen
+
+
+
+ @foreach($users as $user)
+
+ {{ $user->name }}
+ {{ $user->email }}
+ {{ $user->created_at->format('d.m.Y H:i') }}
+
+
+ Sammlung anzeigen
+
+
+
+ @endforeach
+
+
+
+
+
+ @if($users->hasPages())
+
+ {{ $users->links() }}
+
+ @endif
+
+
+ @else
+
+
+
Keine User gefunden
+
Dieser Lack wird von keinem Benutzer verwendet.
+
+ @endif
+
+@endsection
diff --git a/resources/views/user-nail-polishes/available.blade.php b/resources/views/user-nail-polishes/available.blade.php
new file mode 100755
index 0000000..e8d028f
--- /dev/null
+++ b/resources/views/user-nail-polishes/available.blade.php
@@ -0,0 +1,124 @@
+@extends('layouts.app')
+
+@section('title', 'Verfügbare Lacke - NeoNail DB')
+
+@section('content')
+
+
+
+
+ Verfügbare NeoNail-Lacke
+
+
Lacke, die Sie noch nicht in Ihrer Sammlung haben
+
+
+
+
+
+
+
+ Hinweis: Diese Lacke sind Teil des gemeinsamen Hauptkatalogs und können nicht gelöscht werden.
+ Sie können sie nur zu Ihrer persönlichen Sammlung hinzufügen oder entfernen.
+
+
+
+
+
+
+
+ {{ $nailPolishes->total() }} verfügbare Lack{{ $nailPolishes->total() != 1 ? 'e' : '' }}
+
+
+
+
+ @if($nailPolishes->count() > 0)
+
+ @foreach($nailPolishes as $nailPolish)
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
+
{{ $nailPolish->name }}
+
Nr. {{ $nailPolish->number }}
+
+
+
+ @csrf
+
+ Zur Sammlung hinzufügen
+
+
+
+
+
+
+ @endforeach
+
+
+
+ @if($nailPolishes->hasPages())
+
+
+
+ {{ $nailPolishes->appends(['search' => $search])->links() }}
+
+
+
+ @endif
+ @else
+
+
+
Glückwunsch!
+
+ @if($search)
+ Keine verfügbaren Lacke gefunden, die "{{ $search }}" entsprechen.
+ @else
+ Sie haben bereits alle verfügbaren NeoNail-Lacke in Ihrer Sammlung!
+ @endif
+
+
+
+ @endif
+
+@endsection
diff --git a/resources/views/user-nail-polishes/create.blade.php b/resources/views/user-nail-polishes/create.blade.php
new file mode 100755
index 0000000..eaad505
--- /dev/null
+++ b/resources/views/user-nail-polishes/create.blade.php
@@ -0,0 +1,175 @@
+@extends('layouts.app')
+
+@section('title', 'Neuen Lack hinzufügen - NeoNail DB')
+
+@section('content')
+
+
+
+
+
+
+
+ Wichtig: Der neue Lack wird automatisch zum Hauptkatalog hinzugefügt und steht dann allen Benutzern zur Verfügung.
+ Er wird auch automatisch zu Ihrer Sammlung hinzugefügt.
+
+
+ @if ($errors->any())
+
+
+ @foreach ($errors->all() as $error)
+ {{ $error }}
+ @endforeach
+
+
+ @endif
+
+
+ @csrf
+
+
+
+
+
Name des Lackes *
+
+ @error('name')
+
{{ $message }}
+ @enderror
+
+
+
+
+
Nummer des Lackes *
+
+ @error('number')
+
{{ $message }}
+ @enderror
+
+
+
+
+
+
+
+
Hersteller *
+
+ Hersteller auswählen...
+ @foreach(\App\Models\Manufacturer::orderBy('name')->get() as $manufacturer)
+ id ? 'selected' : '' }}>
+ {{ $manufacturer->name }}
+
+ @endforeach
+
+ @error('manufacturer_id')
+
{{ $message }}
+ @enderror
+
+
+
+
+
+
Oder neuen Hersteller erstellen
+
+
+ Falls der Hersteller noch nicht existiert, können Sie ihn hier erstellen.
+
+
+
+
+
+
+
Bild des Lackes (optional)
+
+
+
+ Sie können ein Bild mit der Handykamera aufnehmen oder eine Datei auswählen.
+ Maximale Größe: 10MB. Das Bild wird automatisch optimiert.
+
+ @error('image')
+
{{ $message }}
+ @enderror
+
+
+
+
+
+
+
+
+
+
+
+
+ Der Lack wird automatisch zum Hauptkatalog hinzugefügt
+ Andere Benutzer können den Lack dann zu ihrer Sammlung hinzufügen
+ Das Bild wird automatisch auf 400x400 Pixel optimiert
+ Sie können den Lack später in Ihren Einstellungen bearbeiten
+ Neue Hersteller werden automatisch erstellt und stehen allen zur Verfügung
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/user-nail-polishes/index.blade.php b/resources/views/user-nail-polishes/index.blade.php
new file mode 100755
index 0000000..55d67ee
--- /dev/null
+++ b/resources/views/user-nail-polishes/index.blade.php
@@ -0,0 +1,123 @@
+@extends('layouts.app')
+
+@section('title', 'Meine Sammlung - NeoNail DB')
+
+@section('content')
+
+
+
+
+ Meine NeoNail-Sammlung
+
+
Verwalten Sie Ihre persönliche Nagellack-Sammlung
+
+
+
+
+
+
+
+
+
+ {{ $nailPolishes->total() }} Lack{{ $nailPolishes->total() != 1 ? 'e' : '' }} in Ihrer Sammlung
+
+
+
+
+ @if($nailPolishes->count() > 0)
+
+ @foreach($nailPolishes as $nailPolish)
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
+
{{ $nailPolish->name }}
+
Nr. {{ $nailPolish->number }}
+ @if($nailPolish->manufacturer)
+
+ {{ $nailPolish->manufacturer->name }}
+
+ @endif
+
+
+
+ @csrf
+
+ Entfernen
+
+
+
+
+
+
+ @endforeach
+
+
+
+ @if($nailPolishes->hasPages())
+
+
+
+ {{ $nailPolishes->appends(['search' => $search])->links() }}
+
+
+
+ @endif
+ @else
+
+
+
Ihre Sammlung ist noch leer
+
+ @if($search)
+ Keine Lacke gefunden, die "{{ $search }}" entsprechen.
+ @else
+ Fügen Sie Ihren ersten NeoNail-Lack hinzu!
+ @endif
+
+
+
+ @endif
+
+@endsection
diff --git a/resources/views/user-nail-polishes/show-user.blade.php b/resources/views/user-nail-polishes/show-user.blade.php
new file mode 100755
index 0000000..11e34a3
--- /dev/null
+++ b/resources/views/user-nail-polishes/show-user.blade.php
@@ -0,0 +1,70 @@
+@extends('layouts.app')
+
+@section('title', 'Sammlung von ' . $user->name . ' - NeoNail DB')
+
+@section('content')
+
+
+
+
+ Sammlung von {{ $user->name }}
+
+
+ Zurück zur Benutzerliste
+
+
+
+
+
+
+
+
+
+
+
+
{{ $user->name }}
+
{{ $user->email }}
+
Registriert am {{ $user->created_at->format('d.m.Y') }}
+
+
+
+
+
{{ $nailPolishes->count() }}
+
Nagellacke in der Sammlung
+
+
+
+
+
+
+ @if($nailPolishes->count() > 0)
+
+ @foreach($nailPolishes as $nailPolish)
+
+
+ @if($nailPolish->image_path)
+
+ @else
+
+
+
+ @endif
+
+
{{ $nailPolish->name }}
+
Nr. {{ $nailPolish->number }}
+
+
+
+ @endforeach
+
+ @else
+
+
+
Keine Nagellacke in der Sammlung
+
{{ $user->name }} hat noch keine NeoNail-Lacke hinzugefügt.
+
+ @endif
+
+
+@endsection
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php
new file mode 100755
index 0000000..c893b80
--- /dev/null
+++ b/resources/views/welcome.blade.php
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+ Laravel
+
+
+
+
+
+
+ @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot')))
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
+ @else
+
+ @endif
+
+
+
+ @if (Route::has('login'))
+
+ @auth
+
+ Dashboard
+
+ @else
+
+ Log in
+
+
+ @if (Route::has('register'))
+
+ Register
+
+ @endif
+ @endauth
+
+ @endif
+
+
+
+
+
Let's get started
+
Laravel has an incredibly rich ecosystem. We suggest starting with the following.
+
+
+
+
+ {{-- Laravel Logo --}}
+
+
+
+
+
+
+
+
+
+
+ {{-- Light Mode 12 SVG --}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{-- Dark Mode 12 SVG --}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (Route::has('login'))
+
+ @endif
+
+
diff --git a/routes/console.php b/routes/console.php
new file mode 100755
index 0000000..3c9adf1
--- /dev/null
+++ b/routes/console.php
@@ -0,0 +1,8 @@
+comment(Inspiring::quote());
+})->purpose('Display an inspiring quote');
diff --git a/routes/web.php b/routes/web.php
new file mode 100755
index 0000000..5217390
--- /dev/null
+++ b/routes/web.php
@@ -0,0 +1,64 @@
+route('login');
+});
+
+// Authentifizierung (nur für Gäste)
+Route::middleware('guest')->group(function () {
+ Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
+ Route::post('/login', [LoginController::class, 'login']);
+});
+
+// Logout (nur für eingeloggte Benutzer)
+Route::post('/logout', [LoginController::class, 'logout'])->name('logout')->middleware('auth');
+
+// Geschützte Routen
+Route::middleware(['auth'])->group(function () {
+ // Benutzer-Nagellack-Verwaltung
+ Route::get('/my-collection', [UserNailPolishController::class, 'index'])->name('user-nail-polishes.index');
+ Route::get('/available', [UserNailPolishController::class, 'available'])->name('user-nail-polishes.available');
+ Route::get('/create-nail-polish', [UserNailPolishController::class, 'create'])->name('user-nail-polishes.create');
+ Route::post('/create-nail-polish', [UserNailPolishController::class, 'store'])->name('user-nail-polishes.store');
+ Route::post('/add-to-collection/{nailPolish}', [UserNailPolishController::class, 'add'])->name('user-nail-polishes.add');
+ Route::post('/remove-from-collection/{nailPolish}', [UserNailPolishController::class, 'remove'])->name('user-nail-polishes.remove');
+
+ // Admin-Routen
+ Route::middleware(['admin'])->prefix('admin')->name('admin.')->group(function () {
+ Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
+ Route::get('/users', [AdminController::class, 'users'])->name('users.index');
+ Route::get('/users/create', [AdminController::class, 'createUser'])->name('users.create');
+ Route::post('/users', [AdminController::class, 'storeUser'])->name('users.store');
+ Route::get('/users/{user}/edit', [AdminController::class, 'editUser'])->name('users.edit');
+ Route::put('/users/{user}', [AdminController::class, 'updateUser'])->name('users.update');
+ Route::delete('/users/{user}', [AdminController::class, 'destroyUser'])->name('users.destroy');
+ Route::get('/statistics', [AdminController::class, 'statistics'])->name('statistics');
+ Route::get('/users/{user}/collection', [UserNailPolishController::class, 'showUserCollection'])->name('users.collection');
+ });
+
+ // Nagellack-Verwaltung (nur für Admin)
+ Route::middleware(['admin'])->group(function () {
+ Route::resource('nail-polishes', NailPolishController::class);
+ Route::get('/nail-polishes/{nailPolish}/users', [NailPolishController::class, 'showUsers'])->name('nail-polishes.showUsers');
+ });
+
+ // Hersteller-Verwaltung (für alle eingeloggten User)
+ Route::resource('manufacturers', ManufacturerController::class);
+ Route::get('/manufacturers-search', [ManufacturerController::class, 'search'])->name('manufacturers.search');
+});
+
+// Fallback
+Route::fallback(function () {
+ return redirect()->route('login');
+});
+
+// Einfache Logout-Route für Debugging
+Route::get('/logout', [App\Http\Controllers\Auth\LoginController::class, 'logout'])->name('logout');
diff --git a/send-mail-to-user.php b/send-mail-to-user.php
new file mode 100644
index 0000000..e04f6ef
--- /dev/null
+++ b/send-mail-to-user.php
@@ -0,0 +1,122 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // User in der Datenbank suchen
+ $user = \App\Models\User::where('email', $targetEmail)->first();
+
+ if (!$user) {
+ echo "❌ User mit E-Mail '$targetEmail' nicht in der Datenbank gefunden!\n";
+ echo "\n📋 Verfügbare User:\n";
+ $allUsers = \App\Models\User::all();
+ foreach ($allUsers as $u) {
+ $adminBadge = $u->isAdmin() ? ' 👑' : '';
+ echo " - {$u->name} ({$u->email}){$adminBadge}\n";
+ }
+ exit;
+ }
+
+ echo "✅ User gefunden: {$user->name} ({$user->email})\n";
+ echo " - Admin-Status: " . ($user->isAdmin() ? 'Ja 👑' : 'Nein') . "\n";
+ echo " - Registriert: {$user->created_at->format('d.m.Y H:i')}\n";
+
+ // E-Mail-Inhalt
+ $emailContent = "Hallo {$user->name}!
+
+🎨 Willkommen bei der NeoNail Datenbank!
+
+Dies ist eine persönliche E-Mail, die speziell an Sie gesendet wurde.
+
+📋 Ihre Account-Informationen:
+ - Name: {$user->name}
+ - E-Mail: {$user->email}
+ - Registriert: {$user->created_at->format('d.m.Y H:i')}
+ - Admin-Status: " . ($user->isAdmin() ? 'Ja 👑' : 'Nein') . "
+
+🎯 Ihre NeoNail DB Features:
+ - Persönliche Nagellack-Sammlung verwalten
+ - Neue Lacke hinzufügen und fotografieren
+ - Nach Lacken suchen (Name oder Nummer)
+ - Mobile-optimierte Benutzeroberfläche
+
+🔗 Direkte Links:
+ - Meine Sammlung: https://neonail.vogt.de.com/my-collection
+ - Verfügbare Lacke: https://neonail.vogt.de.com/available
+ - Neuen Lack hinzufügen: https://neonail.vogt.de.com/create-nail-polish
+
+" . ($user->isAdmin() ? "
+👑 Als Admin haben Sie zusätzlichen Zugriff:
+ - User-Verwaltung: https://neonail.vogt.de.com/admin/users
+ - Nagellack-Verwaltung: https://neonail.vogt.de.com/nail-polishes
+ - Dashboard: https://neonail.vogt.de.com/admin/dashboard
+" : "") . "
+Viele Grüße,
+Ihr NeoNail DB Team
+
+---
+Diese E-Mail wurde automatisch generiert.
+Bei Fragen wenden Sie sich an den Administrator.";
+
+ // E-Mail senden
+ $result = \Illuminate\Support\Facades\Mail::raw($emailContent, function($message) use ($user) {
+ $message->to($user->email, $user->name)
+ ->subject('🎨 NeoNail DB - Persönliche Willkommens-E-Mail')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo "\n✅ E-Mail erfolgreich gesendet!\n";
+ echo "📧 Empfänger: {$user->email}\n";
+ echo "📅 Zeitstempel: " . now() . "\n";
+ echo "📋 Betreff: 🎨 NeoNail DB - Persönliche Willkommens-E-Mail\n";
+
+ // Erfolgs-Bestätigung an Admin
+ echo "\n📧 Sende Bestätigung an Admin...\n";
+
+ $adminContent = "Hallo Admin!
+
+Eine persönliche E-Mail wurde erfolgreich an einen User gesendet.
+
+📋 Details:
+ - Empfänger: {$user->name} ({$user->email})
+ - Admin-Status: " . ($user->isAdmin() ? 'Ja' : 'Nein') . "
+ - Zeitstempel: " . now() . "
+ - E-Mail-Konfiguration: ✅ Funktioniert perfekt
+
+Die E-Mail-Funktionalität ist vollständig einsatzbereit!
+
+Viele Grüße,
+NeoNail DB System";
+
+ $adminResult = \Illuminate\Support\Facades\Mail::raw($adminContent, function($message) {
+ $message->to('oliver@vogt.de.com', 'Admin')
+ ->subject('✅ NeoNail DB - Persönliche User-E-Mail gesendet')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ Admin-Bestätigung gesendet!\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler beim Senden der E-Mail:\n";
+ echo " " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ Persönliche User-E-Mail abgeschlossen!\n";
+echo "📋 Nächste Schritte:\n";
+echo "1. Prüfen Sie das Postfach von: $targetEmail\n";
+echo "2. Prüfen Sie Ihr Admin-Postfach: oliver@vogt.de.com\n";
+echo "3. Falls keine E-Mails ankommen, prüfen Sie Spam-Ordner\n";
+echo "\n🎯 Die E-Mail-Funktionalität ist jetzt vollständig einsatzbereit!\n";
+?>
diff --git a/send-test-mail.php b/send-test-mail.php
new file mode 100644
index 0000000..f79df9d
--- /dev/null
+++ b/send-test-mail.php
@@ -0,0 +1,65 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Einfache Test-Mail senden
+ $result = \Illuminate\Support\Facades\Mail::raw('Hallo!
+
+Dies ist eine Test-Mail von der NeoNail Datenbank.
+
+✅ E-Mail-Konfiguration funktioniert!
+📅 Zeitstempel: ' . now() . '
+🌐 Server: ' . ($_SERVER['SERVER_NAME'] ?? 'Unbekannt') . '
+
+Die E-Mail-Funktionalität ist jetzt bereit.
+
+Viele Grüße,
+NeoNail DB System', function($message) use ($testEmail) {
+ $message->to($testEmail)
+ ->subject('✅ NeoNail DB - E-Mail-Test erfolgreich!')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo "✅ Test-Mail erfolgreich gesendet!\n";
+ echo "📧 Prüfen Sie Ihr Postfach: $testEmail\n";
+ echo "📁 Falls keine E-Mail ankommt, prüfen Sie auch den Spam-Ordner\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler beim Senden der Test-Mail:\n";
+ echo " " . $e->getMessage() . "\n\n";
+
+ echo "🔍 Fehleranalyse:\n";
+ if (strpos($e->getMessage(), 'Connection refused') !== false) {
+ echo " - Problem: Verbindung zum SMTP-Server verweigert\n";
+ echo " - Lösung: Prüfen Sie MAIL_HOST und MAIL_PORT\n";
+ } elseif (strpos($e->getMessage(), 'Authentication failed') !== false) {
+ echo " - Problem: Authentifizierung fehlgeschlagen\n";
+ echo " - Lösung: Prüfen Sie MAIL_USERNAME und MAIL_PASSWORD\n";
+ } elseif (strpos($e->getMessage(), 'SSL') !== false) {
+ echo " - Problem: SSL/TLS Verbindungsproblem\n";
+ echo " - Lösung: Prüfen Sie MAIL_ENCRYPTION (SSL/TLS)\n";
+ } else {
+ echo " - Unbekannter Fehler\n";
+ }
+
+ echo "\n📋 Aktuelle E-Mail-Konfiguration:\n";
+ echo " - MAIL_HOST: " . config('mail.mailers.smtp.host') . "\n";
+ echo " - MAIL_PORT: " . config('mail.mailers.smtp.port') . "\n";
+ echo " - MAIL_ENCRYPTION: " . config('mail.mailers.smtp.encryption') . "\n";
+ echo " - MAIL_USERNAME: " . config('mail.mailers.smtp.username') . "\n";
+ echo " - MAIL_FROM_ADDRESS: " . config('mail.from.address') . "\n";
+}
+?>
diff --git a/send-user-mail.php b/send-user-mail.php
new file mode 100644
index 0000000..0eb89aa
--- /dev/null
+++ b/send-user-mail.php
@@ -0,0 +1,116 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Alle User auflisten
+ echo "1. 👥 Verfügbare User:\n";
+ $users = \App\Models\User::all();
+
+ if ($users->isEmpty()) {
+ echo " ❌ Keine User in der Datenbank gefunden\n";
+ exit;
+ }
+
+ foreach ($users as $index => $user) {
+ $adminBadge = $user->isAdmin() ? ' 👑' : '';
+ echo " " . ($index + 1) . ". {$user->name} ({$user->email}){$adminBadge}\n";
+ }
+
+ // User auswählen (hier können Sie den Index ändern)
+ $selectedUserIndex = 0; // Erster User (0-basiert)
+ $selectedUser = $users[$selectedUserIndex];
+
+ echo "\n2. 📧 Sende E-Mail an: {$selectedUser->name} ({$selectedUser->email})\n";
+
+ // E-Mail-Inhalt
+ $emailContent = "Hallo {$selectedUser->name}!
+
+Willkommen bei der NeoNail Datenbank! 🎨
+
+Dies ist eine Test-E-Mail, die an einen registrierten User gesendet wurde.
+
+📋 Ihre Account-Details:
+ - Name: {$selectedUser->name}
+ - E-Mail: {$selectedUser->email}
+ - Registriert: {$selectedUser->created_at->format('d.m.Y H:i')}
+ - Admin-Status: " . ($selectedUser->isAdmin() ? 'Ja 👑' : 'Nein') . "
+
+🎯 Was Sie mit der NeoNail DB machen können:
+ - Ihre persönliche Nagellack-Sammlung verwalten
+ - Neue Lacke hinzufügen
+ - Nach Lacken suchen
+ - Bilder von Ihren Lacken hochladen
+
+🔗 Zugriff auf Ihre Sammlung:
+ https://neonail.vogt.de.com/my-collection
+
+Viele Grüße,
+Ihr NeoNail DB Team
+
+---
+Diese E-Mail wurde automatisch generiert.
+Bei Fragen wenden Sie sich an den Administrator.";
+
+ // E-Mail senden
+ $result = \Illuminate\Support\Facades\Mail::raw($emailContent, function($message) use ($selectedUser) {
+ $message->to($selectedUser->email, $selectedUser->name)
+ ->subject('🎨 Willkommen bei der NeoNail DB - Test-E-Mail')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ E-Mail erfolgreich gesendet!\n";
+ echo " 📧 Empfänger: {$selectedUser->email}\n";
+ echo " 📅 Zeitstempel: " . now() . "\n";
+
+ // Zusätzliche Info-Mail an Admin
+ echo "\n3. 📧 Sende Info-Mail an Admin...\n";
+
+ $adminInfoContent = "Hallo Admin!
+
+Eine Test-E-Mail wurde erfolgreich an einen User gesendet.
+
+📋 Details:
+ - Empfänger: {$selectedUser->name} ({$selectedUser->email})
+ - Zeitstempel: " . now() . "
+ - E-Mail-Konfiguration: ✅ Funktioniert
+
+Die E-Mail-Funktionalität ist bereit für:
+ - Passwort-Reset
+ - Benutzer-Benachrichtigungen
+ - Admin-Benachrichtigungen
+
+Viele Grüße,
+NeoNail DB System";
+
+ $adminResult = \Illuminate\Support\Facades\Mail::raw($adminInfoContent, function($message) {
+ $message->to('oliver@vogt.de.com', 'Admin')
+ ->subject('📧 NeoNail DB - User-E-Mail erfolgreich gesendet')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ Admin-Info-Mail gesendet!\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler beim Senden der E-Mail:\n";
+ echo " " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ User-E-Mail-Test abgeschlossen!\n";
+echo "📋 Nächste Schritte:\n";
+echo "1. Prüfen Sie das Postfach von: {$selectedUser->email}\n";
+echo "2. Prüfen Sie Ihr Admin-Postfach: oliver@vogt.de.com\n";
+echo "3. Falls keine E-Mails ankommen, prüfen Sie Spam-Ordner\n";
+echo "\n🔗 E-Mail-Funktionen sind jetzt verfügbar für:\n";
+echo "- Passwort-Reset für User\n";
+echo "- Willkommens-E-Mails für neue User\n";
+echo "- Admin-Benachrichtigungen\n";
+echo "- System-Benachrichtigungen\n";
+?>
diff --git a/setup-apache.sh b/setup-apache.sh
new file mode 100755
index 0000000..f009285
--- /dev/null
+++ b/setup-apache.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+echo "🌐 Apache Setup für NeoNail DB"
+echo "=============================="
+
+# 1. .htaccess im Hauptverzeichnis erstellen
+echo "📝 Erstelle .htaccess im Hauptverzeichnis..."
+cat > .htaccess << 'EOF'
+# NeoNail DB - Hauptverzeichnis .htaccess
+RewriteEngine On
+RewriteRule ^$ public/ [L]
+RewriteRule (.*) public/$1 [L]
+
+# Sicherheit
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+EOF
+
+# 2. Apache Virtual Host erstellen
+echo "🌐 Erstelle Apache Virtual Host..."
+cat > /etc/apache2/sites-available/neonail.conf << 'EOF'
+
+ ServerName 192.168.30.81
+ DocumentRoot /var/www/html/public
+
+
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog ${APACHE_LOG_DIR}/neonail_error.log
+ CustomLog ${APACHE_LOG_DIR}/neonail_access.log combined
+
+EOF
+
+# 3. Standard-Site deaktivieren
+echo "🔧 Deaktiviere Standard-Site..."
+a2dissite 000-default.conf 2>/dev/null || echo "⚠️ Standard-Site bereits deaktiviert"
+
+# 4. NeoNail-Site aktivieren
+echo "✅ Aktiviere NeoNail-Site..."
+a2ensite neonail.conf
+
+# 5. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 6. Status prüfen
+echo "🔍 Prüfe Apache-Status..."
+systemctl status apache2 --no-pager -l
+
+echo ""
+echo "✅ Apache Setup abgeschlossen!"
+echo "📋 Testen Sie: http://192.168.30.81"
+echo ""
+echo "📋 Falls es nicht funktioniert:"
+echo "1. Apache-Logs prüfen: tail -f /var/log/apache2/neonail_error.log"
+echo "2. Berechtigungen prüfen: ls -la /var/www/html/public/"
+echo "3. .htaccess prüfen: cat /var/www/html/public/.htaccess"
diff --git a/setup-html-directory.sh b/setup-html-directory.sh
new file mode 100755
index 0000000..e05c8d3
--- /dev/null
+++ b/setup-html-directory.sh
@@ -0,0 +1,112 @@
+#!/bin/bash
+
+echo "🎨 NeoNail DB - Setup für HTML-Verzeichnis"
+echo "=========================================="
+
+# 1. .env Datei erstellen
+echo "📝 Erstelle .env Datei..."
+cat > .env << 'EOF'
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs=
+APP_DEBUG=false
+APP_URL=http://192.168.30.81
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+DB_DATABASE=database.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+EOF
+
+# 2. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+chmod 644 .env
+
+# 3. SQLite-Datenbank erstellen (falls nicht vorhanden)
+echo "🗄️ Erstelle SQLite-Datenbank..."
+touch database.sqlite
+chmod 664 database.sqlite
+
+# 4. Composer install (falls Composer verfügbar)
+if command -v composer &> /dev/null; then
+ echo "📦 Führe Composer install aus..."
+ composer install --no-dev --optimize-autoloader
+else
+ echo "⚠️ Composer nicht gefunden. Bitte manuell ausführen: composer install"
+fi
+
+# 5. Laravel Setup
+echo "⚙️ Laravel Setup..."
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+
+# 6. Migrationen ausführen
+echo "🗃️ Führe Migrationen aus..."
+php artisan migrate --force
+
+# 7. Storage Link erstellen
+echo "🔗 Erstelle Storage Link..."
+php artisan storage:link
+
+echo ""
+echo "✅ Setup abgeschlossen!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Admin-User erstellen:"
+echo " php artisan tinker"
+echo " use App\Models\User;"
+echo " User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);"
+echo ""
+echo "2. Anwendung testen:"
+echo " http://192.168.30.81"
+echo ""
+echo "3. Bei Problemen Debug aktivieren:"
+echo " APP_DEBUG=true in .env setzen"
diff --git a/setup-webspace.sh b/setup-webspace.sh
new file mode 100755
index 0000000..078f975
--- /dev/null
+++ b/setup-webspace.sh
@@ -0,0 +1,131 @@
+#!/bin/bash
+
+# NeoNail DB - Vollständiges Webspace Setup
+echo "🚀 NeoNail DB - Vollständiges Webspace Setup..."
+
+# 1. .env erstellen (falls nicht vorhanden)
+echo "📝 .env Datei erstellen..."
+if [ ! -f .env ]; then
+ cat > .env << 'EOF'
+APP_NAME="NeoNail DB"
+APP_ENV=production
+APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs=
+APP_DEBUG=false
+APP_URL=http://192.168.30.81/neonail
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=error
+
+# SQLite Konfiguration
+DB_CONNECTION=sqlite
+DB_DATABASE=database.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailpit
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_APP_NAME="${APP_NAME}"
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+EOF
+ echo "✅ .env Datei erstellt"
+else
+ echo "✅ .env Datei bereits vorhanden"
+fi
+
+# 2. Storage-Verzeichnisse erstellen
+echo "📁 Storage-Verzeichnisse erstellen..."
+mkdir -p storage/framework/views
+mkdir -p storage/framework/cache
+mkdir -p storage/framework/sessions
+mkdir -p storage/logs
+mkdir -p bootstrap/cache
+
+# 3. Berechtigungen setzen
+echo "🔐 Berechtigungen setzen..."
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+chmod 644 .env
+
+# 4. SQLite-Datenbank erstellen
+echo "🗄️ SQLite-Datenbank erstellen..."
+if [ ! -f database.sqlite ]; then
+ touch database.sqlite
+ echo "✅ SQLite-Datenbank erstellt"
+else
+ echo "✅ SQLite-Datenbank bereits vorhanden"
+fi
+chmod 664 database.sqlite
+
+# 5. Composer installieren (falls verfügbar)
+echo "📦 Composer Dependencies installieren..."
+if command -v composer &> /dev/null; then
+ composer install --optimize-autoloader --no-dev
+ echo "✅ Composer Dependencies installiert"
+else
+ echo "⚠️ Composer nicht verfügbar"
+fi
+
+# 6. Laravel Setup
+echo "🔧 Laravel Setup..."
+if command -v php &> /dev/null; then
+ php artisan config:clear 2>/dev/null || echo "⚠️ php artisan config:clear fehlgeschlagen"
+ php artisan cache:clear 2>/dev/null || echo "⚠️ php artisan cache:clear fehlgeschlagen"
+ php artisan view:clear 2>/dev/null || echo "⚠️ php artisan view:clear fehlgeschlagen"
+ php artisan storage:link 2>/dev/null || echo "⚠️ php artisan storage:link fehlgeschlagen"
+ php artisan migrate --force 2>/dev/null || echo "⚠️ php artisan migrate fehlgeschlagen"
+ php artisan config:cache 2>/dev/null || echo "⚠️ php artisan config:cache fehlgeschlagen"
+ echo "✅ Laravel Setup abgeschlossen"
+else
+ echo "⚠️ PHP nicht verfügbar"
+fi
+
+echo "✅ Setup abgeschlossen!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Seite testen: http://192.168.30.81/neonail/"
+echo "2. Admin-User erstellen (falls php verfügbar):"
+echo " php artisan tinker"
+echo " use App\Models\User;"
+echo " User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('passwort')]);"
+echo ""
+echo "💡 Falls Probleme bestehen:"
+echo "- APP_DEBUG=true in .env setzen für Debug-Informationen"
+echo "- Logs prüfen: storage/logs/laravel.log"
+echo "- Hosting-Provider kontaktieren"
diff --git a/simple-htaccess-fix.sh b/simple-htaccess-fix.sh
new file mode 100755
index 0000000..0aacbd9
--- /dev/null
+++ b/simple-htaccess-fix.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+echo "📝 Einfache .htaccess Lösung"
+echo "==========================="
+
+# 1. .htaccess im Hauptverzeichnis erstellen
+echo "📝 Erstelle .htaccess im Hauptverzeichnis..."
+cat > .htaccess << 'EOF'
+RewriteEngine On
+
+# Umleitung auf public/
+RewriteRule ^$ public/ [L]
+RewriteRule (.*) public/$1 [L]
+
+# Sicherheit
+
+ Order allow,deny
+ Deny from all
+
+
+
+ Order allow,deny
+ Deny from all
+
+
+# PHP-Dateien erlauben
+
+ Order allow,deny
+ Allow from all
+
+EOF
+
+# 2. Apache mod_rewrite aktivieren
+echo "🔧 Aktiviere mod_rewrite..."
+a2enmod rewrite
+
+# 3. Apache neu laden
+echo "🔄 Lade Apache neu..."
+systemctl reload apache2
+
+# 4. Test
+echo "🧪 Teste Anwendung..."
+curl -I http://192.168.30.81
+
+echo ""
+echo "✅ .htaccess Lösung aktiviert!"
+echo "📋 Testen Sie: http://192.168.30.81"
diff --git a/simple-laravel-setup.sh b/simple-laravel-setup.sh
new file mode 100755
index 0000000..e904c8a
--- /dev/null
+++ b/simple-laravel-setup.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+echo "🎨 NeoNail DB - Einfaches Laravel Setup"
+echo "======================================"
+
+# 1. .env erstellen (falls nicht vorhanden)
+if [ ! -f ".env" ]; then
+ echo "📝 Erstelle .env Datei..."
+ cp env-production-example.txt .env
+fi
+
+# 2. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 777 storage/
+chmod -R 777 bootstrap/cache/
+chmod 644 .env
+
+# 3. SQLite-Datenbank erstellen
+echo "🗄️ Erstelle SQLite-Datenbank..."
+touch database.sqlite
+chmod 664 database.sqlite
+
+# 4. Nur grundlegende Laravel-Befehle (ohne problematische Provider)
+echo "⚙️ Laravel Grund-Setup..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+# 5. Migrationen ausführen (falls möglich)
+echo "🗃️ Führe Migrationen aus..."
+php artisan migrate --force 2>/dev/null || echo "⚠️ Migrationen übersprungen"
+
+# 6. Storage Link erstellen
+echo "🔗 Erstelle Storage Link..."
+php artisan storage:link 2>/dev/null || echo "⚠️ Storage Link übersprungen"
+
+echo ""
+echo "✅ Grund-Setup abgeschlossen!"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Vendor-Ordner hochladen (falls nicht vorhanden)"
+echo "2. Admin-User erstellen:"
+echo " php artisan tinker"
+echo " use App\Models\User;"
+echo " User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);"
+echo ""
+echo "3. Anwendung testen: http://192.168.30.81"
diff --git a/smart-setup.sh b/smart-setup.sh
new file mode 100755
index 0000000..a37779a
--- /dev/null
+++ b/smart-setup.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+echo "🧠 NeoNail DB - Intelligentes Setup"
+echo "=================================="
+
+# 1. .env erstellen (falls nicht vorhanden)
+if [ ! -f ".env" ]; then
+ echo "📝 Erstelle .env Datei..."
+ cp env-production-example.txt .env
+else
+ echo "✅ .env Datei bereits vorhanden"
+fi
+
+# 2. SQLite-Datenbank erstellen
+if [ ! -f "database.sqlite" ]; then
+ echo "🗄️ Erstelle SQLite-Datenbank..."
+ touch database.sqlite
+else
+ echo "✅ SQLite-Datenbank bereits vorhanden"
+fi
+chmod 664 database.sqlite
+
+# 3. Berechtigungen setzen
+echo "🔐 Setze Berechtigungen..."
+chmod -R 777 storage/ 2>/dev/null
+chmod -R 777 bootstrap/cache/ 2>/dev/null
+chmod 644 .env 2>/dev/null
+
+# 4. Storage Link prüfen
+echo "🔗 Prüfe Storage Link..."
+if [ ! -L "public/storage" ]; then
+ echo "📎 Erstelle Storage Link..."
+ php artisan storage:link 2>/dev/null || echo "⚠️ Storage Link übersprungen"
+else
+ echo "✅ Storage Link bereits vorhanden"
+fi
+
+# 5. Cache leeren (nur wenn nötig)
+echo "🧹 Leere Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+
+# 6. Migrationen ausführen
+echo "🗃️ Führe Migrationen aus..."
+php artisan migrate --force 2>/dev/null || echo "⚠️ Migrationen übersprungen"
+
+echo ""
+echo "✅ Intelligentes Setup abgeschlossen!"
+echo ""
+echo "📋 Status:"
+echo "• .env: $(test -f .env && echo '✅' || echo '❌')"
+echo "• database.sqlite: $(test -f database.sqlite && echo '✅' || echo '❌')"
+echo "• storage link: $(test -L public/storage && echo '✅' || echo '❌')"
+echo "• storage/ schreibbar: $(test -w storage && echo '✅' || echo '❌')"
+echo ""
+echo "📋 Nächste Schritte:"
+echo "1. Admin-User erstellen:"
+echo " php artisan tinker"
+echo " use App\Models\User;"
+echo " User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);"
+echo ""
+echo "2. Anwendung testen: http://192.168.30.81"
diff --git a/storage/app/.gitignore b/storage/app/.gitignore
new file mode 100644
index 0000000..fedb287
--- /dev/null
+++ b/storage/app/.gitignore
@@ -0,0 +1,4 @@
+*
+!private/
+!public/
+!.gitignore
diff --git a/storage/app/private/.gitignore b/storage/app/private/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/app/private/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/app/public/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore
new file mode 100644
index 0000000..05c4471
--- /dev/null
+++ b/storage/framework/.gitignore
@@ -0,0 +1,9 @@
+compiled.php
+config.php
+down
+events.scanned.php
+maintenance.php
+routes.php
+routes.scanned.php
+schedule-*
+services.json
diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore
new file mode 100644
index 0000000..01e4a6c
--- /dev/null
+++ b/storage/framework/cache/.gitignore
@@ -0,0 +1,3 @@
+*
+!data/
+!.gitignore
diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/cache/data/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/sessions/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/testing/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/views/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/logs/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/test-admin-access.php b/test-admin-access.php
new file mode 100644
index 0000000..0520580
--- /dev/null
+++ b/test-admin-access.php
@@ -0,0 +1,169 @@
+ 'Dashboard',
+ 'admin/users' => 'Users Index',
+ 'admin/users/create' => 'Users Create',
+ 'admin/users/{user}/edit' => 'Users Edit',
+ 'admin/statistics' => 'Statistics',
+ 'nail-polishes' => 'Nail Polishes'
+ ];
+
+ foreach ($adminRoutes as $route => $description) {
+ if (strpos($content, $route) !== false) {
+ echo " ✅ Route gefunden: $route ($description)\n";
+ } else {
+ echo " ❌ Route fehlt: $route ($description)\n";
+ }
+ }
+
+} else {
+ echo " ❌ Routes-Datei nicht gefunden\n";
+}
+
+// 2. AdminController prüfen
+echo "\n2. 🎛️ AdminController prüfen:\n";
+$controllerPath = 'app/Http/Controllers/AdminController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+
+ $methods = [
+ 'dashboard' => 'Dashboard',
+ 'users' => 'Users Index',
+ 'createUser' => 'Create User',
+ 'storeUser' => 'Store User',
+ 'editUser' => 'Edit User',
+ 'updateUser' => 'Update User',
+ 'destroyUser' => 'Destroy User',
+ 'statistics' => 'Statistics'
+ ];
+
+ foreach ($methods as $method => $description) {
+ if (strpos($content, "public function $method") !== false) {
+ echo " ✅ Methode gefunden: $method ($description)\n";
+ } else {
+ echo " ❌ Methode fehlt: $method ($description)\n";
+ }
+ }
+
+} else {
+ echo " ❌ AdminController nicht gefunden\n";
+}
+
+// 3. AdminMiddleware prüfen
+echo "\n3. 🛡️ AdminMiddleware prüfen:\n";
+$middlewarePath = 'app/Http/Middleware/AdminMiddleware.php';
+if (file_exists($middlewarePath)) {
+ $content = file_get_contents($middlewarePath);
+
+ if (strpos($content, 'auth()->user()->isAdmin()') !== false) {
+ echo " ✅ AdminMiddleware verwendet isAdmin() Methode\n";
+ } else {
+ echo " ❌ AdminMiddleware verwendet nicht isAdmin() Methode\n";
+ }
+
+ if (strpos($content, 'abort(403') !== false) {
+ echo " ✅ AdminMiddleware gibt 403 bei fehlenden Rechten\n";
+ } else {
+ echo " ❌ AdminMiddleware gibt keinen 403 Fehler\n";
+ }
+
+} else {
+ echo " ❌ AdminMiddleware nicht gefunden\n";
+}
+
+// 4. Layout prüfen
+echo "\n4. 🎨 Layout prüfen:\n";
+$layoutPath = 'resources/views/layouts/app.blade.php';
+if (file_exists($layoutPath)) {
+ $content = file_get_contents($layoutPath);
+
+ if (strpos($content, 'auth()->user()->isAdmin()') !== false) {
+ echo " ✅ Layout verwendet isAdmin() für Admin-Menü\n";
+ } else {
+ echo " ❌ Layout verwendet nicht isAdmin() für Admin-Menü\n";
+ }
+
+ if (strpos($content, 'Admin-Badge') !== false || strpos($content, 'badge bg-primary') !== false) {
+ echo " ✅ Layout hat Admin-Badge\n";
+ } else {
+ echo " ❌ Layout hat keinen Admin-Badge\n";
+ }
+
+ // Prüfe Admin-Menü Links
+ $adminLinks = [
+ 'admin.dashboard' => 'Dashboard Link',
+ 'admin.users.index' => 'Users Link',
+ 'nail-polishes.index' => 'Nail Polishes Link',
+ 'admin.statistics' => 'Statistics Link'
+ ];
+
+ foreach ($adminLinks as $route => $description) {
+ if (strpos($content, "route(\"$route\")") !== false) {
+ echo " ✅ Admin-Link gefunden: $route ($description)\n";
+ } else {
+ echo " ❌ Admin-Link fehlt: $route ($description)\n";
+ }
+ }
+
+} else {
+ echo " ❌ Layout-Datei nicht gefunden\n";
+}
+
+// 5. Admin-Views prüfen
+echo "\n5. 👁️ Admin-Views prüfen:\n";
+$adminViews = [
+ 'resources/views/admin/dashboard.blade.php' => 'Admin Dashboard',
+ 'resources/views/admin/users/index.blade.php' => 'Users Index',
+ 'resources/views/admin/users/create.blade.php' => 'Users Create',
+ 'resources/views/admin/users/edit.blade.php' => 'Users Edit',
+ 'resources/views/nail-polishes/index.blade.php' => 'Nail Polishes Index',
+ 'resources/views/nail-polishes/show-users.blade.php' => 'Show Users'
+];
+
+foreach ($adminViews as $viewPath => $description) {
+ if (file_exists($viewPath)) {
+ echo " ✅ View gefunden: $description\n";
+ } else {
+ echo " ❌ View fehlt: $description\n";
+ }
+}
+
+// 6. Cache-Status prüfen
+echo "\n6. 🧹 Cache-Status prüfen:\n";
+$cacheFiles = [
+ 'bootstrap/cache/packages.php' => 'Packages Cache',
+ 'bootstrap/cache/services.php' => 'Services Cache',
+ 'bootstrap/cache/routes.php' => 'Routes Cache',
+ 'bootstrap/cache/config.php' => 'Config Cache'
+];
+
+foreach ($cacheFiles as $cacheFile => $description) {
+ if (file_exists($cacheFile)) {
+ echo " ⚠️ Cache vorhanden: $description\n";
+ } else {
+ echo " ✅ Cache geleert: $description\n";
+ }
+}
+
+echo "\n✅ Admin-Zugriffe Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt:\n";
+echo "1. Melden Sie sich als Admin an (oliver@vogt.de.com)\n";
+echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n";
+echo "3. Klicken Sie auf 'Admin' → 'Benutzer'\n";
+echo "4. Prüfen Sie ob Admin-Badge neben dem Namen steht\n";
+echo "5. Versuchen Sie direkt auf /admin/users zuzugreifen\n";
+echo "\n📋 Falls Probleme bestehen:\n";
+echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n";
+echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n";
+echo "- Teilen Sie eventuelle Fehlermeldungen mit\n";
+?>
diff --git a/test-admin-checkbox.php b/test-admin-checkbox.php
new file mode 100644
index 0000000..3755367
--- /dev/null
+++ b/test-admin-checkbox.php
@@ -0,0 +1,90 @@
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ echo "🧪 Test der Admin-Checkbox Funktionalität\n";
+ echo "========================================\n\n";
+
+ // 1. Prüfe is_admin Spalte
+ $stmt = $pdo->query("PRAGMA table_info(users)");
+ $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $hasAdminColumn = false;
+
+ foreach ($columns as $column) {
+ if ($column['name'] === 'is_admin') {
+ $hasAdminColumn = true;
+ break;
+ }
+ }
+
+ if ($hasAdminColumn) {
+ echo "✅ is_admin Spalte existiert\n";
+ } else {
+ echo "❌ is_admin Spalte fehlt - führen Sie fix-admin-role.php aus\n";
+ exit;
+ }
+
+ // 2. Zeige alle User mit Admin-Status
+ echo "\n📋 User mit Admin-Status:\n";
+ $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users ORDER BY is_admin DESC, name");
+ $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ if (empty($users)) {
+ echo "❌ Keine User gefunden\n";
+ } else {
+ foreach ($users as $user) {
+ $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User';
+ $checkboxState = $user['is_admin'] ? '☑️ Aktiviert' : '☐ Deaktiviert';
+ echo "- {$user['name']} ({$user['email']}) - {$adminStatus} - {$checkboxState}\n";
+ }
+ }
+
+ // 3. Test: Mache einen User zum Admin
+ echo "\n🧪 Test: Mache einen User zum Admin...\n";
+
+ // Finde einen User, der noch kein Admin ist
+ $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE is_admin = 0 LIMIT 1");
+ $stmt->execute();
+ $testUser = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($testUser) {
+ echo "📝 Teste mit User: {$testUser['name']} ({$testUser['email']})\n";
+
+ // Mache User zum Admin
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+
+ echo "✅ User zum Admin gemacht\n";
+
+ // Prüfe Änderung
+ $stmt = $pdo->prepare("SELECT is_admin FROM users WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ $result = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($result['is_admin']) {
+ echo "✅ Admin-Status korrekt gesetzt\n";
+ } else {
+ echo "❌ Admin-Status nicht korrekt gesetzt\n";
+ }
+
+ // Mache User wieder zurück
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 0 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ echo "🔄 User-Status zurückgesetzt\n";
+
+ } else {
+ echo "ℹ️ Alle User sind bereits Admins\n";
+ }
+
+ echo "\n✅ Admin-Checkbox Test erfolgreich!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: " . $e->getMessage() . "\n";
+}
+?>
diff --git a/test-admin-functionality.php b/test-admin-functionality.php
new file mode 100644
index 0000000..f025d2c
--- /dev/null
+++ b/test-admin-functionality.php
@@ -0,0 +1,126 @@
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ echo "1. 🔍 Prüfe is_admin Spalte...\n";
+
+ // Prüfe ob is_admin Spalte existiert
+ $stmt = $pdo->query("PRAGMA table_info(users)");
+ $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $hasAdminColumn = false;
+
+ foreach ($columns as $column) {
+ if ($column['name'] === 'is_admin') {
+ $hasAdminColumn = true;
+ echo " ✅ is_admin Spalte gefunden\n";
+ break;
+ }
+ }
+
+ if (!$hasAdminColumn) {
+ echo " ❌ is_admin Spalte fehlt - führen Sie fix-admin-role-database.php aus\n";
+ exit;
+ }
+
+ echo "\n2. 📋 Zeige alle User...\n";
+
+ // Zeige alle User
+ $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users ORDER BY is_admin DESC, name");
+ $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+ if (empty($users)) {
+ echo " ❌ Keine User gefunden\n";
+ } else {
+ foreach ($users as $user) {
+ $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User';
+ echo " - {$user['name']} ({$user['email']}) - {$adminStatus}\n";
+ }
+ }
+
+ echo "\n3. 🧪 Test Admin-Funktionen...\n";
+
+ // Test: Mache einen User zum Admin
+ $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE is_admin = 0 LIMIT 1");
+ $stmt->execute();
+ $testUser = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($testUser) {
+ echo " 📝 Teste Admin-Erstellung mit User: {$testUser['name']}\n";
+
+ // Mache User zum Admin
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+
+ // Prüfe Änderung
+ $stmt = $pdo->prepare("SELECT is_admin FROM users WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ $result = $stmt->fetch(PDO::FETCH_ASSOC);
+
+ if ($result['is_admin']) {
+ echo " ✅ Admin-Erstellung erfolgreich\n";
+ } else {
+ echo " ❌ Admin-Erstellung fehlgeschlagen\n";
+ }
+
+ // Mache User wieder zurück
+ $stmt = $pdo->prepare("UPDATE users SET is_admin = 0 WHERE id = ?");
+ $stmt->execute([$testUser['id']]);
+ echo " 🔄 User-Status zurückgesetzt\n";
+
+ } else {
+ echo " ℹ️ Alle User sind bereits Admins\n";
+ }
+
+ echo "\n4. 🔐 Prüfe Admin-Middleware...\n";
+
+ // Prüfe ob AdminMiddleware existiert
+ if (file_exists('app/Http/Middleware/AdminMiddleware.php')) {
+ echo " ✅ AdminMiddleware gefunden\n";
+
+ $content = file_get_contents('app/Http/Middleware/AdminMiddleware.php');
+ if (strpos($content, 'isAdmin()') !== false) {
+ echo " ✅ AdminMiddleware verwendet isAdmin() Methode\n";
+ } else {
+ echo " ⚠️ AdminMiddleware verwendet möglicherweise alte Email-Prüfung\n";
+ }
+ } else {
+ echo " ❌ AdminMiddleware nicht gefunden\n";
+ }
+
+ echo "\n5. 👤 Prüfe User Model...\n";
+
+ // Prüfe ob User Model isAdmin() Methode hat
+ if (file_exists('app/Models/User.php')) {
+ echo " ✅ User Model gefunden\n";
+
+ $content = file_get_contents('app/Models/User.php');
+ if (strpos($content, 'isAdmin()') !== false) {
+ echo " ✅ User Model hat isAdmin() Methode\n";
+ } else {
+ echo " ❌ User Model hat keine isAdmin() Methode\n";
+ }
+
+ if (strpos($content, 'is_admin') !== false) {
+ echo " ✅ User Model hat is_admin in fillable\n";
+ } else {
+ echo " ❌ User Model hat is_admin nicht in fillable\n";
+ }
+ } else {
+ echo " ❌ User Model nicht gefunden\n";
+ }
+
+ echo "\n✅ Admin-Funktionalität Test abgeschlossen!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n";
+ echo "📝 Versuchen Sie einen User zum Admin zu machen\n";
+
+} catch (Exception $e) {
+ echo "❌ Fehler: " . $e->getMessage() . "\n";
+ echo "📍 Datei: " . $e->getFile() . ":" . $e->getLine() . "\n";
+}
+?>
diff --git a/test-admin-user-management.sh b/test-admin-user-management.sh
new file mode 100755
index 0000000..655b207
--- /dev/null
+++ b/test-admin-user-management.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+echo "👑 Admin-User-Verwaltung testen"
+echo "=============================="
+
+# 1. Laravel Cache leeren
+echo "🧹 Leere Laravel Cache..."
+php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen"
+php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen"
+php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen"
+php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen"
+
+# 2. Routes prüfen
+echo "🔍 Prüfe Admin-Routes..."
+php artisan route:list | grep admin
+
+# 3. Views prüfen
+echo "📁 Prüfe Admin-Views..."
+if [ -f "resources/views/admin/users/index.blade.php" ]; then
+ echo "✅ User-Index-View gefunden"
+else
+ echo "❌ User-Index-View fehlt"
+fi
+
+if [ -f "resources/views/admin/users/create.blade.php" ]; then
+ echo "✅ User-Create-View gefunden"
+else
+ echo "❌ User-Create-View fehlt"
+fi
+
+if [ -f "resources/views/admin/users/edit.blade.php" ]; then
+ echo "✅ User-Edit-View gefunden"
+else
+ echo "❌ User-Edit-View fehlt"
+fi
+
+# 4. Controller prüfen
+echo "🎮 Prüfe AdminController..."
+if [ -f "app/Http/Controllers/AdminController.php" ]; then
+ echo "✅ AdminController gefunden"
+ grep -n "function.*User" app/Http/Controllers/AdminController.php
+else
+ echo "❌ AdminController fehlt"
+fi
+
+# 5. Test-URLs
+echo "🧪 Teste Admin-URLs..."
+echo "Admin-Dashboard: https://neonail.vogt.de.com/admin/dashboard"
+echo "User-Verwaltung: https://neonail.vogt.de.com/admin/users"
+echo "User erstellen: https://neonail.vogt.de.com/admin/users/create"
+
+# 6. Admin-User prüfen
+echo "👤 Prüfe Admin-User..."
+sqlite3 database.sqlite "SELECT id, name, email FROM users WHERE email LIKE '%admin%';" 2>/dev/null || echo "⚠️ Keine Admin-User gefunden"
+
+echo ""
+echo "✅ Admin-User-Verwaltung getestet!"
+echo ""
+echo "📋 Admin-Funktionen:"
+echo "1. User erstellen: https://neonail.vogt.de.com/admin/users/create"
+echo "2. User verwalten: https://neonail.vogt.de.com/admin/users"
+echo "3. User bearbeiten: Klicken Sie auf den Bearbeiten-Button"
+echo "4. User löschen: Klicken Sie auf den Löschen-Button"
+echo ""
+echo "🔑 Admin-Login:"
+echo "Email: admin@neonail.com"
+echo "Passwort: admin123"
diff --git a/test-all-forms-final.php b/test-all-forms-final.php
new file mode 100644
index 0000000..b6f971d
--- /dev/null
+++ b/test-all-forms-final.php
@@ -0,0 +1,50 @@
+ 'Login-Formular',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish',
+ 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish',
+ 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish',
+ 'resources/views/admin/users/create.blade.php' => 'Admin Create User',
+ 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User',
+ 'resources/views/admin/users/index.blade.php' => 'Admin Delete User',
+ 'resources/views/layouts/app.blade.php' => 'Logout-Formular'
+];
+
+$allFixed = true;
+
+foreach ($forms as $file => $description) {
+ if (file_exists($file)) {
+ $content = file_get_contents($file);
+ if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) {
+ echo " ✅ $description: HTTPS-URL gefunden\n";
+ } else {
+ echo " ❌ $description: Keine HTTPS-URL gefunden\n";
+ $allFixed = false;
+
+ // Zeige die aktuelle action
+ if (preg_match('/action="([^"]+)"/', $content, $matches)) {
+ echo " Aktuelle action: " . $matches[1] . "\n";
+ }
+ }
+ } else {
+ echo " ❌ $description: Datei nicht gefunden\n";
+ $allFixed = false;
+ }
+}
+
+echo "\n";
+if ($allFixed) {
+ echo "🎉 ALLE Formulare sind jetzt mit HTTPS-URLs konfiguriert!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n";
+ echo "📝 Safari-Sicherheitswarnungen sollten komplett verschwunden sein.\n";
+} else {
+ echo "⚠️ Einige Formulare müssen noch korrigiert werden.\n";
+ echo "🔧 Führen Sie das Fix-Script erneut aus.\n";
+}
+
+echo "\n✅ Finaler Formular-Test abgeschlossen!\n";
+?>
diff --git a/test-all-forms.php b/test-all-forms.php
new file mode 100644
index 0000000..6ff3c01
--- /dev/null
+++ b/test-all-forms.php
@@ -0,0 +1,31 @@
+ 'Login-Formular',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish',
+ 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish',
+ 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish',
+ 'resources/views/admin/users/create.blade.php' => 'Admin Create User',
+ 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User',
+ 'resources/views/admin/users/index.blade.php' => 'Admin Delete User'
+];
+
+foreach ($forms as $file => $description) {
+ if (file_exists($file)) {
+ $content = file_get_contents($file);
+ if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) {
+ echo " ✅ $description: HTTPS-URL gefunden\n";
+ } else {
+ echo " ❌ $description: Keine HTTPS-URL gefunden\n";
+ }
+ } else {
+ echo " ❌ $description: Datei nicht gefunden\n";
+ }
+}
+
+echo "\n✅ Alle Formulare getestet!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n";
+?>
diff --git a/test-apache-status.php b/test-apache-status.php
new file mode 100644
index 0000000..4261c17
--- /dev/null
+++ b/test-apache-status.php
@@ -0,0 +1,87 @@
+ [
+ 'timeout' => 5,
+ 'method' => 'GET'
+ ]
+]);
+
+$result = @file_get_contents('http://localhost/', false, $context);
+if ($result !== false) {
+ echo " ✅ HTTP-Request erfolgreich\n";
+} else {
+ echo " ❌ HTTP-Request fehlgeschlagen\n";
+ $error = error_get_last();
+ if ($error) {
+ echo " Fehler: " . $error['message'] . "\n";
+ }
+}
+
+echo "\n✅ Apache-Status Test abgeschlossen!\n";
+?>
diff --git a/test-forms-fixed.php b/test-forms-fixed.php
new file mode 100644
index 0000000..17f5fd7
--- /dev/null
+++ b/test-forms-fixed.php
@@ -0,0 +1,49 @@
+ 'Login-Formular',
+ 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish',
+ 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish',
+ 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish',
+ 'resources/views/admin/users/create.blade.php' => 'Admin Create User',
+ 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User',
+ 'resources/views/admin/users/index.blade.php' => 'Admin Delete User'
+];
+
+$allFixed = true;
+
+foreach ($forms as $file => $description) {
+ if (file_exists($file)) {
+ $content = file_get_contents($file);
+ if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) {
+ echo " ✅ $description: HTTPS-URL gefunden\n";
+ } else {
+ echo " ❌ $description: Keine HTTPS-URL gefunden\n";
+ $allFixed = false;
+
+ // Zeige die aktuelle action
+ if (preg_match('/action="([^"]+)"/', $content, $matches)) {
+ echo " Aktuelle action: " . $matches[1] . "\n";
+ }
+ }
+ } else {
+ echo " ❌ $description: Datei nicht gefunden\n";
+ $allFixed = false;
+ }
+}
+
+echo "\n";
+if ($allFixed) {
+ echo "🎉 Alle Formulare sind jetzt mit HTTPS-URLs konfiguriert!\n";
+ echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n";
+ echo "📝 Safari-Sicherheitswarnungen sollten verschwunden sein.\n";
+} else {
+ echo "⚠️ Einige Formulare müssen noch korrigiert werden.\n";
+ echo "🔧 Führen Sie das Fix-Script erneut aus.\n";
+}
+
+echo "\n✅ Formular-Test abgeschlossen!\n";
+?>
diff --git a/test-https-security.php b/test-https-security.php
new file mode 100644
index 0000000..72e2bad
--- /dev/null
+++ b/test-https-security.php
@@ -0,0 +1,59 @@
+ true") !== false) {
+ echo " ✅ Session secure: true\n";
+ } else {
+ echo " ❌ Session secure: false\n";
+ }
+ if (strpos($content, "'http_only' => true") !== false) {
+ echo " ✅ Session http_only: true\n";
+ } else {
+ echo " ❌ Session http_only: false\n";
+ }
+}
+
+// 3. Prüfe CSRF-Konfiguration
+echo "\n3. CSRF-Konfiguration:\n";
+if (file_exists('config/csrf.php')) {
+ $content = file_get_contents('config/csrf.php');
+ if (strpos($content, "'secure' => true") !== false) {
+ echo " ✅ CSRF secure: true\n";
+ } else {
+ echo " ❌ CSRF secure: false\n";
+ }
+}
+
+// 4. Prüfe .htaccess
+echo "\n4. .htaccess HTTPS-Headers:\n";
+if (file_exists('public/.htaccess')) {
+ $content = file_get_contents('public/.htaccess');
+ if (strpos($content, 'Strict-Transport-Security') !== false) {
+ echo " ✅ HSTS Header vorhanden\n";
+ } else {
+ echo " ❌ HSTS Header fehlt\n";
+ }
+ if (strpos($content, 'upgrade-insecure-requests') !== false) {
+ echo " ✅ CSP upgrade-insecure-requests vorhanden\n";
+ } else {
+ echo " ❌ CSP upgrade-insecure-requests fehlt\n";
+ }
+}
+
+echo "\n✅ HTTPS-Sicherheit Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n";
+?>
diff --git a/test-mail.php b/test-mail.php
new file mode 100644
index 0000000..6c75c4a
--- /dev/null
+++ b/test-mail.php
@@ -0,0 +1,233 @@
+ 'Mailer',
+ 'MAIL_HOST' => 'Host',
+ 'MAIL_PORT' => 'Port',
+ 'MAIL_USERNAME' => 'Username',
+ 'MAIL_PASSWORD' => 'Password',
+ 'MAIL_ENCRYPTION' => 'Encryption',
+ 'MAIL_FROM_ADDRESS' => 'From Address',
+ 'MAIL_FROM_NAME' => 'From Name'
+ ];
+
+ foreach ($mailSettings as $setting => $description) {
+ if (preg_match("/$setting=(.*)/", $envContent, $matches)) {
+ $value = trim($matches[1]);
+ if ($setting === 'MAIL_PASSWORD') {
+ $value = str_repeat('*', min(strlen($value), 4)) . '...';
+ }
+ echo " ✅ $description: $value\n";
+ } else {
+ echo " ❌ $description: Nicht gesetzt\n";
+ }
+ }
+
+} else {
+ echo " ❌ .env Datei nicht gefunden\n";
+}
+
+// 2. Laravel Mail-Konfiguration testen
+echo "\n2. 🐘 Laravel Mail-Konfiguration testen:\n";
+try {
+ require_once 'vendor/autoload.php';
+
+ // Laravel Bootstrap
+ $app = require_once 'bootstrap/app.php';
+ $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ // Mail-Konfiguration abrufen
+ $mailConfig = config('mail');
+
+ echo " 📋 Mail-Konfiguration:\n";
+ echo " - Default: " . ($mailConfig['default'] ?? 'nicht gesetzt') . "\n";
+ echo " - Mailers: " . implode(', ', array_keys($mailConfig['mailers'] ?? [])) . "\n";
+
+ if (isset($mailConfig['mailers']['smtp'])) {
+ $smtpConfig = $mailConfig['mailers']['smtp'];
+ echo " - SMTP Host: " . ($smtpConfig['host'] ?? 'nicht gesetzt') . "\n";
+ echo " - SMTP Port: " . ($smtpConfig['port'] ?? 'nicht gesetzt') . "\n";
+ echo " - SMTP Encryption: " . ($smtpConfig['encryption'] ?? 'nicht gesetzt') . "\n";
+ echo " - SMTP Username: " . ($smtpConfig['username'] ?? 'nicht gesetzt') . "\n";
+ echo " - SMTP Password: " . (isset($smtpConfig['password']) ? '***' : 'nicht gesetzt') . "\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Laden der Mail-Konfiguration: " . $e->getMessage() . "\n";
+}
+
+// 3. Test-Mail senden
+echo "\n3. 📤 Test-Mail senden...\n";
+try {
+ // Test-E-Mail-Adresse (kann angepasst werden)
+ $testEmail = 'test@example.com';
+
+ echo " 📧 Sende Test-Mail an: $testEmail\n";
+
+ // Mail senden
+ $result = \Illuminate\Support\Facades\Mail::raw('Dies ist eine Test-Mail von der NeoNail Datenbank.
+
+Zeitstempel: ' . now() . '
+Server: ' . $_SERVER['SERVER_NAME'] ?? 'Unbekannt' . '
+
+Diese E-Mail wurde automatisch generiert, um die E-Mail-Konfiguration zu testen.
+
+Viele Grüße,
+NeoNail DB System', function($message) use ($testEmail) {
+ $message->to($testEmail)
+ ->subject('Test-Mail: NeoNail DB E-Mail-Konfiguration')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ Test-Mail erfolgreich gesendet!\n";
+
+} catch (Exception $e) {
+ echo " ❌ Fehler beim Senden der Test-Mail: " . $e->getMessage() . "\n";
+
+ // Detaillierte Fehleranalyse
+ echo " 🔍 Fehleranalyse:\n";
+ if (strpos($e->getMessage(), 'Connection refused') !== false) {
+ echo " - Problem: Verbindung zum SMTP-Server verweigert\n";
+ echo " - Lösung: Prüfen Sie MAIL_HOST und MAIL_PORT\n";
+ } elseif (strpos($e->getMessage(), 'Authentication failed') !== false) {
+ echo " - Problem: Authentifizierung fehlgeschlagen\n";
+ echo " - Lösung: Prüfen Sie MAIL_USERNAME und MAIL_PASSWORD\n";
+ } elseif (strpos($e->getMessage(), 'SSL') !== false) {
+ echo " - Problem: SSL/TLS Verbindungsproblem\n";
+ echo " - Lösung: Prüfen Sie MAIL_ENCRYPTION (SSL/TLS)\n";
+ } else {
+ echo " - Unbekannter Fehler: " . $e->getMessage() . "\n";
+ }
+}
+
+// 4. Alternative Test-Mail mit SwiftMailer
+echo "\n4. 📤 Alternative Test-Mail (SwiftMailer)...\n";
+try {
+ // SwiftMailer direkt testen
+ $transport = new \Swift_SmtpTransport(
+ config('mail.mailers.smtp.host'),
+ config('mail.mailers.smtp.port'),
+ config('mail.mailers.smtp.encryption')
+ );
+
+ $transport->setUsername(config('mail.mailers.smtp.username'));
+ $transport->setPassword(config('mail.mailers.smtp.password'));
+
+ $mailer = new \Swift_Mailer($transport);
+
+ $message = new \Swift_Message('SwiftMailer Test: NeoNail DB');
+ $message->setFrom([config('mail.from.address') => config('mail.from.name')]);
+ $message->setTo(['test@example.com' => 'Test User']);
+ $message->setBody('Dies ist eine SwiftMailer Test-Mail von der NeoNail Datenbank.
+
+Zeitstempel: ' . now() . '
+
+Viele Grüße,
+NeoNail DB System');
+
+ $result = $mailer->send($message);
+
+ if ($result) {
+ echo " ✅ SwiftMailer Test-Mail erfolgreich gesendet!\n";
+ } else {
+ echo " ❌ SwiftMailer Test-Mail fehlgeschlagen\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ SwiftMailer Fehler: " . $e->getMessage() . "\n";
+}
+
+// 5. E-Mail-Template erstellen
+echo "\n5. 📝 E-Mail-Template erstellen...\n";
+$emailTemplatePath = 'resources/views/emails/test.blade.php';
+$emailTemplateContent = '
+
+
+
+ NeoNail DB Test-Mail
+
+
+
+
+
+
+
+
✅ E-Mail-Konfiguration erfolgreich!
+
+
Hallo,
+
+
dies ist eine Test-Mail von der NeoNail Datenbank. Die E-Mail-Konfiguration funktioniert korrekt!
+
+
📋 Test-Details:
+
+ Zeitstempel: {{ now() }}
+ Server: {{ $_SERVER["SERVER_NAME"] ?? "Unbekannt" }}
+ Mailer: {{ config("mail.default") }}
+ Host: {{ config("mail.mailers.smtp.host") }}
+
+
+
Die E-Mail-Funktionalität ist jetzt bereit für Benachrichtigungen und Passwort-Reset.
+
+
+
+
+
+';
+
+// Template-Verzeichnis erstellen
+$emailDir = 'resources/views/emails';
+if (!is_dir($emailDir)) {
+ mkdir($emailDir, 0755, true);
+ echo " ✅ E-Mail-Verzeichnis erstellt: $emailDir\n";
+}
+
+file_put_contents($emailTemplatePath, $emailTemplateContent);
+echo " ✅ E-Mail-Template erstellt: $emailTemplatePath\n";
+
+// 6. Template-Mail senden
+echo "\n6. 📤 Template-Mail senden...\n";
+try {
+ $result = \Illuminate\Support\Facades\Mail::send('emails.test', [], function($message) {
+ $message->to('test@example.com')
+ ->subject('Template Test: NeoNail DB')
+ ->from(config('mail.from.address'), config('mail.from.name'));
+ });
+
+ echo " ✅ Template-Mail erfolgreich gesendet!\n";
+
+} catch (Exception $e) {
+ echo " ❌ Template-Mail Fehler: " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ E-Mail-Test abgeschlossen!\n";
+echo "📋 Nächste Schritte:\n";
+echo "1. Prüfen Sie Ihr E-Mail-Postfach (test@example.com)\n";
+echo "2. Falls keine E-Mail ankommt, prüfen Sie Spam-Ordner\n";
+echo "3. Falls Fehler auftreten, prüfen Sie die SMTP-Einstellungen\n";
+echo "4. Für echte Tests, ändern Sie die E-Mail-Adresse im Script\n";
+echo "\n🔗 E-Mail-Funktionen sind jetzt verfügbar für:\n";
+echo "- Passwort-Reset\n";
+echo "- Benutzer-Benachrichtigungen\n";
+echo "- Admin-Benachrichtigungen\n";
+?>
diff --git a/test-remove-fix.php b/test-remove-fix.php
new file mode 100644
index 0000000..421d667
--- /dev/null
+++ b/test-remove-fix.php
@@ -0,0 +1,99 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ $router = $app->make('router');
+ $routes = $router->getRoutes();
+
+ $foundRemoveRoute = false;
+
+ foreach ($routes as $route) {
+ if (strpos($route->uri(), 'remove-from-collection') !== false) {
+ echo " ✅ Route 'remove-from-collection' gefunden\n";
+ echo " - URI: " . $route->uri() . "\n";
+ echo " - Method: " . implode('|', $route->methods()) . "\n";
+ echo " - Name: " . $route->getName() . "\n";
+ $foundRemoveRoute = true;
+ }
+ }
+
+ if (!$foundRemoveRoute) {
+ echo " ❌ Route 'remove-from-collection' nicht gefunden\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n";
+}
+
+// 2. Prüfe Form-Action in Index-View
+echo "\n2. Form-Action in Index-View prüfen:\n";
+$indexViewPath = 'resources/views/user-nail-polishes/index.blade.php';
+if (file_exists($indexViewPath)) {
+ $content = file_get_contents($indexViewPath);
+ if (strpos($content, 'action="/remove-from-collection/') !== false) {
+ echo " ✅ Form-Action korrekt: /remove-from-collection/{id}\n";
+ } else {
+ echo " ❌ Form-Action nicht korrekt\n";
+ echo " Gefunden: " . preg_match('/action="([^"]+)"/', $content, $matches) ? $matches[1] : 'nichts';
+ }
+
+ // Prüfe @method('DELETE')
+ if (strpos($content, '@method(\'DELETE\')') !== false) {
+ echo " ⚠️ @method('DELETE') noch vorhanden - sollte entfernt werden\n";
+ } else {
+ echo " ✅ @method('DELETE') entfernt\n";
+ }
+} else {
+ echo " ❌ Index-View nicht gefunden\n";
+}
+
+// 3. Prüfe CSRF-Token
+echo "\n3. CSRF-Token prüfen:\n";
+if (strpos($content, '@csrf') !== false) {
+ echo " ✅ CSRF-Token in Form vorhanden\n";
+} else {
+ echo " ❌ CSRF-Token fehlt\n";
+}
+
+// 4. Prüfe Method
+echo "\n4. HTTP-Method prüfen:\n";
+if (strpos($content, 'method="POST"') !== false) {
+ echo " ✅ HTTP-Method: POST\n";
+} else {
+ echo " ❌ HTTP-Method nicht POST\n";
+}
+
+// 5. Prüfe Datenbank
+echo "\n5. Datenbank prüfen:\n";
+try {
+ $pdo = new PDO('sqlite:database.sqlite');
+ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+ // Prüfe nail_polishes Tabelle
+ $stmt = $pdo->query("SELECT COUNT(*) FROM nail_polishes");
+ $polishCount = $stmt->fetchColumn();
+ echo " - Lacke in Datenbank: $polishCount\n";
+
+ // Prüfe user_nail_polishes Tabelle
+ $stmt = $pdo->query("SELECT COUNT(*) FROM user_nail_polishes");
+ $userPolishCount = $stmt->fetchColumn();
+ echo " - User-Lack-Verbindungen: $userPolishCount\n";
+
+} catch (Exception $e) {
+ echo " ❌ Datenbankfehler: " . $e->getMessage() . "\n";
+}
+
+echo "\n✅ Remove-Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/my-collection\n";
+echo "📝 Versuchen Sie einen Lack aus Ihrer Sammlung zu entfernen\n";
+?>
diff --git a/test-route-fix.php b/test-route-fix.php
new file mode 100644
index 0000000..45f6fa0
--- /dev/null
+++ b/test-route-fix.php
@@ -0,0 +1,83 @@
+make('Illuminate\Contracts\Console\Kernel')->bootstrap();
+
+ $router = $app->make('router');
+ $routes = $router->getRoutes();
+
+ $foundStoreRoute = false;
+ $foundCreateRoute = false;
+
+ foreach ($routes as $route) {
+ if ($route->getName() === 'user-nail-polishes.store') {
+ echo " ✅ Route 'user-nail-polishes.store' gefunden\n";
+ echo " - URI: " . $route->uri() . "\n";
+ echo " - Method: " . implode('|', $route->methods()) . "\n";
+ $foundStoreRoute = true;
+ }
+
+ if ($route->uri() === 'create-nail-polish') {
+ echo " ✅ Route '/create-nail-polish' gefunden\n";
+ echo " - Method: " . implode('|', $route->methods()) . "\n";
+ echo " - Name: " . $route->getName() . "\n";
+ $foundCreateRoute = true;
+ }
+ }
+
+ if (!$foundStoreRoute) {
+ echo " ❌ Route 'user-nail-polishes.store' nicht gefunden\n";
+ }
+
+ if (!$foundCreateRoute) {
+ echo " ❌ Route '/create-nail-polish' nicht gefunden\n";
+ }
+
+} catch (Exception $e) {
+ echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n";
+}
+
+// 2. Prüfe Form-Action
+echo "\n2. Form-Action prüfen:\n";
+$createViewPath = 'resources/views/user-nail-polishes/create.blade.php';
+if (file_exists($createViewPath)) {
+ $content = file_get_contents($createViewPath);
+ if (strpos($content, 'action="/create-nail-polish"') !== false) {
+ echo " ✅ Form-Action korrekt: /create-nail-polish\n";
+ } else {
+ echo " ❌ Form-Action nicht korrekt\n";
+ echo " Gefunden: " . preg_match('/action="([^"]+)"/', $content, $matches) ? $matches[1] : 'nichts';
+ }
+} else {
+ echo " ❌ Create-View nicht gefunden\n";
+}
+
+// 3. Prüfe CSRF-Token
+echo "\n3. CSRF-Token prüfen:\n";
+if (strpos($content, '@csrf') !== false) {
+ echo " ✅ CSRF-Token in Form vorhanden\n";
+} else {
+ echo " ❌ CSRF-Token fehlt\n";
+}
+
+// 4. Prüfe Method
+echo "\n4. HTTP-Method prüfen:\n";
+if (strpos($content, 'method="POST"') !== false) {
+ echo " ✅ HTTP-Method: POST\n";
+} else {
+ echo " ❌ HTTP-Method nicht POST\n";
+}
+
+echo "\n✅ Route-Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+echo "📝 Versuchen Sie einen neuen Lack zu erstellen\n";
+?>
diff --git a/test-upload-limits.php b/test-upload-limits.php
new file mode 100644
index 0000000..c0ef60e
--- /dev/null
+++ b/test-upload-limits.php
@@ -0,0 +1,63 @@
+ ini_get('upload_max_filesize'),
+ 'post_max_size' => ini_get('post_max_size'),
+ 'max_file_uploads' => ini_get('max_file_uploads'),
+ 'memory_limit' => ini_get('memory_limit')
+];
+
+foreach ($limits as $setting => $value) {
+ echo " - $setting: $value\n";
+}
+
+// 2. Laravel Validierungsregeln prüfen
+echo "\n2. Laravel Validierungsregeln:\n";
+$controllerPath = 'app/Http/Controllers/UserNailPolishController.php';
+if (file_exists($controllerPath)) {
+ $content = file_get_contents($controllerPath);
+ if (preg_match('/image.*max:(\d+)/', $content, $matches)) {
+ $maxKB = $matches[1];
+ $maxMB = $maxKB / 1024;
+ echo " - Bild-Upload-Limit: {$maxKB}KB ({$maxMB}MB)\n";
+
+ if ($maxMB >= 10) {
+ echo " ✅ Upload-Limit ist ausreichend (>= 10MB)\n";
+ } else {
+ echo " ❌ Upload-Limit ist zu klein (< 10MB)\n";
+ }
+ } else {
+ echo " ❌ Keine Bild-Upload-Validierung gefunden\n";
+ }
+} else {
+ echo " ❌ Controller nicht gefunden\n";
+}
+
+// 3. View-Text prüfen
+echo "\n3. View-Text:\n";
+$viewPath = 'resources/views/user-nail-polishes/create.blade.php';
+if (file_exists($viewPath)) {
+ $content = file_get_contents($viewPath);
+ if (preg_match('/Maximale Größe: (\d+MB)/', $content, $matches)) {
+ echo " - Angezeigte Größe: {$matches[1]}\n";
+
+ if ($matches[1] === '10MB') {
+ echo " ✅ View zeigt korrekte Größe an\n";
+ } else {
+ echo " ❌ View zeigt falsche Größe an\n";
+ }
+ } else {
+ echo " ❌ Keine Größenangabe in View gefunden\n";
+ }
+} else {
+ echo " ❌ View nicht gefunden\n";
+}
+
+echo "\n✅ Upload-Limits Test abgeschlossen!\n";
+echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n";
+?>
diff --git a/test.php b/test.php
new file mode 100755
index 0000000..fa1488e
--- /dev/null
+++ b/test.php
@@ -0,0 +1,109 @@
+PHP-Test";
+
+// PHP-Version prüfen
+echo "PHP-Version: ";
+echo "PHP Version: " . phpversion() . " ";
+
+// Erforderliche Extensions prüfen
+echo "Erforderliche Extensions: ";
+$required_extensions = [
+ 'pdo',
+ 'pdo_sqlite',
+ 'sqlite3',
+ 'bcmath',
+ 'ctype',
+ 'json',
+ 'mbstring',
+ 'openssl',
+ 'tokenizer',
+ 'xml',
+ 'gd',
+ 'fileinfo'
+];
+
+foreach ($required_extensions as $ext) {
+ $status = extension_loaded($ext) ? "✅" : "❌";
+ echo "$status $ext ";
+}
+
+// Verzeichnis-Struktur prüfen
+echo "Verzeichnis-Struktur: ";
+$required_dirs = [
+ 'public',
+ 'app',
+ 'bootstrap',
+ 'config',
+ 'database',
+ 'resources',
+ 'routes',
+ 'storage'
+];
+
+foreach ($required_dirs as $dir) {
+ $status = is_dir($dir) ? "✅" : "❌";
+ echo "$status $dir/ ";
+}
+
+// .env Datei prüfen
+echo ".env Datei: ";
+if (file_exists('.env')) {
+ echo "✅ .env Datei gefunden ";
+ $env_content = file_get_contents('.env');
+ if (strpos($env_content, 'DB_CONNECTION=sqlite') !== false) {
+ echo "✅ SQLite konfiguriert ";
+ } else {
+ echo "❌ SQLite nicht konfiguriert ";
+ }
+} else {
+ echo "❌ .env Datei nicht gefunden ";
+}
+
+// SQLite-Datenbank prüfen
+echo "SQLite-Datenbank: ";
+if (file_exists('database.sqlite')) {
+ echo "✅ database.sqlite gefunden ";
+ echo "Größe: " . filesize('database.sqlite') . " Bytes ";
+} else {
+ echo "❌ database.sqlite nicht gefunden ";
+}
+
+// Berechtigungen prüfen
+echo "Berechtigungen: ";
+$writable_dirs = [
+ 'storage',
+ 'bootstrap/cache'
+];
+
+foreach ($writable_dirs as $dir) {
+ if (is_dir($dir)) {
+ $status = is_writable($dir) ? "✅" : "❌";
+ echo "$status $dir/ schreibbar ";
+ }
+}
+
+// Laravel index.php prüfen
+echo "Laravel index.php: ";
+if (file_exists('public/index.php')) {
+ echo "✅ public/index.php gefunden ";
+} else {
+ echo "❌ public/index.php nicht gefunden ";
+}
+
+// Composer autoload prüfen
+echo "Composer autoload: ";
+if (file_exists('vendor/autoload.php')) {
+ echo "✅ vendor/autoload.php gefunden ";
+} else {
+ echo "❌ vendor/autoload.php nicht gefunden ";
+ echo "Hinweis: Composer install ausführen ";
+}
+
+echo " ";
+echo "Nächste Schritte: ";
+echo "1. Falls Extensions fehlen: Hosting-Provider kontaktieren ";
+echo "2. Falls .env fehlt: env-sqlite-example.txt zu .env kopieren ";
+echo "3. Falls vendor/ fehlt: composer install ausführen ";
+echo "4. Falls Berechtigungen falsch: chmod 755 storage/ bootstrap/cache/ ";
+?>
diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php
new file mode 100755
index 0000000..8364a84
--- /dev/null
+++ b/tests/Feature/ExampleTest.php
@@ -0,0 +1,19 @@
+get('/');
+
+ $response->assertStatus(200);
+ }
+}
diff --git a/tests/TestCase.php b/tests/TestCase.php
new file mode 100755
index 0000000..fe1ffc2
--- /dev/null
+++ b/tests/TestCase.php
@@ -0,0 +1,10 @@
+assertTrue(true);
+ }
+}
diff --git a/upload-vendor-instructions.md b/upload-vendor-instructions.md
new file mode 100755
index 0000000..28bca42
--- /dev/null
+++ b/upload-vendor-instructions.md
@@ -0,0 +1,40 @@
+# 📦 Vendor-Ordner hochladen (Alternative zu Composer)
+
+## 🎯 Einfachste Lösung
+
+Da Composer auf dem Webspace nicht verfügbar ist, können Sie den `vendor/` Ordner von Ihrem lokalen System hochladen.
+
+## 📋 Schritte:
+
+### 1. Lokal Composer ausführen
+```bash
+# In Ihrem lokalen Projekt-Verzeichnis
+composer install --no-dev --optimize-autoloader
+```
+
+### 2. Vendor-Ordner hochladen
+- Laden Sie den kompletten `vendor/` Ordner auf den Webspace hoch
+- Ziel: `/var/www/html/vendor/`
+
+### 3. Berechtigungen setzen
+```bash
+chmod -R 755 vendor/
+```
+
+### 4. Laravel Setup
+```bash
+php artisan config:cache
+php artisan route:cache
+php artisan view:cache
+php artisan migrate --force
+```
+
+## ✅ Vorteile:
+- Keine Composer-Installation nötig
+- Schnell und einfach
+- Funktioniert auf allen Webspaces
+
+## ⚠️ Hinweise:
+- Stellen Sie sicher, dass Sie `--no-dev` verwenden
+- Der vendor-Ordner kann groß sein (ca. 50-100 MB)
+- Verwenden Sie FTP/SFTP für den Upload
diff --git a/vite.config.js b/vite.config.js
new file mode 100755
index 0000000..29fbfe9
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,13 @@
+import { defineConfig } from 'vite';
+import laravel from 'laravel-vite-plugin';
+import tailwindcss from '@tailwindcss/vite';
+
+export default defineConfig({
+ plugins: [
+ laravel({
+ input: ['resources/css/app.css', 'resources/js/app.js'],
+ refresh: true,
+ }),
+ tailwindcss(),
+ ],
+});