74 Commits

Author SHA1 Message Date
3ca6aa017a MenueController Button highlight 2023-02-01 18:21:40 +01:00
f5ca04983c MenueController Button highlight 2023-02-01 18:20:22 +01:00
646d63c6c0 Merge remote-tracking branch 'origin/Richards_Branch' into Richards_Branch 2023-02-01 17:46:17 +01:00
e4eb47aa05 MenueController Button highlight 2023-02-01 17:46:04 +01:00
ba3b92b3c4 MenueController Button highlight 2023-02-01 17:45:40 +01:00
54c3b9f3f5 New.01 2023-02-01 11:59:56 +01:00
2c387cda0d New.01 2023-02-01 11:58:14 +01:00
3613e246c9 MenueController Button highlight 2023-02-01 09:27:34 +01:00
b7bc440a4f MenueController Button highlight 2023-02-01 09:25:40 +01:00
b456b6d1d8 MenueController Button highlight 2023-01-31 21:26:41 +01:00
3f3875fd78 signup 2023-01-31 17:53:01 +01:00
f09d63dd21 aus main stuff kopiert 2023-01-31 17:51:37 +01:00
pbs2h21asc
2814244d29 Merge remote-tracking branch 'origin/Richards_Branch' into Richards_Branch
# Conflicts:
#	src/main/resources/com/bib/essensbestellungsverwaltung/createCoworker-view.fxml
2023-01-31 12:27:59 +01:00
pbs2h21asc
1a9f13581e Admin Controller bearbeitet 2023-01-31 12:27:14 +01:00
6747188668 settingsview & Controller erstellt 2023-01-31 10:22:48 +01:00
pbs2h21asc
0550482a6b View überarbeitet
Controller AdminController anfangen
2023-01-30 15:03:54 +01:00
pbs2h21asc
6cb48af976 Merge remote-tracking branch 'origin/Richards_Branch' into Richards_Branch 2023-01-30 14:58:43 +01:00
pbs2h21asc
9e4db23e7a View überarbeitet
Controller AdminController anfangen
2023-01-30 14:57:57 +01:00
a039bb09fc „.idea/vcs.xml“ löschen 2023-01-30 14:22:23 +01:00
97af9f3792 „.idea/misc.xml“ löschen 2023-01-30 14:22:17 +01:00
2b1223b3b7 „.idea/encodings.xml“ löschen 2023-01-30 14:22:12 +01:00
7e6b1aedf3 „.idea/.gitignore“ löschen 2023-01-30 14:22:07 +01:00
464285dcbf „database.db“ löschen 2023-01-30 14:21:50 +01:00
49575add8a Merge branch 'main' into Richards_Branch 2023-01-30 14:21:09 +01:00
329acaabcb Merge pull request 'WIP_Objects' (#5) from WIP_Objects into main
Reviewed-on: #5
2023-01-30 14:14:03 +01:00
5447d7f238 Merge branch 'main' into WIP_Objects 2023-01-30 14:13:50 +01:00
e3c6513ebb „.idea/vcs.xml“ löschen 2023-01-30 14:13:10 +01:00
3f7fb06e1b „.idea/uiDesigner.xml“ löschen 2023-01-30 14:13:04 +01:00
318e1ef065 „.idea/misc.xml“ löschen 2023-01-30 14:12:59 +01:00
43a4e2aa85 „.idea/encodings.xml“ löschen 2023-01-30 14:12:54 +01:00
741b4892b8 „.idea/.gitignore“ löschen 2023-01-30 14:12:47 +01:00
50e0118ded small fix 2023-01-30 14:04:59 +01:00
2d91259953 StartViewApplication ist die Startpunkt des Projekt 2023-01-30 14:01:33 +01:00
53c603249d StartViewApplication ist die Startpunkt des Projekt 2023-01-30 14:01:19 +01:00
81bcb44d74 most Objects done 2023-01-30 04:26:30 +01:00
3c0edbc431 new Regisiteren View 2023-01-27 15:17:17 +01:00
a0eed3ce51 Food, User 2023-01-27 15:14:36 +01:00
981169d578 Merge remote-tracking branch 'origin/Richards_Branch' into Richards_Branch 2023-01-27 15:11:38 +01:00
9b73f91f5c new Regisiteren View 2023-01-27 15:11:25 +01:00
67b3637505 Views & Controller erstellt 2023-01-27 14:36:10 +01:00
c7d0514c43 Merge remote-tracking branch 'origin/Richards_Branch' into Richards_Branch 2023-01-23 09:08:32 +01:00
702677b65b neue Zustand 23.01.23 2023-01-23 09:08:03 +01:00
b97fe83f40 Merge pull request 'Richards_Branch' (#4) from Richards_Branch into main 2023-01-23 08:59:53 +01:00
27710e92af Merge branch 'main' into Richards_Branch 2023-01-23 08:59:38 +01:00
a3c3ee0fe0 Login und SingUp aktuallisiert 2023-01-18 22:32:38 +01:00
pbs2h21asc
dd69909b16 Views erstellt 2023-01-18 13:22:05 +01:00
a7bcaf13ce css + png hinzugefügt 2023-01-18 02:41:25 +01:00
f8673ca92a Views hinzugefügt 2023-01-18 02:39:17 +01:00
400ffb0e98 ParetSence 2023-01-17 22:30:56 +01:00
3bb141fb52 Views & Controller erstellt 2023-01-17 15:58:22 +01:00
ec2d3b581d fixed salt 2023-01-17 13:47:24 +01:00
e245233a23 fixed the mess 2023-01-17 08:47:09 +01:00
074107752d LoginView überarbeitet 2023-01-16 23:25:58 +01:00
8634df0d6d LoginView überarbeitet 2023-01-16 23:09:16 +01:00
8ce8c027c8 test 2023-01-16 18:37:39 +01:00
1194b163fa login view
menue view
MenueController
2023-01-16 18:06:54 +01:00
f072cc9f66 Merge remote-tracking branch 'origin/main' 2023-01-16 18:02:45 +01:00
438d18e378 salz 2023-01-16 17:23:25 +01:00
7d0855be4e Merge remote-tracking branch 'origin/main' 2023-01-16 16:58:57 +01:00
c93489d014 zeile 15 wurde geändert 2023-01-16 16:58:44 +01:00
0fcc477613 Merge pull request 'von der Wiege bis zur Bahre, Kommentare, Kommentare' (#3) from MaltesConsolenEcke into main
Reviewed-on: #3
2023-01-16 16:38:07 +01:00
0dcec76379 von der Wiege bis zur Bahre, Kommentare, Kommentare 2023-01-16 16:35:45 +01:00
9b040cd779 Merge pull request 'MaltesConsolenEcke' (#2) from MaltesConsolenEcke into main
works on my machine
2023-01-12 15:59:04 +01:00
573e17161b added invoice and order collection 2023-01-07 23:14:41 +01:00
58fb02875a added missing functionality 2023-01-06 01:51:42 +01:00
89ea9ca70e basic encryption 2023-01-06 00:02:06 +01:00
c4b31bc548 did some stuff 2023-01-05 05:06:19 +01:00
e16f0342a7 frohes Neues 2023-01-01 15:03:21 +01:00
31b6b2cc39 Username und Passwort 2022-12-22 02:02:19 +01:00
d1737b730f Merge pull request 'db' (#1) from db into main
Reviewed-on: #1
2022-12-20 15:24:58 +01:00
0a8e052582 filled food_type and allergy
created generic insert
2022-12-19 17:31:06 +01:00
8478b80407 created tables 2022-12-15 09:26:08 +01:00
83507bef98 made program executable 2022-12-13 03:35:52 +01:00
18d812e1a2 moved dbconnection to own class 2022-12-12 14:03:49 +01:00
70 changed files with 3740 additions and 68 deletions

4
.idea/misc_.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="openjdk-19" project-jdk-type="JavaSDK" />
</project>

6
.idea/vcs_.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@@ -69,7 +69,7 @@
<id>default-cli</id>
<configuration>
<mainClass>
com.bib.essensbestellungsverwaltung/com.bib.essensbestellungsverwaltung.HelloApplication
com.bib.essensbestellungsverwaltung/com.bib.essensbestellungsverwaltung.StartViewApplication
</mainClass>
<launcher>app</launcher>
<jlinkZipName>app</jlinkZipName>

View File

@@ -0,0 +1,258 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
public class AccountMgr {
protected static double price = 5.0;
/**
* creates a user with createUser(...) and adds its id to the 'worker' table
* @return userid or -1
*/
protected static long createWorker(Worker worker){
long id = createUser(worker);
String sId = String.valueOf(id);
Database.insert("worker", new String[]{"userid"}, new String[]{sId});
return id;
}
/**
* creates a user with createUser(...) and adds its id to the 'parent' table
* @return userid or -1
*/
protected static long createParent(Parent parent){
long id = createUser(parent);
String sId = String.valueOf(id);
Database.insert("parent", new String[]{"userid"}, new String[]{sId});
return id;
}
/**
* adds a user to the database
* @return userid or -1
*/
protected static long createUser(User user) {
String[] userH = {"name", "firstname", "addressid", "password", "email"};
String name = user.getName();
String firstname = user.getFirstname();
String pw = hashAndSalt(user.getPassword(), getSalt());
String email = user.getEmail();
long addressId = user.getAddress().getId();
if(addressId < 1){
addressId = createAddress(user.getAddress());
}
String[] userD = {name, firstname, String.valueOf(addressId), pw, email};
return Database.insert("user", userH, userD);
}
protected static long createAddress(Address address){
String[] addressH = {"street", "number", "plz", "city"};
String[] addressD = {address.getStreet(),address.getNumber(),address.getPlz(),address.getCity()};
return Database.insert("address",addressH,addressD);
}
/**
* adds a child and allergies to the database
* @return id of child or -1
*/
protected static long createChild(Child child){
String[] childH = {"name","firstname","addressid"};
String[] childD = {child.getName(), child.getFirstname(), String.valueOf(child.getAddress().getId())};
long id = Database.insert("child", childH, childD);
String[] child_allergyH = {"childid","allergyid","severityid"};
for (AllergySeverity allergy: child.getAllergies()) {
String sId = String.valueOf(id);
String sAllergyId = String.valueOf(allergy.getAllergy().getId());
String sSeverityId = String.valueOf(allergy.getSeverityId());
String[] child_allergyD = {sId,sAllergyId,sSeverityId};
Database.insert("child_allergy",child_allergyH,child_allergyD);
}
return id;
}
protected static User getUserById(long id){
List<String> entry = Database.getEntryById("user",id);
String[] parts = entry.get(0).split(":");
Address address = getAddressById(id);
if(isWorker(String.valueOf(id))){
return new Worker(id,parts[1],parts[2],parts[4],parts[5],address);
}else{
String[] parent_childH = {"parentuserid"};
String[] parent_childD = {String.valueOf(id)};
List<Child> children = new ArrayList<>();
List<String> parent_childEntries = Database.select("parent_child",parent_childH,parent_childD);
for (String parent_childEntry: parent_childEntries) {
String[] parent_childParts = parent_childEntry.split(":");
children.add(getChildById(Long.parseLong(parent_childParts[2])));
}
return new Parent(id,parts[1],parts[2],parts[4],parts[5],address,children);
}
}
protected static Child getChildById(long id){
List<String> entry = Database.getEntryById("child",id);
String[] parts = entry.get(0).split(":");
String[] child_allergyH = {"childid"};
String[] child_allergyD = {String.valueOf(id)};
List<String> entriesAllergy = Database.select("child_allergy",child_allergyH,child_allergyD);
List<AllergySeverity> allergySeverities = new ArrayList<>();
for (String entryAllergy : entriesAllergy) {
String[] allergyParts = entryAllergy.split(":");
List<String> severity = Database.getEntryById("severity", Long.parseLong(allergyParts[3]));
String sSeverity = severity.get(0).split(":")[1];
long lSeverity = Long.parseLong(severity.get(0).split(":")[0]);
allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyParts[2])),lSeverity,sSeverity));
}
return new Child(id,parts[1],parts[2],getAddressById(Long.parseLong(parts[3])),allergySeverities);
}
protected static Address getAddressById(long id){
List<String> entry = Database.getEntryById("address",id);
String[] parts = entry.get(0).split(":");
return new Address(Long.parseLong(parts[0]),parts[1],parts[2],parts[3],parts[4]);
}
/**
* creates entries in the database to match parent to child
* @param parentId id of parent
* @param childId id of child
* @return id of parent_child or -1
*/
protected static long matchParentChild(String parentId, String childId){
String[] parent_childH = {"parentuserid","childid"};
String[] parent_childD = {parentId,childId};
return Database.insert("parent_child", parent_childH,parent_childD);
}
/**
* a simple login to check if a given email matches a password
* @param email email
* @param pw password
* @return id or -1
*/
protected static long login(String email, String pw){
String[] pwH = {"email"};
String[] pwD = {email};
List<String> foundEmail = Database.select("user",pwH,pwD);
String salt;
if(foundEmail.size() == 1){
String[] userParts = foundEmail.get(0).split(":");
String[] pwParts = userParts[4].split("\\.");
salt = pwParts[1];
}else{
//no unique user found; still calculating a hash for security reasons
salt = getSalt();
}
String[] userH = {"email","password"};
String[] userD = {email,hashAndSalt(pw,salt)};
return Database.getSingleId("user",userH,userD);
}
/**
* checks if id is in worker table
* @param id userid
* @return true if id is in worker table
*/
protected static boolean isWorker(String id){
String[] workerH = {"userid"};
String[] workerD = {id};
long workerId = Database.getSingleId("worker",workerH,workerD);
return workerId > 0;
}
/**
* checks if id is in parent table
* @param id userid
* @return true if id is in parent table
*/
protected static boolean isParent(String id){
String[] parentH = {"userid"};
String[] parentD = {id};
long parentId = Database.getSingleId("parent",parentH,parentD);
return parentId > 0;
}
/**
* returns a hashed and salted password
* @param pw the password to hash
* @return hashed and salted password
*/
private static String hashAndSalt(String pw, String salt){
Base64.Decoder dec = Base64.getDecoder();
byte[] bySalt = dec.decode(salt);
KeySpec spec = new PBEKeySpec(pw.toCharArray(), bySalt,310001,256);
String hashedPw;
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = factory.generateSecret(spec).getEncoded();
Base64.Encoder enc = Base64.getEncoder();
hashedPw = enc.encodeToString(hash);
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
hashedPw += "." + salt;
return hashedPw;
}
private static String getSalt(){
SecureRandom sec = new SecureRandom();
byte[] salt = new byte[16];
sec.nextBytes(salt);
Base64.Encoder enc = Base64.getEncoder();
return enc.encodeToString(salt);
}
/**
* gives the invoice for one month and one child
* @param date YYYY-MM the month
* @param childId id of child
* @return the invoice as a List
*/
protected static List<String> getInvoice(String date, String childId){
List<String> invoice = new ArrayList<>();
invoice.add("Monatsabrechnung " + date);
List<String> child = Database.getEntryById("child", Long.parseLong(childId));
String[] childParts = child.get(0).split(":");
invoice.add(childParts[1] + ", " + childParts[2]);
String[] food_planH = {"date"};
String[] food_planD = {date+"%"};
List<String> food_plan = Database.select("food_plan",food_planH,food_planD);
for (String day : food_plan) {
String[] food_planParts = day.split(":");
String[] food_selectionH = {"childid","food_planid"};
String[] food_selectionD = {childId,food_planParts[0]};
List<String> food_selection = Database.select("food_selection",food_selectionH,food_selectionD);
for (String food_select : food_selection) {
String[] food_selectParts = food_select.split(":");
List<String> food = Database.getEntryById("food",Long.parseLong(food_selectParts[3]));
String[] foodParts = food.get(0).split(":");
String line = food_planParts[1] + ": " + foodParts[1];
invoice.add(line);
}
}
invoice.add("Total: " + (invoice.size()-2) + " X " + price + "€ = " + ((invoice.size()-2)*price) + "");
return invoice;
}
protected static void getPriceFromDb(){
List<String> priceEntry = Database.getEntryById("price",1);
price = Double.parseDouble(priceEntry.get(0).split(":")[1])/100.0;
}
protected static void setPriceInDb(){
String[] priceH = {"id","price"};
String[] priceD = {"1", String.valueOf(price*100)};
Database.update("price",priceH,priceD);
}
}

View File

@@ -0,0 +1,47 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class Address {
private long id;
private String street;
private String number;
private String plz;
private String city;
public long getId() {
return id;
}
public String getStreet() {
return street;
}
public String getNumber() {
return number;
}
public String getPlz() {
return plz;
}
public String getCity() {
return city;
}
public Address(long id, String street, String number, String plz, String city) {
this.id = id;
this.street = street;
this.number = number;
this.plz = plz;
this.city = city;
}
public Address(String street, String number, String plz, String city) {
this.id = -1;
this.street = street;
this.number = number;
this.plz = plz;
this.city = city;
}
}

View File

@@ -0,0 +1,81 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
public class AdminController {
@FXML
TextField lastname;
@FXML
TextField firstname;
@FXML
TextField street;
@FXML
TextField number;
@FXML
TextField city;
@FXML
TextField plz;
@FXML
TextField email;
@FXML
PasswordField password;
@FXML
protected void onBtSignUp(){
String ln = lastname.getText();
String fn = firstname.getText();
String st = street.getText();
String nr = number.getText();
String cityString = city.getText();
String plzString = plz.getText();
String emailString = email.getText();
String pw = password.getText();
if(!pw.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$")){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Passwort");
alert.setHeaderText("Ungültiges Passwort");
alert.setContentText("Das Passwort benötigt mindestens: \n-8 Zeichen\n-einen Kleinbuchstaben\n-einen Großbuchstaben\n-ein Sonderzeichen\n-kein Leerzeichen");
password.setText("");
}
if(!emailString.matches("^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\.[A-Za-z0-9-]+)*(\\\\.[A-Za-z]{2,})$")){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("E-Mail");
alert.setHeaderText("Ungültige E-Mail Adresse");
alert.setContentText("Bitte geben sie eine gültige E-Mail Adresse an");
email.setText("");
}
//String[] userData = new String[]{ln,fn,pw,emailString};
//String[] addressData = new String[]{st,nr,plzString,cityString};
Address address = new Address(st,nr,plzString,cityString);
Worker worker = new Worker(ln,fn,pw,emailString,address);
AccountMgr.createWorker(worker);
}
@FXML
protected void onBtCancel(){
}
}

View File

@@ -0,0 +1,28 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class Allergy {
private final long id;
private final String name;
private final String handle;
public Allergy(long id, String name, String handle) {
this.id = id;
this.name = name;
this.handle = handle;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getHandle() {
return handle;
}
}

View File

@@ -0,0 +1,28 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class AllergySeverity {
private Allergy allergy;
private long severityId;
private String severity;
public AllergySeverity(Allergy allergy, long severityId, String severity) {
this.allergy = allergy;
this.severityId = severityId;
this.severity = severity;
}
public Allergy getAllergy() {
return allergy;
}
public long getSeverityId() {
return severityId;
}
public String getSeverity() {
return severity;
}
}

View File

@@ -0,0 +1,49 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.List;
public class Child {
private long id;
private String name;
private String firstname;
private Address address;
private List<AllergySeverity> allergies;
public Child(long id, String name, String firstname, Address address, List<AllergySeverity> allergies) {
this.id = id;
this.name = name;
this.firstname = firstname;
this.address = address;
this.allergies = allergies;
}
public Child(String name, String firstname, Address address, List<AllergySeverity> allergies) {
this.id = -1;
this.name = name;
this.firstname = firstname;
this.address = address;
this.allergies = allergies;
}
public String getName() {
return name;
}
public String getFirstname() {
return firstname;
}
public Address getAddress() {
return address;
}
public long getId() {
return id;
}
public List<AllergySeverity> getAllergies() {
return allergies;
}
}

View File

@@ -0,0 +1,326 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ConsoleLib {
public static void createWorkerPrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Registrierung eines neuen Mitarbeiters");
String[] userData = new String[4];
String[] addressData = new String[4];
System.out.print("Nachname: ");
userData[0] = sc.nextLine();
System.out.print("Vorname: ");
userData[1] = sc.nextLine();
System.out.print("Straße: ");
addressData[0] = sc.nextLine();
System.out.print("Hausnummer: ");
addressData[1] = sc.nextLine();
System.out.print("Postleitzahl: ");
addressData[2] = sc.nextLine();
System.out.print("Stadt: ");
addressData[3] = sc.nextLine();
System.out.print("Email: ");
userData[3] = sc.nextLine();
System.out.print("Passwort: ");
userData[2] = sc.nextLine();
Address address = new Address(addressData[0],addressData[1],addressData[2],addressData[3]);
Worker worker = new Worker(userData[0],userData[1],userData[2],userData[3],address);
long id = AccountMgr.createWorker(worker);
if(id < 1){
System.out.println("Fehler beim erstellen");
}
}
public static void createParentPrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Registrierung eines neuen Elternteils");
String[] userData = new String[4];
String[] addressData = new String[4];
System.out.print("Nachname: ");
userData[0] = sc.nextLine();
System.out.print("Vorname: ");
userData[1] = sc.nextLine();
System.out.print("Straße: ");
addressData[0] = sc.nextLine();
System.out.print("Hausnummer: ");
addressData[1] = sc.nextLine();
System.out.print("Postleitzahl: ");
addressData[2] = sc.nextLine();
System.out.print("Stadt: ");
addressData[3] = sc.nextLine();
System.out.print("Email: ");
userData[3] = sc.nextLine();
System.out.print("Passwort: ");
userData[2] = sc.nextLine();
Address address = new Address(addressData[0],addressData[1],addressData[2],addressData[3]);
Parent parent = new Parent(userData[0],userData[1],userData[2],userData[3],address);
long id = AccountMgr.createParent(parent);
if(id < 1){
System.out.println("Fehler beim erstellen");
}
}
public static void createChildPrompt(String parentId){
Scanner sc = new Scanner(System.in);
String[] childData = new String[3];
System.out.println("Registrierung eines neuen Kindes");
System.out.print("Nachname: ");
childData[0] = sc.nextLine();
System.out.print("Vorname: ");
childData[1] = sc.nextLine();
System.out.println("Bitte geben Sie die Nummer der passenden Adresse an: ");
for (String s : Database.getTable("address")) {
String[] parts = s.split(":");
System.out.printf("Nr.: %s Straße: %s Hausnr.: %s PLZ: %s Stadt: %s%n",parts[0],parts[1],parts[2],parts[3],parts[4]);
}
System.out.print("Adressnummer: ");
childData[2] = sc.nextLine();
for (String s : Database.getTable("allergy")) {
String[] parts = s.split(":");
System.out.printf("Nr. %s %s%n",parts[0],parts[1]);
}
System.out.println("Bitte Geben Sie die Nr der Allergien und Ihre Schwere an: ");
System.out.print("Allergien (Nr mit , getrennt[1,4,5,16]): ");
String allergies = sc.nextLine();
String[] allergyData = allergies.split(",");
System.out.print("Schweren (1 Harmlos - 3 Kritisch[2,3,1,3]): ");
String severities = sc.nextLine();
String[] severityData = severities.split(",");
Address address = AccountMgr.getAddressById(Long.parseLong(childData[2]));
List<AllergySeverity> allergySeverities = new ArrayList<>();
for(int i = 0; i < allergyData.length; i++){
List<String> allergySeverity = Database.getEntryById("severity", Long.parseLong(severityData[i]));
String[] asParts = allergySeverity.get(0).split(":");
allergySeverities.add(new AllergySeverity(FoodMgr.getAllergyById(Long.parseLong(allergyData[0])),Long.parseLong(asParts[0]),asParts[1]));
}
Child child = new Child(childData[0],childData[1],address,allergySeverities);
long id = AccountMgr.createChild(child);
if(id < 1){
System.out.println("Fehler beim erstellen");
return;
}
String sId = String.valueOf(id);
if(AccountMgr.matchParentChild(parentId,sId) == -1){
System.out.println("Fehler beim verknüpfen");
}
}
public static void createFoodPrompt(){
Scanner sc = new Scanner(System.in);
String[] foodData = new String[4];
System.out.println("Registrierung eines neuen Essens");
System.out.print("Name: ");
foodData[0] = sc.nextLine();
System.out.print("Beschreibung: ");
foodData[1] = sc.nextLine();
System.out.print("Ist es ein Dessert?[0/1]: ");
foodData[2] = sc.nextLine();
System.out.print("Ist es vegan[1], vegetarisch[2] oder fleischhaltig[3]: ");
foodData[3] = sc.nextLine();
for (String s : Database.getTable("allergy")) {
String[] parts = s.split(":");
System.out.printf("Nr. %s %s%n",parts[0],parts[1]);
}
System.out.println("Bitte geben Sie die Nr. aller zutreffenden Allergien mit Komma getrennt an [1,3,6]");
System.out.print("Allergienummer: ");
String allergies = sc.nextLine();
String[] allergyData = allergies.split(",");
FoodType foodType = FoodMgr.getFoodTypeById(Long.parseLong(foodData[3]));
List<Allergy> allergyList = new ArrayList<>();
for (String data : allergyData) {
allergyList.add(FoodMgr.getAllergyById(Long.parseLong(data)));
}
boolean isDessert = !foodData[2].equals("0");
Food food = new Food(foodData[0],foodData[1],isDessert,foodType,allergyList);
if(FoodMgr.createFood(food) < 1){
System.out.println("Fehler");
}
}
public static User loginPrompt(){
System.out.println("Login");
Scanner sc = new Scanner(System.in);
User user = null;
while (user == null){
System.out.print("Email: ");
String email = sc.nextLine();
if(email.isEmpty()){
return null;
}
System.out.print("Passwort: ");
String pw = sc.nextLine();
long id = AccountMgr.login(email,pw);
if(id == -1){
System.out.println("Login fehlgeschlagen");
}else {
user = AccountMgr.getUserById(id);
}
}
System.out.println("Login erfolgreich");
return user;
}
public static void matchParentChildPrompt(String parentId){
System.out.println("Wählen Sie ihr Kind aus: ");
Database.getTable("child");
Scanner sc = new Scanner(System.in);
System.out.print("Nr: ");
String childId = sc.nextLine();
if(AccountMgr.matchParentChild(parentId,childId) == -1){
System.out.println("Fehler");
}
}
public static void tablePrompt(){
Scanner sc = new Scanner(System.in);
System.out.print("Table: ");
String table = sc.nextLine();
printConsole(Database.getTable(table));
}
public static void deletePrompt(){
Scanner sc = new Scanner(System.in);
System.out.println("Löschen");
System.out.print("Tabelle: ");
String table = sc.nextLine();
System.out.print("Id: ");
long id = sc.nextLong();
sc.nextLine();
Database.delete(table,id);
}
public static void printConsole(List<String> list){
for (String entry : list) {
System.out.println(entry);
}
}
public static void createFood_planPrompt(){
System.out.println("Erstellen eines Essensplans");
String[] food_planData = new String[5];
Scanner sc = new Scanner(System.in);
System.out.print("Bitte geben Sie das Datum im Format YYYY-MM-DD an: ");
food_planData[0] = sc.nextLine();
List<Food> veganMain = FoodMgr.getVeganFood(false);
for (Food food : veganMain) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Veganes Hauptgericht Nr: ");
food_planData[1] = sc.nextLine();
List<Food> foodMain = FoodMgr.getFood(false);
for (Food food : foodMain) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Zweites Hauptgericht Nr: ");
food_planData[2] = sc.nextLine();
List<Food> veganDessert = FoodMgr.getVeganFood(true);
for (Food food : veganDessert) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Veganes Dessert Nr: ");
food_planData[3] = sc.nextLine();
List<Food> foodDessert = FoodMgr.getFood(true);
for (Food food : foodDessert) {
System.out.println(food.getId() + " : " + food.getName());
}
System.out.print("Zweites Dessert Nr: ");
food_planData[4] = sc.nextLine();
FoodPlan foodPlan = new FoodPlan(food_planData[0],
FoodMgr.getFoodById(Long.parseLong(food_planData[1])),
FoodMgr.getFoodById(Long.parseLong(food_planData[2])),
FoodMgr.getFoodById(Long.parseLong(food_planData[3])),
FoodMgr.getFoodById(Long.parseLong(food_planData[4])));
long id = FoodMgr.createFood_plan(foodPlan);
if(id < 0){
System.out.println("Fehler");
}
}
public static void showFood_planPrompt(){
System.out.println("Essensplan zum Anzeigen auswählen");
Scanner sc = new Scanner(System.in);
System.out.print("Bitte geben Sie das Datum im Format YYYY-MM-DD an: ");
String date = sc.nextLine();
FoodPlan plan = FoodMgr.getFoodPlan(date);
List<String> foodList = new ArrayList<>();
StringBuilder sb;
sb = new StringBuilder();
sb.append("Tag: ");
sb.append(plan.getDate());
sb.append(" Veganesgericht: ");
sb.append(plan.getFoodVegan().getName());
sb.append(" Zweites Hauptgericht: ");
sb.append(plan.getFoodSecond().getName());
sb.append(" Veganesdessert: ");
sb.append(plan.getDessertVegan().getName());
sb.append(" Zweites Dessert: ");
sb.append(plan.getDessertSecond().getName());
foodList.add(sb.toString());
printConsole(foodList);
}
public static void createFood_selectionPrompt(){
System.out.println("Essensauswahl");
Scanner sc = new Scanner(System.in);
String[] food_selectionData = new String[3];
System.out.print("Kind ID: ");
food_selectionData[0] = sc.nextLine();
System.out.print("Datum: ");
String date = sc.nextLine();
String[] foodPlanParts = Database.select("food_plan", new String[]{"date"}, new String[]{date}).get(0).split(":");
food_selectionData[1] = foodPlanParts[0];
System.out.println("Hauptspeisen: ");
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[2]}).get(0));
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[3]}).get(0));
System.out.print("Id: ");
food_selectionData[2] = sc.nextLine();
if(FoodMgr.createFood_selection(food_selectionData) < 1){
System.out.println("Fehler");
}
System.out.println("Nachspeisen: ");
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[4]}).get(0));
System.out.println(Database.select("food",new String[]{"id"},new String[]{foodPlanParts[5]}).get(0));
System.out.print("Id: ");
food_selectionData[2] = sc.nextLine();
if(FoodMgr.createFood_selection(food_selectionData) < 1){
System.out.println("Fehler");
}
}
public static void dayOrderPrompt(){
System.out.println("Zusammenfassung des Tages");
System.out.print("Datum eingeben: ");
Scanner sc = new Scanner(System.in);
String date = sc.nextLine();
List<String> dayOrder = FoodMgr.getDayOrder(date);
for (String food : dayOrder) {
System.out.println(food);
}
}
public static void invoicePrompt(){
System.out.println("Monatsabrechnung");
System.out.print("Monat(YYYY-MM): ");
Scanner sc = new Scanner(System.in);
String date = sc.nextLine();
System.out.print("ID des Kindes: ");
String id = sc.nextLine();
List<String> invoice = AccountMgr.getInvoice(date,id);
printConsole(invoice);
}
public static void changePricePrompt(){
System.out.print("Neuer Preis: ");
Scanner sc = new Scanner(System.in);
double price = sc.nextDouble();
sc.nextLine();
AccountMgr.price = price;
AccountMgr.setPriceInDb();
}
}

View File

@@ -0,0 +1,114 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.Scanner;
public class ConsoleMain {
static User currentUser = null;
static boolean running = true;
public static void main(String[] args) {
boolean firstRun = Database.init();
if(firstRun){
Database.createDb();
Database.fillDb();
ConsoleLib.createWorkerPrompt();
}
AccountMgr.getPriceFromDb();
while (running){
if(currentUser == null){
defaultMenu();
}else{
if(currentUser.getClass().getSimpleName().equals("Worker")){
adminMenu();
}else if(currentUser.getClass().getSimpleName().equals("Parent")){
parentMenu();
}
}
}
}
public static void defaultMenu(){
System.out.println("0: Programm beenden");
System.out.println("1: Login");
System.out.println("2: Essensplan anzeigen");
System.out.println("3: Registrieren");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> running = false;
case "1" -> {
currentUser = ConsoleLib.loginPrompt();
}
case "2" -> ConsoleLib.showFood_planPrompt();
case "3" -> ConsoleLib.createParentPrompt();
}
}
public static void adminMenu(){
System.out.println("0: Ausloggen");
System.out.println("1: Einen neuen Mitarbeiter anlegen");
System.out.println("2: Ein neues Elternteil anlegen");
System.out.println("3: Ein neues Kind anlegen");
System.out.println("4: Kind einem Elternteil zuordnen");
System.out.println("5: Ein neues Essen anlegen");
System.out.println("6: Einen Essensplan erstellen");
System.out.println("7: Essensplan anzeigen");
System.out.println("8: Essen auswählen");
System.out.println("9: Bestellungen des Tages sammeln");
System.out.println("10: Monatsabrechnung");
System.out.println("11: Preis ändern");
System.out.println("x1: Table");
System.out.println("x2: Löschen");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> {
currentUser = null;
}
case "1" -> ConsoleLib.createWorkerPrompt();
case "2" -> ConsoleLib.createParentPrompt();
case "3" -> ConsoleLib.createChildPrompt(String.valueOf(currentUser.getId()));
case "4" -> ConsoleLib.matchParentChildPrompt(String.valueOf(currentUser.getId()));
case "5" -> ConsoleLib.createFoodPrompt();
case "6" -> ConsoleLib.createFood_planPrompt();
case "7" -> ConsoleLib.showFood_planPrompt();
case "8" -> ConsoleLib.createFood_selectionPrompt();
case "9" -> ConsoleLib.dayOrderPrompt();
case "10" -> ConsoleLib.invoicePrompt();
case "11" -> ConsoleLib.changePricePrompt();
case "x1" -> ConsoleLib.tablePrompt();
case "x2" -> ConsoleLib.deletePrompt();
}
}
public static void parentMenu(){
System.out.println("0: Ausloggen");
System.out.println("3: Ein neues Kind anlegen");
System.out.println("7: Essensplan anzeigen");
System.out.println("8: Essen auswählen");
System.out.print("Auswahl: ");
Scanner sc = new Scanner(System.in);
String selection = sc.nextLine();
switch (selection) {
case "0" -> {
currentUser = null;
}
case "3" -> ConsoleLib.createChildPrompt(String.valueOf(currentUser.getId()));
case "6" -> ConsoleLib.tablePrompt();
case "7" -> ConsoleLib.showFood_planPrompt();
case "8" -> ConsoleLib.createFood_selectionPrompt();
}
}
}

View File

@@ -0,0 +1,605 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Database {
private static final String dbLocation = "jdbc:sqlite:"+Path.of("").toAbsolutePath()+"/database.db";
/**
* creates new database.db if it doesn't exist
* @return true if a new database has been created
*/
protected static boolean init(){
File db = new File(Path.of("").toAbsolutePath()+"/database.db");
try {
return db.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* connects to the database
* @return Connection to the database
*/
protected static Connection connect(){
Connection conn = null;
try{
conn = DriverManager.getConnection(dbLocation);
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
/**
* creates the initial structure of the db
*/
protected static void createDb(){
String[] sql = new String[15];
sql[0] = """
CREATE TABLE IF NOT EXISTS address (
id integer PRIMARY KEY,
street text,
number text,
plz text,
city text
);""";
sql[1] = """
CREATE TABLE IF NOT EXISTS food_type (
id integer PRIMARY KEY,
name text UNIQUE
);""";
sql[2] = """
CREATE TABLE IF NOT EXISTS allergy (
id integer PRIMARY KEY,
name text UNIQUE,
handle text UNIQUE
);""";
sql[3] = """
CREATE TABLE IF NOT EXISTS severity (
id integer PRIMARY KEY,
name text UNIQUE
);""";
sql[4] = """
CREATE TABLE IF NOT EXISTS user (
id integer PRIMARY KEY,
name text,
firstname text,
addressid integer,
password text,
email text UNIQUE,
FOREIGN KEY(addressid) REFERENCES address(id)
);""";
sql[5] = """
CREATE TABLE IF NOT EXISTS child (
id integer PRIMARY KEY,
name text,
firstname text,
addressid integer,
FOREIGN KEY(addressid) REFERENCES address(id)
);""";
sql[6] = """
CREATE TABLE IF NOT EXISTS worker (
userid integer PRIMARY KEY,
FOREIGN KEY(userid) REFERENCES user(id)
);""";
sql[7] = """
CREATE TABLE IF NOT EXISTS parent (
userid integer PRIMARY KEY,
FOREIGN KEY(userid) REFERENCES user(id)
);""";
sql[8] = """
CREATE TABLE IF NOT EXISTS parent_child (
id integer PRIMARY KEY,
parentuserid integer,
childid integer,
FOREIGN KEY(parentuserid) REFERENCES parent(userid),
FOREIGN KEY(childid) REFERENCES child(id)
);""";
sql[9] = """
CREATE TABLE IF NOT EXISTS child_allergy (
id integer PRIMARY KEY,
childid integer,
allergyid integer,
severityid integer,
FOREIGN KEY(childid) REFERENCES child(id),
FOREIGN KEY(allergyid) REFERENCES allergy(id),
FOREIGN KEY(severityid) REFERENCES severity(id)
);""";
sql[10] = """
CREATE TABLE IF NOT EXISTS food (
id integer PRIMARY KEY,
name text UNIQUE,
description text,
isdessert integer,
food_typeid integer,
FOREIGN KEY(food_typeid) REFERENCES food_type(id)
);""";
sql[11] = """
CREATE TABLE IF NOT EXISTS food_plan (
id integer PRIMARY KEY,
date text UNIQUE,
food1 integer,
food2 integer,
dessert1 integer,
dessert2 integer,
issent integer DEFAULT '0',
FOREIGN KEY(food1) REFERENCES food(id),
FOREIGN KEY(food2) REFERENCES food(id),
FOREIGN KEY(dessert1) REFERENCES food(id),
FOREIGN KEY(dessert2) REFERENCES food(id)
);""";
sql[12] = """
CREATE TABLE IF NOT EXISTS food_restriction (
id integer PRIMARY KEY,
foodid integer,
allergyid integer,
FOREIGN KEY(foodid) REFERENCES food(id),
FOREIGN KEY(allergyid) REFERENCES allergy(id)
);""";
sql[13] = """
CREATE TABLE IF NOT EXISTS food_selection (
id integer PRIMARY KEY,
childid integer,
food_planid integer,
foodid integer,
FOREIGN KEY(childid) REFERENCES child(id),
FOREIGN KEY(food_planid) REFERENCES food_plan(id),
FOREIGN KEY(foodid) REFERENCES food(id)
);""";
sql[14] = """
CREATE TABLE IF NOT EXISTS price (
id integer PRIMARY KEY,
price integer
);""";
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
for(int i = 0; i < sql.length; i++){
stmt.execute(sql[i]);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* inserts fixed values into the database
*/
protected static void fillDb(){
List<String> sqls = new ArrayList<>();
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('1','Vegan');""");
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('2','Vegetarisch');""");
sqls.add("""
INSERT OR IGNORE INTO food_type (id,name)
VALUES ('3','Fleischhaltig');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('1','Eier','a');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('2','Soja','b');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('3','Milch','c');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('4','Erdnüsse','d');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('5','Weichtiere','e');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('6','Krebstiere','f');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('7','Getreide','g');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('8','Senf','h');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('9','Sesam','i');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('10','Schwefeldioxid und Sulfit','j');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('11','Nüsse','k');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('12','Sellerie','l');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('13','Fische','m');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('14','Lupinen','n');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('15','Nitrit-Pökelsalz','1');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('16','Phosphat','2');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('17','Nitrat','3');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('18','Antioxidationsmittel','4');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('19','Farbstoff','5');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('20','Geschmacksverstärker','6');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('21','Süßungsmittel','7');""");
sqls.add("""
INSERT OR IGNORE INTO allergy (id,name,handle)
VALUES('22','Konservierungsstoff','8');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('1','Harmlos');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('2','Warnung');""");
sqls.add("""
INSERT OR IGNORE INTO severity (id,name)
VALUES('3','Kritisch');""");
sqls.add("""
INSERT OR IGNORE INTO price (id,price)
VALUES('1','500');""");
try(Connection conn = connect(); Statement stmt = conn.createStatement()){
for (String sql : sqls) {
stmt.execute(sql);
}
}catch (SQLException e){
e.printStackTrace();
}
}
/**
* inserts data into table and returns its id
* does not insert if the exact set already exists
* @param table name of the database table
* @param header String[] order should match with values
* @param values String[] order should match with header
* @return id of dataset or -1
*/
protected static long insert(String table, String[] header, String[] values){
long id = -1;
try (Connection conn = connect()){
String query = queryBuilder("exists",table,header,values);
PreparedStatement psQuery = conn.prepareStatement(query);
ResultSet rsQuery = psQuery.executeQuery();
if(rsQuery.next()){
boolean found = rsQuery.getBoolean(1);
if(!found){
String sql = queryBuilder("insert",table,header,values);
String[] rowId = {"id"};
PreparedStatement ps = conn.prepareStatement(sql,rowId);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if(rs.next()){
id = rs.getLong(1);
}
}else{
query = queryBuilder("selectMatch",table,header,values);
psQuery = conn.prepareStatement(query);
rsQuery = psQuery.executeQuery();
if(rsQuery.next()) {
id = rsQuery.getLong(1);
}
}
}
} catch (SQLException e) {
return id;
}
return id;
}
/**
* returns a single id that matches the given data
* @param table the table that contains the searched entry
* @param header the header of the table, order should match with values
* @param values the data you want the id of, order should match witch values
* @return one id matching the given data or -1 if no match has been found
*/
protected static long getSingleId(String table, String[] header, String[] values){
long id = -1;
try(Connection conn = connect()){
String sql = queryBuilder("selectMatch",table,header,values);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()){
id = rs.getLong(1);
if(rs.next()){
id = -1;
}
}
}catch (SQLException e){
e.printStackTrace();
return id;
}
return id;
}
/**
* @deprecated
*/
protected static void printSampleQuery(){
String sql = """
SELECT * FROM food_type WHERE id > ?;""";
String sql1 = """
SELECT * FROM allergy WHERE id > ?;""";
try(Connection conn = connect()){
PreparedStatement ps = conn.prepareStatement(sql);
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps.setInt(1,0);
ResultSet rs = ps.executeQuery();
System.out.println("food_type");
while (rs.next()){
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
System.out.println("allergy");
ps1.setInt(1,0);
rs = ps1.executeQuery();
while (rs.next()){
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
}catch (SQLException e){
e.printStackTrace();
}
}
/**
* deletes an entry from table with matching id
* @param table the table that contains the entry you want to delete
* @param id the id of the entry you want to delete
*/
protected static void delete(String table, long id){
String sql = "DELETE FROM " + table + " WHERE id = ?;";
try(Connection conn = connect();PreparedStatement ps = conn.prepareStatement(sql)){
ps.setLong(1,id);
ps.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}
}
private static String queryBuilder(String type,String table, String[] header, String[] values){
String sql;
StringBuilder sb = new StringBuilder();
switch (type) {
case "exists" -> {
sb = new StringBuilder("SELECT (count(*) > 0) as found FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" LIKE '");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < header.length; i++) {
sb.append(" AND ");
sb.append(header[i]);
sb.append(" LIKE '");
sb.append(values[i]);
sb.append("'");
}
}
case "selectMatch" -> {
sb = new StringBuilder("SELECT * FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" LIKE '");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < header.length; i++) {
sb.append(" AND ");
sb.append(header[i]);
sb.append(" LIKE '");
sb.append(values[i]);
sb.append("'");
}
}
case "insert" -> {
sb = new StringBuilder("INSERT OR IGNORE INTO ");
sb.append(table);
sb.append(" (");
sb.append(header[0]);
for (int i = 1; i < header.length; i++) {
sb.append(",");
sb.append(header[i]);
}
sb.append(") VALUES('");
sb.append(values[0]);
sb.append("'");
for (int i = 1; i < values.length; i++) {
sb.append(",'");
sb.append(values[i]);
sb.append("'");
}
sb.append(");");
}
case "count" -> {
sb = new StringBuilder("SELECT COUNT(*) FROM ");
sb.append(table);
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" = ");
sb.append(values[0]);
for(int i = 1; i < header.length; i++){
sb.append(" AND ");
sb.append(header[i]);
sb.append(" = ");
sb.append(values[i]);
}
}
case "update" -> {
sb = new StringBuilder("UPDATE ");
sb.append(table);
sb.append(" SET ");
sb.append(header[1]);
sb.append(" = ");
sb.append(values[1]);
for(int i = 2; i < header.length; i++){
sb.append(", ");
sb.append(header[i]);
sb.append(" = ");
sb.append(values[i]);
}
sb.append(" WHERE ");
sb.append(header[0]);
sb.append(" = ");
sb.append(values[0]);
}
}
sql = sb.toString();
return sql;
}
/**
* returns a list of all entries
* @param table the table you want
* @return a list of all entries as String with the fields separated by ":"
*/
protected static List<String> getTable(String table){
List<String> data = new ArrayList<>();
StringBuilder sb;
try(Connection conn = connect()) {
String sql = "SELECT * FROM " + table;
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while (rs.next()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
}catch (SQLException e){
return new ArrayList<>();
}
return data;
}
/**
* issues a select query on the database for the given table and the given values checked with LIKE
* @param table the table you want the data from
* @param header header for the WHERE portion, order should match with values
* @param values values for the WHERE portion, order should match with header
* @return a list of the matching data as String separated by ":"
*/
protected static List<String> select(String table,String[] header, String[] values){
List<String> data = new ArrayList<>();
StringBuilder sb;
String sql = queryBuilder("selectMatch",table,header,values);
try(Connection conn = connect()) {
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while (rs.next()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
}catch (SQLException e){
e.printStackTrace();
return data;
}
return data;
}
/**
* returns the entry from table with the given id
* @param table the table you want the entry from
* @param id the id of the entry you want
* @return a list of String separated by ":"
*/
protected static List<String> getEntryById(String table, long id){
List<String> data = new ArrayList<>();
StringBuilder sb;
String sql = "SELECT * FROM " + table + " WHERE id = ?;";
try (Connection conn = connect()) {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1,id);
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
while (rs.next()){
sb = new StringBuilder();
sb.append(rs.getString(1));
for(int i = 2; i <= count; i++){
sb.append(":");
sb.append(rs.getString(i));
}
data.add(sb.toString());
}
} catch (SQLException e) {
e.printStackTrace();
return data;
}
return data;
}
/**
* counts the number of matching entries
* @param table the table you want to count
* @param header the properties you want to count on
* @param values the values for the properties
* @return the number of found rows
*/
protected static int count(String table,String[] header,String[] values){
String sql = queryBuilder("count",table,header,values);
try(Connection conn = connect()) {
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
return rs.getInt(1);
}catch (SQLException e){
return -1;
}
}
/**
* updates an entry in the database
* @param table the table you want to update
* @param header [0] is used as WHERE, everything else in SET
* @param values [0] is used as WHERE, everything else in SET
* @return number of rows affected or -1 on error
*/
protected static int update(String table,String[] header,String[] values){
try(Connection conn = connect()) {
String sql = queryBuilder("update",table,header,values);
PreparedStatement ps = conn.prepareStatement(sql);
return ps.executeUpdate();
}catch (SQLException e){
return -1;
}
}
}

View File

@@ -0,0 +1,62 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.List;
public class Food {
private long id;
private String name;
private String description;
private boolean isDessert;
private FoodType foodType;
private List<Allergy> allergies;
public Food(long id, String name, String description, boolean isDessert, FoodType foodType, List<Allergy> allergies) {
this.id = id;
this.name = name;
this.description = description;
this.isDessert = isDessert;
this.foodType = foodType;
this.allergies = allergies;
}
public Food(String name, String description, boolean isDessert, FoodType foodType, List<Allergy> allergies) {
this.id = -1;
this.name = name;
this.description = description;
this.isDessert = isDessert;
this.foodType = foodType;
this.allergies = allergies;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isDessert() {
return isDessert;
}
public FoodType getFoodType() {
return foodType;
}
public List<Allergy> getAllergies() {
return allergies;
}
@Override
public String toString() {
return getName();
}
}

View File

@@ -0,0 +1,189 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
public class FoodMgr {
/**
* inserts a food int to the database and creates the food_restriction entries
* @return id of food or -1
*/
public static long createFood(Food food){
String[] foodH = {"name","description","isDessert","food_typeid"};
String[] food_restrictionH = {"foodid","allergyid"};
String[] foodD = {food.getName(),food.getDescription(),(food.isDessert() ? "1" : "0"), String.valueOf(food.getFoodType().getId())};
long id = Database.insert("food",foodH,foodD);
if(food.getAllergies().size() > 0){
String sId = String.valueOf(id);
for (Allergy allergy : food.getAllergies()) {
String[] food_restrictionD = {sId, String.valueOf(allergy.getId())};
Database.insert("food_restriction",food_restrictionH, food_restrictionD);
}
}
return id;
}
/**
* inserts a food_plan into the database
* @return id of food_plan or -1
*/
public static long createFood_plan(FoodPlan foodPlan){
String[] food_planH = {"date","food1","food2","dessert1","dessert2"};
String[] food_planD = {foodPlan.getDate(),
String.valueOf(foodPlan.getFoodVegan().getId()),
String.valueOf(foodPlan.getFoodSecond().getId()),
String.valueOf(foodPlan.getDessertVegan().getId()),
String.valueOf(foodPlan.getDessertSecond().getId())};
return Database.insert("food_plan",food_planH,food_planD);
}
/**
* returns all non desserts or all desserts
* @param isDessert true for only desserts false for non desserts
* @return a list of all non desserts or all desserts
*/
public static List<Food> getFood(boolean isDessert){
String[] foodH = {"isDessert"};
String[] foodD = {(isDessert ? "1" : "0")};
List<String> entries = Database.select("food",foodH,foodD);
List<Food> foods = new ArrayList<>();
for (String entry : entries) {
String[] parts = entry.split(":");
foods.add(getFoodById(Long.parseLong(parts[0])));
}
return foods;
}
/**
* getFood but returns only vegan food
* @param isDessert true for only desserts false for non desserts
* @return a list of all vegan non desserts or all vegan desserts
*/
public static List<Food> getVeganFood(boolean isDessert){
String[] foodH = {"isDessert","food_typeid"};
String[] foodD = {(isDessert ? "1" : "0"),"1"};
List<String> entries = Database.select("food",foodH,foodD);
List<Food> foods = new ArrayList<>();
for (String entry : entries) {
String[] parts = entry.split(":");
foods.add(getFoodById(Long.parseLong(parts[0])));
}
return foods;
}
/**
* returns a food_plan for a day
* @param date YYYY-MM-DD one day
* @return food_plan for date
*/
public static FoodPlan getFoodPlan(String date){
String[] food_planH = {"date"};
String[] food_planD = {date};
List<String> entry = Database.select("food_plan",food_planH,food_planD);
String[] parts = entry.get(0).split(":");
Food foodVegan = getFoodById(Long.parseLong(parts[2]));
Food foodSecond = getFoodById(Long.parseLong(parts[3]));
Food dessertVegan = getFoodById(Long.parseLong(parts[4]));
Food dessertSecond = getFoodById(Long.parseLong(parts[5]));
boolean isSent = !parts[6].equals("0");
return new FoodPlan(Long.parseLong(parts[0]),date,foodVegan,foodSecond,dessertVegan,dessertSecond,isSent);
}
public static FoodPlan getFoodPlanById(long id){
List<String> entry = Database.getEntryById("food_plan",id);
String[] parts = entry.get(0).split(":");
Food foodVegan = getFoodById(Long.parseLong(parts[2]));
Food foodSecond = getFoodById(Long.parseLong(parts[3]));
Food dessertVegan = getFoodById(Long.parseLong(parts[4]));
Food dessertSecond = getFoodById(Long.parseLong(parts[5]));
boolean isSent = !parts[6].equals("0");
return new FoodPlan(id,parts[1], foodVegan,foodSecond,dessertVegan,dessertSecond,isSent);
}
public static Food getFoodById(long id){
List<String> entry = Database.getEntryById("food",id);
String[] parts = entry.get(0).split(":");
String name = parts[1];
String description = parts[2];
boolean isDessert;
isDessert = parts[3].equals("0");
FoodType foodType = getFoodTypeById(Long.parseLong(parts[4]));
List<Allergy> allergies = getAllergies(id);
return new Food(id,name,description,isDessert,foodType,allergies);
}
public static FoodType getFoodTypeById(long id){
List<String> entry = Database.getEntryById("food_type",id);
String[] typeParts = entry.get(0).split(":");
return new FoodType(Long.parseLong(typeParts[0]),typeParts[1]);
}
public static Allergy getAllergyById(long id){
String[] allergyH = {"id"};
String[] allergyD = {String.valueOf(id)};
List<String> allergies = Database.select("allergy",allergyH,allergyD);
String[] allergyParts = allergies.get(0).split(":");
return new Allergy(id,allergyParts[1],allergyParts[2]);
}
public static List<Allergy> getAllergies(long foodId){
List<Allergy> allergies = new ArrayList<>();
String[] restrictionsH = {"foodid"};
String[] restrictionsD = {String.valueOf(foodId)};
List<String> restrictions = Database.select("food_restriction",restrictionsH,restrictionsD);
for (String restriction : restrictions) {
String[] partsRestrictions = restriction.split(":");
allergies.add(getAllergyById(Long.parseLong(partsRestrictions[2])));
}
return allergies;
}
/**
* inserts the selected food into food_Selection if the food_plan has not been sent
* @param food_selectionData childid, food_planid, foodid
* @return id or -1
*/
public static long createFood_selection(String[] food_selectionData){
String[] food_selectionH = {"childid","food_planid","foodid"};
FoodPlan food_plan = getFoodPlanById(Long.parseLong(food_selectionData[1]));
if(!food_plan.isSent()){
return Database.insert("food_selection",food_selectionH,food_selectionData);
}else {
return -1;
}
}
/**
* accumulates the selected food for a given day and locks the corresponding food_plan
* @param date YYYY-MM-DD day
* @return the accumulated orders
*/
public static List<String> getDayOrder(String date){
List<String> orders = new ArrayList<>();
FoodPlan food_plan = getFoodPlan(date);
String sId = String.valueOf(food_plan.getId());
String[] food_selectionH = {"food_planid","foodid"};
Food[] foodArray = {
food_plan.getFoodVegan(),
food_plan.getFoodSecond(),
food_plan.getDessertVegan(),
food_plan.getDessertSecond()
};
for(int i = 0; i < 4; i++){
String foodName = foodArray[i].getName();
String[] food_selectionD = {sId, String.valueOf(foodArray[i].getId())};
int count = Database.count("food_selection",food_selectionH,food_selectionD);
orders.add(count+" X "+foodName);
}
String[] updateH = {"id","issent"};
String[] updateD = {sId,"1"};
if(Database.update("food_plan",updateH,updateD) < 0){
System.out.println("Fehler");
}
return orders;
}
}

View File

@@ -0,0 +1,58 @@
package com.bib.essensbestellungsverwaltung;
public class FoodPlan {
private long id;
private String date;
private Food foodVegan;
private Food foodSecond;
private Food dessertVegan;
private Food dessertSecond;
private boolean isSent;
public FoodPlan(long id, String date, Food foodVegan, Food foodSecond, Food dessertVegan, Food dessertSecond, boolean isSent) {
this.id = id;
this.date = date;
this.foodVegan = foodVegan;
this.foodSecond = foodSecond;
this.dessertVegan = dessertVegan;
this.dessertSecond = dessertSecond;
this.isSent = isSent;
}
public FoodPlan(String date, Food foodVegan, Food foodSecond, Food dessertVegan, Food dessertSecond) {
this.id = -1;
this.date = date;
this.foodVegan = foodVegan;
this.foodSecond = foodSecond;
this.dessertVegan = dessertVegan;
this.dessertSecond = dessertSecond;
this.isSent = false;
}
public long getId() {
return id;
}
public String getDate() {
return date;
}
public Food getFoodVegan() {
return foodVegan;
}
public Food getFoodSecond() {
return foodSecond;
}
public Food getDessertVegan() {
return dessertVegan;
}
public Food getDessertSecond() {
return dessertSecond;
}
public boolean isSent() {
return isSent;
}
}

View File

@@ -0,0 +1,22 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class FoodType {
private long id;
private String name;
public FoodType(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}

View File

@@ -1,55 +0,0 @@
package com.bib.essensbestellungsverwaltung;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.*;
public class HelloApplication extends Application {
private static final String dbLocation = "jdbc:sqlite:"+HelloApplication.class.getResource("database/database.db");
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello World! von Richard");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
/* String sql = """
CREATE TABLE IF NOT EXISTS user (
id integer PRIMARY KEY,
name text);""";
String sql2 = "SELECT * FROM user WHERE id > ?";
String sql3 = "INSERT INTO user (id,name) VALUES (1,'test1')";
try(Connection conn = connect();
Statement stmt = conn.createStatement()){
stmt.execute(sql);
stmt.execute(sql3);
PreparedStatement pstmt = conn.prepareStatement(sql2);
pstmt.setInt(1,0);
ResultSet rs = pstmt.executeQuery();
while (rs.next()){
System.out.println(rs.getInt("id"));
}
}catch (SQLException e){
e.printStackTrace();
return;
} */
launch();
}
private static Connection connect(){
Connection conn = null;
try{
conn = DriverManager.getConnection(dbLocation);
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
}

View File

@@ -1,14 +1,34 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class HelloController {
@FXML
private Label welcomeText;
/**
* @autor: Reshad Meher
* Username, Passwort , login
*/
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
private TextField unsernameEingabe;
@FXML
private TextField passwortEingabe;
@FXML
private Label lblAusgabe;
@FXML
protected void onLoginButtonClick() {
String benutzerEingabe = unsernameEingabe.getText();
String kennwortEingabe = passwortEingabe.getText();
if(benutzerEingabe.contains("Reshad") && kennwortEingabe.contains("test123")){
lblAusgabe.setText("Herzlich Willkommen, " + benutzerEingabe + "!");
}else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Die Benutzername oder Passwort ist falsch");
alert.showAndWait();
}
unsernameEingabe.setText("");
passwortEingabe.setText("");
}
}

View File

@@ -0,0 +1,43 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.HashMap;
public class LoginController {
@FXML
private TextField tfEmail;
@FXML
private PasswordField pfPassword;
HashMap<String,String> benutzerMap = new HashMap<String,String>();
@FXML
protected void onBtLoginClick() throws IOException {
benutzerMap.put("Reshad","1234");
String email = tfEmail.getText();
String password = pfPassword.getText();
if(benutzerMap.containsKey(email) && benutzerMap.containsValue(password)){
// if user is worker: StartViewApplication.changeScene("workerMenu-view.fxml");
StartViewApplication.changeScene("parentMenu-view.fxml");
}else {
Alert alert = new Alert(Alert.AlertType.ERROR,"Email oder Passwort ist falsch");
alert.showAndWait();
}
tfEmail.setText("");
pfPassword.setText("");
}
@FXML
protected void changeToSignUp() throws IOException {
StartViewApplication.changeScene("signUp-view.fxml");
}
}

View File

@@ -0,0 +1,100 @@
package com.bib.essensbestellungsverwaltung;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.*;
public class MenueController {
@FXML
Button btFirstMealMon;
@FXML
Button btSecondMealMon;
@FXML
Button btNoMealMon;
@FXML
Button btFirstDessertMon;
@FXML
Button btSecondDessertMon;
@FXML
Button btNoDessertMon;
@FXML
Button btFirstMealTue;
@FXML
Button btSecondMealTue;
@FXML
Button btNoMealTue;
@FXML
Button btFirstDessertTue;
@FXML
Button btSecondDessertTue;
@FXML
Button btNoDessertTue;
@FXML
Button btFirstMealWed;
@FXML
Button btSecondMealWed;
@FXML
Button btNoMealWed;
@FXML
Button btFirstDessertWed;
@FXML
Button btSecondDessertWed;
@FXML
Button btNoDessertWed;
@FXML
Button btFirstMealThu;
@FXML
Button btSecondMealThu;
@FXML
Button btNoMealThu;
@FXML
Button btFirstDessertThu;
@FXML
Button btSecondDessertThu;
@FXML
Button btNoDessertThu;
@FXML
Button btFirstMealFri;
@FXML
Button btSecondMealFri;
@FXML
Button btNoMealFri;
@FXML
Button btFirstDessertFri;
@FXML
Button btSecondDessertFri;
@FXML
Button btNoDessertFri;
@FXML
ComboBox<String> cbPickChild;
@FXML
Button btLogin;
@FXML
Button btSaveOrder;
@FXML
ListView<String> lvFoodInfo;
public ObservableList<Node> buttons = FXCollections.observableArrayList();
public void setButtonActive(ActionEvent event) {
Button b = (Button) event.getSource();
javafx.scene.Parent p = b.getParent();
buttons = p.getChildrenUnmodifiable();
for(Node button : buttons){
System.out.println(b.getStyleClass());
/*
b.getStyleClass().remove("active");
if (button.equals(b)){
b.getStyleClass().add("active");;
}
*/
}
}
}

View File

@@ -0,0 +1,24 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
import java.util.ArrayList;
import java.util.List;
public class Parent extends User{
List<Child> children;
public Parent(long id, String name, String firstname, String password, String email, Address address, List<Child> children) {
super(id, name, firstname, password, email, address);
this.children = children;
}
public Parent(String name, String firstname, String password, String email, Address address) {
super(name, firstname, password, email, address);
this.children = new ArrayList<>();
}
public List<Child> getChildren() {
return children;
}
}

View File

@@ -0,0 +1,6 @@
package com.bib.essensbestellungsverwaltung;
public class ParentController{
}

View File

@@ -0,0 +1,12 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import java.io.IOException;
import java.util.Objects;
public class SceneController {
}

View File

@@ -0,0 +1,4 @@
package com.bib.essensbestellungsverwaltung;
public class SettingsController {
}

View File

@@ -0,0 +1,27 @@
/** Reshad Meher*/
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.HashMap;
public class SingUpController {
@FXML
private void onKontoErstellenBtClick(){
}
@FXML
private void onAnmeldenBtClick() throws IOException {
}
}

View File

@@ -0,0 +1,4 @@
package com.bib.essensbestellungsverwaltung;
public class StartPageController {
}

View File

@@ -0,0 +1,42 @@
/**
* @autor: Reshad Meher
* Fenstergrößer
* Fenstertitle
*/
package com.bib.essensbestellungsverwaltung;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class StartViewApplication extends Application {
public static Stage primary;
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(StartViewApplication.class.getResource("login-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1200, 750);
primary = stage;
stage.setTitle("Essen Bestellung im Kindergarten");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Database.init();
Database.createDb();
Database.fillDb();
//Database.printSampleQuery();
//Database.deleteSample();
launch();
}
public static void changeScene(String scene) throws IOException {
Parent p = FXMLLoader.load(StartViewApplication.class.getResource(scene));
primary.getScene().setRoot(p);
}
}

View File

@@ -0,0 +1,11 @@
package com.bib.essensbestellungsverwaltung;
public class SuperMain {
public static void main(String[] args) {
if(args.length > 0){
ConsoleMain.main(args);
}else {
StartViewApplication.main(args);
}
}
}

View File

@@ -0,0 +1,54 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class User {
private long id;
private String name;
private String firstname;
private String password;
private String email;
private Address address;
public User(long id, String name, String firstname, String password, String email, Address address) {
this.id = id;
this.name = name;
this.firstname = firstname;
this.password = password;
this.email = email;
this.address = address;
}
public User(String name, String firstname, String password, String email, Address address) {
this.id = -1;
this.name = name;
this.firstname = firstname;
this.password = password;
this.email = email;
this.address = address;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getFirstname() {
return firstname;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
public Address getAddress() {
return address;
}
}

View File

@@ -0,0 +1,13 @@
package com.bib.essensbestellungsverwaltung;
/*
@author Malte Schulze Hobeling
*/
public class Worker extends User{
public Worker(long id, String name, String firstname, String password, String email, Address address) {
super(id, name, firstname, password, email, address);
}
public Worker(String name, String firstname, String password, String email, Address address) {
super(name, firstname, password, email, address);
}
}

View File

@@ -0,0 +1,95 @@
package com.bib.essensbestellungsverwaltung;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import java.io.IOException;
public class WorkerMenuController {
@FXML
public BorderPane contentView;
@FXML
Button tagesbestellungButton;
@FXML
Button wochenplanButton;
@FXML
Button monatsabrechnungButton;
@FXML
Button mitarbeiterButton;
@FXML
Button mahlzeitButton;
@FXML
Button einstellungenButton;
@FXML
public void initialize() {
changePage("menue-view.fxml");
setButtonActive(tagesbestellungButton);
}
@FXML
public void onTagesbestellungenClick(MouseEvent mouseEvent) {
changePage("menue-view.fxml");
setButtonActive(tagesbestellungButton);
}
@FXML
public void onWochenplanClick(MouseEvent mouseEvent) {
changePage("createFoodplan-view.fxml");
setButtonActive(wochenplanButton);
}
@FXML
public void onMonatsabrechnungClick(MouseEvent mouseEvent) {
changePage("invoice-view.fxml");
setButtonActive(monatsabrechnungButton);
}
@FXML
public void onMitarbeiterClick(MouseEvent mouseEvent) {
changePage("createCoworker-view.fxml");
setButtonActive(mitarbeiterButton);
}
@FXML
public void onMahlzeitClick(MouseEvent mouseEvent) {
changePage("createFood-view.fxml");
setButtonActive(mahlzeitButton);
}
public void onEinstellungenClick(MouseEvent mouseEvent) {
setButtonActive(einstellungenButton);
}
@FXML
public void onAusloggenClick(MouseEvent mouseEvent) throws IOException {
StartViewApplication.changeScene("parentMenu-view.fxml");
}
private void changePage(String page) {
try {
Parent root = FXMLLoader.load(getClass().getResource(page));
contentView.setCenter(root);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void setButtonActive(Button b) {
tagesbestellungButton.getStyleClass().remove("active");
monatsabrechnungButton.getStyleClass().remove("active");
wochenplanButton.getStyleClass().remove("active");
mahlzeitButton.getStyleClass().remove("active");
mitarbeiterButton.getStyleClass().remove("active");
einstellungenButton.getStyleClass().remove("active");
b.getStyleClass().add("active");
}
}

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="625.0" prefWidth="600.0" stylesheets="@adminMenue.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.AdminController">
<children>
<VBox id="optionsContainer" layoutY="25.0" prefHeight="600.0" prefWidth="300.0" stylesheets="@adminMenue.css">
<children>
<HBox alignment="CENTER_LEFT" prefHeight="40.0" prefWidth="179.0">
<children>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/to-do-list.png" />
</image>
</ImageView>
<Button id="buttons" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="300.0" style="-fx-background-color: transparent;" text="Tagesbestellungen" textFill="WHITE">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="35.0" prefWidth="175.0">
<children>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/spreadsheet.png" />
</image>
</ImageView>
<Button id="buttons" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="300.0" style="-fx-background-color: transparent;" text="Monatsabrechnung" textFill="WHITE">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="23.0" prefWidth="175.0">
<children>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/calendar.png" />
</image>
</ImageView>
<Button id="buttons" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="300.0" style="-fx-background-color: transparent;" text="Wochenplan" textFill="WHITE">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="0.0" prefWidth="175.0">
<children>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/lunch.png" />
</image>
</ImageView>
<Button id="buttons" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="300.0" style="-fx-background-color: transparent;" text="Mahlzeit" textFill="WHITE">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="26.0" prefWidth="175.0">
<children>
<ImageView fitHeight="25.0" fitWidth="25.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/teamwork.png" />
</image>
</ImageView>
<Button id="buttons" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="300.0" style="-fx-background-color: transparent;" text="Mitarbeiter" textFill="WHITE">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
</children>
</VBox>
<HBox id="optionsContainer" alignment="TOP_RIGHT" prefHeight="25.0" prefWidth="1200.0" style="-fx-background-color: lightblue;">
<children>
<Button mnemonicParsing="false" style="-fx-background-color: transparent;" text="Hallo, [Nutzername]" textFill="WHITE" />
</children>
</HBox>
</children>
</AnchorPane>

View File

@@ -0,0 +1,12 @@
#buttons:hover{
-fx-underline: true;
-fx-background-color: rgba(85, 103, 136, 0.64);
}
#buttons:pressed{
-fx-background-color: #748d96;
}
#optionsContainer{
-fx-background-color: lightblue;
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.AdminController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="760.0" prefWidth="867.0" stylesheets="@child.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.ParentController">
<children>
<Text layoutX="51.0" layoutY="90.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Kinder">
<font>
<Font size="58.0" />
</font>
</Text>
<HBox id="contentContainer" alignment="CENTER" layoutX="48.0" layoutY="244.0" prefHeight="250.0" prefWidth="770.0">
<children>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Name">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<TextField prefWidth="97.0">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</TextField>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Geburtsdatum">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<DatePicker prefHeight="26.0" prefWidth="226.0">
<VBox.margin>
<Insets top="13.0" />
</VBox.margin>
</DatePicker>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Alter">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<TextField prefWidth="97.0">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</TextField>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Gruppe">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<ComboBox prefHeight="26.0" prefWidth="230.0">
<VBox.margin>
<Insets top="13.0" />
</VBox.margin>
</ComboBox>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
<VBox id="contentContainer" prefHeight="250.0" prefWidth="256.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Allergien">
<VBox.margin>
<Insets bottom="15.0" top="15.0" />
</VBox.margin>
</Text>
<ListView prefHeight="101.0" prefWidth="227.0" />
<TextField id="tfAddAllergy" promptText="Allergie hinzufügen">
<VBox.margin>
<Insets top="15.0" />
</VBox.margin>
</TextField>
</children>
<HBox.margin>
<Insets left="15.0" right="15.0" />
</HBox.margin>
</VBox>
</children>
</HBox>
<Button id="btAddChild" layoutX="360.0" layoutY="592.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="146.0" text="Kind hinzufügen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,5 @@
#btAddChild{
-fx-background-color: lightblue;
-fx-border-color: transparent;
-fx-text-fill: white;
}

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="860.0" prefWidth="850.0" stylesheets="@createCoworker.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.AdminController">
<children>
<Label layoutX="301.0" layoutY="49.0" />
<Label layoutX="223.0" layoutY="76.0" prefHeight="28.0" prefWidth="220.0" text="Mitarbeiter hinzufügen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox layoutX="223.0" layoutY="149.0" prefHeight="317.0" prefWidth="514.0">
<children>
<HBox prefHeight="43.0" prefWidth="331.0">
<children>
<Label prefHeight="17.0" prefWidth="116.0" text="Nachname">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField id="lastname" prefHeight="25.0" prefWidth="194.0" />
</children>
</HBox>
<HBox prefHeight="60.0" prefWidth="331.0">
<children>
<Label prefHeight="35.0" prefWidth="118.0" text="Vorname">
<padding>
<Insets top="10.0" />
</padding>
<font>
<Font size="16.0" />
</font>
</Label>
<TextField id="firstname" prefHeight="25.0" prefWidth="193.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="116.0" text="Straße">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField id="street" prefHeight="25.0" prefWidth="195.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="25.0" prefWidth="118.0" text="Hausnummer">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField id="number" prefHeight="25.0" prefWidth="87.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="24.0" prefWidth="331.0">
<children>
<Label prefHeight="25.0" prefWidth="118.0" text="PLZ">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField id="plz" prefHeight="25.0" prefWidth="87.0">
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
<padding>
<Insets top="10.0" />
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="120.0" text="Stadt">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField id="city" prefHeight="13.0" prefWidth="194.0">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</TextField>
</children>
<padding>
<Insets top="10.0" />
</padding>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<Label prefHeight="35.0" prefWidth="117.0" text="Email">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<TextField id="email" prefHeight="25.0" prefWidth="196.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="471.0">
<children>
<Label prefHeight="35.0" prefWidth="122.0" text="Passwort">
<font>
<Font size="16.0" />
</font>
<padding>
<Insets top="10.0" />
</padding>
</Label>
<PasswordField id="password" accessibleRole="PASSWORD_FIELD" prefHeight="25.0" prefWidth="194.0">
<HBox.margin>
<Insets top="10.0" />
</HBox.margin>
</PasswordField>
</children>
</HBox>
</children>
</VBox>
<Button id="btCreateCoworker" fx:id="btCreateCoworker" layoutX="216.0" layoutY="533.0" mnemonicParsing="false" onAction="#onBtSignUp" prefHeight="44.0" prefWidth="158.0" text="Mitarbeiter hinzufügen" />
<Button id="btCancelCoworker" fx:id="btCancelCoworker" layoutX="443.0" layoutY="533.0" mnemonicParsing="false" onAction="#onBtCancel" prefHeight="44.0" prefWidth="158.0" text="Abbrechen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btCreateCoworker {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateCoworker:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelCoworker{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelCoworker:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="521.0" prefWidth="731.0" stylesheets="@createFood.css" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label alignment="CENTER" layoutX="247.0" layoutY="29.0" prefHeight="44.0" prefWidth="237.0" text="Gericht hinzufügen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox layoutX="136.0" layoutY="73.0" prefHeight="389.0" prefWidth="459.0">
<children>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label prefHeight="33.0" prefWidth="121.0" text="Name des Gerichts" />
<TextField prefHeight="25.0" prefWidth="290.0">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label prefHeight="33.0" prefWidth="121.0" text="Beschreibung" />
<TextArea prefHeight="75.0" prefWidth="290.0" />
</children>
<padding>
<Insets top="5.0" />
</padding>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label text="Art des Gerichts">
<HBox.margin>
<Insets top="20.0" />
</HBox.margin>
</Label>
<RadioButton mnemonicParsing="false" text="Hauptgericht">
<HBox.margin>
<Insets left="35.0" top="20.0" />
</HBox.margin>
</RadioButton>
<RadioButton mnemonicParsing="false" text="Dessert">
<HBox.margin>
<Insets left="50.0" top="20.0" />
</HBox.margin>
</RadioButton>
</children>
<VBox.margin>
<Insets />
</VBox.margin>
<padding>
<Insets top="5.0" />
</padding>
</HBox>
<HBox prefHeight="75.0" prefWidth="459.0">
<children>
<Label text="Typ">
<HBox.margin>
<Insets top="20.0" />
</HBox.margin>
</Label>
<RadioButton mnemonicParsing="false" prefHeight="17.0" prefWidth="91.0" text="Vegetarisch">
<HBox.margin>
<Insets left="100.0" top="20.0" />
</HBox.margin>
</RadioButton>
<RadioButton mnemonicParsing="false" text="Vegan">
<HBox.margin>
<Insets left="20.0" top="20.0" />
</HBox.margin>
</RadioButton>
<RadioButton mnemonicParsing="false" text="Fleisch">
<HBox.margin>
<Insets left="40.0" top="20.0" />
</HBox.margin>
</RadioButton>
</children>
</HBox>
<HBox prefHeight="76.0" prefWidth="459.0">
<children>
<Label prefHeight="41.0" prefWidth="171.0" text="Allergien mit Komma getrennt" />
<TextArea prefHeight="76.0" prefWidth="246.0" />
</children>
</HBox>
</children>
</VBox>
<Button id="btCreateFood" layoutX="485.0" layoutY="464.0" mnemonicParsing="false" prefHeight="34.0" prefWidth="146.0" text="Hinzufügen" />
<Button id="btCancelFood" layoutX="102.0" layoutY="456.0" mnemonicParsing="false" prefHeight="50.0" prefWidth="162.0" text="Abbrechen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btCreateFood {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateFood:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelFood{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelFood:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="599.0" prefWidth="900.0" stylesheets="@createFoodplan.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label layoutX="359.0" layoutY="36.0" text="Essensplan erstellen">
<font>
<Font size="18.0" />
</font>
</Label>
<VBox layoutX="134.0" layoutY="124.0" prefHeight="327.0" prefWidth="632.0">
<children>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Datum JJJJ-MMM-TT">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<TextField />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Veganes Hauptgericht">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<TextField>
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Zweites Hauptgericht">
<HBox.margin>
<Insets top="5.0" />
</HBox.margin>
</Label>
<TextField>
<HBox.margin>
<Insets />
</HBox.margin>
</TextField>
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Veganes Dessert">
<HBox.margin>
<Insets />
</HBox.margin>
<padding>
<Insets top="5.0" />
</padding>
</Label>
<TextField />
</children>
</HBox>
<HBox prefHeight="50.0" prefWidth="632.0">
<children>
<Label prefHeight="17.0" prefWidth="133.0" text="Zweites Dessert">
<padding>
<Insets top="5.0" />
</padding>
</Label>
<TextField />
</children>
</HBox>
</children>
</VBox>
<Button id="btCreateFoodplan" layoutX="112.0" layoutY="427.0" mnemonicParsing="false" prefHeight="68.0" prefWidth="133.0" text="Plan erstellen" />
<Button id="btCancelFoodplan" layoutX="299.0" layoutY="427.0" mnemonicParsing="false" prefHeight="68.0" prefWidth="133.0" text="Abbrechen" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btCreateFoodplan {
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btCreateFoodplan:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btCancelFoodplan{
-fx-background-color: transparent;
-fx-underline: true;
}
#btCancelFoodplan:hover{
-fx-text-fill: lightblue;
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.AdminController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" stylesheets="@deleteChild.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.ParentController">
<children>
<Text layoutX="253.0" layoutY="180.0" strokeType="OUTSIDE" strokeWidth="0.0" text="[Name vom Kind] löschen?" wrappingWidth="274.130859375">
<font>
<Font size="23.0" />
</font>
</Text>
<ImageView fitHeight="150.0" fitWidth="200.0" layoutX="66.0" layoutY="97.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/trash-can.png" />
</image>
</ImageView>
<Button id="btDeletConfim" layoutX="390.0" layoutY="315.0" mnemonicParsing="false" prefHeight="53.0" prefWidth="141.0" text="Bestätigen" />
<Button id="btDeleteDeny" layoutX="71.0" layoutY="315.0" mnemonicParsing="false" prefHeight="53.0" prefWidth="141.0" text="zurück" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,18 @@
#btDeletConfim{
-fx-background-color: lightblue;
-fx-text-fill: white;
}
#btDeletConfim:hover{
-fx-underline: true;
-fx-text-fill: black;
}
#btDeleteDeny{
-fx-background-color: transparent;
-fx-underline: true;
}
#btDeleteDeny:hover{
-fx-text-fill: lightblue;
}

View File

@@ -2,15 +2,29 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.PasswordField?>
<GridPane hgap="10.0" vgap="10.0"
xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/11.0.2"
fx:controller="com.bib.essensbestellungsverwaltung.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
<Label text="Bitte geben Sie Ihre Anmeldedaten ein."
GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="0" />
<Label text="Benutzername:"
GridPane.columnIndex="0" GridPane.rowIndex="1" />
<TextField fx:id="unsernameEingabe"
GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label text="Passwort:"
GridPane.columnIndex="0" GridPane.rowIndex="2" />
<PasswordField fx:id="passwortEingabe"
GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Button text="LOGIN" onAction="#onLoginButtonClick"
GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Label fx:id="lblAusgabe"
GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="4"/>
</GridPane>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.AdminController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="536.0" prefWidth="929.0" style="-fx-background-color: lightblue;" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.MenueController">
<children>
<Label alignment="CENTER" layoutX="14.0" layoutY="14.0" prefHeight="35.0" prefWidth="895.0" text="Essenbestellung">
<font>
<Font size="28.0"/>
</font>
</Label>
<Button alignment="CENTER" layoutX="868.0" layoutY="61.0" mnemonicParsing="false" style="-fx-background-color: white;" text="Login" />
<VBox layoutX="14.0" layoutY="100.0" prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Montag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<Label prefHeight="18.0" prefWidth="180.0" text="Hauptgericht" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Button">
<VBox.margin>
<Insets />
</VBox.margin>
</Button>
<Label prefHeight="18.0" prefWidth="174.0" text="Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Button" />
</children>
</VBox>
<VBox layoutX="194.0" layoutY="100.0" prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" prefHeight="18.0" prefWidth="210.0" text="Dienstag">
<font>
<Font size="18.0" />
</font>
</Label>
<Label prefHeight="18.0" prefWidth="182.0" text="Hauptgericht">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Button" />
<Label prefHeight="18.0" prefWidth="183.0" text="Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="170.0" text="Button" />
</children>
</VBox>
<VBox layoutX="554.0" layoutY="100.0" prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" prefHeight="18.0" prefWidth="214.0" text="Donnerstag">
<font>
<Font size="18.0" />
</font>
</Label>
<Label prefHeight="18.0" prefWidth="178.0" text="Hauptgericht">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
<Label prefHeight="18.0" prefWidth="186.0" text="Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
</children>
</VBox>
<VBox layoutX="374.0" layoutY="100.0" prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" prefHeight="18.0" prefWidth="212.0" text="Mittwoch">
<font>
<Font size="18.0" />
</font>
</Label>
<Label prefHeight="18.0" prefWidth="176.0" text="Hauptgericht">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
<Label prefHeight="18.0" prefWidth="177.0" text="Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
</children>
</VBox>
<VBox layoutX="734.0" layoutY="100.0" prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" prefHeight="18.0" prefWidth="200.0" text="Freitag">
<font>
<Font size="18.0" />
</font>
</Label>
<Label prefHeight="18.0" prefWidth="190.0" text="Hauptgericht">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
<Label prefHeight="18.0" prefWidth="190.0" text="Dessert">
<VBox.margin>
<Insets top="10.0" />
</VBox.margin>
</Label>
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="78.0" prefWidth="218.0" text="Button" />
<Button alignment="CENTER" mnemonicParsing="false" prefHeight="20.0" prefWidth="218.0" text="Button" />
</children>
</VBox>
</children>
</AnchorPane>

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.Blend?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.LoginController">
<children>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="265.0" style="-fx-background-color: lightblue;">
<children>
<Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Essensbestellung">
<font>
<Font name="Yu Gothic Light" size="26.0" />
</font>
</Text>
</children>
<padding>
<Insets bottom="150.0" />
</padding>
</VBox>
<Circle fill="#67b5ff2e" layoutX="-23.0" layoutY="368.0" radius="100.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#69b6ffb0" layoutX="235.0" layoutY="310.0" radius="158.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#93c4f23d" layoutY="258.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<VBox alignment="CENTER" layoutX="263.0" prefHeight="400.0" prefWidth="338.0" style="-fx-background-color: white;">
<children>
<TextField promptText="Email" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="tfEmail">
<VBox.margin>
<Insets bottom="15.0" left="25.0" right="25.0" top="25.0" />
</VBox.margin>
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le" size="12.0" />
</font>
</TextField>
<PasswordField promptText="Passwort" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;" fx:id="pfPassword">
<VBox.margin>
<Insets bottom="25.0" left="25.0" right="25.0" top="15.0" />
</VBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</PasswordField>
<HBox alignment="CENTER" prefHeight="30.0" prefWidth="238.0">
<children>
<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="106.0" style="-fx-background-radius: 25; -fx-background-color: lightblue;" text="Login" textFill="WHITE" onAction="#onBtLoginClick">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font></Button>
<Button id="btSignUp" mnemonicParsing="false" prefHeight="25.0" prefWidth="101.0" style="-fx-background-color: tranparent;" text="Sign up" textFill="#7c7b7b" underline="true" onAction="#changeToSignUp" />
</children>
</HBox>
</children>
<padding>
<Insets bottom="65.0" left="45.0" right="45.0" top="45.0" />
</padding>
</VBox>
<Circle fill="#1469b895" layoutX="133.0" layoutY="368.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#0088ff82" layoutX="77.0" layoutY="276.0" radius="53.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="600.0" prefWidth="900.0" stylesheets="@menue.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.MenueController">
<children>
<Label alignment="CENTER" layoutX="14.0" layoutY="14.0" prefHeight="35.0" prefWidth="895.0" text="Essenbestellung">
<font>
<Font size="28.0" />
</font>
</Label>
<Button id="btLogin" fx:id="btLogin" alignment="CENTER" layoutX="848.0" layoutY="34.0" mnemonicParsing="false" text="Login" />
<HBox layoutX="220.0" layoutY="87.0" prefHeight="414.0" prefWidth="688.0">
<children>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Montag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstMealMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1" />
<Button id="btFoodChoice" fx:id="btSecondMealMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2" />
<Button id="btFoodChoice" fx:id="btNoMealMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstDessertMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 1" />
<Button id="btFoodChoice" fx:id="btSecondDessertMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 2" />
<Button id="btFoodChoice" fx:id="btNoDessertMon" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="kein Dessert" />
</children>
</VBox>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Dienstag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstMealTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1" />
<Button id="btFoodChoice" fx:id="btSecondMealTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2" />
<Button id="btFoodChoice" fx:id="btNoMealTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstDessertTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 1" />
<Button id="btFoodChoice" fx:id="btSecondDessertTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 2" />
<Button id="btFoodChoice" fx:id="btNoDessertTue" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="kein Dessert" />
</children>
</VBox>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Mittwoch" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstMealWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1" />
<Button id="btFoodChoice" fx:id="btSecondMealWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2" />
<Button id="btFoodChoice" fx:id="btNoMealWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstDessertWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 1" />
<Button id="btFoodChoice" fx:id="btSecondDessertWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 2" />
<Button id="btFoodChoice" fx:id="btNoDessertWed" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="kein Dessert" />
</children>
</VBox>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Donnerstag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstMealThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1" />
<Button id="btFoodChoice" fx:id="btSecondMealThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2" />
<Button id="btFoodChoice" fx:id="btNoMealThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstDessertThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 1" />
<Button id="btFoodChoice" fx:id="btSecondDessertThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 2" />
<Button id="btFoodChoice" fx:id="btNoDessertThu" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="kein Dessert" />
</children>
</VBox>
</children>
</VBox>
<VBox prefHeight="350.0" prefWidth="180.0" style="-fx-background-color: transparent; -fx-padding: 5;">
<children>
<Label alignment="CENTER" contentDisplay="TOP" prefHeight="23.0" prefWidth="196.0" style="-fx-background-color: lightdarkblue;" text="Freitag" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" />
</VBox.margin>
<font>
<Font size="18.0" />
</font>
</Label>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstMealFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 1" />
<Button id="btFoodChoice" fx:id="btSecondMealFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Mahlzeit 2" />
<Button id="btFoodChoice" fx:id="btNoMealFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="Keine Mahlzeit">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Button>
</children>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Button id="btFoodChoice" fx:id="btFirstDessertFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 1" />
<Button id="btFoodChoice" fx:id="btSecondDessertFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="78.0" prefWidth="218.0" text="Dessert 2" />
<Button id="btFoodChoice" fx:id="btNoDessertFri" alignment="CENTER" mnemonicParsing="false" onAction="#setButtonActive" prefHeight="20.0" prefWidth="170.0" text="kein Dessert" />
</children>
</VBox>
</children>
</VBox>
</children>
</HBox>
<Button id="btPlaceOrder" fx:id="btSaveOrder" layoutX="379.0" layoutY="527.0" mnemonicParsing="false" prefHeight="40.0" prefWidth="150.0" text="Bestellung abschicken" />
<ComboBox id="cbChooseChild" fx:id="cbPickChild" layoutX="29.0" layoutY="34.0" prefWidth="150.0" promptText="Wähle Kind" stylesheets="@menue.css" />
<ListView id="lvShowDescription" fx:id="lvFoodInfo" layoutX="20.0" layoutY="115.0" prefHeight="370.0" prefWidth="200.0" />
</children>
</AnchorPane>

View File

@@ -0,0 +1,10 @@
.sidebar-nav_button {
-fx-background-color: #69b6ff;
-fx-text-fill: #123;
-fx-border-color: #000;
-fx-border-radius: 20;
}
.sidebar-nav_button.active {
-fx-background-color: #4e92b4;
}

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1200.0" stylesheets="parentMenue.css" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1">
<children>
<VBox id="contentContainer" layoutY="-14.0" prefHeight="814.0" prefWidth="333.0" stylesheets="@parentMenue.css">
<children>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="327.0">
<children>
<ImageView fitHeight="60.0" fitWidth="60.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/menu.png" />
</image>
</ImageView>
<Button id="contentButton" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="260.0" text="Essensplan">
<font>
<Font size="25.0" />
</font>
</Button>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<ImageView fitHeight="60.0" fitWidth="60.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/little-kid.png" />
</image>
</ImageView>
<Button id="contentButton" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="25.0" prefWidth="260.0" text="Kind">
<font>
<Font size="25.0" />
</font>
</Button>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<ImageView fitHeight="60.0" fitWidth="60.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/shopping-list.png" />
</image>
</ImageView>
<Button id="contentButton" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="52.0" prefWidth="260.0" text="Bestellung">
<font>
<Font size="25.0" />
</font>
</Button>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<ImageView fitHeight="60.0" fitWidth="60.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@pics/setting.png" />
</image>
</ImageView>
<Button id="contentButton" alignment="BASELINE_LEFT" mnemonicParsing="false" prefHeight="52.0" prefWidth="260.0" text="Nutzereinstellungen">
<font>
<Font size="25.0" />
</font>
</Button>
</children>
</HBox>
</children>
<padding>
<Insets top="50.0" />
</padding></VBox>
<HBox id="contentContainer2" alignment="CENTER_RIGHT" prefHeight="40.0" prefWidth="1200.0" stylesheets="@parentMenue.css">
<children>
<Button id="btLogOut" mnemonicParsing="false" stylesheets="@parentMenue.css" text="Abmelden" />
</children>
</HBox>
</children>
</AnchorPane>

View File

@@ -0,0 +1,26 @@
#contentContainer{
-fx-background-color: #add8e6;
}
#contentContainer2{
-fx-background-color: lightblue;
}
#contentButton{
-fx-background-color: transparent;
}
#contentButton:hover{
-fx-underline: true;
-fx-background-color: #78939d;
-fx-text-fill: white;
}
#btLogOut{
-fx-background-color: transparent;
-fx-pref-height: 40px;
}
#btLogOut:hover{
-fx-underline: true;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.bib.essensbestellungsverwaltung.SettingsController"
prefHeight="400.0" prefWidth="600.0">
</AnchorPane>

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.Blend?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane maxHeight="-400" maxWidth="-600" minHeight="-400" minWidth="-600" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.bib.essensbestellungsverwaltung.SingUpController">
<children>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="265.0" style="-fx-background-color: lightblue;">
<children>
<Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Essensbestellung">
<font>
<Font name="Yu Gothic Light" size="26.0" />
</font>
</Text>
</children>
<padding>
<Insets bottom="150.0" />
</padding>
</VBox>
<Circle fill="#67b5ff2e" layoutX="-23.0" layoutY="368.0" radius="100.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#69b6ffb0" layoutX="235.0" layoutY="310.0" radius="158.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#93c4f23d" layoutY="258.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<VBox layoutX="262.0" prefHeight="400.0" prefWidth="364.0" style="-fx-background-color: white;">
<children>
<TextField fx:id="tfEmail" alignment="TOP_LEFT" prefHeight="26.0" prefWidth="282.0" promptText="Name" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</TextField>
<TextField fx:id="tfBestätigungEmail" promptText="Vorname" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<effect>
<Blend />
</effect>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</TextField>
<PasswordField fx:id="pfPasswort" accessibleRole="TEXT_FIELD" promptText="Email" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<opaqueInsets>
<Insets />
</opaqueInsets>
<effect>
<Blend />
</effect>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</PasswordField>
<PasswordField fx:id="pfBestätigungPassowrt" promptText="Passwort" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
<opaqueInsets>
<Insets />
</opaqueInsets>
<effect>
<Blend />
</effect>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</PasswordField>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextField prefHeight="35.0" prefWidth="92.0" promptText="PLZ" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</TextField>
<TextField prefHeight="35.0" prefWidth="182.0" promptText="Stadt" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</TextField>
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextField prefHeight="27.0" prefWidth="134.0" promptText="Straße" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</TextField>
<TextField prefHeight="27.0" prefWidth="99.0" promptText="Hausnummer" style="-fx-background-color: transparent; -fx-border-color: lightgray; -fx-border-width: 0 0 1 0;">
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin>
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font>
</TextField>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="30.0" prefWidth="238.0">
<children>
<Button mnemonicParsing="false" onAction="#onKontoErstellenBtClick" prefHeight="25.0" prefWidth="106.0" style="-fx-background-radius: 25; -fx-background-color: lightblue;" text="Konto erstellen" textFill="WHITE">
<font>
<Font name="Microsoft Tai Le Bold" size="12.0" />
</font></Button>
<Button id="btSignUp" mnemonicParsing="false" onAction="#onAnmeldenBtClick" prefHeight="25.0" prefWidth="101.0" style="-fx-background-color: tranparent;" text="Anmelden" textFill="#7c7b7b" underline="true" />
</children>
<opaqueInsets>
<Insets top="15.0" />
</opaqueInsets>
<VBox.margin>
<Insets top="15.0" />
</VBox.margin>
</HBox>
</children>
<padding>
<Insets bottom="65.0" left="45.0" right="45.0" top="45.0" />
</padding>
</VBox>
<Circle fill="#1469b895" layoutX="133.0" layoutY="368.0" radius="106.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
<Circle fill="#0088ff82" layoutX="77.0" layoutY="276.0" radius="53.0" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" />
</children>
</AnchorPane>