- PHP 65.9%
- Vue 17.1%
- JavaScript 14.1%
- CSS 2.4%
- Blade 0.4%
Kontrast und Überlauf prüft optik.js. npm run sitz sucht die andere Hälfte dessen, was „optisch" heißt, über 22 Seiten und drei Breiten: abgeschnittene Beschriftungen, überlappende Nachbarn, Trefferflächen unter 24 Pixeln, Schaltflächen ungleicher Höhe in einer Reihe, Textzeilen über 110 Zeichen und Felder, die aus ihrer Karte ragen. Die Funde dieser Runde sind bereits eingearbeitet; die Prüfung läuft jetzt ohne Befund und hält den Stand fest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| backend | ||
| docs | ||
| frontend | ||
| .gitignore | ||
| README.md | ||
PrüfungsWerk
Zwei eigenständige Anwendungen, die ausschließlich über eine JSON-API miteinander sprechen:
| Ordner | Technologie | Aufgabe |
|---|---|---|
backend/ |
Laravel 13 (PHP 8.3+), Sanctum | API, Authentifizierung, Datenhaltung |
frontend/ |
Vue 3.5 SPA, Vite 8, Pinia 4, Vue Router 5 | Oberfläche, konsumiert die API |
Der Aufbau folgt der Struktur aus struktur-vorlage/ (getrennte Backend-/Frontend-Projekte,
Token-Authentifizierung über Sanctum, rollenbasierte Middleware, gestaffelte Rate Limits,
Service-/Store-Schicht im Frontend). Übernommen wurde nur das Strukturmuster, keine Inhalte.
Architektur
Vue-SPA (Port 5173) Laravel-API (Port 8080)
┌───────────────────────────┐ ┌──────────────────────────────┐
│ views/ Seiten │ │ routes/api.php │
│ components/ Bausteine │ │ Middleware: role, rate.limit │
│ stores/ Pinia │ HTTP │ Controllers → Services │
│ services/ API-Aufrufe │ ────────► │ Form Requests (Validierung) │
│ apiClient.js axios │ JSON │ API Resources (Ausgabe) │
│ router/ Guards │ │ Models (Eloquent) │
└───────────────────────────┘ └──────────────────────────────┘
Bearer-Token aus /api/auth/login (Laravel Sanctum)
Im Entwicklungsbetrieb leitet der Vite-Proxy alle Aufrufe auf /api an http://localhost:8080
weiter; in Produktion wird die vollständige URL aus VITE_API_BASE_URL verwendet.
Schnellstart
Voraussetzungen: PHP ≥ 8.3 mit pdo_mysql, Composer, Node ≥ 22, MySQL/MariaDB.
# 1. Datenbanken anlegen (einmalig, als Datenbank-Administrator)
# Details und Benutzeranlage: backend/README.md
sudo mariadb -e "CREATE DATABASE \`PruefungsWerk\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 2. Backend
cd backend
cp .env.example .env # falls noch nicht vorhanden
php artisan key:generate
# DB_PASSWORD in .env eintragen
php artisan migrate --seed
php artisan serve --port=8080
# 3. Frontend (zweites Terminal)
cd frontend
npm install
npm run dev # http://localhost:5173
Die Seeder legen drei Demo-Konten an (Passwort jeweils password):
| Rolle | Bezeichnung | |
|---|---|---|
| admin@pruefungswerk.test | admin |
Administrator |
| dozent@pruefungswerk.test | dozent |
Dozierende |
| teilnehmende@pruefungswerk.test | teilnehmende |
Teilnehmende |
API-Überblick
| Methode | Pfad | Zugriff |
|---|---|---|
| GET | /api/health |
öffentlich |
| POST | /api/auth/login |
öffentlich |
| POST | /api/auth/logout |
Token |
| POST | /api/auth/logout-all |
Token |
| POST | /api/auth/refresh |
Token |
| GET | /api/auth/user |
Token |
| GET | /api/auth/check |
Token |
| GET | /api/options |
Token |
| GET/PUT | /api/settings/profile |
Token |
| DELETE | /api/settings/profile |
Token |
| PUT | /api/settings/password |
Token |
| GET | /api/admin/dashboard/stats |
Rolle admin |
| CRUD | /api/admin/users |
Rolle admin |
| CRUD | /api/admin/roles |
Rolle admin |
Antwortformat: { "success": true, "message": "…", "data": … }, Fehler mit
{ "success": false, "message": "…", "errors": { … } }. Listen-Endpunkte liefern
zusätzlich den meta-Block der Laravel-Paginierung.
Tests
cd backend && php artisan test # PHPUnit (benötigt Testdatenbank, s. backend/README.md)
cd frontend && npm run test:unit # Vitest
Ordner
docs/– Umsetzungsplan, Architektur und Entwurfsmuster, Modelle, Anforderungen an das Prüfungswerkzeug, Aufgaben des Examen-Backends und der Abgleich beider samt Prüfungsclientbackend/– Laravel-API (siehebackend/README.md)frontend/– Vue-SPA (siehefrontend/README.md)struktur-vorlage/– Referenzprojekt, dient nur als Vorlage für den Aufbaudesign/– Gestaltungsvorlagen (Farben, Typografie und Farbband sind im Frontend umgesetzt; zusätzlich gibt es Paletten für Rot-, Grün- und Blau-Schwäche, siehefrontend/README.md)