Architekturuebersicht
anyPIM ist als moderne Webanwendung mit klar getrenntem Backend und Frontend konzipiert. Das Backend stellt eine vollstaendige REST-API bereit, das Frontend konsumiert diese als Single-Page-Application. Diese Architektur ermoeglicht sowohl die Nutzung ueber die Weboberflaeche als auch die direkte API-Integration durch Drittsysteme.
Systemarchitektur
Technologie-Stack
| Schicht | Technologie | Version | Zweck |
|---|---|---|---|
| Frontend | Vue 3 | 3.x | Reaktives SPA-Framework mit Composition API |
| Build | Vite | 5.x | Schnelles HMR und optimierte Builds |
| Styling | Tailwind CSS + DaisyUI | 3.x / 4.x | Utility-first CSS mit Komponentenbibliothek |
| State | Pinia | 2.x | Zentrales State-Management |
| Backend | Laravel | 11.x | PHP-Framework fuer die REST-API |
| Authentifizierung | Laravel Sanctum | - | Token-basierte API-Authentifizierung |
| Autorisierung | Spatie Permission | - | Rollen- und Berechtigungsverwaltung |
| Datenbank | MySQL | 8.0+ | Relationale Datenhaltung mit JSON- und FULLTEXT-Support |
| Cache | Redis | 7.x | Anwendungscache und Session-Speicher |
| Queue | Redis + Horizon | - | Asynchrone Jobverarbeitung und Monitoring |
Backend-Architektur
Schichtenmodell
Das Backend folgt einem strikten Schichtenmodell, das die Verantwortlichkeiten klar trennt:
1. Routing und Middleware Alle API-Routen sind unter /api/v1/ registriert und durchlaufen die Sanctum-Authentifizierungs-Middleware. Zusaetzliche Middleware prueft Berechtigungen auf Rollen- und Hierarchieebene.
2. Controller-Schicht Controller validieren eingehende Requests ueber Form Requests, delegieren die Geschaeftslogik an Services und transformieren die Ergebnisse ueber API Resources in JSON-Antworten. Controller enthalten keine Geschaeftslogik.
3. Service-Schicht Services kapseln die gesamte Geschaeftslogik. Sie orchestrieren Datenbankoperationen, loesen Events aus und koordinieren agentenuebergreifende Operationen. Detaillierte Beschreibungen finden sich unter Services und Events.
4. Model-Schicht Eloquent-Models bilden die 35 Datenbanktabellen ab. Sie definieren Relationen, Scopes, Accessors und Mutators. Alle Models verwenden UUID-Primaerschluessel.
Agentenbasiertes Moduldesign
Die Backend-Codebasis ist in funktionale Agenten unterteilt, die jeweils einen fachlichen Bereich abdecken:
- Attribut-Agent: Verwaltung von Attributen, Attributgruppen, Attributtypen und deren Validierungsregeln
- Produkt-Agent: Produktlebenszyklus, Variantenverwaltung, Wertzuweisungen
- Hierarchie-Agent: Baumstrukturen, Knotenoperationen, Produkt-Knoten-Zuordnung
- Import-Agent: Excel-Parsing, Validierung, Fuzzy-Matching, transaktionaler Import
- Export-Agent: Template-Verwaltung, Mapping-Ausfuehrung, Publixx-Anbindung
- Medien-Agent: Datei-Upload, Bildverarbeitung, Medienzuordnung zu Produkten
- Auth-Agent: Benutzer, Rollen, Berechtigungen, Attribut-Views
Jeder Agent besitzt eigene Controller, Services, Models und Form Requests. Agentenuebergreifende Kommunikation erfolgt ueber Service-Injection und Events.
Frontend-Architektur
Das Frontend ist eine Vue 3 Single-Page-Application mit folgender Struktur:
Kern-Technologien
- Composition API durchgaengig fuer reaktive Logik und Code-Wiederverwendung
- Pinia Stores fuer globalen Zustand (aktueller Benutzer, Sprachauswahl, aktive Hierarchie)
- Vue Router mit verschachtelten Routen und navigationsbasierten Guards fuer Berechtigungen
- Axios als HTTP-Client mit automatischer Token-Erneuerung und Fehlerbehandlung
Build-Pipeline
Vite uebernimmt sowohl die Entwicklungsumgebung (HMR mit unter 100ms Aktualisierung) als auch den Produktions-Build mit Tree-Shaking, Code-Splitting und Asset-Hashing. Die gebaute SPA wird als statische Dateien ueber Nginx ausgeliefert.
Caching-Strategie
Redis als Anwendungscache
anyPIM nutzt Redis fuer zwei Zwecke: als Anwendungscache und als Queue-Broker.
Tagged Cache Invalidation: Caches werden mit Tags versehen, die eine gezielte Invalidierung ermoeglichen. Aendert sich ein Produkt, werden alle Caches mit dem Tag product:{id} invalidiert -- unabhaengig davon, ob sie Listendarstellungen, Detailansichten oder Suchindex-Eintraege betreffen.
// Beispiel: Cache mit Tags setzen
Cache::tags(['products', "product:{$id}"])->put($key, $data, 3600);
// Beispiel: Gezieltes Invalidieren
Cache::tags(["product:{$id}"])->flush();Cache-Ebenen:
| Ebene | TTL | Beschreibung |
|---|---|---|
| Attribut-Definitionen | 24 Stunden | Aendern sich selten, werden bei Schema-Aenderungen invalidiert |
| Hierarchie-Baeume | 1 Stunde | Werden bei Strukturaenderungen sofort invalidiert |
| Produktdaten | 30 Minuten | Werden bei jeder Aenderung gezielt invalidiert |
| Suchindex | Permanent | Wird ueber Datenbank-Triggers und Events aktualisiert |
Queue-System und Horizon
Langlebige Operationen werden nicht synchron in der HTTP-Request-Verarbeitung ausgefuehrt, sondern in Background Jobs ausgelagert:
- Excel-Import: Parsing und Verarbeitung grosser Dateien
- Export-Generierung: Zusammenstellung und Formatierung der Exportdaten
- Suchindex-Aktualisierung: Neuberechnung betroffener Eintraege nach Datenaenderungen
- Cache-Aufwaermung: Proaktives Fuellen invalidierter Cache-Eintraege
- Medienverarbeitung: Thumbnail-Generierung und Bildoptimierung
Laravel Horizon ueberwacht die Queue-Verarbeitung, bietet Echtzeitmetriken und erlaubt die Konfiguration von Parallelitaet und Wiederholungsstrategien.
Unterseiten dieser Sektion
| Seite | Inhalt |
|---|---|
| Datenmodell | Detaillierte Beschreibung aller 35 Tabellen, des EAV-Musters und des Suchindex |
| Services und Events | Service-Schicht, Event-System, Queue-Jobs und Cache-Invalidierung |
| Vererbung | Hierarchie- und Varianten-Vererbung mit Aufloesungsregeln und Sortierung |