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
+109
View File
@@ -0,0 +1,109 @@
<?php
use App\Http\Controllers\Admin;
use App\Http\Controllers\Shop;
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// ─── Shop: Startseite ────────────────────────────────────────────
Route::get('/', [Shop\HomeController::class, 'index'])->name('home');
// Produkte
Route::get('/produkte', [Shop\ProductController::class, 'index'])->name('shop.products.index');
Route::get('/kategorie/{slug}', [Shop\ProductController::class, 'category'])->name('shop.category');
Route::get('/produkt/{slug}', [Shop\ProductController::class, 'show'])->name('shop.product.show');
// Warenkorb
Route::get('/warenkorb', [Shop\CartController::class, 'index'])->name('cart.index');
Route::post('/warenkorb/hinzufuegen', [Shop\CartController::class, 'add'])->name('cart.add');
Route::post('/warenkorb/aktualisieren', [Shop\CartController::class, 'update'])->name('cart.update');
Route::post('/warenkorb/entfernen/{key}', [Shop\CartController::class, 'remove'])->name('cart.remove');
// Checkout
Route::get('/kasse', [Shop\CheckoutController::class, 'index'])->name('checkout.index');
Route::post('/kasse/adresse', [Shop\CheckoutController::class, 'storeAddress'])->name('checkout.address');
Route::get('/kasse/zahlung', [Shop\CheckoutController::class, 'payment'])->name('checkout.payment');
Route::match(['GET','POST'], '/kasse/bestaetigen', [Shop\CheckoutController::class, 'confirm'])->name('checkout.confirm');
Route::get('/kasse/danke/{order}', [Shop\CheckoutController::class, 'thankyou'])->name('checkout.thankyou');
// CMS-Seiten
Route::get('/seite/{slug}', [Shop\PageController::class, 'show'])->name('page');
Route::get('/blog', [Shop\PageController::class, 'blog'])->name('blog');
Route::get('/blog/{slug}', [Shop\PageController::class, 'blogPost'])->name('blog.post');
Route::get('/faq', [Shop\FaqController::class, 'index'])->name('faq');
Route::get('/widerruf', [Shop\WiderrufsController::class, 'index'])->name('widerruf');
Route::post('/widerruf', [Shop\WiderrufsController::class, 'submit'])->name('widerruf.submit');
// Kundenkonto (eingeloggt)
Route::middleware(['auth', 'verified'])->prefix('konto')->name('account.')->group(function () {
Route::get('/', [Shop\AccountController::class, 'index'])->name('index');
Route::get('/bestellungen', [Shop\AccountController::class, 'orders'])->name('orders');
Route::get('/bestellung/{order}', [Shop\AccountController::class, 'orderDetail'])->name('order');
Route::get('/adressen', [Shop\AccountController::class, 'addresses'])->name('addresses');
Route::post('/adressen', [Shop\AccountController::class, 'storeAddress'])->name('addresses.store');
Route::delete('/adressen/{address}', [Shop\AccountController::class, 'destroyAddress'])->name('addresses.destroy');
Route::get('/einstellungen', [Shop\AccountController::class, 'settings'])->name('settings');
Route::put('/einstellungen', [Shop\AccountController::class, 'updateSettings'])->name('settings.update');
});
// Bestellverfolgung (Gast)
Route::get('/bestellung/verfolgen', [Shop\OrderTrackingController::class, 'index'])->name('order.track');
Route::post('/bestellung/verfolgen', [Shop\OrderTrackingController::class, 'show'])->name('order.track.show');
// Auth (Breeze)
require __DIR__.'/auth.php';
// ─── Admin ───────────────────────────────────────────────────────
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/', [Admin\DashboardController::class, 'index'])->name('dashboard');
// Kategorien
Route::resource('categories', Admin\CategoryController::class);
// Artikel
Route::resource('products', Admin\ProductController::class);
// Attribute
Route::get('attributes', [Admin\AttributeController::class, 'index'])->name('attributes.index');
Route::post('attributes', [Admin\AttributeController::class, 'store'])->name('attributes.store');
Route::delete('attributes/{attribute}', [Admin\AttributeController::class, 'destroy'])->name('attributes.destroy');
Route::post('attributes/{attribute}/values', [Admin\AttributeController::class, 'storeValue'])->name('attributes.values.store');
Route::delete('attribute-values/{value}', [Admin\AttributeController::class, 'destroyValue'])->name('attribute-values.destroy');
// Kunden
Route::get('customers', [Admin\CustomerController::class, 'index'])->name('customers.index');
Route::get('customers/{customer}', [Admin\CustomerController::class, 'show'])->name('customers.show');
Route::post('customers/{customer}/toggle-approval', [Admin\CustomerController::class, 'toggleApproval'])->name('customers.toggle-approval');
Route::delete('customers/{customer}', [Admin\CustomerController::class, 'destroy'])->name('customers.destroy');
// Bestellungen
Route::get('orders', [Admin\OrderController::class, 'index'])->name('orders.index');
Route::get('orders/{order}', [Admin\OrderController::class, 'show'])->name('orders.show');
Route::put('orders/{order}/status', [Admin\OrderController::class, 'updateStatus'])->name('orders.status');
Route::post('orders/{order}/invoice', [Admin\OrderController::class, 'sendInvoice'])->name('orders.invoice');
Route::get('orders/{order}/pdf', [Admin\OrderController::class, 'downloadInvoice'])->name('orders.pdf');
// CMS: Seiten
Route::resource('pages', Admin\PageController::class);
// CMS: Banner
Route::resource('banners', Admin\BannerController::class);
// CMS: FAQ
Route::get('faqs', [Admin\FaqController::class, 'index'])->name('faqs.index');
Route::post('faqs/groups', [Admin\FaqController::class, 'storeGroup'])->name('faqs.groups.store');
Route::post('faqs', [Admin\FaqController::class, 'store'])->name('faqs.store');
Route::put('faqs/{faq}', [Admin\FaqController::class, 'update'])->name('faqs.update');
Route::delete('faqs/{faq}', [Admin\FaqController::class, 'destroy'])->name('faqs.destroy');
// Einstellungen
Route::get('settings', [Admin\SettingsController::class, 'index'])->name('settings.index');
Route::put('settings', [Admin\SettingsController::class, 'update'])->name('settings.update');
// Versandkosten
Route::get('shipping', [Admin\ShippingController::class, 'index'])->name('shipping.index');
Route::post('shipping', [Admin\ShippingController::class, 'store'])->name('shipping.store');
Route::put('shipping/{rate}', [Admin\ShippingController::class, 'update'])->name('shipping.update');
Route::delete('shipping/{rate}', [Admin\ShippingController::class, 'destroy'])->name('shipping.destroy');
});