Frontend-Architektur¶
Das TCM365 Frontend ist eine Single-Page Application auf Basis von Vue 3.5, Vite 7, Pinia 3 und Tailwind CSS 3. Es bietet eine umfassende UI für alle Plattform-Features mit rollenbasierter Zugriffskontrolle, domain-spezifischen Konfigurations-Renderern und Echtzeit-Fortschrittsverfolgung.
Technology Stack¶
| Technologie | Version | Zweck |
|---|---|---|
| Vue | 3.5 | UI Framework (Composition API) |
| Vite | 7 | Build Tool und Entwicklungsserver |
| Pinia | 3 | State Management |
| Vue Router | 4 | Client-Side Routing mit Navigation Guards |
| Tailwind CSS | 3 | Utility-First CSS Framework |
| ApexCharts | Latest | Interaktive Datenvisualisierung |
| Chart.js | Latest | Chart-Rendering |
| Monaco Editor | Latest | JSON/Code-Editing |
| TipTap | Latest | Rich Text Editing |
| CKEditor 5 | Latest | Erweitertes Rich Text Editing |
| Axios | Latest | HTTP Client für API-Kommunikation |
Projektstruktur¶
frontend/src/
├── views/ # 55 Page-Level View-Komponenten
│ ├── admin/ # 7 Admin Views
│ │ ├── UsersView.vue
│ │ ├── GroupsView.vue
│ │ ├── OrgsView.vue
│ │ ├── SettingsView.vue
│ │ ├── AuditLogView.vue
│ │ ├── DataViewerView.vue
│ │ └── DiagnosticsView.vue
│ ├── auth/ # Authentifizierungs-Views
│ │ └── LoginView.vue
│ ├── errors/ # 6 Fehlerseiten
│ │ ├── Error400.vue ... Error503.vue
│ ├── DashboardView.vue
│ ├── TenantsView.vue
│ ├── SnapshotsView.vue
│ ├── DiffView.vue
│ ├── DriftView.vue
│ ├── BaselinesView.vue
│ ├── ComplianceView.vue
│ ├── RollbackView.vue
│ ├── IncidentsView.vue
│ ├── RiskView.vue
│ ├── ChangeManagementView.vue
│ ├── BcdrView.vue
│ ├── AuditEvidenceView.vue
│ ├── ReportsView.vue
│ ├── WorkflowsView.vue
│ ├── CaWhatIfView.vue
│ ├── EmailSecurityView.vue
│ ├── AnomalyDetectionView.vue
│ ├── CopilotReadinessView.vue
│ ├── AtlassianSetupWizardView.vue # Atlassian OAuth Setup (v2.5.0)
│ ├── AtlassianCallbackView.vue # Atlassian OAuth Callback (v2.5.0)
│ └── ... # Weitere Feature Views
├── components/ # 106 wiederverwendbare Vue-Komponenten
│ ├── common/ # Gemeinsame UI-Primitive
│ ├── snapshots/ # Snapshot-bezogene Komponenten
│ │ └── viewer/ # 24 spezialisierte Renderer
│ ├── diff/ # Diff-Visualisierung
│ ├── drift/ # Drift Monitoring
│ ├── baselines/ # 14 Baseline Template-Komponenten
│ ├── compliance/ # Compliance-Visualisierung
│ ├── tenants/ # Tenant Management
│ ├── incidents/ # Incident Management
│ ├── risk/ # Risk Assessment
│ ├── change-management/ # Change Request-Komponenten
│ ├── rollback/ # Rollback UI
│ ├── anomaly/ # Anomaly Detection
│ ├── audit/ # Audit Evidence
│ ├── bcdr/ # BC/DR-Komponenten
│ └── workflows/ # Workflow Builder
├── services/ # 28 API Client Services
├── stores/ # 10 Pinia State Stores
├── composables/ # Wiederverwendbare Composition Functions
├── router/ # Vue Router-Konfiguration
├── layouts/ # Seitenlayouts
│ ├── DefaultLayout.vue # Hauptlayout mit Seitenleiste
│ ├── BlankLayout.vue # Minimallayout (Login, Fehler)
│ └── partials/ # Layout-Fragmente
│ ├── NavigationSidebar.vue
│ ├── Topbar.vue
│ └── Footer.vue
├── utils/ # Hilfsfunktionen
│ ├── formatters.js # Datum, Zahlen, Groessenformatierung
│ └── snapshot-helpers.js # Snapshot-Daten-Utilities
├── data/ # Statische Konfigurationsdaten
│ ├── menu-config.js # Seitenleisten-Navigationsstruktur
│ ├── utcm-config-areas.js # UTCM-Konfigurationsbereiche
│ └── metadata.js # App-Metadaten
├── App.vue # Root-Komponente
└── main.js # Anwendungs-Einstiegspunkt
Komponenten-Organisation¶
Komponenten sind nach Geschaeftsdomaene organisiert, sodass zusammengehoerige UI-Elemente zusammenbleiben.
Common Components (Gemeinsame UI-Primitive)¶
| Komponente | Zweck |
|---|---|
AppModal.vue |
Modal-Dialog mit konfigurierbarem Header, Body und Footer |
FormField.vue |
Formularfeld-Wrapper mit Label, Validierung und Fehleranzeige |
StatusBadge.vue |
Farbcodierter Status-Indikator |
StatCard.vue |
Dashboard-Statistik-Karte mit Icon und Trend |
EmptyState.vue |
Leerzustands-Platzhalter mit Aktions-Button |
ErrorDisplay.vue |
Fehlermeldungs-Anzeige |
FilterChip.vue |
Entfernbarer Filter-Tag |
FilterGroup.vue |
Gruppe von Filter-Chips mit Alle-Entfernen |
BaseBlock.vue |
Inhaltsblock mit Ueberschrift und optionalem Collapse |
BasePageHeading.vue |
Seitenuebrschrift mit Breadcrumbs und Aktionen |
Snapshot Viewer-Komponenten¶
Der Snapshot Viewer verwendet eine modulare Renderer-Architektur mit 24 spezialisierten Komponenten, die verschiedene Konfigurationstypen darstellen:
| Renderer | Konfigurationstyp |
|---|---|
ConditionalAccessRenderer.vue |
Conditional Access Policies |
AuthMethodsRenderer.vue |
Authentication Methods |
AuthStrengthRenderer.vue |
Authentication Strengths |
NamedLocationsRenderer.vue |
Named Locations |
DirectorySettingsRenderer.vue |
Directory Settings |
RoleAssignmentsRenderer.vue |
Rollenzuweisungen |
ServicePrincipalsRenderer.vue |
Service Principals |
AppRegistrationsRenderer.vue |
App Registrations |
DeviceConfigRenderer.vue |
Gerätekonfigurationen |
CompliancePoliciesRenderer.vue |
Compliance Policies |
EndpointSecurityRenderer.vue |
Endpoint Security |
EnrollmentConfigRenderer.vue |
Enrollment-Konfigurationen |
SecureScoresRenderer.vue |
Secure Scores |
SecureScoreControlsRenderer.vue |
Secure Score Controls |
GroupSettingsRenderer.vue |
Gruppeneinstellungen |
CrossTenantAccessRenderer.vue |
Cross-Tenant Access |
SecurityDefaultsRenderer.vue |
Security Defaults |
AuthorizationPolicyRenderer.vue |
Authorization Policies |
OrgSettingsRenderer.vue |
Organisationseinstellungen |
AppProtectionRenderer.vue |
App Protection Policies |
SecurityTemplatesRenderer.vue |
Security Templates |
ConfigAreaRenderer.vue |
Generischer Konfigurationsbereich |
GenericObjectRenderer.vue |
Generische JSON-Objektanzeige |
GenericArrayRenderer.vue |
Generische JSON-Array-Anzeige |
AtlassianJiraRenderer.vue |
Atlassian Jira-Konfigurationen (v2.5.0) |
AtlassianConfluenceRenderer.vue |
Atlassian Confluence-Konfigurationen (v2.5.0) |
AtlassianOrgSecurityRenderer.vue |
Atlassian Org Security-Einstellungen (v2.5.0) |
Baseline Template-Komponenten¶
14 Komponenten für Security Baseline Management:
| Komponente | Zweck |
|---|---|
TemplateCard.vue |
Baseline Template-Karte mit Vorschau |
TemplateTable.vue |
Tabellarische Template-Auflistung |
TemplateFilters.vue |
Framework- und Kategorie-Filter |
TemplateGroup.vue |
Gruppierte Template-Anzeige |
TemplateStats.vue |
Template-Statistik-Dashboard |
TemplateViewSwitcher.vue |
Umschalten zwischen Karten-/Tabellenansicht |
FrameworkIcon.vue |
Framework-Logo-Anzeige |
FrameworkQuickFilters.vue |
Ein-Klick Framework-Filterung |
BaselineRangeChart.vue |
Compliance-Bereichs-Visualisierung |
BaselineUpdateConfirmModal.vue |
Baseline-Update-Bestätigung |
ComplianceFieldComparison.vue |
Side-by-Side Compliance-Feld-Diff |
SeverityBadge.vue |
Schweregrad-Indikator |
BooleanDisplay.vue |
Boolean-Wert-Renderer |
PropertyDisplay.vue |
Schlüssel-Wert-Eigenschafts-Renderer |
State Management (Pinia)¶
TCM365 verwendet 10 Pinia Stores für zentralisiertes State Management:
| Store | Zweck | Wichtiger State |
|---|---|---|
auth.js |
Authentifizierungsstatus und Tokens | user, token, isAuthenticated, role |
tenants.js |
Tenant-Liste und Auswahl | tenants, currentTenant, loading |
snapshots.js |
Snapshot-Daten und Capture-Status | snapshots, captureProgress, comparing |
baselines.js |
Baseline Templates und Bewertungen | templates, evaluations, filters |
notifications.js |
UI-Benachrichtigungswarteschlange | notifications, unreadCount |
settings.js |
Anwendungseinstellungen | systemSettings, userPreferences |
compliance.js |
Compliance Scores und Checks | scores, checks, frameworks |
drift.js |
Drift Monitors und Alerts | monitors, drifts, activeAlerts |
workflows.js |
Workflow-Definitionen und Ausführungen | workflows, executions, running |
ui.js |
UI State (Seitenleiste, Theme etc.) | sidebarCollapsed, theme, loading |
Store-Pattern¶
Stores folgen dem Pinia Options API-Pattern:
import { defineStore } from 'pinia';
import { tenantsService } from '@/services/tenants.service';
export const useTenantsStore = defineStore('tenants', {
state: () => ({
tenants: [],
currentTenant: null,
loading: false,
error: null,
}),
getters: {
m365Tenants: (state) => state.tenants.filter(t => t.vendor === 'microsoft'),
zscalerTenants: (state) => state.tenants.filter(t => t.vendor === 'zscaler'),
atlassianTenants: (state) => state.tenants.filter(t => t.vendor === 'atlassian'),
},
actions: {
async fetchTenants() {
this.loading = true;
try {
this.tenants = await tenantsService.getAll();
} catch (error) {
this.error = error.message;
} finally {
this.loading = false;
}
},
},
});
API Services¶
28 TypeScript Service-Dateien stellen typisierte API Clients für die Backend-Kommunikation bereit. Alle Services nutzen eine gemeinsame Axios-Instanz, die in services/api.ts konfiguriert ist.
API Client-Konfiguration¶
// services/api.ts
import axios from 'axios';
const api = axios.create({
baseURL: '/api/v1',
headers: { 'Content-Type': 'application/json' },
});
// Request Interceptor: JWT Token anhaengen
api.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// Response Interceptor: 401 behandeln (Weiterleitung zum Login)
api.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
// Weiterleitung zum Login
}
return Promise.reject(error);
},
);
export default api;
Service-Beispiele¶
| Service | Endpoints | Beschreibung |
|---|---|---|
auth.service.ts |
Login, Logout, Refresh, Profil | Authentifizierungsoperationen |
tenants.service.ts |
CRUD, Verbindungstest, Feature Flags | Tenant Management |
snapshots.service.ts |
Capture, Liste, Get, Compare, Delete | Snapshot-Operationen |
diff.service.ts |
Compare, JSON-Export, HTML-Export | Konfigurationsvergleich |
baselines.service.ts |
Templates, Evaluate, Create, Update | Baseline Management |
compliance.service.ts |
Evaluate, Scores, Frameworks | Compliance-Bewertung |
drift.service.ts |
Monitors, Alerts, History | Drift Detection |
rollback.service.ts |
Execute, History, Preview | Rollback-Operationen |
reports.service.ts |
Generate, List, Download | Report Management |
notifications.service.ts |
Channels, Test, Logs | Benachrichtigungskonfiguration |
incidents.service.ts |
CRUD, Timeline, NIS2 | Incident Management |
risk.service.ts |
Assessments, Heat Maps | Risk Management |
Router und Navigation Guards¶
Routen-Konfiguration¶
Routen sind in frontend/src/router/index.js mit Metadaten für Authentifizierung und Rollenanforderungen definiert:
const routes = [
{
path: '/login',
component: BlankLayout,
children: [
{ path: '', name: 'Login', component: LoginView, meta: { public: true } },
],
},
{
path: '/',
component: DefaultLayout,
children: [
{ path: '', name: 'Dashboard', component: DashboardView, meta: { requiresAuth: true } },
{ path: 'tenants', name: 'Tenants', component: TenantsView, meta: { requiresAuth: true } },
{
path: 'admin/users',
name: 'AdminUsers',
component: UsersView,
meta: { requiresAuth: true, requiresAdmin: true },
},
// ... weitere Routen
],
},
// Fehlerrouten
{ path: '/401', component: Error401 },
{ path: '/403', component: Error403 },
{ path: '/404', component: Error404 },
{ path: '/:pathMatch(.*)*', redirect: '/404' },
];
Navigation Guards¶
| Guard | Zweck | Weiterleitung |
|---|---|---|
| Auth Guard | Blockiert nicht-authentifizierten Zugriff auf geschuetzte Routen | /login |
| Admin Guard | Blockiert Nicht-Admin-Zugriff auf Admin-Routen | /403 |
| Role Guard | Erzwingt minimale Rollenstufe pro Route | /403 |
router.beforeEach((to, from, next) => {
const authStore = useAuthStore();
if (to.meta.public) return next();
if (to.meta.requiresAuth && !authStore.isAuthenticated) {
return next('/login');
}
if (to.meta.requiresAdmin && !authStore.isAdmin) {
return next('/403');
}
next();
});
Composables¶
Wiederverwendbare Composition Functions kapseln häufige Muster:
| Composable | Zweck | Rueckgabe |
|---|---|---|
useAsyncAction |
Umschliesst Async-Operationen mit Loading/Error State | { execute, loading, error } |
useDebounce |
Entprellt reaktive Werte | { debouncedValue } |
useNotification |
Fuegt Benachrichtigungen zur Warteschlange hinzu | { success, error, warning, info } |
useCopyToClipboard |
Kopiert Text in die Zwischenablage mit Feedback | { copy, copied } |
useCountUp |
Animiert Zaehlen von Zahlen | { count } |
Verwendungsbeispiel¶
<script setup>
import { useAsyncAction } from '@/composables/useAsyncAction';
import { snapshotsService } from '@/services/snapshots.service';
const { execute: captureSnapshot, loading, error } = useAsyncAction(
(tenantId) => snapshotsService.capture(tenantId)
);
</script>
<template>
<button @click="captureSnapshot(tenantId)" :disabled="loading">
{{ loading ? 'Wird erfasst...' : 'Neuer Snapshot' }}
</button>
<p v-if="error" class="text-red-500">{{ error }}</p>
</template>
Styling-Konventionen¶
TCM365 verwendet Tailwind CSS 3 für jegliches Styling. Keine eigenen CSS-Dateien, sofern nicht unbedingt notwendig.
Tailwind-Patterns¶
<!-- Karten-Komponente -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-6">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
Kartentitel
</h3>
<p class="text-sm text-gray-600 dark:text-gray-400">
Karteninhalt
</p>
</div>
<!-- Status-Badge -->
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium"
:class="{
'bg-green-100 text-green-800': status === 'active',
'bg-red-100 text-red-800': status === 'error',
'bg-yellow-100 text-yellow-800': status === 'warning',
}">
{{ status }}
</span>
Build und Entwicklung¶
Entwicklungsserver¶
Vite startet auf http://localhost:5173 mit Hot Module Replacement. API-Anfragen an /api/* werden an das Backend auf Port 8000 weitergeleitet (konfiguriert in vite.config.js).
Produktions-Build¶
Erzeugt optimierte statische Assets in frontend/dist/ für die Bereitstellung hinter Nginx oder einem beliebigen Static File Server.
Vite-Konfiguration¶
// vite.config.js
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true,
},
'/health': {
target: 'http://localhost:8000',
changeOrigin: true,
},
},
},
});
Code-Qualitaet¶
| Tool | Zweck | Befehl |
|---|---|---|
| Prettier | Code-Formatierung | npm run format |
| ESLint | Linting | npm run lint |
| Playwright | E2E Testing | npm run test:e2e |