Initial commit: WitShop Laravel Online-Shop

- Laravel 11, Blade, Alpine.js, Tailwind CSS
- Produkt- & Kategorieverwaltung mit Varianten
- Checkout (Vorkasse + Rechnung), Session-Warenkorb
- Admin-Backend (Dashboard, Bestellungen, Kunden, CMS)
- DSGVO-konform: Cookie-Consent, Impressum, Widerruf, AGB
- PDF-Rechnung via dompdf, SMTP-Mailversand
- Kundenverwaltung mit manueller Freischaltung

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 00:34:09 +02:00
co-authored by Claude Sonnet 4.6
commit 41078fdc08
208 changed files with 21725 additions and 0 deletions
@@ -0,0 +1,29 @@
@extends('layouts.admin')
@section('title', isset($banner) ? 'Banner bearbeiten' : 'Neuer Banner')
@section('content')
<div class="max-w-xl">
<form method="POST" action="{{ isset($banner) ? route('admin.banners.update', $banner) : route('admin.banners.store') }}" enctype="multipart/form-data" class="bg-white rounded shadow p-6 space-y-4">
@csrf @if(isset($banner)) @method('PUT') @endif
<div>
<label class="block text-sm font-medium mb-1">Bild *</label>
@if(isset($banner) && $banner->image)<img src="{{ asset('storage/'.$banner->image) }}" class="h-20 mb-2 rounded">@endif
<input type="file" name="image" accept="image/*" {{ !isset($banner) ? 'required' : '' }} class="text-sm">
</div>
<div><label class="block text-sm font-medium mb-1">Überschrift</label><input type="text" name="headline" value="{{ old('headline', $banner->headline ?? '') }}" class="w-full border rounded px-3 py-2 text-sm"></div>
<div><label class="block text-sm font-medium mb-1">Untertext</label><input type="text" name="subtext" value="{{ old('subtext', $banner->subtext ?? '') }}" class="w-full border rounded px-3 py-2 text-sm"></div>
<div class="grid grid-cols-2 gap-4">
<div><label class="block text-sm font-medium mb-1">Button-Text</label><input type="text" name="button_label" value="{{ old('button_label', $banner->button_label ?? '') }}" class="w-full border rounded px-3 py-2 text-sm"></div>
<div><label class="block text-sm font-medium mb-1">Button-Link</label><input type="text" name="button_link" value="{{ old('button_link', $banner->button_link ?? '') }}" class="w-full border rounded px-3 py-2 text-sm"></div>
</div>
<div class="flex gap-4">
<div><label class="block text-sm font-medium mb-1">Reihenfolge</label><input type="number" name="sort_order" value="{{ old('sort_order', $banner->sort_order ?? 0) }}" class="w-24 border rounded px-3 py-2 text-sm"></div>
<div class="flex items-end pb-2"><label class="flex items-center gap-2 text-sm"><input type="checkbox" name="active" value="1" {{ old('active', $banner->active ?? true) ? 'checked' : '' }}> Aktiv</label></div>
</div>
<div class="flex gap-3 pt-2">
<button type="submit" class="bg-blue-600 text-white px-5 py-2 rounded hover:bg-blue-700 text-sm">Speichern</button>
<a href="{{ route('admin.banners.index') }}" class="px-5 py-2 rounded border text-sm hover:bg-gray-50">Abbrechen</a>
</div>
</form>
</div>
@endsection
@@ -0,0 +1,27 @@
@extends('layouts.admin')
@section('title', 'Banner')
@section('content')
<div class="flex justify-between items-center mb-6">
<h2 class="text-lg font-semibold">Startseiten-Banner</h2>
<a href="{{ route('admin.banners.create') }}" class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 text-sm">+ Neuer Banner</a>
</div>
<div class="grid grid-cols-3 gap-4">
@forelse($banners as $banner)
<div class="bg-white rounded shadow overflow-hidden">
@if($banner->image)<img src="{{ asset('storage/'.$banner->image) }}" class="w-full h-32 object-cover">@endif
<div class="p-4">
<p class="font-medium text-sm">{{ $banner->headline ?: '(kein Titel)' }}</p>
<p class="text-xs text-gray-400">Reihenfolge: {{ $banner->sort_order }}</p>
<div class="flex gap-2 mt-3">
<a href="{{ route('admin.banners.edit', $banner) }}" class="text-blue-600 text-sm hover:underline">Bearbeiten</a>
<form method="POST" action="{{ route('admin.banners.destroy', $banner) }}" onsubmit="return confirm('Löschen?')">
@csrf @method('DELETE')<button class="text-red-600 text-sm hover:underline">Löschen</button>
</form>
</div>
</div>
</div>
@empty
<p class="col-span-3 text-gray-400">Keine Banner.</p>
@endforelse
</div>
@endsection