') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - StefanRautner/ChatProgram: Chat Programm by Stefan Rautner · GitHub
Skip to content

Repository files navigation

Dokumentation Semesterprojekt Rautner

Softwaredesign (Architektur)

Das Chat-Programm wurde in einer Client-Client-Server-Architektur entwickelt, wobei der Client als WPF-Anwendung oder WebApp implementiert ist und diese beide mit dem Server (welcher auf Spring Boot basiert) kommunizieren. Die Daten werden in einer MongoDB-Datenbank gespeichert.

graph TD;
A[WPF Client] <--> C[Spring Boot Server];
B[Web-App Client] <--> C[Spring Boot Server];
C[Spring Boot Server] <--> D[MongoDB Datenbank];
Loading

Beschreibung der Software

Das Chat-Programm (tinyChat) ermöglicht es Benutzern miteinander in Echtzeit zu chatten. Es bietet eine benutzerfreundliche Oberfläche sowohl als Desktopanwendung (WPF) als auch als Webanwendung. Die Software überträgt die Daten natürlich verschlüsselt, sodass keiner Zugang zu den Benutzerdaten erhalten kann

Funktionen der WebApp

Login

Frontend Login auf der WebApp
In dem Eingabefeld mit dem Placeholder-Text "Benutzername eingeben" gibt man den Benutzernamemn des zu verwendeten Benutzers ein
In dem Eingabefeld mit dem Placeholder-Text "Passwort eingeben" gibt man das Passwort des zu verwendeten Benutzers ein
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Passwort vergessen? Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschen-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drükt, dann wird überprüft, ob der Benutzerexistiert

Registrieren

Frontend Registieren auf der WebApp
In dem Eingabefeld mit dem Placeholder-Text "Benutzername eingeben" gibt man den Benutzernamemn des zu erstellenden Benutzers ein
In dem Eingabefeld mit dem Placeholder-Text "Passwort eingeben" gibt man das Passwort des zu erstellenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Einloggen-Fenster weitergeleitet
Wenn man auf den Passwort vergessen? Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschen-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob noch kein Benutzer mit diesem Namen existiert

Passwort vergessen

Frontend Passwort vergessen auf der WebApp
In dem Eingabefeld mit dem Placeholder-Text "Benutzername eingeben" gibt man den Benutzernamemn des zu aktualisierenden Benutzers ein
In dem Eingabefeld mit dem Placeholder-Text "Passwort eingeben" gibt man das Passwort des zu aktualisierenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Login-Fenster weitergeleitet
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschen-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob ein Benutzer mit diesem Namen existiert

Konto löschen

Frontend Konto löschen auf der WebApp
In dem Eingabefeld mit dem Placeholder-Text "Benutzername eingeben" gibt man den Benutzernamemn des zu löschenden Benutzers ein
In dem Eingabefeld mit dem Placeholder-Text "Passwort eingeben" gibt man das Passwort des zu löschenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Login-Fenster weitergeleitet
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Passwort vergessen? Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob der Benutzer existiert

Hauptfenster

Frontend Haupt-Bildschirm auf der WebApp

Chatnamen-Frontend

In dem Grauen Balken (links) werden alle Chatnamen angezeigt
Wenn auf einen Chatnamen doppelt gedrückt wird, dann wird das Chat-Feld geöffnet
Ebenfalls kann man zum Öffnen des Chat-Feldes den Edit Chat Knopf rechts unten drücken

Nachrichten-Frontend

In dem Weißen Balken (rechts) werden alle Nachrichten des aktuellen Chats angezeigt
Wenn auf eine Nachricht doppelt gedrückt wird, dann wird das Message-Feld geöffnet
Ebenfalls kann man zum Öffnen des Edit Message Knopf rechts unten drücken

Senden-Frontend

In dem Eingabefeld unten mit dem Placeholder-Text "Nachricht eingeben" gibt man den Text für neue Nachrichten ein
Wenn man in diesem Feld auf 'Enter' drückt, dann wird die Nachricht gesendet
Ebenfalls kann man zum Absenden des Text den Send Knopf links unten drücken

Download-Knopf

Wenn der Download Knopf rechts oben gedrückt wird, dann wird die WebApp als Lokales Programm instaliert

Laden eines neuen Chats

Wenn man einmal auf einen Chatnamen drückt, dann wird der Inhalt des Chats rechts in das Nachrichten-Feld eingefügt

Chatfeld

Frontend Chat-Bildschirm auf der WebApp

Chat

In dem Eingabefeld mit dem Placeholder-Text "Neuen Chatnamen eingeben" gibt man den Chatnamen ein
Wenn man auf den Chat hinzufügen Knopf drückt, dann wird ein neuer Chat erstellt
Wenn man auf den Chatnamen aktualisieren Knopf drückt, dann wird der Namen des aktuellen Chats geändert
Wenn man auf den Chat löschen Knopf drückt, dann wird der aktuelle Chat gelöscht

Benutzer

In dem Eingabefeld mit dem Placeholder-Text "Hier Benutzernamen eingeben" gibt man einen Benutzernamen eines anderen Benutzers ein
Wenn man auf den Benutzer hinzufügen Knopf drückt, dann kann man einen anderen Benutzer zum aktuellen Chat hinzufügen
Wenn man auf den Benutzer entfernen Knopf drückt, dann kann man einen anderen Benutzer des aktuellen Chats entfernen

Messagefeld

Frontend Message-Bildschirm auf der WebApp
In dem Eingabefeld mit dem Placeholder-text "Hier neue Nachricht eingeben" gibt man den neuen Inhalt der Nachricht ein
Wenn man auf den Nachricht aktualisieren Knopf drückt, dann wird der Inhalt der Nachricht aktualisiert (ist nur in den ersten 5 Minuten nach Erstellen der Nachricht möglich)
Wenn man auf den Nachricht löschen Knopf drückt, dann wird die aktuelle Nachricht gelöscht

Funktionen der WPF

Login

Frontend Login in WPF
In dem Eingabefeld unter dem Label "Benutzername eingeben" gibt man den Benutzernamemn des zu verwendeten Benutzers ein
In dem Eingabefeld unter dem Label "Passwort eingeben" gibt man das Passwort des zu verwendeten Benutzers ein
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Passwort vergessen Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschen-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob der Benutzer existiert

Registrieren

Frontend Registrieren in WPF
In dem Eingabefeld unter dem Label "Benutzername eingeben" gibt man den Benutzernamemn des zu erstellenden Benutzers ein
In dem Eingabefeld unter dem Label "Passwort eingeben" gibt man das Passwort des zu erstellenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Einloggen-Fenster weitergeleitet
Wenn man auf den Passwort vergessen Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschvben-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob noch kein Benutzer mit dem Namen existiert

Passwort vergessen

Frontend Passwort vergessen in WPF
In dem Eingabefeld unter dem Label "Benutzername eingeben" gibt man den Benutzernamemn des zu aktualisierenden Benutzers ein
In dem Eingabefeld unter dem Label "Passwort eingeben" gibt man das Passwort des zu aktualisierenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Login-Fenster weitergeleitet
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Konto löschen Knopf drückt, dann wird man zum BenutzerLöschen-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob ein Benutzer mit diesem Namen exisitert

Konto löschen

Frontend Konto löschen in WPF
In dem Eingabefeld unter dem Label "Benutzername eingeben" gibt man den Benutzernamemn des zu löschenden Benutzers ein
In dem Eingabefeld unter dem Label "Passwort eingeben" gibt man das Passwort des zu löschenden Benutzers ein
Wenn man auf den Einloggen Knopf drückt, dann wird man zum Login-Fenster weitergeleitet
Wenn man auf den Registrieren Knopf drückt, dann wird man zum Registrieren-Fenster weitergeleitet
Wenn man auf den Passwort vergessen Knopf drückt, dann wird man zum PasswortForgotten-Fenster weitergeleitet
Wenn man in dem Passwort-Feld auf 'Enter' drückt, dann wird überprüft, ob der Benutzer existiert

Hauptfenster

Frontend Haupt-Bildschirm in WPF

Chatnamen-Frontend

In dem linken Balken werden alle Chatnamen angezeigt
Wenn auf einen Chatnamen doppelt gedrückt wird, dann wird das Chat-Feld geöffnet
Ebenfalls kann man zum Öffnen des Chat-Feldes den Chat aktualisieren Knopf links unten drücken

Nachrichten-Frontend

In dem rechten Balken werden alle Nachrichten des aktuellen Chats angezeigt
Wenn auf eine Nachricht doppelt gedrückt wird, dann wird das Message-Feld geöffnet
Ebenfalls kann man zum Öffnen des Nachrichten updaten Knopf rechts obem drücken

Senden-Frontend

In dem Eingabefeld unten mitte, gibt man den Text für neue Nachrichten ein
Wenn man in diesem Feld auf 'Enter' drückt, dann wird die Nachricht gesendet
Ebenfalls kann man zum Absenden des Text den Senden Knopf rechts unten drücken

Laden eines neuen Chats

Wenn man einmal auf einen Chatnamen drückt, dann wird der Inhalt des Chats rechts in das Nachrichten-Feld eingefügt

Chatfeld

Frontend Chat-Bildschirm in WPF

Chat

In dem Eingabefeld unter dem Label "Bitte geben Sie den neuen Namen des Chats ein" gibt man den Chatnamen ein
Wenn man auf den linken Hinzufügen Knopf drückt, dann wird ein neuer Chat erstellt
Wenn man auf den Aktualisieren Knopf drückt, dann wird der Namen des aktuellen Chats geändert
Wenn man auf den linken Entfernen Knopf drückt, dann wird der aktuelle Chat gelöscht

Benutzer

In dem Eingabefeld unter dem Label "Bitte Benutzernamen eingeben" gibt man einen Benutzernamen eines anderen Benutzers ein
Wenn man auf den rechten Hinzufügen Knopf drückt, dann kann man einen anderen Benutzer zum aktuellen Chat hinzufügen
Wenn man auf den rechten BEntfernen Knopf drückt, dann kann man einen anderen Benutzer des aktuellen Chats entfernen

Messagefeld

Frontend Message-Bildschirm in WPF
In dem Eingabefeld unter dem Label "Neuen Nachrichteninhalt eingeben" gibt man den neuen Inhalt der Nachricht ein
Wenn man auf den Aktualisieren Knopf drückt, dann wird der Inhalt der Nachricht aktualisiert (ist nur in den ersten 5 Minuten nach Erstellen der Nachricht möglich)
Wenn man auf den Löschen Knopf drückt, dann wird die aktuelle Nachricht gelöscht

API-Beschreibung

Der Spring-Boot Server basiert auf dem REST-Pinzip, dadurch ermöglicht er den Clients, Nachrichten zu senden, zu empfangen und vieles mehr. (Keine GET-Endpoints, da ich für die Datenübertragung von den Clients an den Server immer den Body verwende & dieses im Web aufgrund von Sicherheitsstandards gesperrt ist)

Die Endpunkte umfassen:

/tinyChat []

Beschreibung: Dieser Endpunkt ist der generelle Endpoint der API, welcher vor dem jeweiligen spezifischen Endpoint geschrieben werden muss.

/checkUser [POST]

Beschreibung: Dieser Endpunkt wird verwendet, um die Zugangsdaten eines Benutzers zu überprüfen.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"password": "Beispiel-Passwort"
}

Return-Wert:

{
"userID": "Beispiel-UserID"
}
/newUser [POST]

Beschreibung: Dieser Endpoint wird verwendet, um einen Neuen Benutzer anzulegen.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"password": "Beispiel-Passwort"
}

Return-Wert:

{
"userID": "Beispiel-UserID"
}
/updateUser [PUT]

Beschreibung: Dieser Endpoint wird verwedent, um das Passwort eines Benutzers zu ändern.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"password": "Beispiel-Passwort"
}

Return-Wert:

{
"userID": "Beispiel-UserID"
}
/deleteUser [DELETE]

Beschreibung: Dieser Endpoint wird verwendet, um einen Benutzer zu löschen.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"password": "Beispiel-Passwort"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/getChatNames [POST]

Beschreibung: Dieser Endpoint wurde verwendet, um die Namen aller Chats eines Benutzers zu erhalten.

JSON-Body:

{
"userID": "Beispiel-userID"
}

Return-Wert:

{
"chatID": "Beispiel-ChatID",
"chatName ": "Beispiel-ChatName"
}
/newChat [POST]

Beschreibung: Dieser Endpoint wurde verwendet, um einen neuen Chat anzulegen.

JSON-Body:

{
"userID": "Beispiel-userID",
"chatName": "Beispiel-Chatnamen"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/updateChatName [PUT]

Beschreibung: Dieser Endpoint wurde verwendet, um den Namen eines Chats zu aktualisieren.

JSON-Body:

{
"chatID": "Beispiel-chatID",
"chatName": "Beispiel-Chatnamen"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/deleteChat [DELETE]

Beschreibung: Dieser Endpoint wurde verwendet, um einen Chat zu löschen.

JSON-Body:

{
"chatID": "Beispiel-chatID"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/addUserToChat [POST]

Beschreibung: Dieser Endpoint wurde verwendet, um einen Benutzer zu einem Chat hinzuzufügen.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"chatID": "Beispiel-chatID"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/removeUserFromChat [DELETE]

Beschreibung: Dieser Endpoint wurde verwendet, um einen Benutzer aus einem Chat zu entfernen.

JSON-Body:

{
"username": "Beispiel-Benutzername",
"chatID": "Beispiel-chatID"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/getMessages [POST]

Beschreibung: Dieser Endpoint wurde verwendet, um alle Nachrichten eines Chats zu erhalten.

JSON-Body:

{
"chatID": "Beispiel-chatID",
"userID": "Beispiel-userID"
}

Return-Wert:

Entweder:
{
"messageID" : "Beispiel-MessageID",
"message": "User (10:50): MessageText"
}
/newMessage [POST]

Beschreibung: Dieser Endpoint wurde verwendet, um eine neue Nachricht zum Chat hinzuzufügen.

JSON-Body:

{
"userID": "Beispiel-userID",
"chatID": "Beispiel-chatID",
"message": "Beispiel-Nachrichtentext"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/updateMessage [PUT]

Beschreibung: Dieser Endpoint wurde verwendet, um den Inhalt einer Nachricht zu aktualisieren (geht nur in den ersten 5 Minuten nch erstellen der Nachricht).

JSON-Body:

{
"userID": "Beispiel-userID",
"chatID": "Beispiel-chatID",
"messageID": "Beispiel-messageID",
"message": "Beispiel-Nachrichtentext"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"
/deleteMessage [DELETE]

Beschreibung: Dieser Endpoint wurde verwendet, um eine Nachricht aus einem Chat zu löschen.

JSON-Body:

{
"userID": "Beispiel-userID",
"chatID": "Beispiel-chatID",
"messageID": "Beispiel-messageID"
}

Return-Wert:

Entweder:
 "true"
Oder:
 "false"

Verwendung der API

Unterhalb ist die Topologie, MongoDB-Konfiguration & Code-Blöcke, welche das Login des ChatProgramms darstellen

Topologie für Login im ChatProgramm

classDiagram
MongoDB-Datenbank -- Spring-Boot-Server
Spring-Boot-Server -- WPF-Client
Spring-Boot-Server -- WebApp-Client
WPF-Client o-- Login_WPF
WebApp-Client o-- Login_WebApp
Loading

MongoDB-Datenbank

Beschreibung: Wie die Daten eines Users in der MongoDB-Datenbank gespeichert werden

Java-Endpoint:

 {
"_id": {
"$oid": "6641a7948e718f7024ff96b0"
},
"username": "test",
"password": "G0ErqvuApy3nJmRBlxGYuxagJxPzUdwhCIcpb64v2+KZxAODXBX9LUynj1as/qDAnG2XZBUQqLCSD1romJX6agKlrDn1WhIyRe7tQc/mYq8=",
"_class": "org.example.server_springboot.User"
}
Spring-Boot Server

Beschreibung: Login von dem Spring-Boot Server aus

Java-Endpoint:

@PostMapping("/checkUser")
publicStringcheckUser(@RequestBodyStringbody) {
JSONObjectjsonBody = newJSONObject(body);
returnchatService.checkUser(jsonBody.getString("username"), jsonBody.getString("password"));
}

Java-Backend:

//UserID aus MongoDB erhaltenpublicStringcheckUser(Stringusername, Stringpassword) {
Useruser = userRepository.findUserByUsernameAndPassword(username, this.encrypt(password));
if (user != null) {
returnuser.getUserID();
}
returnnull;
}
WPF-Client

Beschreibung: Login von dem WPF-Client aus

C#-Code:

//Benutzerdaten überprüfenasyncpublicTask<string?>Login(stringname,stringpasswort){try{//Username & Passwort an den Server schickenRestRequestrequest=newRestRequest("/checkUser",Method.Post);varbody=new{username=name,password=this.Hash(passwort)};request.AddJsonBody(body);//Antwort (userID oder "" erhalten)RestResponse?response=awaitclient.ExecuteAsync(request);returnresponse.Content;}catch(Exceptionex){//MessageBox zum Anzeigen der Error-MessageMessageBox.Show(ex.Message);}returnnull;}
WebApp-Client

Beschreibung: Login von dem WebApp-Client aus

JS-Code:

//Benutzerdaten überprüfenasyncfunctioncheckUserExistence(event){try{event.preventDefault();//Benutzername & Passwort erhaltenconstusername=document.getElementById("usernameLogin").value;constpassword=document.getElementById("passwordLogin").value;//Überprüfen, ob die Url zum Server in localStorage gesetzt wurdeif(localStorage.getItem('urlToSpringBootServer')!==null&&localStorage.getItem('urlToSpringBootServer')!==""){//Überprpfen, ob Benutzername & Passwort richtig eingegeben wurdeif(username!==null&&username!==""&&password!==null&&password!==""){//Anfrage an den Server sendenconstresponse=awaitfetch(`${localStorage.getItem('urlToSpringBootServer')}/checkUser`,{method: 'POST',body: JSON.stringify({'username': username,'password': awaithash(password)})});//Login-Form leerendocument.getElementById("usernameLogin").value="";document.getElementById("passwordLogin").value="";//Antwort erhaltenconstdata=awaitresponse.text();//Wenn userID und nicht "" erhalten, dann weiter zu Homeif(data!==null&&data!==""){localStorage.setItem('userID',data);localStorage.setItem('webAppStatus',"active");window.location.href='../home/home.html'+localStorage.getItem('urlParameter');}else{//Anzeigen, dass Anmeldedaten falsch warenalert("Anmeldung fehlgeschlagen");}}else{//Anzeigen, dass Benutzername und/oder Passwort nicht eingegeben wurdealert("Bitte geben Sie einen Benutzernamen und Passwort ein");}}else{//Anzeigen, dass der Server nicht erreicht werden aknn (weil die Url fehlt)alert("Server konnte nicht erreicht werden");}}catch(error){//Error in Console loggenconsole.error(error);}}

Diskussion der Ergebnisse

Nach ca. 2 Monaten und 3620 Zeilen Code in mehreren verschiedenen Programmier- & Scriptsprachen stelle ich die Erste Version meines ChatProgramms (tinyChat) vor. Das Chatprogramm hat eine intuative Benutzeroberfläche und eine Echtzeitkommunikation. Durch die Entwicklung der Clients in verschidenen Technologien (WPF & WebApp) ist die Unterstützung für sämtliche Platformen gegeben. Die Daten werden sicher in einer MongoDB-Datenbank gespeichert. Das Passwort wird im jeweiligen Client gehashed und im Server nochmals mit AES (= Advanced Encryption Service) verschlüsselt. Durch die Verschlüsselte Übertragung sind die Benutzerdaten von Fremdzugriffen gesichert.

Zusammenfassung

tinyChat stellt eine intuitive Benutzeroberfläche für sämtliche Platformen zur Verfügung. Die REST-API des Spring-Boot Servers ermöglicht die Echtzeitkommunikation zwischen den Clients und der Datenbank.

Hintergründe

Bei der Entwicklung der Chatprogramms wurde der Fokus auf Sicherheit der Benutzerdaten und Benutzerfreundlichkeit gelegt. Durch die Verwendung aktueller Technologien wie Spring-Boot, WPF, HTML, CSS, JSON & JavaScript wird die zukünftige Unterstützung gewährleistet. Die Nutzung einer MongoDB-Datenbank sorgt ebenfalls für die sichere Speicherung der Daten & effiziente Datenverwaltung.

Ausblicke

In Zukunft soll das Chatprogramm auch Dateienübertragung (Foto, Video & Audio) unterstützen. Ebenfalls soll ein Benachrichtigungssystem implementiert werden. Durch Einbeziehen des Benutzerfeedbacks wird die Benutzerfreundlichkeit ebenfalls stark erhöht werden. tinyChat soll in Zukunft eine führende Plattform für sichere und benutzerfreundliche Echtzeitkommunikation werden.

Diagramme

Klassendiagramm des WPF-Clients

classDiagram
Home o-- Login
Home o-- Register
Home o-- PaswordForgotten
Home o-- Delete
Home o-- Chat
Home o-- Message
Loading

Klassendiagramm des WebApp-Clients

classDiagram
Home o-- Login-Register-PasswortForgotten-Delete
Home o-- Chat
Home o-- Message
Loading

Klassendiagramm des Spring-Boot Servers

classDiagram
Application o-- ChatController
ChatController o-- ChatService
ChatService o-- User
ChatService o-- Chat
ChatService o-- Message
ChatService o-- UserRepository
ChatService o-- ChatRepository
ChatService o-- MessageRepository
MongoDBRepository <-- ChatRepository
MongoDBRepository <-- MessageRepository
MongoDBRepository <-- UserRepository
Loading

Quellenverzeichnis

Spring-Boot Server

WPF-Client

WebApp-Client

MongoDB Datenbank

IDE & Nuggets

About

Chat Programm by Stefan Rautner

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages