This commit is contained in:
2026-03-20 19:18:45 +01:00
15 changed files with 464 additions and 176 deletions

16
00-praemble.md Normal file
View File

@@ -0,0 +1,16 @@
\newpage
# Kurzfassung {.unnumbered .unlisted}
Hier steht die Kurzfassung der Diplomarbeit.
\cleardoublepage
# Abstract {.unnumbered .unlisted}
Hier steht der Abstract der Diplomarbeit.
\cleardoublepage
\pagestyle{empty}
\pagenumbering{arabic}
\setcounter{page}{1}

View File

@@ -93,36 +93,6 @@ Wien, am 26.03.2026 & & \hrulefill \\
& & Konstantin Hintermayer
\end{tabular}
\newpage
\section*{Kurzfassung}
Die vorliegende Diplomarbeit dokumentiert die Konzeption, Planung und Entwicklung der Webanwendung „AlumniHub“, einer zentralen Plattform für den Absolventenverein der Höheren Technischen Bundeslehr- und Versuchsanstalt (HTL) Schulzentrum Ungargasse (SZU). Die Ausgangslage des Projekts war die dezentrale und stark manuelle Verwaltung von rund 300 Alumni mittels CSV-Dateien sowie das Auslaufen einer bestehenden Lizenz für Event-Anmeldungen. Der Fokus des Projekts lag darauf, ein modernes, barrierefreies, skalierbares und zukunftssicheres System zu schaffen. Es sollte nicht nur ein reines Verwaltungstool sein, sondern eine interaktive Plattform, die die Kommunikation, die Veranstaltungsorganisation und vor allem das professionelle Networking nachhaltig vereint.
Die technische Realisierung der Software erfolgte unter Anwendung agiler Projektmanagement-Methoden (Scrum) auf Basis moderner Webtechnologien aus dem Microsoft-Ökosystem. Hauptsächlich kam das auf ASP.NET Core und Blazor aufbauende Content-Management-System (CMS) Oqtane zum Einsatz. Durch dessen modulare Architektur wurden die spezifischen Anforderungen des Absolventenvereins in Form von individuell entwickelten Modulen von Grund auf neu programmiert und nahtlos in ein Gesamtsystem integriert.
Die Teammitglieder teilten sich die Umsetzung des Projekts in klar abgegrenzte, spezialisierte Verantwortungsbereiche auf:
**Konstantin Hintermayer** (Product Owner) verantwortete als Projektleiter die Konzeption und Bereitstellung der Server-Infrastruktur unter Linux (inklusive Evaluation von Hosting-Anbietern und Migration zu LiveDesign). Er entwickelte die Datenbankarchitektur mit PostgreSQL, implementierte automatisierte Sicherheitsbackups (Disaster Recovery) sowie eine kontinuierliche Bereitstellungspipeline (CI/CD) über Gitea Actions. Inhaltlich programmierte er die Module für das digitale „Schwarze Brett“ als Kommunikationsdrehscheibe und entwickelte automatisierte Modulfunktionen wie grafische Datenauswertungen der Registrierungen sowie tägliche E-Mail-Rundschreiben.
**Adam Gaiswinkler** konzentrierte sich auf das Frontend und die Benutzeroberfläche. Er entwickelte ein spezifisches, komplett responsives Oqtane-Theme, das stark am offiziellen Schuldesign orientiert ist, und legte dabei besonderen Wert auf eine herausragende User Experience (UX), auch auf mobilen Endgeräten. Zudem implementierte er ein interaktives Anmeldetool für Veranstaltungen sowie das Modul „Hall of Fame“, in dem herausragende berufliche Werdegänge von Absolventinnen und Absolventen in Szene gesetzt werden. Dabei integrierte er eine Lösung für dynamische, maßgeschneiderte PDF-Profil-Exporte via QuestPDF.
**Florian Edlmayer** konzipierte und entwickelte das Herzstück für erweiterte Zugriffsrechte: Einen exklusiven Premiumbereich. Dieses Feature beinhaltet neben einer zielgerichteten Mitgliedersuche samt Kontaktfunktion auch einen vollständig nachvollziehbaren, digitalen Freigabeworkflow für Ingenieursanträge der Absolventen. Zusätzlich sorgte er durch die Ausarbeitung einer umfassenden Datenschutzerklärung für die notwendige rechtliche Konformität nach DSGVO-Richtlinien und übernahm die informationelle Sicherheit der Plattform, indem er Single-Sign-On Mechanismen über OAuth 2.0 (LinkedIn-Login) sowie rollenbasierte Rechte logisch integrierte.
Als Gesamtergebnis der Arbeit entstand eine leistungsstarke, sicher gehostete und hochgradig benutzerfreundliche Plattform, die den administrativen Aufwand aufseiten des Vereins signifikant reduziert. Den Absolventen der HTL Ungargasse wird durch „AlumniHub“ ein zentraler, digitaler Ort geboten, um miteinander vernetzt zu bleiben, von einem gegenseitigen Erfahrungsaustausch zu profitieren und ihre Karrieren aktiv in die Schulgemeinschaft einzubinden.
\cleardoublepage
\section*{Abstract}
This diploma thesis documents the design, planning, and development of the web application "AlumniHub," a centralized digital platform created for the alumni association of the HTL Ungargasse (SZU). The project was initiated to replace the decentralized and highly manual management of approximately 300 alumni, previously handled via simple CSV files, and to provide a new solution for event registrations due to the expiration of a critical software license. The primary goal of the project was to establish a modern, accessible, scalable, and future-proof system. It was designed not merely to function as an administrative tool, but to act as an interactive ecosystem that sustainably unifies member communication, event organization, and professional networking.
Technically, the software was realized using agile project management methodologies (Scrum) and advanced web technologies rooted in the Microsoft ecosystem. The core foundation was the Oqtane Content Management System (CMS), built securely on ASP.NET Core and Blazor. Oqtane's modular software architecture enabled the team to code custom features tailored to the exact requirements of the alumni association from scratch and integrate them seamlessly into a cohesive platform.
The project team strategically partitioned the workload into highly specialized areas of responsibility:
**Konstantin Hintermayer** (Product Owner) operated as the project manager, taking charge of the conceptualization and deployment of the server infrastructure on Linux OS (including the evaluation of hosting providers and subsequent migration to LiveDesign). He designed the relational database architecture using PostgreSQL, implemented automated security backups (Disaster Recovery routines), and configured continuous integration and deployment (CI/CD) workflows via Gitea Actions. In terms of software development, he built the digital "Blackboard" (Schwarzes Brett) module acting as a dynamic communication hub, alongside features for graphical data analytics and scheduled automated email digests.
**Adam Gaiswinkler** dedicated his efforts to the frontend and user interface design. He developed a fully responsive, custom Oqtane theme closely aligned with the school's corporate design, placing a strong emphasis on providing an exceptional User Experience (UX) across desktop and mobile devices. Furthermore, he engineered an interactive event registration tool and created the "Hall of Fame" module, an area dedicated to showcasing the outstanding career progressions of former students. For this module, he innovatively integrated an automated, customized PDF profile generation engine based on QuestPDF.
**Florian Edlmayer** was the lead architect and developer for the implementation of advanced access protocols via the creation of an exclusive Premium Area. This expansive module introduces targeted member search functionalities and implements a completely digital, transparent approval workflow for engineering applications submitted by graduates. Recognizing the critical importance of data privacy, he also drafted comprehensive data protection guidelines ensuring strict compliance with the General Data Protection Regulation (GDPR). To robustly secure the application infrastructure, he integrated Role-Based Access Controls alongside Single Sign-On (SSO) authentication mechanisms, leveraging OAuth 2.0 (specifically LinkedIn login).
The resulting product is a high-performing, securely hosted, and remarkably user-friendly platform that considerably minimizes the administrative burden previously borne by the association. Above all, "AlumniHub" serves as a central, digital home for the graduates of HTL Ungargasse, reliably ensuring they stay connected, share valuable professional experiences, and maintain an active relationship with their broader school community.
\newpage
\pagenumbering{arabic}
\
\setcounter{page}{1}
\makeatletter
\renewcommand{\tableofcontents}{%
\@starttoc{toc}%

View File

@@ -1,4 +1,4 @@
\pagestyle{empty}
\cleardoublepage
# Inhaltsverzeichnis {.unnumbered .unlisted}

View File

@@ -42,27 +42,27 @@ In diesem Kapitel werden die Technologien und Werkzeuge vorgestellt, die für di
### C# und ASP.NET Core
C# ist eine moderne Programmiersprache von Microsoft, die besonders für die Entwicklung von Webanwendungen und Softwaresystemen geeignet ist. Sie ist klar strukturiert, gut lesbar und weit verbreitet in der professionellen Softwareentwicklung. ASP.NET Core ist ein Framework also eine Art Werkzeugkasten das auf C# aufbaut und die Entwicklung von Webseiten und Webanwendungen vereinfacht. Es stellt vorgefertigte Bausteine bereit, sodass man nicht alles von Grund auf neu programmieren muss. Für AlumniHub bildete ASP.NET Core die technische Grundlage aller entwickelten Module.
C# ist eine moderne Programmiersprache von Microsoft, die besonders für die Entwicklung von Webanwendungen und Softwaresystemen geeignet ist. Sie ist klar strukturiert, gut lesbar und weit verbreitet in der professionellen Softwareentwicklung. ASP.NET Core ist ein Framework also eine Art Werkzeugkasten das auf C# aufbaut und die Entwicklung von Webseiten und Webanwendungen vereinfacht [@aspnet_core_docs]. Es stellt vorgefertigte Bausteine bereit, sodass man nicht alles von Grund auf neu programmieren muss. Für AlumniHub bildete ASP.NET Core die technische Grundlage aller entwickelten Module.
### Blazor
Blazor ist ein Framework, das es ermöglicht, interaktive Weboberflächen direkt in C# zu entwickeln. Normalerweise werden solche Oberflächen also alles, was der Benutzer auf dem Bildschirm sieht und mit dem er interagiert mit einer anderen Programmiersprache namens JavaScript umgesetzt. Blazor erlaubt es, dasselbe in C# zu schreiben, was die Entwicklung vereinheitlicht und übersichtlicher macht. Konkret bedeutet das: Wenn ein Benutzer beispielsweise auf den „Zusagen"-Button klickt, reagiert die Seite sofort und aktualisiert sich automatisch ohne dass die gesamte Seite neu geladen werden muss.
Blazor ist ein Framework, das es ermöglicht, interaktive Weboberflächen direkt in C# zu entwickeln. Normalerweise werden solche Oberflächen also alles, was der Benutzer auf dem Bildschirm sieht und mit dem er interagiert mit einer anderen Programmiersprache namens JavaScript umgesetzt. Blazor erlaubt es, dasselbe in C# zu schreiben, was die Entwicklung vereinheitlicht und übersichtlicher macht [@blazor_docs]. Konkret bedeutet das: Wenn ein Benutzer beispielsweise auf den „Zusagen"-Button klickt, reagiert die Seite sofort und aktualisiert sich automatisch ohne dass die gesamte Seite neu geladen werden muss.
### Oqtane
Oqtane ist ein Content-Management-System (CMS) also eine Software, mit der Webseiten und deren Inhalte verwaltet werden können, ähnlich wie WordPress oder Typo3. Das Besondere an Oqtane ist, dass es vollständig auf Blazor und C# aufbaut und eine modulare Architektur besitzt: Man kann eigene Erweiterungen sogenannte Module entwickeln und in das System einbinden, ohne den Kern der Software verändern zu müssen. Für AlumniHub wurde Oqtane als Grundlage gewählt, weil es Benutzerverwaltung, Seitenstruktur und viele weitere Standardfunktionen bereits mitbringt und somit viel Entwicklungsaufwand spart.
Oqtane ist ein Content-Management-System (CMS) also eine Software, mit der Webseiten und deren Inhalte verwaltet werden können, ähnlich wie WordPress oder Typo3. Das Besondere an Oqtane ist, dass es vollständig auf Blazor und C# aufbaut und eine modulare Architektur besitzt: Man kann eigene Erweiterungen sogenannte Module entwickeln und in das System einbinden, ohne den Kern der Software verändern zu müssen. Für AlumniHub wurde Oqtane als Grundlage gewählt, weil es Benutzerverwaltung, Seitenstruktur und viele weitere Standardfunktionen bereits mitbringt und somit viel Entwicklungsaufwand spart [@oqtane_about].
### Bootstrap und CSS
CSS (Cascading Style Sheets) ist die Sprache, mit der das Aussehen einer Webseite festgelegt wird also Farben, Schriftarten, Abstände und das Layout. Bootstrap ist eine fertige Sammlung von CSS-Regeln und Hilfsmitteln, die von Twitter entwickelt wurde und kostenlos verfügbar ist. Der große Vorteil von Bootstrap ist, dass es sogenanntes Responsive Design einfach umsetzbar macht: Die Webseite passt sich automatisch an verschiedene Bildschirmgrößen an egal ob Desktop, Tablet oder Smartphone. Für AlumniHub wurde Bootstrap als Basis verwendet, ergänzt durch eigenes CSS für das individuelle Erscheinungsbild der Plattform.
CSS (Cascading Style Sheets) ist die Sprache, mit der das Aussehen einer Webseite festgelegt wird also Farben, Schriftarten, Abstände und das Layout. Bootstrap ist eine fertige Sammlung von CSS-Regeln und Hilfsmitteln, die von Twitter entwickelt wurde und kostenlos verfügbar ist. Der große Vorteil von Bootstrap ist, dass es sogenanntes Responsive Design einfach umsetzbar macht: Die Webseite passt sich automatisch an verschiedene Bildschirmgrößen an egal ob Desktop, Tablet oder Smartphone. Für AlumniHub wurde Bootstrap als Basis verwendet, ergänzt durch eigenes CSS für das individuelle Erscheinungsbild der Plattform [@bootstrap].
### QuestPDF
QuestPDF ist eine kostenlose Open-Source-Bibliothek also eine fertige Programmsammlung die es ermöglicht, PDF-Dokumente direkt aus C#-Code heraus zu erstellen. Anstatt ein PDF manuell zu gestalten, beschreibt man im Code wie das Dokument aussehen soll, und QuestPDF generiert daraus automatisch eine fertige PDF-Datei. Im Hall-of-Fame-Modul wurde QuestPDF eingesetzt, um jedem Absolventen zu ermöglichen, sein eigenes Profil als visuell ansprechendes PDF herunterzuladen.
QuestPDF ist eine kostenlose Open-Source-Bibliothek also eine fertige Programmsammlung die es ermöglicht, PDF-Dokumente direkt aus C#-Code heraus zu erstellen. Anstatt ein PDF manuell zu gestalten, beschreibt man im Code wie das Dokument aussehen soll, und QuestPDF generiert daraus automatisch eine fertige PDF-Datei. Im Hall-of-Fame-Modul wurde QuestPDF eingesetzt, um jedem Absolventen zu ermöglichen, sein eigenes Profil als visuell ansprechendes PDF herunterzuladen [@questpdf].
### Gitea
Wenn mehrere Personen gemeinsam an einem Softwareprojekt arbeiten, braucht man ein System, das alle Änderungen am Code nachverfolgt und verhindert, dass sich Änderungen verschiedener Personen gegenseitig überschreiben. Dieses Konzept nennt sich Versionskontrolle. Gitea ist eine selbst gehostete Plattform für genau diesen Zweck ähnlich wie GitHub, aber auf einem eigenen Server betrieben. Jede Änderung am Code wird als sogenannter „Commit" gespeichert, sodass man jederzeit nachvollziehen kann, wer wann was geändert hat, und bei Bedarf auf eine ältere Version zurückwechseln kann.
Wenn mehrere Personen gemeinsam an einem Softwareprojekt arbeiten, braucht man ein System, das alle Änderungen am Code nachverfolgt und verhindert, dass sich Änderungen verschiedener Personen gegenseitig überschreiben. Dieses Konzept nennt sich Versionskontrolle. Gitea ist eine selbst gehostete Plattform für genau diesen Zweck ähnlich wie GitHub, aber auf einem eigenen Server betrieben [@gitea_about]. Jede Änderung am Code wird als sogenannter „Commit" gespeichert, sodass man jederzeit nachvollziehen kann, wer wann was geändert hat, und bei Bedarf auf eine ältere Version zurückwechseln kann.
### Entwicklungsumgebung
@@ -420,23 +420,3 @@ Langfristig könnte die Plattform um eine automatische E-Mail-Benachrichtigung e
AlumniHub bietet als Plattform eine solide Grundlage, die in den kommenden Jahren kontinuierlich erweitert werden kann, um den Absolventenverein der HTL Ungargasse langfristig digital zu unterstützen.
---
### Quellen
Microsoft: ASP.NET Core Documentation. https://learn.microsoft.com/en-us/aspnet/core/ [Zugriff: 17.03.2026]
Microsoft: Blazor Documentation. https://learn.microsoft.com/en-us/aspnet/core/blazor/ [Zugriff: 17.03.2026]
Microsoft: Entity Framework Core Migrations. https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/ [Zugriff: 17.03.2026]
Oqtane Framework: https://www.oqtane.org/ [Zugriff: 17.03.2026]
Oqtane Developer Documentation: https://docs.oqtane.org/ [Zugriff: 17.03.2026]
QuestPDF Open Source Library: https://www.questpdf.com/ [Zugriff: 17.03.2026]
Bootstrap Framework: https://getbootstrap.com/ [Zugriff: 17.03.2026]
Gitea Open Source Git Service: https://about.gitea.com/ [Zugriff: 17.03.2026]
LiveDesign Hosting, Design & Branding: https://livedesign.at/ [Zugriff: 17.03.2026]

View File

@@ -132,7 +132,7 @@ Für die sichere Anmeldung über externe Identitätsanbieter wurde das Protokoll
### Datenschutz und rechtliche Grundlagen
#### Bedeutung der Datenschutz-Grundverordnung (DSGVO) [^1]
#### 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.
@@ -153,7 +153,7 @@ Die DSGVO enthält dabei zentral die Grundsätze der Datenverarbeitung (Art. 5 D
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 Website [^2]
#### Umsetzung der Datenschutzanforderungen auf der Website [@ris]
Im Rahmen der Diplomarbeit wurde eine umfassende Analyse der Datenschutzanforderungen durchgeführt und entsprechende Maßnahmen zur Umsetzung auf der Website implementiert. Dabei wurden insbesondere die Vorgaben der DSGVO berücksichtigt, um sicherzustellen, dass die Website den geltenden Datenschutzbestimmungen entspricht.
@@ -175,7 +175,7 @@ Neben der Informationspflicht wurden auch technische und organisatorische Maßna
• Regelmäßige Sicherheitsupdates der eingesetzten Software
• Minimierung der Datenerhebung auf das Notwendige: Es werden nur die Daten erhoben, die für die Funktion der Website unbedingt erforderlich sind. (Grundprinzip der Datenminimierung nach Art. 5 Abs. 1 lit. c DSGVO)
#### Schutz personenbezogener Daten der Benutzer [^3]
#### Schutz personenbezogener Daten der Benutzer [@dsb]
Der Schutz personenbezogener Daten der Benutzer stellt einen zentralen Bestandteil der Website des Absolventenvereins dar. Sämtliche Datenverarbeitungen erfolgen unter Berücksichtigung der Vorgaben der Datenschutz-Grundverordnung (DSGVO) sowie des österreichischen Datenschutzgesetzes (DSG).
@@ -195,7 +195,7 @@ Durch die Kombination aus klar definierten Rechtsgrundlagen, transparenten Infor
### Backup & Restore
#### Notwendigkeit von Datensicherung [^4][^5]
#### Notwendigkeit von Datensicherung [@bsi_datensicherung][@bsi_grundschutz]
Die Datensicherung ist ein wesentlicher Bestandteil der Website des Absolventenvereins. Sie dient dazu, die auf der Website gespeicherten Daten vor Verlust oder Beschädigung zu schützen. Digitale Daten bilden die Grundlage für die Funktion der Website und müssen daher regelmäßig gesichert werden. Ein Verlust oder eine Beschädigung der Daten kann zu erheblichen Problemen führen.
@@ -460,7 +460,7 @@ 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 [^6]. Dieses Verfahren ermöglicht es, Benutzer über externe Identitätsanbieter zu authentifizieren, ohne dass deren Zugangsdaten direkt an die Webanwendung übertragen werden müssen.
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,9 +476,9 @@ 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 [^8] des Content-Management-Systems Oqtane. Dieses System ermöglicht die Integration externer Identitätsanbieter über standardisierte Protokolle wie OAuth 2.0.
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 [^7] erstellt. Dabei werden zwei zentrale Zugangsdaten generiert:
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
@@ -916,21 +916,3 @@ Darüber hinaus kann die Plattform auch zur Organisation von Veranstaltungen gen
Langfristig kann die Plattform zu einem zentralen digitalen Treffpunkt für Absolventinnen und Absolventen werden. Besonders im beruflichen Umfeld kann ein starkes Alumni-Netzwerk einen großen Mehrwert bieten, beispielsweise durch den Austausch von Erfahrungen oder beruflichen Möglichkeiten.
Insgesamt besitzt die entwickelte Plattform ein großes Zukunftspotenzial. Durch kontinuierliche Erweiterungen und die aktive Nutzung durch die Mitglieder kann sie zu einem wichtigen Instrument für die Vernetzung und Weiterentwicklung des Absolventenvereins werden.
## Quellenverzeichnis
[^1]: DSGVO Datenschutz-Grundverordnung: https://eur-lex.europa.eu/eli/reg/2016/679/ [Zugriff: 19.03.2026]
[^2]: RIS Rechtsinformationssystem des Bundes: https://www.ris.bka.gv.at/ [Zugriff: 19.03.2026]
[^3]: DSB Österreichische Datenschutzbehörde: https://dsb.gv.at/ [Zugriff: 19.03.2026]
[^4]: Datensicherung und Datenverlust: https://www.bsi.bund.de/DE/Themen/Verbraucherinnen-und-Verbraucher/Informationen-und-Empfehlungen/Cyber-Sicherheitsempfehlungen/Daten-sichern-verschluesseln-und-loeschen/Datensicherung-und-Datenverlust/Datensicherung-wie-geht-das/datensicherung-wie-geht-das_node.html [Zugriff: 19.03.2026]
[^5]: BSI Bundesamt für Sicherheit in der Informationstechnik: _IT-Grundschutz-Kompendium CON.3: Datensicherungskonzept._ URL: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Grundschutz/Kompendium/IT_Grundschutz_Kompendium_Edition2023.pdf [Zugriff: 19.03.2026]
[^6]: IETF RFC 6749 The OAuth 2.0 Authorization Framework: https://datatracker.ietf.org/doc/html/rfc6749 [Zugriff: 19.03.2026]
[^7]: LinkedIn Developer Documentation Authorization Code Flow: https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow [Zugriff: 19.03.2026]
[^8]: Oqtane Framework External Login: https://docs.oqtane.org/ [Zugriff: 19.03.2026]

View File

@@ -1,3 +1,5 @@
\cleardoublepage
# Tabellenverzeichnis
\listoftables

View File

@@ -1,3 +1,5 @@
\cleardoublepage
# Abbildungsverzeichnis
\listoffigures

View File

@@ -1,3 +1,5 @@
\cleardoublepage
# Quellenverzeichnis
::: {#refs}

View File

@@ -7,6 +7,28 @@
\usepackage[hidelinks]{hyperref}
\setlength{\emergencystretch}{3em} % Prevent overfull lines
\usepackage{tocloft}
% Dotted lines for all levels in TOC
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}
\renewcommand{\cftsubsecleader}{\cftdotfill{\cftdotsep}}
\renewcommand{\cftsubsubsecleader}{\cftdotfill{\cftdotsep}}
% Bold section numbers and names
\renewcommand{\cftsecfont}{\bfseries}
\renewcommand{\cftsecpagefont}{\bfseries}
% Adjust vertical spacing before sections
\setlength{\cftbeforesecskip}{0.5em}
\usepackage{fvextra}
\fvset{breaklines=true}
\usepackage{needspace}
\let\oldShaded\Shaded
\let\oldendShaded\endShaded
\renewenvironment{Shaded}{\needspace{8\baselineskip}\oldShaded}{\oldendShaded}
\usepackage{fancyhdr}
% Define the fancy style but don't activate yet

230
_extensions/sources/tgm.csl Normal file
View File

@@ -0,0 +1,230 @@
<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="note" default-locale="de-DE" version="1.0" demote-non-dropping-particle="sort-only">
<info>
<title>TGM Wien Diplomarbeit (Deutsch)</title>
<id>http://www.zotero.org/styles/tgm-wien-diplom</id>
<link href="http://www.zotero.org/styles/tgm-wien-diplom" rel="self"/>
<link href="http://www.tgm.ac.at/" rel="documentation"/>
<author>
<name>Gabriele Schachinger</name>
<email>gs@i-gs.at</email>
</author>
<category citation-format="note"/>
<category field="social_science"/>
<updated>2021-02-10T05:28:52+00:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="de">
<terms>
<term name="et-al">u.a.</term>
<term name="and">und</term>
<term name="retrieved">zugegriffen am</term>
<term name="accessed">abgerufen am</term>
<term name="ibid">ebenda</term>
<term name="page" form="short">S.</term>
<term name="section" form="short">Abs.</term>
<term name="editor" form="verb-short">hrsg. von</term>
<term name="editor" form="short">(Hrsg.)</term>
</terms>
</locale>
<!--
macro definitions
author
editor
accessed
date
year-date
pages
point-locators
point-locators-subsequent
hasUrl
-->
<macro name="author">
<names variable="author">
<name and="text" name-as-sort-order="all" sort-separator=", " delimiter=", " delimiter-precedes-last="never"/>
<label form="short" text-case="lowercase" strip-periods="true"/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
</substitute>
</names>
</macro>
<macro name="editor">
<names variable="editor translator">
<name and="text" name-as-sort-order="all" sort-separator=", " delimiter=", " delimiter-precedes-last="never"/>
<label form="short" prefix=" " strip-periods="true"/>
</names>
</macro>
<macro name="accessed">
<text term="accessed"/>
<date variable="accessed" prefix=" ">
<date-part form="numeric-leading-zeros" name="day" suffix="."/>
<date-part form="numeric-leading-zeros" name="month" suffix="."/>
<date-part form="long" name="year"/>
</date>
</macro>
<macro name="date">
<choose>
<if variable="issued">
<date variable="issued">
<date-part form="numeric-leading-zeros" name="day" suffix="."/>
<date-part form="numeric-leading-zeros" name="month" suffix="."/>
<date-part form="long" name="year"/>
</date>
</if>
<else>
<date variable="accessed">
<date-part form="numeric-leading-zeros" name="day" suffix="."/>
<date-part form="numeric-leading-zeros" name="month" suffix="."/>
<date-part form="long" name="year"/>
</date>
</else>
</choose>
</macro>
<macro name="year-date">
<choose>
<if type="webpage">
<choose>
<if variable="issued">
<date variable="issued">
<date-part name="year"/>
</date>
</if>
<else>
<date variable="accessed">
<date-part name="year"/>
</date>
</else>
</choose>
</if>
<else>
<date variable="issued">
<date-part name="year"/>
</date>
</else>
</choose>
</macro>
<macro name="pages">
<label variable="locator" form="short" prefix=", " suffix=" "/>
<text variable="page"/>
</macro>
<macro name="point-locators">
<label variable="locator" form="short" prefix=", " suffix=" "/>
<text variable="locator"/>
</macro>
<macro name="point-locators-subsequent">
<group>
<choose>
<if locator="page" match="none">
<choose>
<if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<choose>
<if variable="volume">
<group>
<text term="volume" form="short" text-case="lowercase" suffix=" "/>
<number variable="volume" form="numeric"/>
<label variable="locator" form="short" prefix=", "/>
</group>
</if>
<else>
<label variable="locator" form="short" suffix=" "/>
</else>
</choose>
</if>
</choose>
</if>
<else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<number variable="volume" form="numeric" suffix=":"/>
</else-if>
</choose>
<label variable="locator" form="short" suffix=" "/>
<text variable="locator"/>
</group>
</macro>
<macro name="hasUrl">
<choose>
<if variable="URL" match="any">
<text value="yes"/>
</if>
<else>
<text value="no"/>
</else>
</choose>
</macro>
<citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true">
<layout delimiter="; " suffix=".">
<choose>
<if position="ibid">
<text term="ibid"/>
<text macro="point-locators-subsequent" prefix=", "/>
</if>
<else>
<text macro="author"/>
<text macro="year-date" prefix=" (" suffix=")"/>
<text macro="point-locators"/>
<choose>
<if variable="URL" match="any">
<text value="(siehe Internet-/Intranetverzeichnis)" prefix=" "/>
</if>
</choose>
</else>
</choose>
</layout>
</citation>
<bibliography hanging-indent="true">
<sort>
<key macro="hasUrl"/>
<key macro="author"/>
<key macro="date"/>
</sort>
<layout suffix=".">
<group font-weight="bold">
<text macro="author"/>
<text macro="year-date" prefix=" (" suffix="):" font-weight="bold"/>
</group>
<text variable="title" prefix=" "/>
<choose>
<if type="webpage">
<text macro="date" prefix=", "/>
</if>
<else-if type="speech" match="any">
<text variable="publisher-place" prefix=", "/>
<text macro="date" prefix=", "/>
<text macro="accessed" prefix=", "/>
</else-if>
<else-if type="article-newspaper article-magazine article-journal" match="any">
<text value=" In: " font-style="italic"/>
<text variable="container-title" font-style="italic"/>
<text variable="collection-title" prefix=", Reihe "/>
<text variable="volume" prefix=", Band "/>
<text variable="issue" prefix=", Ausgabe "/>
<text macro="date" prefix=", "/>
<text macro="pages"/>
</else-if>
<else-if type="chapter paper-conference" match="any">
<text macro="editor" prefix=", in: " suffix=": "/>
<text variable="container-title" font-style="italic"/>
<text variable="publisher-place" prefix=", "/>
<text variable="edition" prefix=", "/>
<text macro="year-date" prefix=", "/>
<text macro="pages"/>
</else-if>
<else>
<text variable="edition" prefix=", "/>
<text variable="publisher-place" prefix=", "/>
<text variable="publisher" prefix=", "/>
<text macro="year-date" prefix=", "/>
</else>
</choose>
<choose>
<if variable="URL">
<text macro="accessed" prefix=", "/>
<text variable="URL" prefix=", "/>
</if>
</choose>
<text variable="ISBN" prefix=", ISBN: "/>
<text variable="DOI" prefix=", DOI: "/>
<text variable="note" prefix=", "/>
</layout>
</bibliography>
</style>

View File

@@ -2,6 +2,6 @@
include_toc: true
gitea: none
lang: de-DE
csl: ieee.csl
csl: _extensions/sources/tgm.csl
link-citations: true
---

View File

@@ -1,10 +1,11 @@
#!/bin/bash
pandoc \
00-toc.md \
01-Allgemein.md \
02-Diplomarbeitsbuch-individueller-teil-Adam-Gaiswinkler.md \
03-Diplomarbeitsbuch-individueller-teil-Florian-Edlmayer.md \
04-Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md \
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 \
@@ -13,6 +14,7 @@ pandoc \
--syntax-definition _extensions/razor/razor.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" \

View File

@@ -169,3 +169,83 @@
year = {2024},
urldate = {2026-03-19}
}
@online{aspnet_core_docs,
title = {ASP.NET Core Documentation},
url = {https://learn.microsoft.com/en-us/aspnet/core/},
author = {{Microsoft}},
year = {2026},
urldate = {2026-03-17}
}
@online{blazor_docs,
title = {Blazor Documentation},
url = {https://learn.microsoft.com/en-us/aspnet/core/blazor/},
author = {{Microsoft}},
year = {2026},
urldate = {2026-03-17}
}
@online{ef_core_migrations,
title = {Entity Framework Core Migrations},
url = {https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/},
author = {{Microsoft}},
year = {2026},
urldate = {2026-03-17}
}
@online{questpdf,
title = {QuestPDF Open Source Library},
url = {https://www.questpdf.com/},
author = {{QuestPDF}},
year = {2026},
urldate = {2026-03-17}
}
@online{bootstrap,
title = {Bootstrap Framework},
url = {https://getbootstrap.com/},
author = {{Bootstrap}},
year = {2026},
urldate = {2026-03-17}
}
@online{gitea_about,
title = {Gitea Open Source Git Service},
url = {https://about.gitea.com/},
author = {{Gitea}},
year = {2026},
urldate = {2026-03-17}
}
@online{livedesign,
title = {LiveDesign Hosting, Design & Branding},
url = {https://livedesign.at/},
author = {{LiveDesign}},
year = {2026},
urldate = {2026-03-17}
}
@online{bsi_grundschutz,
title = {IT-Grundschutz-Kompendium CON.3: Datensicherungskonzept},
url = {https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Grundschutz/Kompendium/IT_Grundschutz_Kompendium_Edition2023.pdf},
author = {{BSI}},
year = {2023},
urldate = {2026-03-19}
}
@online{rfc6749,
title = {IETF RFC 6749 The OAuth 2.0 Authorization Framework},
url = {https://datatracker.ietf.org/doc/html/rfc6749},
author = {{IETF}},
year = {2012},
urldate = {2026-03-19}
}
@online{linkedin_auth_flow,
title = {LinkedIn Developer Documentation Authorization Code Flow},
url = {https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow},
author = {{Microsoft}},
year = {2026},
urldate = {2026-03-19}
}