Compare commits
15 Commits
907eada0f5
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f673460e07 | |||
| 69c01af8d4 | |||
| 3be7fd4123 | |||
| 90294a0503 | |||
| 29b29fe49d | |||
| e4c7cab347 | |||
| 8612e13f2a | |||
| 6995fa35f0 | |||
| 9f0bd16ec9 | |||
| a32f395822 | |||
| cda4491ac0 | |||
| ad8de7141f | |||
| dee5d67484 | |||
| 8be72b130f | |||
| bc4044803e |
@@ -1,4 +1,4 @@
|
||||
\newpage
|
||||
\cleardoublepage
|
||||
|
||||
# Kurzfassung {.unnumbered .unlisted}
|
||||
|
||||
@@ -7,13 +7,17 @@ In dieser Diplomarbeit geht es um die Entwicklung von „AlumniHub“ – einer
|
||||
Die technische Arbeit haben wir uns im Team aufgeteilt: Konstantin Hintermayer hat als Product Owner die Linux-Serverinfrastruktur, die PostgreSQL-Datenbank und die CI/CD-Pipelines aufgesetzt sowie das digitale „Schwarze Brett“ programmiert. Adam Gaiswinkler hat das responsive Design im Stil der Schule entworfen und das Event-Anmeldetool sowie die „Hall of Fame“ inklusive PDF-Export umgesetzt. Florian Edlmayer war für den Premiumbereich mit seinem Freigabe-Workflow verantwortlich, hat die DSGVO-Vorgaben umgesetzt und den sicheren Login über LinkedIn (OAuth 2.0) eingebaut. Das Ergebnis ist eine leistungsstarke Plattform, die dem Verein die tägliche Verwaltungsarbeit deutlich erleichtert.
|
||||
\cleardoublepage
|
||||
|
||||
|
||||
\cleardoublepage
|
||||
|
||||
# Abstract {.unnumbered .unlisted}
|
||||
|
||||
This diploma thesis covers the development of "AlumniHub," a web platform designed for the alumni association of the HTL Ungargasse. Our goal was to replace their old, manual administration with an automated system using ASP.NET Core, Blazor, and the Oqtane CMS. The platform now handles communication, event planning, and networking in one central place.
|
||||
|
||||
The technical work was split between the team: Konstantin Hintermayer (Product Owner) was responsible for the Linux server infrastructure, the PostgreSQL database, and CI/CD pipelines, while also building the digital "Blackboard." Adam Gaiswinkler created the responsive UI in the school’s style and implemented the event registration tool and the "Hall of Fame" with automated PDF exports. Florian Edlmayer developed the premium area and its approval workflow, ensured GDPR compliance, and integrated the LinkedIn Login (OAuth 2.0). Overall, we built a high-performance system that significantly simplifies the association’s daily administrative work.
|
||||
|
||||
\newpage
|
||||
|
||||
\cleardoublepage
|
||||
|
||||
# Danksagung {.unnumbered .unlisted}
|
||||
|
||||
@@ -29,13 +33,14 @@ Als wir im Oktober kurzfristig eine neue Produktionsumgebung benötigten, wurde
|
||||
|
||||
Für den „frischen Wind“ und das sorgfältige Korrekturlesen der Arbeit bedanken wir uns herzlich bei Frau Prof. Gertrude Brindlmayer. Ihr geschulter Blick auf Details, die dem Team im Arbeitsprozess entgangen waren, stellte eine große Bereicherung für die finale Qualität dieser Arbeit dar.
|
||||
|
||||
\newpage
|
||||
\cleardoublepage
|
||||
|
||||
# Vorwort {.unnumbered .unlisted}
|
||||
|
||||
Diese Diplomarbeit ist im Schuljahr 2025/2026 an der HTL SZU Ungargasse im Rahmen des Projekts Alumnihub entstanden. Unser Ziel war es, zusammen mit dem Absolventenverein die veraltete Mitgliederverwaltung zu modernisieren und eine neue digitale Plattform für ehemalige Schülerinnen und Schüler zu entwickeln. Was am Anfang nur eine Pflichtaufgabe für die Schule war, wurde für uns schnell zu einem Projekt, mit dem wir uns voll identifiziert haben. Besonders herausfordernd war, dass unser Team im Laufe der Zeit kleiner wurde und wir am Ende nur noch zu dritt waren. Konstantin Hintermayer, Florian Edlmayer und Adam Gaiswinkler mussten deshalb viel mehr Verantwortung übernehmen und technisches Wissen schneller aufbauen als eigentlich geplant. Die Arbeit am AlumniHub war für uns die ideale Chance, das Wissen aus der Theorie endlich mal in einem echten und anspruchsvollen Softwareprojekt einzusetzen. Es war eine stressige, aber sehr lehrreiche Zeit, und wir sind stolz auf das, was wir am Ende als Team abgeliefert haben.
|
||||
|
||||
\newpage
|
||||
|
||||
\cleardoublepage
|
||||
|
||||
# Einsatz Künstlicher Intelligenz (KI-Disclaimer) {.unnumbered .unlisted}
|
||||
|
||||
|
||||
@@ -66,9 +66,9 @@
|
||||
\hrulefill
|
||||
\end{titlepage}
|
||||
|
||||
\newpage
|
||||
\pagenumbering{Roman}
|
||||
\thispagestyle{empty}
|
||||
\cleardoublepage
|
||||
\pagenumbering{Roman}
|
||||
\section*{Eidesstattliche Erklärung}
|
||||
Ich erkläre, dass ich die vorliegende Diplomarbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt, sowie die aus anderen Werken übernommene Inhalte durch Quellenangaben erkenntlich gemacht habe.
|
||||
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
|
||||
# Inhaltsverzeichnis {.unnumbered .unlisted}
|
||||
|
||||
\tableofcontents
|
||||
\tableofcontents
|
||||
103
02-Allgemein.md
103
02-Allgemein.md
@@ -26,7 +26,7 @@ Florian Edlmayer entwickelte ein funktionierendes CMS-Modul für den Premiumbere
|
||||
|
||||
## Das Team
|
||||
|
||||
Konstantin Hintermayer
|
||||
**Konstantin Hintermayer**
|
||||
|
||||
Geboren am: 25.05.2007
|
||||
|
||||
@@ -34,7 +34,8 @@ E-Mail: [konstantin.hintermayer@edu.szu.at]
|
||||
|
||||
Individuelle Themenstellung: Projektleitung (Product Owner), (Server-) Infrastruktur, Aufsetzen und Installieren der Server / Linux / Datenbank, Adminzugriff, Skripten, Entwicklung der Auswertungen und des schwarzen Bretts.
|
||||
|
||||
Florian Edlmayer
|
||||
|
||||
**Florian Edlmayer**
|
||||
|
||||
Geboren am: 20.08.2006
|
||||
|
||||
@@ -42,7 +43,8 @@ E-Mail: [florian.edlmayer@edu.szu.at]
|
||||
|
||||
Individuelle Themenstellung: Entwicklung eines CMS-Moduls für den Premiumbereich des Absolventenvereins,Verfassung der Datenschutzerklärung und zuständig für Informationssicherheit, Implementierung von OAuth, Datenbankmanagement.
|
||||
|
||||
Adam Gaiswinkler
|
||||
|
||||
**Adam Gaiswinkler**
|
||||
|
||||
Geboren am: 11.10.2006
|
||||
|
||||
@@ -168,27 +170,27 @@ Die Datenbank wird zur Ausfallsicherheit redundant geführt und nutzt automatisc
|
||||
|
||||
### Konstantin Hintermayer
|
||||
|
||||
| | |
|
||||
| :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Konzeption und Umsetzung der Infrastruktur sowie die Entwicklung von Modulen für Auswertungen und ein Schwarzes Brett innerhalb der Plattform. |
|
||||
| | |
|
||||
| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Konzeption und Umsetzung der Infrastruktur sowie die Entwicklung von Modulen für Auswertungen und ein Schwarzes Brett innerhalb der Plattform. |
|
||||
| Ziele und Anforderungen | HW01, HW02, HW03, HW04/05, HW07, RED-1, SW-4, ScB-1–4 |
|
||||
|
||||
Table: Aufgabenverteilung Konstantin Hintermayer
|
||||
|
||||
### Florian Edlmayer
|
||||
|
||||
| | |
|
||||
| :----------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Entwicklung eines Premiumbereichs sowie die Umsetzung von Datenschutz- und Informationssicherheitsmaßnahmen, einschließlich Zugriffs- und Profilverwaltung. |
|
||||
| | |
|
||||
| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Entwicklung eines Premiumbereichs sowie die Umsetzung von Datenschutz- und Informationssicherheitsmaßnahmen, einschließlich Zugriffs- und Profilverwaltung. |
|
||||
| Ziele und Anforderungen | HZ01, HZ05, HW12/13, SnT-3, ZUG-1–4, ZUG-6/7, PRE-1–3, Pro-1–4, DB-1 |
|
||||
|
||||
Table: Aufgabenverteilung Florian Edlmayer
|
||||
|
||||
### Adam Gaiswinkler
|
||||
|
||||
| | |
|
||||
| :----------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Entwicklung einer Hall of Fame, die Implementierung eines Anmeldetools für Treffen sowie die Konfiguration des Content-Management-Systems. |
|
||||
| | |
|
||||
| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Themenstellung: | Die individuelle Themenstellung umfasst die Entwicklung einer Hall of Fame, die Implementierung eines Anmeldetools für Treffen sowie die Konfiguration des Content-Management-Systems. |
|
||||
| Ziele und Anforderungen | HZ02, HZ03, HZ06, SnT-2, SW-1/2, HoF-1/2, AfT-1–5 |
|
||||
|
||||
Table: Aufgabenverteilung Adam Gaiswinkler
|
||||
@@ -200,11 +202,11 @@ Table: Aufgabenverteilung Adam Gaiswinkler
|
||||
| # | Datum | Beschreibung |
|
||||
| :-- | :------------- | --------------------------------------------------------- |
|
||||
| _1_ | _19.09.2025_ | Fertigstellung und Abgabe des Diplomarbeitsantrags. |
|
||||
| _2_ | _30.10.2025_ | [cite_start]Server-Setup mit SSH-Zugriff [cite: 83][cite_start], CMS-Grundkonfiguration (Oqtane) im SZU-Design [cite: 69, 83][cite_start], Implementierung der Eingabemaske und API für das Anmeldetool [cite: 137] [cite_start]sowie Erstellung der DSGVO-Richtlinien [cite: 38] [cite_start]und Backupstrategie[cite: 55, 62]. |
|
||||
| _3_ | _27.11.2025_ | [cite_start]Entwicklung grafischer Auswertungen für Anmeldedaten [cite: 120] [cite_start]und Integration der OAuth-Authentifizierung zum automatisierten Abruf von Profildaten[cite: 78, 148]. |
|
||||
| _4_ | _18.12.2025_ | Realisierung des Schwarzen Bretts inkl. [cite_start]Sperrfunktion für Administratoren [cite: 133][cite_start], Entwicklung des Hall of Fame Moduls mit PDF-Generierung [cite: 105] [cite_start]sowie Aufbau der Premiumkunden-Verwaltung[cite: 113]. |
|
||||
| _5_ | _21.01.2026_ | [cite_start]Erstellung der technischen Systemdokumentation [cite: 155][cite_start], Durchführung von Modultests und Implementierung der Premium-Serviceverwaltung[cite: 113]. |
|
||||
| _6_ | _08.02.2026_ | [cite_start]Projektabschluss der Infrastruktur-Tasks, Übergabe der Disaster-Recovery-Skripte [cite: 58] [cite_start]und Finalisierung der gesamten Projektdokumentation[cite: 155]. |
|
||||
| _2_ | _30.10.2025_ | Server-Setup mit SSH-Zugriff, CMS-Grundkonfiguration (Oqtane) im SZU-Design, Implementierung der Eingabemaske und API für das Anmeldetool sowie Erstellung der DSGVO-Richtlinien und Backupstrategie. |
|
||||
| _3_ | _27.11.2025_ | Entwicklung grafischer Auswertungen für Anmeldedaten und Integration der OAuth-Authentifizierung zum automatisierten Abruf von Profildaten. |
|
||||
| _4_ | _18.12.2025_ | Realisierung des Schwarzen Bretts inkl. Sperrfunktion für Administratoren, Entwicklung des Hall of Fame Moduls mit PDF-Generierung sowie Aufbau der Premiumkunden-Verwaltung. |
|
||||
| _5_ | _21.01.2026_ | Erstellung der technischen Systemdokumentation, Durchführung von Modultests und Implementierung der Premium-Serviceverwaltung. |
|
||||
| _6_ | _08.02.2026_ | Projektabschluss der Infrastruktur-Tasks, Übergabe der Disaster-Recovery-Skripte und Finalisierung der gesamten Projektdokumentation. |
|
||||
| _7_ | _12.03.2026_ | Finale Abgabe des Diplomarbeitsbuchs. |
|
||||
| _8_ | _22.04.2026_ | Defensio (Projektabschluss). |
|
||||
|
||||
@@ -212,20 +214,20 @@ Table: Meilensteine
|
||||
|
||||
### Sprints
|
||||
|
||||
| # | Beginn | Ende | Hinweis | Meilensteine |
|
||||
| :-- | :--------- | :--------- | :--------------- | :------------- |
|
||||
| 1 | 02.10.2025 | 16.10.2025 | | |
|
||||
| 2 | 16.10.2025 | 30.10.2025 | | 1. Meilenstein |
|
||||
| 3 | 30.10.2025 | 13.11.2025 | Herbstferien | |
|
||||
| 4 | 13.11.2025 | 27.11.2025 | | 2. Meilenstein |
|
||||
| 5 | 27.11.2025 | 11.12.2025 | | |
|
||||
| 6 | 11.12.2025 | 25.12.2025 | Weihnachtsferien | 3. Meilenstein |
|
||||
| 7 | 25.12.2025 | 08.01.2026 | Weihnachtsferien | |
|
||||
| 8 | 08.01.2026 | 22.01.2026 | | 4. Meilenstein |
|
||||
| 9 | 22.01.2026 | 05.02.2026 | Semesterferien | |
|
||||
| 10 | 05.02.2026 | 19.02.2026 | | 5. Meilenstein |
|
||||
| 11 | 19.02.2026 | 05.03.2026 | | |
|
||||
| 12 | 05.03.2026 | 19.03.2026 | | 6. Meilenstein |
|
||||
| # | Beginn | Ende | Hinweis | Meilensteine |
|
||||
| :--- | :--------- | :--------- | :--------------- | :------------- |
|
||||
| 1 | 02.10.2025 | 16.10.2025 | | |
|
||||
| 2 | 16.10.2025 | 30.10.2025 | | 1. Meilenstein |
|
||||
| 3 | 30.10.2025 | 13.11.2025 | Herbstferien | |
|
||||
| 4 | 13.11.2025 | 27.11.2025 | | 2. Meilenstein |
|
||||
| 5 | 27.11.2025 | 11.12.2025 | | |
|
||||
| 6 | 11.12.2025 | 25.12.2025 | Weihnachtsferien | 3. Meilenstein |
|
||||
| 7 | 25.12.2025 | 08.01.2026 | Weihnachtsferien | |
|
||||
| 8 | 08.01.2026 | 22.01.2026 | | 4. Meilenstein |
|
||||
| 9 | 22.01.2026 | 05.02.2026 | Semesterferien | |
|
||||
| 10 | 05.02.2026 | 19.02.2026 | | 5. Meilenstein |
|
||||
| 11 | 19.02.2026 | 05.03.2026 | | |
|
||||
| 12 | 05.03.2026 | 19.03.2026 | | 6. Meilenstein |
|
||||
|
||||
Table: Sprints und deren Schwerpunkte
|
||||
|
||||
@@ -284,25 +286,32 @@ Table: Sprints und deren Schwerpunkte
|
||||
|
||||
### Beschreibung der wichtigsten Umfelder
|
||||
|
||||
| ID | Name | Beschreibung | Bewertung |
|
||||
| :-- | :--------- | :------------------------------- | :-------- |
|
||||
| 8 | Konkurrenz | Potenziell vorhandene Konkurrenz | - |
|
||||
| # | Bezeichnung | Beschreibung | Bewertung |
|
||||
| :--- | :--------------------- | :------------------------------- | :-------- |
|
||||
| 1 | Konstantin Hintermayer | Projektleiter | + |
|
||||
| 2 | Florian Edlmayer | Projektmitarbeiter | + |
|
||||
| 3 | Adam Gaiswinkler | Projektmitarbeiter | + |
|
||||
| 4 | Ing. Thomas Gürth | Projektbetreuer | + |
|
||||
| 5 | Absolventenverein | Auftraggeber des Alumnihubs | +/- |
|
||||
| 6 | Schülerinnen/Schüler | Zielgruppe der SZU Ungargasse | +/- |
|
||||
| 7 | Lehrerinnen/Lehrer | Lehrpersonal der SZU Ungargasse | +/- |
|
||||
| 8 | Konkurrenz | Potenziell vorhandene Konkurrenz | - |
|
||||
|
||||
Table: Projektumfelder und deren Bewertung
|
||||
|
||||
## Risikoanalyse
|
||||
|
||||
| # | Bezeichnung | Beschreibung | Wahrscheinlichkeit (%) | Auswirkung (%) | Risikowert |
|
||||
| # | Bezeichnung | Beschreibung | Warsch. (%) | Ausw. (%) | Risikowert |
|
||||
| :-- | :----------------- | :-------------------------------------------------------- | :-------: | :-------: | :-----: |
|
||||
| 1 | Infrastruktur | [cite_start]Instabilität oder Fehlkonfiguration der Cloud-Server (Hetzner CX22), die den Live-Betrieb unterbrechen[cite: 45, 51]. | 60 | 90 | 5400 |
|
||||
| 2 | Datenverlust | [cite_start]Kritischer Ausfall der Datenbank ohne erfolgreiche Wiederherstellung durch automatisierte Backups[cite: 51, 62]. | 15 | 95 | 1425 |
|
||||
| 3 | DSGVO-Verstoß | [cite_start]Fehlende Konformität bei der Speicherung personenbezogener Daten oder beim Opt-In-Verfahren[cite: 38, 39, 128]. | 10 | 100 | 1000 |
|
||||
| 4 | Sicherheitslücke | [cite_start]Unbefugter Zugriff auf das System durch Schwachstellen in der VPN- oder SSH-Verbindung[cite: 83]. | 15 | 85 | 1275 |
|
||||
| 5 | API-Schnittstellen | [cite_start]Ausfall oder Inkompatibilität externer Dienste wie LinkedIn OAuth oder Brevo Mailservice[cite: 74, 78]. | 30 | 50 | 1500 |
|
||||
| 6 | Performance | [cite_start]Beeinträchtigung der Systemleistung bei steigenden Zugriffszahlen in Phase 2[cite: 44, 46]. | 40 | 40 | 1600 |
|
||||
| 7 | Wieder-herstellung | [cite_start]Überschreitung des geplanten Disaster-Recovery-Zeitraums von 24 Stunden[cite: 51, 66]. | 25 | 70 | 1750 |
|
||||
| 8 | Oqtane-Integration | [cite_start]Komplexität bei der Entwicklung und Einbindung benutzerdefinierter CMS-Module[cite: 69, 72]. | 30 | 45 | 1350 |
|
||||
| 9 | Dokumentation | [cite_start]Lückenhafte technische Dokumentation erschwert die Wartung durch den Absolventenverein[cite: 155]. | 20 | 30 | 600 |
|
||||
| 1 | Infrastruktur | Instabilität oder Fehlkonfiguration der Cloud-Server (Hetzner CX22), die den Live-Betrieb unterbrechen. | 60 | 90 | 5400 |
|
||||
| 2 | Datenverlust | Kritischer Ausfall der Datenbank ohne erfolgreiche Wiederherstellung durch automatisierte Backups. | 20 | 92 | 1425 |
|
||||
| 3 | DSGVO-Verstoß | Fehlende Konformität bei der Speicherung personenbezogener Daten oder beim Opt-In-Verfahren. | 10 | 89 | 1000 |
|
||||
| 4 | Sicherheitslücke | Unbefugter Zugriff auf das System durch Schwachstellen in der VPN- oder SSH-Verbindung. | 15 | 85 | 1275 |
|
||||
| 5 | API-Schnittstellen | Ausfall oder Inkompatibilität externer Dienste wie LinkedIn OAuth oder Brevo Mailservice. | 30 | 50 | 1500 |
|
||||
| 6 | Performance | Beeinträchtigung der Systemleistung bei steigenden Zugriffszahlen in Phase 2. | 40 | 40 | 1600 |
|
||||
| 7 | Wieder-herstellung | Überschreitung des geplanten Disaster-Recovery-Zeitraums von 24 Stunden. | 25 | 70 | 1750 |
|
||||
| 8 | Oqtane-Integration | Komplexität bei der Entwicklung und Einbindung benutzerdefinierter CMS-Module. | 55 | 45 | 1350 |
|
||||
| 9 | Dokumentation | Lückenhafte technische Dokumentation erschwert die Wartung durch den Absolventenverein. | 20 | 30 | 600 |
|
||||
|
||||
Table: Risikoanalyse und Bewertung
|
||||
|
||||
@@ -318,13 +327,13 @@ quadrantChart
|
||||
quadrant-3 Akzeptabel
|
||||
quadrant-4 Handlungsbedarf
|
||||
Infrastruktur: [0.9, 0.6]
|
||||
Datenverlust: [0.95, 0.15]
|
||||
DSGVO_Verstoss: [0.99, 0.1]
|
||||
Datenverlust: [0.92, 0.2]
|
||||
DSGVO_Verstoss: [0.89, 0.1]
|
||||
Sicherheitsluecke: [0.85, 0.15]
|
||||
API_Schnittstellen: [0.5, 0.3]
|
||||
Performance: [0.4, 0.4]
|
||||
Wiederherstellung: [0.7, 0.25]
|
||||
Oqtane_Integration: [0.45, 0.3]
|
||||
Oqtane_Integration: [0.55, 0.45]
|
||||
Dokumentation: [0.3, 0.2]
|
||||
```
|
||||
|
||||
|
||||
@@ -119,7 +119,28 @@ foreach (var item in PageState.Pages
|
||||
|
||||
Durch diesen Ansatz werden ausschließlich die für Benutzer relevanten Inhaltsseiten in der Navigation angezeigt. Gleichzeitig bleibt die Navigation vollständig dynamisch: Werden im CMS neue Seiten angelegt und als Navigationsseiten markiert, erscheinen diese automatisch im Menü, ohne dass eine Anpassung am Theme-Code notwendig ist.
|
||||
|
||||
![Filterlogik der Oqtane-Navigation] (./images/06-Adam/navigationsfilter_v2.svg)
|
||||
<!--  -->
|
||||
|
||||
``` {.mermaid width=75%}
|
||||
graph TD
|
||||
%%| filename: navigationsfilter_v2
|
||||
%%| fig-cap: Filterlogik der Oqtane-Navigation (Theme.razor)
|
||||
|
||||
Start[PageState.Pages<br/>Alle CMS-Seiten ~12 Seiten] --> Filter1[Filter 1: ParentId == null<br/>Nur Root-Seiten]
|
||||
Filter1 -- Unterseiten --> Rejected1[Aussortiert]
|
||||
Filter1 --> Filter2[Filter 2: hiddenNames<br/>Systemseiten ausblenden]
|
||||
Filter2 -- "Login, Register, Admin, Privacy, ..." --> Rejected2[Aussortiert]
|
||||
Filter2 --> Result[Sichtbare Navigation<br/>~3 Inhaltsseiten im Menü]
|
||||
Result -.-> Note[Neue Seiten im CMS erscheinen automatisch im Menü – kein Code nötig]
|
||||
|
||||
style Start fill:#F5F5F3,stroke:#B4B2A9,color:#000000
|
||||
style Filter1 fill:#E8E6FF,stroke:#3C3489,color:#000000
|
||||
style Filter2 fill:#E8E6FF,stroke:#3C3489,color:#000000
|
||||
style Rejected1 fill:#FFE8E8,stroke:#791F1F,color:#000000
|
||||
style Rejected2 fill:#FFE8E8,stroke:#791F1F,color:#000000
|
||||
style Result fill:#E6FFF9,stroke:#085041,color:#000000
|
||||
style Note fill:none,stroke:#B4B2A9,stroke-dasharray: 5 5,color:#000000
|
||||
```
|
||||
|
||||
Dies reduziert den Wartungsaufwand erheblich und stellt sicher, dass die Navigation stets dem aktuellen Stand der Plattform entspricht.
|
||||
|
||||
@@ -245,7 +266,33 @@ Am unteren Rand des Formulars befinden sich zwei Speicheroptionen: „Als Entwur
|
||||
|
||||
Der folgende Lebenszyklus zeigt die möglichen Zustände eines Eintrags und die Übergänge zwischen ihnen:
|
||||
|
||||
![Lebenszyklus eines Hall-of-Fame-Eintrags] (./images/06-Adam/hall_of_fame_lebenszyklus_v4.svg)
|
||||
<!--  -->
|
||||
|
||||
``` {.mermaid width=75%}
|
||||
graph TD
|
||||
%%| filename: hall_of_fame_lebenszyklus_v4
|
||||
%%| fig-cap: Lebenszyklus eines Hall-of-Fame-Eintrags
|
||||
|
||||
Start([Benutzer eingeloggt]) --> Create[Eintrag erstellen<br/>Duplikat- & Eigentümerprüfung]
|
||||
Create -- Fehler --> Rejected[Abgelehnt]
|
||||
Create --> Draft[Draft<br/>Nur für Eigentümer sichtbar]
|
||||
Draft -- Veröffentlichen --> Published[Published<br/>Öffentlich sichtbar]
|
||||
Published -- Meldung --> Reported[Gemeldet<br/>IsReported = true]
|
||||
Reported --> Admin[Admin-Entscheidung]
|
||||
Admin -- OK --> Approved[Freigegeben]
|
||||
Admin -- Verstoß --> Deleted[Gelöscht<br/>→ neuer Eintrag möglich]
|
||||
|
||||
%% Styling to match original SVG
|
||||
style Start fill:#F5F5F3,stroke:#B4B2A9,color:#000000
|
||||
style Create fill:#E8E6FF,stroke:#3C3489,color:#000000
|
||||
style Rejected fill:#FFE8E8,stroke:#791F1F,color:#000000
|
||||
style Draft fill:#E6FFF9,stroke:#085041,color:#000000
|
||||
style Published fill:#E6FFF9,stroke:#085041,color:#000000
|
||||
style Reported fill:#FFF2E0,stroke:#633806,color:#000000
|
||||
style Admin fill:#F5F5F3,stroke:#B4B2A9,color:#000000
|
||||
style Approved fill:#F0FFE6,stroke:#27500A,color:#000000
|
||||
style Deleted fill:#FFE8E8,stroke:#791F1F,color:#000000
|
||||
```
|
||||
|
||||
##### Meldefunktion
|
||||
|
||||
@@ -255,7 +302,27 @@ Die Meldefunktion ermöglicht es angemeldeten Benutzerinnen und Benutzern, einen
|
||||
|
||||
Die Meldefunktion ist dabei nicht direkt im Hall-of-Fame-Modul implementiert, sondern wird über eine zentrale Schnittstelle aus einem gemeinsamen Interfaces-Paket eingebunden. Dieses Konzept ermöglicht es, dieselbe Melde-Oberfläche in beliebig vielen weiteren Modulen wiederzuverwenden, ohne die Logik mehrfach implementieren zu müssen.
|
||||
|
||||
![Ablauf des globalen Reporting-Systems] (./images/06-Adam/reporting_sequence_diagram.svg)
|
||||
<!---->
|
||||
```mermaid
|
||||
%%{init: {'theme': 'neutral'}}%%
|
||||
sequenceDiagram
|
||||
%%| filename: reporting_sequence_diagram
|
||||
%%| fig-cap: Ablauf des globalen Reporting-Systems
|
||||
participant User
|
||||
participant Module
|
||||
participant ReportingComponent
|
||||
participant ReportingHandler
|
||||
|
||||
User-->>+Module: View entity
|
||||
Module-->>+ReportingComponent: Report current entity
|
||||
ReportingComponent-->>User: Ask for reason
|
||||
User-->>ReportingComponent: Enters reason
|
||||
ReportingComponent-->>+ReportingHandler: New report (entity + reason)
|
||||
ReportingHandler-->>-ReportingComponent: Done
|
||||
ReportingComponent-->>-Module: Report saved
|
||||
Module-->>-User: Report saved
|
||||
```
|
||||
|
||||
|
||||
##### PDF-Export
|
||||
|
||||
@@ -324,7 +391,7 @@ Der Fremdschlüssel zu `SZUAbsolventenvereinHallOfFame` ist mit kaskadierendem L
|
||||
Die Datenbankstruktur wird über Entity Framework Core Migrationen versioniert verwaltet [@ef_core_migrations].
|
||||
|
||||
| Migration | Versionsnummer | Inhalt |
|
||||
|--------------------|----------------|--------|
|
||||
| ------- | ------ | ------------ |
|
||||
| `InitializeModule` | `01.00.00.00` | Erstellt die Haupttabelle mit allen Grundspalten sowie den Audit-Spalten |
|
||||
| `AddReportingColumns` | `01.00.00.02` | Erweitert die Haupttabelle um die Spalten `IsReported` und `ReportReason` |
|
||||
| `AddReportTable` | `01.00.00.03` | Erstellt die eigenständige Report-Tabelle mit Fremdschlüssel zur Haupttabelle |
|
||||
|
||||
@@ -20,19 +20,27 @@ Für den Verein bedeutet das: rechtskonforme Datenverarbeitung, gesicherte Daten
|
||||
|
||||
#### Entwicklung eines CMS-Moduls
|
||||
|
||||
• **Premiumbereich:**
|
||||
\
|
||||
|
||||
- **Premiumbereich:**
|
||||
Ein Schwerpunkt der Arbeit ist die Entwicklung eines Oqtane-Moduls, das einen Premiumbereich bereitstellt. Dieser Bereich soll ausschließlich autorisierten Benutzerinnen und Benutzern zugänglich sein und spezielle Inhalte oder Funktionen anbieten wie zum Beispiel das hochladen und ansehen von Ingeneuranträgen als Vorlage oder das finden und Kontakt aufnehmen mit anderen Benutzern. Dabei werden grundlegende Konzepte wie Benutzerrollen, Zugriffsrechte und die Integration in das bestehende CMS eingebunden.
|
||||
|
||||
##### Erstellung einer Datenschutzerklärung
|
||||
|
||||
\
|
||||
|
||||
Eine weitere wichtige Aufgabe war die Erstellung einer gesetzeskonformen Datenschutzerklärung. Diese ist erforderlich, um die Nutzerinnen und Nutzer unserer Webanwendung transparent und verständlich darüber zu informieren, welche personenbezogenen Daten erhoben, verarbeitet und gespeichert werden, zu welchem Zweck dies geschieht und welche Rechte ihnen in Bezug auf ihre Daten zustehen.
|
||||
|
||||
#### LinkedIn-Anmeldung
|
||||
|
||||
\
|
||||
|
||||
Zur Verbesserung der Benutzerfreundlichkeit und zur vereinfachten Anmeldung wird eine Anmeldung über LinkedIn mithilfe des OAuth-2.0-Protokolls implementiert. Diese ermöglicht es Benutzerinnen und Benutzern, sich mit einem bestehenden LinkedIn-Konto zu registrieren oder anzumelden.
|
||||
|
||||
#### Datenbank-Backup und Restore
|
||||
|
||||
\
|
||||
|
||||
Abschließend wurde das Thema Datensicherung umfassend behandelt, da die Sicherstellung der Datenintegrität und Systemverfügbarkeit einen zentralen Bestandteil moderner Webanwendungen darstellt. In diesem Zusammenhang wurde ein Skript zur automatisierten Erstellung von Datenbank-Backups entwickelt, das in regelmäßigen Abständen Sicherungskopien der relevanten Daten erzeugt. Zusätzlich wurde ein weiteres Skript implementiert, das im Falle eines Datenverlusts oder Systemausfalls eine strukturierte und zuverlässige Wiederherstellung der gesicherten Daten ermöglicht.
|
||||
|
||||
Ziel dieser Maßnahmen ist es, das Risiko von Datenverlusten zu minimieren und einen stabilen sowie sicheren Betrieb der Webanwendung zu gewährleisten. Die Backup- und Restore-Prozesse sollen automatisiert ablaufen, um menschliche Fehler zu reduzieren und eine kontinuierliche, regelmäßige Datensicherung sicherzustellen. Dadurch wird eine hohe Ausfallsicherheit sowie die langfristige Verfügbarkeit der gespeicherten Informationen gewährleistet.
|
||||
@@ -41,8 +49,12 @@ Ziel dieser Maßnahmen ist es, das Risiko von Datenverlusten zu minimieren und e
|
||||
|
||||
#### Zielsetzung
|
||||
|
||||
\
|
||||
|
||||
##### Technische Zielsetzung
|
||||
|
||||
\
|
||||
|
||||
Die technische Zielsetzung dieses Diplomarbeitsprojekts bestand darin, eine stabile und sichere Webplattform für Alumni zu entwickeln. Als technische Grundlage wurde das Content-Management-System Oqtane verwendet, welches auf modernen Webtechnologien basiert und eine modulare Erweiterung von Funktionen ermöglicht. Die Implementierung erfolgte innerhalb der von Oqtane bereitgestellten Architektur, wodurch verschiedene Funktionen effizient integriert werden konnten.
|
||||
|
||||
Ein zentraler Bestandteil der technischen Umsetzung war die Integration einer externen Authentifizierung über LinkedIn mithilfe des Protokolls OAuth 2.0. Dadurch können sich Benutzer direkt mit ihrem LinkedIn-Konto auf der Plattform anmelden, ohne ein separates Benutzerkonto erstellen zu müssen. Dies vereinfacht den Registrierungsprozess und erhöht gleichzeitig die Sicherheit, da sensible Zugangsdaten ausschließlich beim externen Anbieter verbleiben.
|
||||
@@ -53,6 +65,8 @@ Ein weiterer wichtiger Aspekt der technischen Zielsetzung war die Einhaltung rec
|
||||
|
||||
##### Funktionale Zielsetzung
|
||||
|
||||
\
|
||||
|
||||
Die funktionale Zielsetzung des Projekts bestand darin, eine Onlineplattform zu entwickeln, die ehemaligen Schülerinnen und Schülern die Möglichkeit bietet, miteinander in Kontakt zu bleiben und sich über aktuelle Veranstaltungen zu informieren. Die Plattform dient somit als digitales Netzwerk für Alumni und soll den Austausch zwischen ehemaligen Mitgliedern der Bildungseinrichtung fördern.
|
||||
|
||||
Eine zentrale Funktion der Anwendung ist die Anmeldung über LinkedIn, wodurch Benutzer schnell und unkompliziert Zugriff auf die Plattform erhalten können. Nach der erfolgreichen Anmeldung wird automatisch ein Benutzerkonto erstellt oder ein bestehendes Konto zugeordnet.
|
||||
@@ -65,6 +79,8 @@ Durch diese Funktionen entsteht eine Plattform, die nicht nur als Informationsqu
|
||||
|
||||
##### Gestalterische Zielsetzung
|
||||
|
||||
\
|
||||
|
||||
Neben den technischen und funktionalen Anforderungen spielte auch die Gestaltung der Plattform eine wichtige Rolle. Ziel war es, eine übersichtliche und benutzerfreundliche Oberfläche zu entwickeln, die eine einfache Navigation und intuitive Bedienung ermöglicht.
|
||||
|
||||
Die Struktur der Webseite wurde so aufgebaut, dass wichtige Funktionen wie Login, Benutzerprofil oder Eventübersicht schnell erreichbar sind. Ein klares Layout und eine strukturierte Seitenaufteilung tragen dazu bei, dass sich Benutzer auf der Plattform leicht orientieren können.
|
||||
@@ -75,9 +91,50 @@ Insgesamt verfolgt die gestalterische Zielsetzung das Ziel, eine Plattform zu sc
|
||||
|
||||
## Anforderungen an das entwickelte Modul bzw. die Funktionalität
|
||||
|
||||
funktionale / nicht‑funktionale Anforderungen
|
||||
### Modulanforderungen / funktionale Anforderungen
|
||||
|
||||
Use Cases
|
||||
Die funktionalen Anforderungen beschreiben die spezifischen Dienste und Funktionen, die das System für die Benutzer bereitstellen muss. Im Rahmen der individuellen Aufgabenstellung wurden Anforderungen für vier Teilbereiche definiert:
|
||||
|
||||
#### Premium-Bereich
|
||||
|
||||
\
|
||||
|
||||
Das Ziel des Premium-Bereichs ist die Bereitstellung exklusiver Funktionen und Inhalte für berechtigte Absolventinnen und Absolventen, um einen Anreiz für aktives Engagement zu schaffen.
|
||||
|
||||
- **Antragsworkflow**: Benutzer müssen die Möglichkeit haben, einen Ingenieur-Antrag in Form eines PDF-Dokuments hochzuladen und mit einem Titel sowie einer Kurzbeschreibung zu versehen.
|
||||
- **Genehmigungsprüfung**: Eine Berechtigungsstruktur muss es ermöglichen, eingereichte Anträge zu sichten und entweder zu genehmigen oder abzulehnen. Bei Genehmigung wird der Premium-Status vergeben.
|
||||
- **Antrags-Bibliothek**: Premium-Mitglieder müssen auf eine Übersicht aller genehmigten Anträge zugreifen und die zugehörigen Dokumente einsehen können.
|
||||
- **Mitgliedersuche & Kontakt**: Premium-Mitglieder sollen gezielt nach anderen Benutzern suchen und diesen über eine interne Funktion Nachrichten senden können, ohne dass E-Mail-Adressen für Benutzer sichtbar werden.
|
||||
|
||||
#### Authentifizierung mittels LinkedIn (OAuth 2.0)
|
||||
|
||||
\
|
||||
|
||||
Diese Anforderung zielt darauf ab, den Registrierungs- und Anmeldeprozess für Benutzer signifikant zu vereinfachen und sicherer zu gestalten.
|
||||
|
||||
- **Externe Anmeldung**: Benutzer müssen sich über ihr bestehendes LinkedIn-Konto auf der Plattform registrieren und anmelden können.
|
||||
- **Sichere Token-Verarbeitung**: Die Anwendung muss das OAuth 2.0-Protokoll korrekt implementieren und den Autorisierungscode sicher gegen ein Zugriffstoken austauschen.
|
||||
- **Account-Zuordnung**: Bei der Anmeldung über LinkedIn muss im CMS automatisch ein neues Benutzerprofil erstellt und mit den abgerufenen Daten befüllt werden, sofern kein bestehender Account vorliegt.
|
||||
|
||||
#### Backup- und Restore-System
|
||||
|
||||
\
|
||||
|
||||
Das System dient der Sicherstellung der Datenverfügbarkeit und dem Schutz vor Datenverlust durch Hardwarefehler oder sonstige Ausfälle.
|
||||
|
||||
- **Automatisierte Sicherung**: Täglich muss automatisch ein Backup der gesamten PostgreSQL-Datenbank sowie aller wichtigen System- und Anwendungsdateien als komprimiertes Archiv erstellt werden.
|
||||
- **Chronologische Ablage und Speichermanagement**: Die Backup-Archive müssen chronologisch und versioniert abgelegt werden. Eine Automatisierung sorgt dafür, dass alte Backups routinemäßig bereinigt werden.
|
||||
- **Strukturierte Wiederherstellung**: Ein eigenes Restore-Skript muss existieren, um ein ausgewähltes Backup kontrolliert wiederherstellen zu können. Sicherheits- und Bestätigungsmechanismen müssen etabliert werden, um Überschreiben aktueller Daten versehentlich zu vermeiden.
|
||||
|
||||
#### Datenschutz und DSGVO-Konformität
|
||||
|
||||
\
|
||||
|
||||
Die Umsetzung rechtlicher Rahmenbedingungen ist notwendig, um die Privatsphäre der Benutzer zu schützen und einen rechtskonformen Betrieb der Webplattform zu gewährleisten.
|
||||
|
||||
- **Datenschutzerklärung**: Eine umfassende, gesetzeskonforme Datenschutzerklärung muss auf der Webseite integriert werden, die über Verwendungszweck, Speicherdauer und Betroffenenrechte aufklärt.
|
||||
- **Datenminimierung**: Die Plattform darf nur jene Daten erheben, die zur Bereitstellung der Dienste (Verwaltung von Mitgliedschaften, Eventorganisation, Kommunikation) erforderlich sind.
|
||||
- **Sichere Verarbeitung**: Personenbezogene Daten müssen verschlüsselt übertragen (HTTPS) und bei Suchvorgängen (z. B. in der Mitgliedersuche) muss auf die Zurückhaltung sensibler Daten geachtet werden.
|
||||
|
||||
## Technologien
|
||||
|
||||
@@ -95,9 +152,9 @@ Durch diese Architektur wird sichergestellt, dass die eigentliche Logik der Anwe
|
||||
|
||||
Ein weiterer Vorteil von ASP.NET besteht in der klar strukturierten Architektur moderner Webanwendungen. Typischerweise wird eine Anwendung in mehrere Schichten unterteilt, beispielsweise:
|
||||
|
||||
• Präsentationsschicht (Benutzeroberfläche)
|
||||
• Geschäftslogik
|
||||
• Datenzugriffsschicht
|
||||
- Präsentationsschicht (Benutzeroberfläche)
|
||||
- Geschäftslogik
|
||||
- Datenzugriffsschicht
|
||||
|
||||
Diese Struktur erleichtert die Wartung und Erweiterung der Anwendung erheblich, da Änderungen gezielt innerhalb einzelner Komponenten vorgenommen werden können.
|
||||
|
||||
@@ -109,16 +166,16 @@ Eine relationale Datenbank speichert Informationen in Tabellen, die aus Zeilen u
|
||||
|
||||
Durch diese Struktur kann beispielsweise gespeichert werden:
|
||||
|
||||
• welcher Benutzer existiert
|
||||
• welche Veranstaltungen geplant sind
|
||||
• welcher Benutzer sich für welches Event angemeldet hat
|
||||
- welcher Benutzer existiert
|
||||
- welche Veranstaltungen geplant sind
|
||||
- welcher Benutzer sich für welches Event angemeldet hat
|
||||
|
||||
PostgreSQL bietet darüber hinaus zahlreiche Funktionen, die für moderne Webanwendungen wichtig sind. Dazu gehören unter anderem:
|
||||
|
||||
• hohe Stabilität und Zuverlässigkeit
|
||||
• Unterstützung komplexer Datenabfragen mittels SQL
|
||||
• Transaktionssicherheit zur Vermeidung von Datenverlust
|
||||
• Erweiterbarkeit durch zusätzliche Module
|
||||
- hohe Stabilität und Zuverlässigkeit
|
||||
- Unterstützung komplexer Datenabfragen mittels SQL
|
||||
- Transaktionssicherheit zur Vermeidung von Datenverlust
|
||||
- Erweiterbarkeit durch zusätzliche Module
|
||||
|
||||
Ein weiterer wichtiger Vorteil besteht darin, dass PostgreSQL sehr gut mit modernen Webframeworks wie ASP.NET zusammenarbeitet. Dadurch kann die Anwendung effizient auf gespeicherte Daten zugreifen und diese verarbeiten.
|
||||
|
||||
@@ -134,49 +191,55 @@ Für die sichere Anmeldung über externe Identitätsanbieter wurde das Protokoll
|
||||
|
||||
#### Bedeutung der Datenschutz-Grundverordnung (DSGVO) [@dsgvo]
|
||||
|
||||
\
|
||||
|
||||
Die Datenschutz-Grundverordnung (DSGVO) ist eine rechtsverbindliche Verordnung der Europäischen Union, die seit dem 25. Mai 2018 unmittelbar in allen EU-Mitgliedstaaten gilt und den Schutz personenbezogener Daten regelt. Sie wurde erlassen, um die Rechte natürlicher Personen bei der Verarbeitung ihrer Daten zu stärken und ein einheitliches Datenschutzniveau innerhalb der EU zu gewährleisten.
|
||||
|
||||
Der Anwendungsbereich der DSGVO umfasst alle Verarbeitungen personenbezogener Daten, unabhängig davon, ob diese automatisiert oder in nicht-automatisierten Akten erfolgt. Personenbezogene Daten sind dabei definiert als alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person beziehen.
|
||||
|
||||
Die DSGVO verfolgt mehrere grundsätzliche Ziele:
|
||||
|
||||
• Schutz der Grundrechte natürlicher Personen bei der Verarbeitung ihrer personenbezogenen Daten sowie die Gewährleistung ihrer Grundfreiheiten.
|
||||
• Einheitlicher Datenschutz in der EU, sodass sowohl Unternehmen innerhalb als auch außerhalb der EU, die Daten von EU-Bürgern verarbeiten, denselben Regeln unterliegen.
|
||||
• Schaffung klarer Pflichten für Datenverantwortliche und -verarbeiter zur rechtskonformen Datenverarbeitung.
|
||||
- Schutz der Grundrechte natürlicher Personen bei der Verarbeitung ihrer personenbezogenen Daten sowie die Gewährleistung ihrer Grundfreiheiten.
|
||||
- Einheitlicher Datenschutz in der EU, sodass sowohl Unternehmen innerhalb als auch außerhalb der EU, die Daten von EU-Bürgern verarbeiten, denselben Regeln unterliegen.
|
||||
- Schaffung klarer Pflichten für Datenverantwortliche und -verarbeiter zur rechtskonformen Datenverarbeitung.
|
||||
|
||||
Die DSGVO enthält dabei zentral die Grundsätze der Datenverarbeitung (Art. 5 DSGVO), die sicherstellen, dass personenbezogene Daten nur rechtmäßig, zweckgebunden und in transparentem Umfang verarbeitet werden. Dazu gehören unter anderem:
|
||||
|
||||
• Rechtmäßigkeit, Fairness und Transparenz der Verarbeitung
|
||||
• Zweckbindung der Datenerhebung
|
||||
• Datenminimierung und Speicherbegrenzung
|
||||
• Integrität und Vertraulichkeit der Datenverarbeitung
|
||||
- Rechtmäßigkeit, Fairness und Transparenz der Verarbeitung
|
||||
- Zweckbindung der Datenerhebung
|
||||
- Datenminimierung und Speicherbegrenzung
|
||||
- Integrität und Vertraulichkeit der Datenverarbeitung
|
||||
|
||||
Die Einhaltung dieser Prinzipien ist für jede Organisation verpflichtend, die personenbezogene Daten verarbeitet – unabhängig von ihrer Größe oder Branche. Dies umfasst sowohl technische Aspekte der Datenverarbeitung als auch die Informationspflichten gegenüber Betroffenen, wie sie etwa in Datenschutzerklärungen umgesetzt werden müssen.
|
||||
|
||||
#### Umsetzung der Datenschutzanforderungen auf der Webseite [@ris]
|
||||
|
||||
\
|
||||
|
||||
Im Rahmen der Diplomarbeit wurde eine umfassende Analyse der Datenschutzanforderungen durchgeführt und entsprechende Maßnahmen zur Umsetzung auf der Webseite implementiert. Dabei wurden insbesondere die Vorgaben der DSGVO berücksichtigt, um sicherzustellen, dass die Webseite den geltenden Datenschutzbestimmungen entspricht.
|
||||
|
||||
Ein zentrales Element der Umsetzung war die Erstellung einer gesetzeskonformen Datenschutzerklärung. Diese informiert die Nutzerinnen und Nutzer über:
|
||||
|
||||
• die Art der verarbeiteten personenbezogenen Daten,
|
||||
• den Zweck der Datenverarbeitung,
|
||||
• die Rechtsgrundlagen der Verarbeitung,
|
||||
• die Speicherdauer der Daten,
|
||||
• die Weitergabe von Daten an Dritte
|
||||
• sowie über die Rechte der Betroffenen gemäß Art. 15–22 DSGVO.
|
||||
- die Art der verarbeiteten personenbezogenen Daten,
|
||||
- den Zweck der Datenverarbeitung,
|
||||
- die Rechtsgrundlagen der Verarbeitung,
|
||||
- die Speicherdauer der Daten,
|
||||
- die Weitergabe von Daten an Dritte
|
||||
- sowie über die Rechte der Betroffenen gemäß Art. 15–22 DSGVO.
|
||||
|
||||
Die Datenschutzerklärung wird auf der Webseite gut sichtbar eingebunden und ist für alle Nutzerinnen und Nutzer jederzeit zugänglich.
|
||||
|
||||
Neben der Informationspflicht wurden auch technische und organisatorische Maßnahmen umgesetzt, um die Sicherheit der verarbeiteten Daten zu gewährleisten. Dazu gehören unter anderem:
|
||||
|
||||
• Verschlüsselte Übertragung von Daten mittels HTTPS
|
||||
• Passwortgeschützter Zugriff auf sensible Daten
|
||||
• Regelmäßige Sicherheitsupdates der eingesetzten Software
|
||||
• Minimierung der Datenerhebung auf das Notwendige: Es werden nur die Daten erhoben, die für die Funktion der Webseite unbedingt erforderlich sind. (Grundprinzip der Datenminimierung nach Art. 5 Abs. 1 lit. c DSGVO)
|
||||
- Verschlüsselte Übertragung von Daten mittels HTTPS
|
||||
- Passwortgeschützter Zugriff auf sensible Daten
|
||||
- Regelmäßige Sicherheitsupdates der eingesetzten Software
|
||||
- Minimierung der Datenerhebung auf das Notwendige: Es werden nur die Daten erhoben, die für die Funktion der Webseite unbedingt erforderlich sind. (Grundprinzip der Datenminimierung nach Art. 5 Abs. 1 lit. c DSGVO)
|
||||
|
||||
#### Schutz personenbezogener Daten der Benutzer [@dsb]
|
||||
|
||||
\
|
||||
|
||||
Der Schutz personenbezogener Daten der Benutzer stellt einen zentralen Bestandteil der Webseite des Absolventenvereins dar. Sämtliche Datenverarbeitungen erfolgen unter Berücksichtigung der Vorgaben der Datenschutz-Grundverordnung (DSGVO) sowie des österreichischen Datenschutzgesetzes (DSG).
|
||||
|
||||
Gemäß Art. 5 Abs. 1 lit. c DSGVO gilt der Grundsatz der Datenminimierung, wonach nur jene personenbezogenen Daten erhoben werden dürfen, die für den jeweiligen Zweck erforderlich sind. Auf der Webseite werden daher ausschließlich solche Daten verarbeitet, die für die Verwaltung der Mitgliedschaft, die Organisation von Veranstaltungen sowie die Kommunikation mit Absolventinnen und Absolventen notwendig sind.
|
||||
@@ -197,6 +260,8 @@ Durch die Kombination aus klar definierten Rechtsgrundlagen, transparenten Infor
|
||||
|
||||
#### Notwendigkeit von Datensicherung [@bsi_datensicherung][@bsi_grundschutz]
|
||||
|
||||
\
|
||||
|
||||
Die Datensicherung ist ein wesentlicher Bestandteil der Webseite des Absolventenvereins. Sie dient dazu, die auf der Webseite gespeicherten Daten vor Verlust oder Beschädigung zu schützen. Digitale Daten bilden die Grundlage für die Funktion der Webseite und müssen daher regelmäßig gesichert werden. Ein Verlust oder eine Beschädigung der Daten kann zu erheblichen Problemen führen.
|
||||
|
||||
Mögliche Ursachen für einen Datenverlust sind unter anderem Hardwaredefekte, Softwarefehler, menschliches Versagen oder Cyberangriffe. Ohne geeignete Sicherheitsmaßnahmen besteht das Risiko, dass Daten unwiederbringlich verloren gehen oder nur mit erheblichen Kosten wiederhergestellt werden können.
|
||||
@@ -205,6 +270,8 @@ Neben der technischen besteht ebenfalls eine rechtliche und organisatorische Not
|
||||
|
||||
#### Konzeption des Backup-Systems
|
||||
|
||||
\
|
||||
|
||||
Ziel des Backup-Systems war es im Falle eines Datenverlustes oder eines Systemausfalls die Daten wiederherstellen zu können. Es wurde eine Strategie entwickelt die es ermöglicht sowohl die Datenbank als auch die Dateien auf dem Server zu sichern.
|
||||
Der Umfang des Backups besteht aus zwei zentralen Komponenten:
|
||||
|
||||
@@ -316,6 +383,8 @@ Die gewählte Anzahl von 30 Sicherungen ermöglicht es, bei täglicher Ausführu
|
||||
|
||||
#### Implementierung der Backup-Skripte
|
||||
|
||||
\
|
||||
|
||||
Die Implementierung des Backup-Systems erfolgte mittels eines Bash-Skripts, das auf dem Linux-Server ausgeführt wird. Bash eignet sich besonders für administrative Aufgaben, da sie direkten Zugriff auf Systembefehle, Dateien und Prozesse bietet. Das Skript wurde so aufgebaut, dass es robust, automatisierbar und nachvollziehbar arbeitet.
|
||||
|
||||
Zu Beginn des Skripts wird folgende Konfiguration gesetzt:
|
||||
@@ -329,9 +398,9 @@ Die erste Zeile definiert den Interpreter, mit dem das Skript ausgeführt wird.
|
||||
|
||||
Die Anweisung set -euo pipefail erhöht die Sicherheit und Stabilität des Skripts:
|
||||
|
||||
• `-e` beendet das Skript sofort, wenn ein Befehl fehlschlägt
|
||||
• `-u` verhindert die Verwendung nicht definierter Variablen
|
||||
• `-o pipefail` sorgt dafür, dass auch Fehler innerhalb von Befehls-Pipelines erkannt werden
|
||||
- `-e` beendet das Skript sofort, wenn ein Befehl fehlschlägt
|
||||
- `-u` verhindert die Verwendung nicht definierter Variablen
|
||||
- `-o pipefail` sorgt dafür, dass auch Fehler innerhalb von Befehls-Pipelines erkannt werden
|
||||
|
||||
Diese Einstellungen verhindern, dass das Backup bei Fehlern unbemerkt unvollständig ausgeführt wird.
|
||||
|
||||
@@ -365,16 +434,18 @@ Diese Meldungen werden bei automatischer Ausführung über den Cronjob in eine L
|
||||
|
||||
Die Implementierung zeichnet sich durch folgende Eigenschaften aus:
|
||||
|
||||
• vollständige Sicherung von Datenbank und Anwendungsdateien
|
||||
• automatische tägliche Ausführung
|
||||
• integrierte Fehlerbehandlung
|
||||
• strukturierte Archivierung mit Zeitstempel
|
||||
• automatische Speicherverwaltung durch Rotationsmechanismus
|
||||
- vollständige Sicherung von Datenbank und Anwendungsdateien
|
||||
- automatische tägliche Ausführung
|
||||
- integrierte Fehlerbehandlung
|
||||
- strukturierte Archivierung mit Zeitstempel
|
||||
- automatische Speicherverwaltung durch Rotationsmechanismus
|
||||
|
||||
Durch diese Umsetzung wurde ein zuverlässiges und wartbares Backup-System geschaffen, das den kontinuierlichen Betrieb der Webanwendung unterstützt und im Fehlerfall eine schnelle Wiederherstellung ermöglicht.
|
||||
|
||||
#### Wiederherstellung von Daten mittels Restore-Skripten
|
||||
|
||||
\
|
||||
|
||||
Neben der Datensicherung stellt die strukturierte Wiederherstellung der Daten einen zentralen Bestandteil des Backup-Systems dar. Zu diesem Zweck wurde ein eigenes Bash-Skript implementiert, das sowohl die PostgreSQL-Datenbank als auch die Anwendungsdateien aus einem gewählten Backup-Ordner wiederherstellt (Restore-Skript). Ziel war es, einen klar definierten und kontrollierten Prozess zu schaffen, der im Fehlerfall eine vollständige Rücksetzung des Systems ermöglicht.
|
||||
|
||||
Das Skript beginnt – analog zum Backup-Skript – mit einer sicheren Ausführungskonfiguration:
|
||||
@@ -448,6 +519,8 @@ Zusammenfassend ermöglicht das Restore-Skript eine vollständige Rücksetzung d
|
||||
|
||||
#### Fazit zur Datensicherung
|
||||
|
||||
\
|
||||
|
||||
Durch die Implementierung eines automatisierten Backup- und Restore-Systems wurde eine zuverlässige Grundlage für die Datensicherheit der Webanwendung geschaffen. Das entwickelte System ermöglicht eine regelmäßige Sicherung sowohl der PostgreSQL-Datenbank als auch der vollständigen Anwendungsdateien. Durch die automatisierte Ausführung mittels Cronjob wird sichergestellt, dass die Backups ohne manuelles Eingreifen täglich erstellt werden.
|
||||
|
||||
Zusätzlich sorgt das integrierte Rotationsprinzip dafür, dass ältere Sicherungen automatisch entfernt werden und der verfügbare Speicherplatz effizient genutzt wird. Die strukturierte Ablage der Backups mit Zeitstempeln erleichtert die Auswahl eines bestimmten Sicherungsstandes.
|
||||
@@ -460,6 +533,8 @@ Insgesamt stellt das entwickelte Backup-System eine robuste und praxisnahe Lösu
|
||||
|
||||
#### Authentifizierung mittels OAuth 2.0
|
||||
|
||||
\
|
||||
|
||||
Zur Anmeldung auf der entwickelten Webplattform wurde eine Authentifizierung über das Business-Netzwerk LinkedIn implementiert. Dabei kommt das standardisierte Autorisierungsprotokoll OAuth 2.0 zum Einsatz [@rfc6749]. Dieses Verfahren ermöglicht es, Benutzer über externe Identitätsanbieter zu authentifizieren, ohne dass deren Zugangsdaten direkt an die Webanwendung übertragen werden müssen.
|
||||
|
||||
OAuth 2.0 basiert auf dem Prinzip der delegierten Autorisierung. Dabei erlaubt ein Benutzer einer Anwendung, bestimmte Informationen seines Kontos bei einem externen Dienst zu verwenden. Die eigentlichen Zugangsdaten – beispielsweise das LinkedIn-Passwort – verbleiben dabei ausschließlich beim Identitätsanbieter.
|
||||
@@ -476,12 +551,14 @@ Der Vorteil dieses Verfahrens liegt darin, dass die Webanwendung zu keinem Zeitp
|
||||
|
||||
#### Technische Umsetzung der LinkedIn-Anmeldung in Oqtane
|
||||
|
||||
\
|
||||
|
||||
Die technische Umsetzung der LinkedIn-Authentifizierung erfolgte über das integrierte External Login System [@oqtane_about] des Content-Management-Systems Oqtane. Dieses System ermöglicht die Integration externer Identitätsanbieter über standardisierte Protokolle wie OAuth 2.0.
|
||||
|
||||
Für die Verbindung mit LinkedIn wurde zunächst eine Entwickleranwendung im LinkedIn Developer Portal [@linkedin_auth_flow] erstellt. Dabei werden zwei zentrale Zugangsdaten generiert:
|
||||
|
||||
• Client ID
|
||||
• Client Secret
|
||||
- Client ID
|
||||
- Client Secret
|
||||
|
||||
Diese dienen zur Identifikation der Webanwendung gegenüber den LinkedIn-Servern.
|
||||
|
||||
@@ -499,9 +576,9 @@ Zusätzlich wurde eine sogenannte Redirect-URL definiert. Diese URL wird von Lin
|
||||
|
||||
In der Konfiguration wurde außerdem festgelegt, welche Benutzerdaten von LinkedIn übernommen werden sollen. Dazu gehören unter anderem:
|
||||
|
||||
• Benutzername
|
||||
• E-Mail-Adresse
|
||||
• eindeutige Benutzer-ID
|
||||
- Benutzername
|
||||
- E-Mail-Adresse
|
||||
- eindeutige Benutzer-ID
|
||||
|
||||
Diese Daten werden von Oqtane als sogenannte Claims verarbeitet und anschließend dem Benutzerkonto der Plattform zugeordnet.
|
||||
|
||||
@@ -509,18 +586,24 @@ Darüber hinaus wurde in den Einstellungen aktiviert, dass bei der ersten Anmeld
|
||||
|
||||
#### Ablauf des Anmeldeprozesses
|
||||
|
||||
\
|
||||
|
||||
Der eigentliche Anmeldevorgang erfolgt in mehreren aufeinanderfolgenden Schritten. Zunächst wählt der Benutzer auf der Login-Seite der Webplattform die Option zur Anmeldung über LinkedIn aus.
|
||||
|
||||
Daraufhin wird der Benutzer zur LinkedIn-Authentifizierungsseite weitergeleitet. Dort meldet sich der Benutzer mit seinem LinkedIn-Konto an und bestätigt die Autorisierung der Anwendung.
|
||||
|
||||
Nach erfolgreicher Authentifizierung sendet LinkedIn eine Antwort an die zuvor definierte Redirect-URL der Webanwendung. Diese Antwort enthält einen Autorisierungscode, der anschließend vom Server der Webanwendung gegen ein Zugriffstoken ausgetauscht wird.
|
||||
|
||||
Wie in Abschnitt 4.3.1 beschrieben, werden die abgerufenen Profildaten zur Identifikation oder Neuanlage des Benutzerkontos in der lokalen Datenbank verwendet.
|
||||
Wie in Abschnitt 4.4.3.1 beschrieben, werden die abgerufenen Profildaten zur Identifikation oder Neuanlage des Benutzerkontos in der lokalen Datenbank verwendet.
|
||||
|
||||
### Implementierung des Premium-Bereichs
|
||||
|
||||
\
|
||||
|
||||
#### Ziel und Zweck des Premium-Bereichs
|
||||
|
||||
\
|
||||
|
||||
Der Premium-Bereich wurde mit dem Ziel entwickelt, den Mitgliedern des SZU Absolventenvereins einen klar abgegrenzten, exklusiven Bereich innerhalb der VereinsWebseite bereitzustellen. Das Premium-Bereich-Modul ist eine Erweiterung für das Content-Management-System Oqtane und bildet das Kernstück des digitalen Mitgliederbereichs. Es ermöglicht Mitgliedern, sich über das Hochladen eines Ingenieur-Antrags als PDF-Dokument für eine zeitlich begrenzte Premium-Mitgliedschaft zu qualifizieren. Premium-Mitglieder erhalten Zugang zu exklusiven Funktionen wie dem Einsehen genehmigter Anträge anderer Mitglieder sowie einer Mitgliedersuche mit integrierter Kontaktfunktion.
|
||||
|
||||
Der zentrale Zweck besteht darin, einen Anreiz für aktives Engagement im Verein zu schaffen. Dadurch entsteht ein Kreislauf, in dem qualitativ hochwertige Anträge die Wissensbasis der Gemeinschaft bereichern und gleichzeitig den einreichenden Mitgliedern einen konkreten Gegenwert in Form von Premium-Funktionen bieten. Der Premium-Bereich dient darüber hinaus als digitales Netzwerk-Instrument. Durch die Kombination aus Antrags-Einsicht, Mitgliedersuche und Kontaktfunktion wird eine Plattform geschaffen, die den fachlichen Austausch zwischen Absolventen fördert und die Vernetzung innerhalb der Gemeinschaft stärkt. Die zeitliche Begrenzung der Premium-Mitgliedschaft auf 12 Monate sorgt dafür, dass Mitglieder regelmäßig aktiv bleiben und neue Inhalte beitragen, um ihren Premium-Status aufrechtzuerhalten.
|
||||
@@ -556,6 +639,8 @@ graph TD
|
||||
|
||||
#### Funktionalität und Features des Premium-Bereichs
|
||||
|
||||
\
|
||||
|
||||
Der Premium-Bereich umfasst mehrere miteinander verknüpfte Funktionen, die gemeinsam ein geschlossenes System bilden.
|
||||
|
||||
**Ingenieur-Antrags-Workflow**
|
||||
@@ -690,10 +775,14 @@ public class PremiumAreaContext : DBContextBase, ITransientService, IMultiDataba
|
||||
protected override void OnModelCreating(ModelBuilder builder)
|
||||
{
|
||||
base.OnModelCreating(builder);
|
||||
builder.Entity<Models.PremiumArea>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinPremiumArea"));
|
||||
builder.Entity<Models.EngineerApplication>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinEngineerApplications"));
|
||||
builder.Entity<Models.UserPremium>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinUserPremium"));
|
||||
builder.Entity<Models.PremiumEvent>().ToTable(ActiveDatabase.RewriteName("SZUAbsolventenvereinPremiumEvents"));
|
||||
builder.Entity<Models.PremiumArea>().ToTable(
|
||||
ActiveDatabase.RewriteName("SZUAbsolventenvereinPremiumArea"));
|
||||
builder.Entity<Models.EngineerApplication>().ToTable(
|
||||
ActiveDatabase.RewriteName("SZUAbsolventenvereinEngineerApplications"));
|
||||
builder.Entity<Models.UserPremium>().ToTable(
|
||||
ActiveDatabase.RewriteName("SZUAbsolventenvereinUserPremium"));
|
||||
builder.Entity<Models.PremiumEvent>().ToTable(
|
||||
ActiveDatabase.RewriteName("SZUAbsolventenvereinPremiumEvents"));
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -740,6 +829,8 @@ Insgesamt definieren vier Migrationen die Datenbankstruktur: Die erste erstellt
|
||||
|
||||
#### Zugriffsbeschränkung und Benutzerrechte
|
||||
|
||||
\
|
||||
|
||||
Der Zugriff auf den Premium-Bereich wird durch ein mehrstufiges Berechtigungssystem gesteuert, das sowohl auf Server- als auch auf Client-Seite durchgesetzt wird. Die verfügbaren Berechtigungen werden in der `ModuleInfo`-Klasse registriert:
|
||||
|
||||
```C#
|
||||
@@ -817,6 +908,8 @@ Die Zugriffsbeschränkung wird konsequent auf beiden Seiten durchgesetzt: Client
|
||||
|
||||
#### Mehrwert für registrierte Mitglieder
|
||||
|
||||
\
|
||||
|
||||
Der Premium-Bereich schafft einen konkreten Mehrwert für registrierte Mitglieder auf mehreren Ebenen. Auf fachlicher Ebene entsteht durch die gesammelten Ingenieur-Anträge eine wachsende Wissensbasis, die allen Premium-Mitgliedern zugänglich ist. Absolventen können von den Arbeiten anderer Mitglieder lernen, sich inspirieren lassen und fachliche Ansätze vergleichen. Durch die Möglichkeit, Titel und Kurzbeschreibungen zu hinterlegen, können Mitglieder gezielt nach relevanten Themen suchen, ohne jedes PDF-Dokument einzeln öffnen zu müssen.
|
||||
|
||||
Auf sozialer Ebene fördert der Premium-Bereich die Vernetzung innerhalb der Absolventengemeinschaft. Die Mitgliedersuche mit integrierter Kontaktfunktion ermöglicht es, gezielt nach ehemaligen Kommilitonen oder Fachkollegen zu suchen und direkt Kontakt aufzunehmen. Der duale Benachrichtigungsmechanismus — bestehend aus In-App-Nachricht und E-Mail — stellt sicher, dass Kontaktanfragen zuverlässig zugestellt werden und kein Mitglied eine Nachricht verpasst.
|
||||
|
||||
@@ -106,11 +106,11 @@ Um die Interaktion der Benutzer mit den Modulen zu verdeutlichen, wurden folgend
|
||||
|
||||
| ID | Name | Akteur | Beschreibung |
|
||||
| :---- | :---------------------- | :----------------- | :----------------------------------------------------------- |
|
||||
| UC-01 | Veranstaltung erstellen | Administrator | Ein Administrator legt ein neues Absolvententreffen mit Ort und Datum an. |
|
||||
| UC-02 | Zu Event anmelden | Mitglied | Ein Absolvent bestätigt seine Teilnahme an einem Event über die Weboberfläche. |
|
||||
| UC-03 | Inhalt melden | Mitglied | Ein Benutzer meldet einen beleidigenden Post am Schwarzen Brett über den "Melden"-Button. |
|
||||
| UC-04 | Meldung bearbeiten | Moderator | Ein Vorstandsmitglied sichtet eine Meldung und löscht den entsprechenden Beitrag. |
|
||||
| UC-05 | Rundmail versenden | Administrator | Der Vorstand erstellt eine Einladung zur Generalversammlung für alle 500 Mitglieder. |
|
||||
| 1 | Veranstaltung erstellen | Administrator | Ein Administrator legt ein neues Absolvententreffen mit Ort und Datum an. |
|
||||
| 2 | Zu Event anmelden | Mitglied | Ein Absolvent bestätigt seine Teilnahme an einem Event über die Weboberfläche. |
|
||||
| 3 | Inhalt melden | Mitglied | Ein Benutzer meldet einen beleidigenden Post am Schwarzen Brett über den "Melden"-Button. |
|
||||
| 4 | Meldung bearbeiten | Moderator | Ein Vorstandsmitglied sichtet eine Meldung und löscht den entsprechenden Beitrag. |
|
||||
| 5 | Rundmail versenden | Administrator | Der Vorstand erstellt eine Einladung zur Generalversammlung für alle 500 Mitglieder. |
|
||||
|
||||
Table: Wesentliche Use Cases der entwickelten Module
|
||||
|
||||
@@ -219,6 +219,8 @@ Oqtane selbst läuft als Systemd-Service im Kestrel-Backend. Kestrel ist ein kle
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
%%| filename: sequence-diagram-system-architecture
|
||||
%%| fig-cap: Schematische Darstellung der Systemarchitektur
|
||||
participant browser as Client
|
||||
participant nginx as NginX
|
||||
participant oqtane as Oqtane
|
||||
@@ -310,7 +312,8 @@ Der folgende Ablauf zeigt die Kommunikation bei einer typischen Datenabfrage in
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
%
|
||||
%%| filename: sequence-diagram-data-query
|
||||
%%| fig-cap: Schematische Darstellung der Systemarchitektur
|
||||
participant C as Blazor Client (Razor)
|
||||
participant S as Oqtane Server (Controller)
|
||||
participant R as Repository (EntityFramework)
|
||||
@@ -349,6 +352,8 @@ Ausgangslage ist eine Softwarearchitektur im Direct-Dependency-Graph-Modell.
|
||||
|
||||
```mermaid
|
||||
architecture-beta
|
||||
%%| filename: architecture-beta
|
||||
%%| fig-cap: DIP: Direct Dependency Graph
|
||||
service a(mdi:package-variant-closed)[Klasse A]
|
||||
service b(mdi:package-variant-closed)[Klasse B]
|
||||
|
||||
@@ -360,6 +365,8 @@ Das Problem dabei: Die einzelnen Klassen sind eng gekoppelt, was das Austauschen
|
||||
|
||||
```mermaid
|
||||
architecture-beta
|
||||
%%| filename: architecture-beta
|
||||
%%| fig-cap: DIP: Dependency Inversion Principle
|
||||
service a(mdi:package-variant-closed)[Klasse A]
|
||||
service b(mdi:package-variant-closed)[Klasse B]
|
||||
service ib(mdi:car-clutch)[Interface B]
|
||||
@@ -427,6 +434,7 @@ Mit dem Aufruf von `builder.Build()` wird intern ein Dependency Graph erstellt u
|
||||
So sieht der Abhängigkeitsgraph bei diesem Beispiel aus.
|
||||
|
||||
```mermaid
|
||||
%%| fig-cap: DIP: Dependency Inversion Principle Beispiel
|
||||
architecture-beta
|
||||
service a(mdi:package-variant-closed)[Worker]
|
||||
service b(mdi:package-variant-closed)[MessageWriter]
|
||||
@@ -655,6 +663,7 @@ Eine weitere Anforderung der Diplomarbeit war es Einträge in Modulen wie der `H
|
||||
Angestrebt wurde folgender Ablauf für das Melden eines Eintrags:
|
||||
|
||||
```mermaid
|
||||
%%| fig-cap: Reporting System: Ablaufdiagramm
|
||||
sequenceDiagram
|
||||
participant Module
|
||||
actor User
|
||||
@@ -714,10 +723,10 @@ Die Kommunikation zwischen dem Client und dem Server erfolgt über einen REST-AP
|
||||
\
|
||||
|
||||
``` {.mermaid width=50%}
|
||||
%%| filename: erd-event-registration
|
||||
%%| fig-cap: ER Diagramm des Event Registration Moduls
|
||||
erDiagram
|
||||
direction LR
|
||||
%%| filename: erd-event-registration
|
||||
%%| fig-cap: ER Diagramm des Event Registration Moduls
|
||||
EVENT ||--o{ RESPONSE : "has"
|
||||
EVENT {
|
||||
int EventId PK
|
||||
|
||||
@@ -564,6 +564,7 @@ local function code_to_figure (conf)
|
||||
-- Check if a converter exists for this block. If not, return the block
|
||||
-- unchanged.
|
||||
local diagram_type = block.classes[1]
|
||||
print("Diagram type: ", diagram_type)
|
||||
if not diagram_type then
|
||||
return nil
|
||||
end
|
||||
|
||||
26
pandoc-tex.sh
Normal file
26
pandoc-tex.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
pandoc \
|
||||
00-praemble.md \
|
||||
01-toc.md \
|
||||
02-Allgemein.md \
|
||||
03-Diplomarbeitsbuch-individueller-teil-Adam-Gaiswinkler.md \
|
||||
04-Diplomarbeitsbuch-individueller-teil-Florian-Edlmayer.md \
|
||||
05-Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md \
|
||||
97-tabellenverzeichnis.md \
|
||||
98-abbildungsverzeichnis.md \
|
||||
99-bibliographie.md \
|
||||
--number-sections \
|
||||
--lua-filter _extensions/diagram/diagram.lua \
|
||||
--syntax-definition _extensions/razor/razor.xml \
|
||||
--syntax-definition _extensions/nginx/nginx.xml \
|
||||
--citeproc \
|
||||
--bibliography sources.bib \
|
||||
--csl _extensions/sources/tgm.csl \
|
||||
--include-before-body 00_preamble.tex \
|
||||
-H _extensions/header/header.tex \
|
||||
-V geometry:"top=2.5cm, bottom=2cm, left=3cm, right=2cm, a4paper" \
|
||||
-V toc-title="Inhaltsverzeichnis" \
|
||||
-V classoption=twoside \
|
||||
-V fontsize=12pt \
|
||||
-V linestretch=1.5 \
|
||||
-o diplomarbeitsbuch.tex
|
||||
Reference in New Issue
Block a user