- 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>
110 lines
6.7 KiB
PHP
110 lines
6.7 KiB
PHP
<?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');
|
|
});
|