Finale-Version

master
Eldar Sabic 2025-01-11 14:12:50 +01:00
parent 1741131f7b
commit c0d33f1aa9
13 changed files with 892 additions and 148 deletions

View File

@ -7,76 +7,85 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String userRole = authenticateUser(username, password);
String userRole = authenticateUser(username, password);
if ("Mitarbeiter".equals(userRole)) {
// Weiterleitung zur Mitarbeiter-Seite
response.sendRedirect("mitarbeiter.jsp");
} else if ("Chef".equals(userRole)) {
// Weiterleitung zur Chef-Seite
response.sendRedirect("chef.jsp");
} else {
// Zurück zur Login-Seite mit Fehlermeldung
request.setAttribute("errorMessage", "Ungültige Anmeldedaten!");
request.getRequestDispatcher("startseite.jsp").forward(request, response);
}
}
if ("Mitarbeiter".equals(userRole)) {
// Weiterleitung zur Mitarbeiter-Seite
response.sendRedirect("mitarbeiter.jsp");
} else if ("Chef".equals(userRole)) {
// Weiterleitung zur Chef-Seite
response.sendRedirect("chef.jsp");
} else {
// Zurück zur Login-Seite mit Fehlermeldung
request.setAttribute("errorMessage", "Ungültige Anmeldedaten!");
request.getRequestDispatcher("startseite.jsp").forward(request, response);
}
}
/**
* Authentifiziert den Benutzer in der Datenbank.
*
* @param username Der Benutzername (E-Mail in der Datenbank)
* @param password Das Passwort
* @return Die Benutzerrolle ("Mitarbeiter", "Chef") oder null, wenn ungültig
*/
private String authenticateUser(String username, String password) {
String role = null;
/**
* Authentifiziert den Benutzer in der Datenbank.
*
* @param username Der Benutzername (E-Mail in der Datenbank)
* @param password Das Passwort
* @return Die Benutzerrolle ("Mitarbeiter", "Chef") oder null, wenn ungültig
*/
private String authenticateUser(String username, String password) {
String role = null;
String mitarbeiterQuery = "SELECT 'Mitarbeiter' as role FROM mitarbeiter WHERE email = ? AND password = ?";
String chefQuery = "SELECT 'Chef' as role FROM chef WHERE email = ? AND password = ?";
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
// Mitarbeiter-Check
try (PreparedStatement mitarbeiterStmt = conn.prepareStatement(mitarbeiterQuery)) {
mitarbeiterStmt.setString(1, username);
mitarbeiterStmt.setString(2, password);
String mitarbeiterQuery = "SELECT 'Mitarbeiter' as role FROM mitarbeiter WHERE email = ? AND password = ?";
String chefQuery = "SELECT 'Chef' as role FROM chef WHERE email = ? AND password = ?";
try (ResultSet rs = mitarbeiterStmt.executeQuery()) {
if (rs.next()) {
role = rs.getString("role");
return role;
}
}
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
// Mitarbeiter-Check
try (PreparedStatement mitarbeiterStmt = conn.prepareStatement(mitarbeiterQuery)) {
mitarbeiterStmt.setString(1, username);
mitarbeiterStmt.setString(2, password);
// Chef-Check
try (PreparedStatement chefStmt = conn.prepareStatement(chefQuery)) {
chefStmt.setString(1, username);
chefStmt.setString(2, password);
try (ResultSet rs = mitarbeiterStmt.executeQuery()) {
if (rs.next()) {
role = rs.getString("role");
return role;
}
}
}
try (ResultSet rs = chefStmt.executeQuery()) {
if (rs.next()) {
role = rs.getString("role");
}
}
}
// Chef-Check
try (PreparedStatement chefStmt = conn.prepareStatement(chefQuery)) {
chefStmt.setString(1, username);
chefStmt.setString(2, password);
} catch (SQLException e) {
e.printStackTrace();
}
return role;
}
}
try (ResultSet rs = chefStmt.executeQuery()) {
if (rs.next()) {
role = rs.getString("role");
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return role;
}
}

View File

@ -0,0 +1,129 @@
package com.cafe.verwaltung;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
@WebServlet("/AktualisiereDatenServlet")
public class AktualisiereDatenServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String mitarbeiterNr = request.getParameter("mitarbeiterNr");
if (mitarbeiterNr == null || mitarbeiterNr.isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "MitarbeiterNr fehlt.");
return;
}
response.setContentType("text/plain;charset=UTF-8");
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
String query = "SELECT m.mitarbeiterNr, m.vorname, m.nachname, m.telefonNr, m.email, " +
"m.strasse, m.hausnummer, m.ortsNr AS ort, m.password " +
"FROM Mitarbeiter m " +
"WHERE m.mitarbeiterNr = ?";
try (PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setInt(1, Integer.parseInt(mitarbeiterNr));
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
String csvOutput = String.join(",",
rs.getString("mitarbeiterNr"),
rs.getString("vorname"),
rs.getString("nachname"),
rs.getString("telefonNr"),
rs.getString("email"),
rs.getString("strasse"),
rs.getString("hausnummer"),
rs.getString("ort"),
rs.getString("password")
);
response.getWriter().print(csvOutput);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Mitarbeiter nicht gefunden.");
}
}
}
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Datenbankfehler: " + e.getMessage());
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// Parameter aus der Anfrage lesen
String mitarbeiterNr = request.getParameter("mitarbeiterNr");
String vorname = request.getParameter("vorname");
String nachname = request.getParameter("nachname");
String telefonNr = request.getParameter("telefonNr");
String email = request.getParameter("email");
String strasse = request.getParameter("strasse");
String hausnummer = request.getParameter("hausnummer");
String ortsNr = request.getParameter("ort");
String password = request.getParameter("password");
// Überprüfung, ob alle Felder gefüllt sind
if (mitarbeiterNr == null || mitarbeiterNr.isEmpty() ||
vorname == null || vorname.isEmpty() ||
nachname == null || nachname.isEmpty() ||
telefonNr == null || telefonNr.isEmpty() ||
email == null || email.isEmpty() ||
strasse == null || strasse.isEmpty() ||
hausnummer == null || hausnummer.isEmpty() ||
ortsNr == null || ortsNr.isEmpty() ||
password == null || password.isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Alle Felder müssen ausgefüllt sein.");
return;
}
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
String query = "UPDATE Mitarbeiter SET vorname = ?, nachname = ?, telefonNr = ?, email = ?, " +
"strasse = ?, hausnummer = ?, ortsNr = ?, password = ? WHERE mitarbeiterNr = ?";
try (PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, vorname);
stmt.setString(2, nachname);
stmt.setString(3, telefonNr);
stmt.setString(4, email);
stmt.setString(5, strasse);
stmt.setString(6, hausnummer);
stmt.setInt(7, Integer.parseInt(ortsNr));
stmt.setString(8, password);
stmt.setInt(9, Integer.parseInt(mitarbeiterNr));
int rowsUpdated = stmt.executeUpdate();
if (rowsUpdated > 0) {
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write("Mitarbeiterdaten erfolgreich aktualisiert.");
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Mitarbeiter nicht gefunden.");
}
}
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Datenbankfehler: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,46 @@
package com.cafe.verwaltung;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
@WebServlet("/LoeschenMitarbeiterServlet")
public class LoeschenMitarbeiterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String mitarbeiterNr = request.getParameter("mitarbeiterNr");
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
if (mitarbeiterNr == null || mitarbeiterNr.isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Ungültige Mitarbeiter-Nr.");
return;
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
String query = "DELETE FROM Mitarbeiter WHERE mitarbeiterNr = ?";
try (PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setInt(1, Integer.parseInt(mitarbeiterNr));
stmt.executeUpdate();
response.setStatus(HttpServletResponse.SC_OK);
}
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Datenbankfehler: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,63 @@
package com.cafe.verwaltung;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
@WebServlet("/MitarbeiterDatenServlet")
public class MitarbeiterDatenServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/plain;charset=UTF-8");
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try (PrintWriter out = response.getWriter()) {
try (Connection conn = DriverManager.getConnection(DB_URL)) {
String query = "SELECT m.mitarbeiterNr, m.vorname, m.nachname, m.telefonNr, m.email, " +
"m.strasse, m.hausnummer, o.name AS ort, o.plz, m.password " +
"FROM Mitarbeiter m " +
"JOIN Orte o ON m.ortsNr = o.ortsNr " +
"ORDER BY m.mitarbeiterNr";
try (PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery()) {
StringBuilder csvOutput = new StringBuilder();
csvOutput.append("mitarbeiterNr,vorname,nachname,telefonNr,email,strasse,hausNr,ort,plz,password\n");
while (rs.next()) {
csvOutput.append(rs.getInt("mitarbeiterNr")).append(",")
.append(rs.getString("vorname")).append(",")
.append(rs.getString("nachname")).append(",")
.append(rs.getString("telefonNr")).append(",")
.append(rs.getString("email")).append(",")
.append(rs.getString("strasse")).append(",")
.append(rs.getString("hausnummer")).append(",")
.append(rs.getString("ort")).append(",")
.append(rs.getString("plz")).append(",")
.append(rs.getString("password")).append("\n");
}
out.print(csvOutput.toString());
}
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Datenbankfehler: " + e.getMessage());
}
}
}
}

View File

@ -0,0 +1,80 @@
package com.cafe.verwaltung;
import jakarta.servlet.ServletException;
import java.sql.*;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/NeuerMitarbeiterServlet")
public class NeuerMitarbeiterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:sqlite:C:/Users/asus/personal.db";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String vorname = request.getParameter("vorname");
String nachname = request.getParameter("nachname");
String telefonNr = request.getParameter("telefonNr");
String email = request.getParameter("email");
String strasse = request.getParameter("strasse");
String hausNr = request.getParameter("hausnummer");
String ortsnr = request.getParameter("ort");
String password = request.getParameter("password");
/*
System.out.println("Vorname: " + vorname);
System.out.println("Nachname: " + nachname);
System.out.println("TelefonNr: " + telefonNr);
System.out.println("Email: " + email);
System.out.println("Strasse: " + strasse);
System.out.println("HausNr: " + hausNr);
System.out.println("Ort: " + ortsnr);
System.out.println("Password: " + password);
*/
// Validierung: Überprüfe, ob Pflichtfelder null oder leer sind
if (isEmpty(vorname) || isEmpty(nachname) || isEmpty(telefonNr) ||
isEmpty(email) || isEmpty(strasse) || isEmpty(hausNr) ||
isEmpty(ortsnr) || isEmpty(password)) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write("Bitte alle Felder ausfüllen.");
return;
}
try (Connection conn = DriverManager.getConnection(DB_URL)) {
String query = "INSERT INTO mitarbeiter (vorname, nachname, telefonNr, email, strasse, hausnummer, ortsNr, password) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, vorname);
stmt.setString(2, nachname);
stmt.setString(3, telefonNr);
stmt.setString(4, email);
stmt.setString(5, strasse);
stmt.setString(6, hausNr);
stmt.setInt(7, Integer.parseInt(ortsnr)); // Konvertiere Ort zu Integer
stmt.setString(8, password);
stmt.executeUpdate();
response.setStatus(HttpServletResponse.SC_OK);
}
} catch (NumberFormatException e) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write("Fehler: " + e.getMessage());
} catch (SQLException e) {
e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().write("Datenbankfehler: " + e.getMessage());
}
}
private boolean isEmpty(String value) {
return value == null || value.trim().isEmpty();
}
}

View File

@ -70,4 +70,36 @@
<servlet-mapping>
<servlet-name>SchichtenDatenServlet</servlet-name>
<url-pattern>/SchichtenDatenServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MitarbeiterDatenServlet</servlet-name>
<servlet-class>com.cafe.verwaltung</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MitarbeiterDatenServlet</servlet-name>
<url-pattern>/MitarbeiterDatenServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoeschenMitarbeiterServlet</servlet-name>
<servlet-class>com.cafe.verwaltung</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoeschenMitarbeiterServlet</servlet-name>
<url-pattern>/LoeschenMitarbeiterServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NeuerMitarbeiterServlet</servlet-name>
<servlet-class>com.cafe.verwaltung</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NeuerMitarbeiterServlet</servlet-name>
<url-pattern>/NeuerMitarbeiterServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AktualisiereDatenServlet</servlet-name>
<servlet-class>com.cafe.verwaltung</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AktualisiereDatenServlet</servlet-name>
<url-pattern>/AktualisiereDatenServlet</url-pattern>
</servlet-mapping></web-app>

View File

@ -29,8 +29,7 @@
<ul>
<li><a href="/Projekt_SE2/chef.jsp" class="aktiv"><i class="fa-solid fa-house"></i> Startseite</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/schichtenPlan.jsp"><i class="fa-solid fa-calendar-days"></i> Schichtenplan</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/produktVerwaltung.jsp"><i class="fa-solid fa-folder"></i> Produktverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="#" onclick="openLogoutPopup()"><i class="fa-solid fa-right-to-bracket"></i> Abmelden</a></li>
</ul>
</div>
@ -55,7 +54,7 @@
Hier kannst du alles verwalten, was dein Lokal so besonders macht.<br>
In der vertrauten und professionellen Umgebung<br>
hast du die Kontrolle über alle Abläufe.<br>
<strong>Pflege die Speise- und Getränkekarte, verwalte deine Mitarbeiter<br>
<strong>Verwalte deine Mitarbeiter<br>
und behalte den Überblick über die Schichtpläne.</strong><br>
Falls du Unterstützung brauchst, steht dir unser Support-Team jederzeit zur Verfügung.<br>
Wir freuen uns, dich auf dem Weg zum Erfolg begleiten zu dürfen.<br>

View File

@ -29,8 +29,7 @@
<ul>
<li><a href="/Projekt_SE2/chef.jsp"><i class="fa-solid fa-house"></i> Startseite</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/schichtenPlan.jsp"><i class="fa-solid fa-calendar-days"></i> Schichtenplan</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp" class="aktiv"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/produktVerwaltung.jsp"><i class="fa-solid fa-folder"></i> Produktverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp" class="aktiv"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="#" onclick="openLogoutPopup()"><i class="fa-solid fa-right-to-bracket"></i> Abmelden</a></li>
</ul>
</div>
@ -49,16 +48,96 @@
</div>
</div>
</div>
<!-- Popup für Mitarbeiterverwaltung -->
<div id="popupOverlay" style="display: none;">
<div id="popupContent">
<h3 id="popupMessage">Neuen Mitarbeiter hinzufügen</h3>
<form id="mitarbeiterForm">
<label for="vorname">Vorname:</label>
<input type="text" id="vorname" name="vorname" placeholder="Vorname eingeben" required /><br><br>
<label for="nachname">Nachname:</label>
<input type="text" id="nachname" name="nachname" placeholder="Nachname eingeben" required /><br><br>
<label for="telefon">Telefonnummer:</label>
<input type="text" id="telefonNr" name="telefonNr" placeholder="Telefonnummer eingeben" required /><br><br>
<label for="email">E-Mail:</label>
<input type="email" id="email" name="email" placeholder="E-Mail eingeben" required /><br><br>
<label for="strasse">Straße:</label>
<input type="text" id="strasse" name="strasse" placeholder="Straße eingeben" required /><br><br>
<label for="hausnummer">Hausnummer:</label>
<input type="text" id="hausnummer" name="hausnummer" placeholder="Hausnummer eingeben" required /><br><br>
<label for="ort">Ort:</label>
<input type="number" id="ort" name="ort" placeholder="Ort eingeben (1, 2, 3)" required /><br>
<small>Hinweis: 1 = Mannheim, 2 = Schwetzingen, 3 = Heidelberg</small><br><br>
<label for="password">Passwort:</label>
<input type="password" id="password" name="password" placeholder="Passwort eingeben" required /><br><br>
<button type="button" id="popupConfirmButton">Speichern</button>
<button type="button" onclick="closePopup()">Abbrechen</button>
</form>
</div>
</div>
<!-- Popup für Nachrichten -->
<div id="messagePopup" class="popup" style="display: none;">
<div class="popup-content">
<h3 id="messagePopupMessage"></h3>
<button type="button" onclick="closeMessagePopup()">OK</button>
</div>
</div>
<div id="errorPopup" class="popup" style="display: none;">
<div class="popup-content">
<h3 id="errorPopupMessage"></h3>
<button type="button" onclick="closeErrorPopup()">OK</button>
</div>
</div>
<div class="willkommenstext">
<p>
<span class="einleitung">Willkommen zur Mitarbeiterverwaltung<br>vom EJSS Palast</span><br>
<strong>Hier kannst du alle deine Mitarbeiter verwalten, ihre Daten einsehen und deren Passwörter aktuellisieren.</strong><br>
<strong>Hier kannst du alle deine Mitarbeiter verwalten, ihre Daten einsehen und aktualisieren.</strong><br>
Falls du Unterstützung brauchst, steht dir unser Support-Team jederzeit zur Verfügung.<br>
Wir freuen uns, dich auf dem Weg zum Erfolg begleiten zu dürfen.<br>
<em>Dein EJSS Palast Admin-Team</em>
</p>
</div>
<h2>Mitarbeiterverwaltung</h2>
<table id="mitarbeiterTabelle">
<thead>
<tr>
<th>Mitarbeiter-Nr</th>
<th>Vorname</th>
<th>Nachname</th>
<th>Telefon</th>
<th>Email</th>
<th>Straße</th>
<th>Haus-Nr</th>
<th>Ort</th>
<th>PLZ</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
<!-- Dynamische Inhalte -->
</tbody>
</table>
<div style="text-align: center; margin-top: 20px;">
<button id="neuerMitarbeiterButton" onclick="neuerMitarbeiter()">Neuer Mitarbeiter</button>
</div>
</main>
<a href="#Anfang"><h4>Zurück zum Anfang</h4></a>
<footer>
@ -74,7 +153,8 @@
<a href="tel:004962012345678" class="call-icon"><i class="fa-solid fa-phone"></i></a>
</div>
</footer>
<script src="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltungScript.js"></script>
<script src="/Projekt_SE2/chefFunktionen/chefScript.js"></script>
</body>
</html>

View File

@ -0,0 +1,257 @@
document.addEventListener("DOMContentLoaded", () => {
loadMitarbeiter();
});
function loadMitarbeiter() {
fetch("/Projekt_SE2/MitarbeiterDatenServlet")
.then(response => response.text())
.then(csv => {
const rows = csv.trim().split("\n").slice(1); // Überspringe die Kopfzeile
const tbody = document.querySelector("#mitarbeiterTabelle tbody");
tbody.innerHTML = "";
rows.forEach(row => {
const columns = row.split(",");
const tr = document.createElement("tr");
tr.innerHTML = `
<td>${columns[0]}</td> <!-- Mitarbeiter-Nr -->
<td>${columns[1]}</td> <!-- Vorname -->
<td>${columns[2]}</td> <!-- Nachname -->
<td>${columns[3]}</td> <!-- Telefon -->
<td>${columns[4]}</td> <!-- Email -->
<td>${columns[5]}</td> <!-- Straße -->
<td>${columns[6]}</td> <!-- Hausnummer -->
<td>${columns[7]}</td> <!-- Ort -->
<td>${columns[8]}</td> <!-- Passwort -->
<td>
<button onclick="bearbeitenMitarbeiter(${columns[0]})">Bearbeiten</button>
<button onclick="loeschenMitarbeiter(${columns[0]})">Löschen</button>
</td>
`;
tbody.appendChild(tr);
});
})
.catch(error => showPopup("Fehler beim Laden der Mitarbeiter: " + error.message));
}
function neuerMitarbeiter() {
document.getElementById("popupOverlay").style.display = "flex";
document.getElementById("popupMessage").innerText = "Neuen Mitarbeiter hinzufügen";
clearPopupFields();
document.getElementById("popupConfirmButton").onclick = () => {
const newMitarbeiter = {
vorname: document.getElementById("vorname").value.trim(),
nachname: document.getElementById("nachname").value.trim(),
telefonNr: document.getElementById("telefonNr").value.trim(),
email: document.getElementById("email").value.trim(),
strasse: document.getElementById("strasse").value.trim(),
hausnummer: document.getElementById("hausnummer").value.trim(),
ort: document.getElementById("ort").value.trim(),
password: document.getElementById("password").value.trim()
};
if (Object.values(newMitarbeiter).some(value => value === "")) {
showPopup("Fehler: Bitte alle Felder ausfüllen.");
return;
}
fetch("/Projekt_SE2/NeuerMitarbeiterServlet", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams(newMitarbeiter).toString()
})
.then(response => {
if (response.ok) {
loadMitarbeiter();
closePopup();
showPopup("Neuer Mitarbeiter erfolgreich hinzugefügt!");
} else {
showPopup("Fehler beim Hinzufügen des Mitarbeiters.");
}
})
.catch(error => showPopup("Fehler beim Hinzufügen: " + error.message));
};
}
function bearbeitenMitarbeiter(mitarbeiterNr) {
fetch(`/Projekt_SE2/AktualisiereDatenServlet?mitarbeiterNr=${mitarbeiterNr}`)
.then(response => response.text())
.then(csv => {
const rows = csv.trim().split("\n");
if (rows.length === 0 || rows[0] === "") {
throw new Error("Keine Mitarbeiterdaten gefunden.");
}
const mitarbeiterData = rows[0].split(",");
if (mitarbeiterData.length < 9) {
throw new Error("Ungültige CSV-Daten erhalten.");
}
// Felder mit den CSV-Daten füllen
document.getElementById("vorname").value = mitarbeiterData[1];
document.getElementById("nachname").value = mitarbeiterData[2];
document.getElementById("telefonNr").value = mitarbeiterData[3];
document.getElementById("email").value = mitarbeiterData[4];
document.getElementById("strasse").value = mitarbeiterData[5];
document.getElementById("hausnummer").value = mitarbeiterData[6];
document.getElementById("ort").value = mitarbeiterData[7];
document.getElementById("password").value = mitarbeiterData[8];
// Popup anzeigen
document.getElementById("popupOverlay").style.display = "flex";
document.getElementById("popupMessage").innerText = "Mitarbeiter bearbeiten";
// Speichern-Funktion setzen
document.getElementById("popupConfirmButton").onclick = () => {
saveMitarbeiter(mitarbeiterNr); // Erfolgsmeldung wird in saveMitarbeiter angezeigt
};
})
.catch(error => showPopup("Fehler beim Laden der Mitarbeiterdetails: " + error.message));
}
function saveMitarbeiter(mitarbeiterNr) {
// Debug-Ausgabe zur Verfolgung
// console.log("Speichern von Mitarbeiter:", mitarbeiterNr);
// Sammeln der Formulardaten
const formData = {
vorname: document.getElementById("vorname").value.trim(),
nachname: document.getElementById("nachname").value.trim(),
telefonNr: document.getElementById("telefonNr").value.trim(),
email: document.getElementById("email").value.trim(),
strasse: document.getElementById("strasse").value.trim(),
hausnummer: document.getElementById("hausnummer").value.trim(),
ort: document.getElementById("ort").value.trim(),
password: document.getElementById("password").value.trim()
};
// Validierung: Überprüfen, ob alle Felder ausgefüllt sind
const unfilledFields = Object.entries(formData).filter(([key, value]) => !value);
if (unfilledFields.length > 0) {
const fehlendeFelder = unfilledFields.map(([key]) => key).join(", ");
showPopup(`Fehler: Die folgenden Felder sind leer: ${fehlendeFelder}`);
return;
}
// URL je nach Kontext (Aktualisierung oder Neuerstellung)
const servletURL = mitarbeiterNr
? `/Projekt_SE2/AktualisiereDatenServlet`
: "/Projekt_SE2/NeuerMitarbeiterServlet";
// Bei Update wird die MitarbeiterNr angehängt
if (mitarbeiterNr) {
formData.mitarbeiterNr = mitarbeiterNr;
}
// Debug-Ausgabe der Daten
console.log("Gesendete Daten:", formData);
fetch(servletURL, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams(formData).toString() // Daten in x-www-form-urlencoded-Format umwandeln
})
.then(response => {
if (!response.ok) {
// Fehlertext vom Server lesen
return response.text().then((text) => {
throw new Error(text);
});
}
const successMessage = mitarbeiterNr
? "Mitarbeiter erfolgreich aktualisiert!"
: "Neuer Mitarbeiter erfolgreich hinzugefügt!";
showPopup(successMessage);
closePopup();
loadMitarbeiter(); // Tabelle neu laden
})
.catch((error) => showPopup("Fehler beim Speichern: " + error.message));
}
// Mitarbeiter löschen
function loeschenMitarbeiter(mitarbeiterNr) {
const confirmation = confirm("Möchten Sie diesen Mitarbeiter wirklich löschen?");
if (confirmation) {
fetch(`/Projekt_SE2/LoeschenMitarbeiterServlet`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `mitarbeiterNr=${mitarbeiterNr}`
})
.then(response => {
if (response.ok) {
// Mitarbeiter erfolgreich gelöscht
alert("Mitarbeiter erfolgreich gelöscht!");
loadMitarbeiter(); // Aktualisiere die Tabelle
} else {
// Fehler vom Server lesen und anzeigen
return response.text().then((errorMessage) => {
showPopup("Fehler beim Löschen des Mitarbeiters: " + errorMessage);
});
}
})
.catch(error => {
// Netzwerk- oder andere Fehler anzeigen
showPopup("Fehler beim Löschen des Mitarbeiters: " + error.message);
});
}
}
// Neuer Mitarbeiter hinzufügen
// Popup schließen
function closePopup() {
document.getElementById("popupOverlay").style.display = "none";
clearPopupFields();
}
// Felder im Popup leeren
function clearPopupFields() {
document.getElementById("vorname").value = "";
document.getElementById("nachname").value = "";
document.getElementById("telefonNr").value = "";
document.getElementById("email").value = "";
document.getElementById("strasse").value = "";
document.getElementById("hausnummer").value = "";
document.getElementById("ort").value = "";
document.getElementById("password").value = "";
}
// Popup-Nachricht anzeigen
function showPopup(message) {
const popupOverlay = document.getElementById("popupOverlay");
const popupMessage = document.getElementById("popupMessage");
popupMessage.textContent = message;
popupOverlay.style.display = "flex";
}
// Popup-Nachricht mit Bestätigung anzeigen
function showPopupWithConfirmation(message, onConfirm) {
const popupOverlay = document.getElementById("popupOverlay");
const popupMessage = document.getElementById("popupMessage");
popupMessage.textContent = message;
const confirmButton = document.getElementById("popupConfirmButton");
confirmButton.style.display = "inline-block";
confirmButton.onclick = () => {
closePopup();
onConfirm();
};
popupOverlay.style.display = "flex";
}

View File

@ -1,80 +0,0 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>EJSS Palast - Produktverwaltung</title>
<link rel="icon" href="/Projekt_SE2/Bilder/EJS_Palast_logo.jpg" type="image/x-icon" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.1/css/all.min.css"/>
<link rel="stylesheet" href="/Projekt_SE2/styles.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Playwrite+GB+S:ital,wght@0,100..400;1,100..400&display=swap"
rel="stylesheet">
<link
href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&family=Playwrite+GB+S:ital,wght@0,100..400;1,100..400&display=swap"
rel="stylesheet">
</head>
<body>
<header id="Anfang">
<img src="/Projekt_SE2/Bilder/EJS_Palast_logo.jpg" alt="EJS Logo" class="logoOben">
<h1>EJSS Palast - Chef</h1>
</header>
<nav>
<span class="menu-icon" onclick="toggleMenu()">☰ Menu</span>
<div class="navigation">
<ul>
<li><a href="/Projekt_SE2/chef.jsp"><i class="fa-solid fa-house"></i> Startseite</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/schichtenPlan.jsp"><i class="fa-solid fa-calendar-days"></i> Schichtenplan</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/produktVerwaltung.jsp" class="aktiv"><i class="fa-regular fa-folder-open"></i> Produktverwaltung</a></li>
<li><a href="#" onclick="openLogoutPopup()"><i class="fa-solid fa-right-to-bracket"></i> Abmelden</a></li>
</ul>
</div>
</nav>
<main>
<!-- Popup-HTML -->
<div id="logoutPopup" class="popup">
<div class="popup-content">
<h3>Abmelden</h3>
<p>Möchten Sie sich wirklich abmelden?</p><br>
<div class="popup-actions">
<button onclick="confirmLogout()">Ja</button><br><hr>
<button onclick="closeLogoutPopup()">Nein</button>
</div>
</div>
</div>
<div class="willkommenstext">
<p>
<span class="einleitung">Willkommen zur Produktverwaltung<br>vom EJSS Palast</span><br>
<strong>Hier kannst du alle deine Produkt-Angebote verwalten, neue einfügen, löschen und aktuellisieren</strong><br>
Falls du Unterstützung brauchst, steht dir unser Support-Team jederzeit zur Verfügung.<br>
Wir freuen uns, dich auf dem Weg zum Erfolg begleiten zu dürfen.<br>
<em>Dein EJSS Palast Admin-Team</em>
</p>
</div>
</main>
<a href="#Anfang"><h4>Zurück zum Anfang</h4></a>
<footer>
<img src="/Projekt_SE2/Bilder/EJS_Palast_logo.jpg" alt="EJS Logo" class="logo">
<p>
<small>Anschrift:<br>
Musterstrasse 10<br>
68163 Mannheim</small>
</p>
<div class="socials">
<a href="https://www.facebook.com" target="_blank"><i class="fa-brands fa-facebook"></i></a>
<a href="https://www.instagram.com" target="_blank"><i class="fa-brands fa-instagram"></i></a>
<a href="tel:004962012345678" class="call-icon"><i class="fa-solid fa-phone"></i></a>
</div>
</footer>
<script src="/Projekt_SE2/chefFunktionen/chefScript.js"></script>
</body>
</html>

View File

@ -29,8 +29,7 @@
<ul>
<li><a href="/Projekt_SE2/chef.jsp"><i class="fa-solid fa-house"></i> Startseite</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/schichtenPlan.jsp" class="aktiv"><i class="fa-solid fa-calendar-days"></i> Schichtenplan</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/produktVerwaltung.jsp"><i class="fa-solid fa-folder"></i> Produktverwaltung</a></li>
<li><a href="/Projekt_SE2/chefFunktionen/mitarbeiterVerwaltung.jsp"><i class="fa-solid fa-users-gear"></i> Mitarbeiterverwaltung</a></li>
<li><a href="#" onclick="openLogoutPopup()"><i class="fa-solid fa-right-to-bracket"></i> Abmelden</a></li>
</ul>
</div>

View File

@ -363,7 +363,10 @@ footer {
background-color: #333;
color: #fff;
text-align: center;
padding: 20px;
padding: 10px 20px;
font-size: 14px;
}
/*Öffnungszeiten */
@ -1056,3 +1059,130 @@ footer .call-icon:hover {
background-color: #6c2f3d;
}
#popupMessage {
font-size: 16px; /* Standard-Schriftgröße */
margin-bottom: 20px;
}
/* Popup-Overlay */
#popupOverlay {
display: none; /* Popup ist standardmäßig ausgeblendet */
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5); /* Hintergrund mit Transparenz */
z-index: 1000; /* Sicherstellen, dass es über anderen Elementen liegt */
justify-content: center;
align-items: center;
}
/* Popup-Container */
#popupContent {
background: white;
padding: 20px;
border-radius: 5px;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
max-width: 400px;
width: 90%;
text-align: center;
}
/* Popup-Fehlernachrichten */
.popup-content {
background: white;
padding: 20px;
border-radius: 5px;
text-align: center;
max-width: 300px;
width: 90%;
margin: auto;
z-index: 1001;
}
/* Verhindern, dass der Rest der Seite gescrollt wird */
body.popup-open {
overflow: hidden;
}
/* Allgemeine Tabelleneinstellungen */
#mitarbeiterTabelle {
width: 90%;
margin: 20px auto;
border-collapse: collapse;
font-family: Arial, sans-serif;
font-size: 14px;
}
#mitarbeiterTabelle thead {
background-color: #5b2c25; /* Dunkles Braun */
color: white;
text-align: left;
}
#mitarbeiterTabelle th, #mitarbeiterTabelle td {
padding: 12px; /* Gleichmäßiger Innenabstand */
border: 1px solid #ddd; /* Dünne Rahmenlinie */
text-align: left;
}
#mitarbeiterTabelle tbody tr:nth-child(even) {
background-color: #f9f9f9; /* Hellgrauer Hintergrund für jede zweite Zeile */
}
#mitarbeiterTabelle tbody tr:hover {
background-color: #f1f1f1; /* Hellgrau beim Überfahren */
}
/* Styling der Buttons */
#mitarbeiterTabelle button {
padding: 5px 12px; /* Innenabstand für die Buttons */
font-size: 14px;
border: none;
border-radius: 4px; /* Runde Ecken */
cursor: pointer;
}
/* Eintragen-Button */
#mitarbeiterTabelle button.eintragen {
background-color: #5b2c25; /* Dunkles Braun */
color: white;
margin-right: 5px; /* Abstand zwischen Buttons */
}
/* Austragen-Button */
#mitarbeiterTabelle button.austragen {
background-color: #ddd; /* Hellgrau */
color: #333; /* Dunkle Schrift */
}
/* Hover-Effekt für Buttons */
#mitarbeiterTabelle button:hover {
opacity: 0.9; /* Transparenz bei Hover */
}
#neuerMitarbeiterButton {
display: block;
margin: 20px auto; /* Zentriert den Button horizontal und fügt Abstand ein */
padding: 10px 20px; /* Größe des Buttons */
background-color: #6c3b2a; /* Dunkelbraune Farbe */
color: #fff; /* Weißer Text */
border: none; /* Entfernt den Rahmen */
border-radius: 5px; /* Runde Ecken */
font-size: 16px; /* Schriftgröße */
font-weight: bold;
cursor: pointer; /* Zeigt einen Zeiger beim Hover */
transition: background-color 0.3s ease; /* Animation für Hover */
}
#neuerMitarbeiterButton:hover {
background-color: #8a4c38; /* Hellere braune Farbe beim Hover */
}
#neuerMitarbeiterButton:active {
background-color: #56271a; /* Noch dunkler bei Klick */
}