15 Commits

Author SHA1 Message Date
eeb14ead3c Yum04 registrierung kunde (#49)
Annis aktueller Stand
2023-06-26 20:11:36 +02:00
3c765ff57d Fix unused code 2023-06-26 20:10:40 +02:00
3a4064198d Fix Error CS0102 The type 'Speisekarte' already contains a definition for 'kunden' e 2023-06-26 19:42:53 +02:00
6c627add92 Merge branch 'dev' into YUM04-RegistrierungKunde 2023-06-26 19:04:20 +02:00
901d533cd1 Update README.md (#41)
Spelling mistakes
2023-06-26 18:57:01 +02:00
28327710f8 Warenkorb bestellungsabschluss + Login (Kunde/Chefin) (#48)
* Add Bestellabschluss link

* Add vorbestllungsdata into Table Bestellungsposition

* Add vorbestllungsdata into Table BestellungspositionHasMenuitem

* Add complete vorbestellungsfunktion

* Add kontaktverwaltung Bestellübersicht

* Update Bestelluebersicht BestelluebersichtD-Chefin

* Update Bestelluebersicht

* Fix kunde.Idkunde access

* Add page acees only on valid kunde login

* Add current kunde usage

* Add admin login

* Fix frontend speisekarte1

* Fix treuepunkte vergabe

* Fix chefin bestellungseinsicht
2023-06-26 18:55:12 +02:00
b2dc8402f2 Abandon QRCode scanning idea 2023-06-24 20:29:06 +02:00
35345e455c Remove unused razor page 2023-06-24 19:39:06 +02:00
c85415e740 Check if user is logged in
If the user is not logged in they will be redireted to the login page
Removed old razor Page that is not needed anymore
2023-06-24 18:42:11 +02:00
7cd20602b6 Add .vscode to gitignore 2023-06-24 17:41:41 +02:00
d45fa68fe0 Add visibility if valid kunde on speisekarte 2023-06-24 17:23:41 +02:00
a9418aea33 Add kunden login index 2023-06-24 17:11:52 +02:00
7b8db08d99 Merge branch 'dev' into YUM04-RegistrierungKunde 2023-06-24 16:46:59 +02:00
ba6266579d New Kundenregistrierung 2023-06-24 15:17:45 +02:00
9781d94d6e Update README.md
Spelling mistakes
2023-06-24 14:37:57 +02:00
17 changed files with 330 additions and 146 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
## files generated by popular Visual Studio add-ons.
# User-specific files
.vscode
.vs
*/.vs
*.suo

View File

@ -6,7 +6,7 @@ Yummy4Friends ist eine benutzerfreundliche und visuell ansprechende Webapp zur O
## Description (English)
Yummy4Friends is a user friendly and visually appealing WebApp for ordering food or other things online. Food or other stuff get dynamically fetched from a customer and food database while also taking into account special requests. To attract customers one can also offer limeted time sales/coupons, ordering in advance as well as being able to choosing their preferred pickup time.
Yummy4Friends is a user-friendly and visually appealing WebApp for ordering food or other things online. Food or other stuff gets dynamically fetched from a customer and food database while also taking into account special requests. To attract customers, one can also offer limited-time sales and coupons, order in advance, and have the option to choose the preferred pickup time.
## Tech Stack

View File

@ -4,6 +4,8 @@
@inject HttpClient Http
@inject Blazored.LocalStorage.ISyncLocalStorageService localStorage
@inject NavigationManager _navigationManager
@inject IJSRuntime JSRuntime;
<PageTitle>Yummy4Friends</PageTitle>
@ -32,14 +34,25 @@
{
localStorage.SetItem("kunde", kunde);
_navigationManager.NavigateTo("/speisekarte");
break;
return;
}
}
JSRuntime.InvokeVoidAsync("alert", "Zugangscode ist falsch!");
}
protected override async Task OnInitializedAsync()
{
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
// if already logged in navigate to speisekarte
if (localStorage.ContainKey("kunde"))
{
_navigationManager.NavigateTo("/speisekarte");
}
}
public class Kunde
@ -51,6 +64,3 @@
}

View File

@ -26,18 +26,39 @@
<tr>
<td><a href="/SpeisekarteChinesich">@item2.Bezeichnung</a></td>
</tr>
@if (@item2.Bezeichnung == "Nachspeise")
{
<tr>
<td class="lowest"><br></td>
</tr>
}
}
else if (@item.Bezeichnung == "Japanisch")
{
<tr>
<td><a href="/SpeisekarteJapanisch">@item2.Bezeichnung</a></td>
</tr>
@if (@item2.Bezeichnung == "Nachspeise")
{
<tr>
<td class="lowest"><br></td>
</tr>
}
}
else if (@item.Bezeichnung == "Getränke")
{
<tr>
<td><a href="/SpeisekarteGetraenke">@item2.Bezeichnung</a></td>
</tr>
@if (@item2.Bezeichnung == "Bier")
{
<tr>
<td class="lowest"><br></td>
</tr><tr>
<td class="lowest"><br></td>
</tr>
}
}
else if (@item.Bezeichnung == "Sonstiges")
{
@ -47,15 +68,9 @@
}
else
{
<tr>
<td><a href="/">@item2.Bezeichnung</a></td>
</tr>
}
}
}
<tr>
<td class="lowest"><br></td>
</tr>
<tr>
<td class="lowest"><br></td>
@ -120,3 +135,4 @@
public int Treuepunkte { get; set; }
}
}

View File

@ -137,7 +137,6 @@
allergien = await Http.GetFromJsonAsync<List<Allergie>>("https://localhost:7076/api/allergien");
bestellungspositions = await Http.GetFromJsonAsync<List<Bestellungsposition>>("https://localhost:7076/api/bestellungspositionen");
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
menuitems = await Http.GetFromJsonAsync<List<Menuitem>>("https://localhost:7076/api/Menuitems");
menuitemkategories = await Http.GetFromJsonAsync<List<Menuitemkategorie>>("https://localhost:7076/api/Menuitemkategories");
menuitemueberkategories = await Http.GetFromJsonAsync<List<Menuitemueberkategorie>>("https://localhost:7076/api/Menuitemueberkategories");

View File

@ -143,7 +143,6 @@
allergien = await Http.GetFromJsonAsync<List<Allergie>>("https://localhost:7076/api/allergien");
bestellungspositions = await Http.GetFromJsonAsync<List<Bestellungsposition>>("https://localhost:7076/api/bestellungspositionen");
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
menuitems = await Http.GetFromJsonAsync<List<Menuitem>>("https://localhost:7076/api/Menuitems");
menuitemkategories = await Http.GetFromJsonAsync<List<Menuitemkategorie>>("https://localhost:7076/api/Menuitemkategories");
menuitemueberkategories = await Http.GetFromJsonAsync<List<Menuitemueberkategorie>>("https://localhost:7076/api/Menuitemueberkategories");

View File

@ -93,11 +93,6 @@
</div>
</div>
@code {
private List<Kunde> kunden = new List<Kunde>();
private Kunde kunde = new Kunde();
@ -142,9 +137,9 @@
{
menuitemIds = localStorage.GetItem<Dictionary<int, int>>("MenuItemIds");
}
allergien = await Http.GetFromJsonAsync<List<Allergie>>("https://localhost:7076/api/allergien");
bestellungspositions = await Http.GetFromJsonAsync<List<Bestellungsposition>>("https://localhost:7076/api/bestellungspositionen");
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
menuitems = await Http.GetFromJsonAsync<List<Menuitem>>("https://localhost:7076/api/Menuitems");
menuitemkategories = await Http.GetFromJsonAsync<List<Menuitemkategorie>>("https://localhost:7076/api/Menuitemkategories");
menuitemueberkategories = await Http.GetFromJsonAsync<List<Menuitemueberkategorie>>("https://localhost:7076/api/Menuitemueberkategories");

View File

@ -132,14 +132,13 @@
if (kunde != null && !kunden.Any(k => k.Code == kunde.Code))
_navigationManager.NavigateTo("/");
// kunde login end
if (localStorage.GetItem<Dictionary<int, int>>("MenuItemIds") != null)
{
menuitemIds = localStorage.GetItem<Dictionary<int, int>>("MenuItemIds");
}
allergien = await Http.GetFromJsonAsync<List<Allergie>>("https://localhost:7076/api/allergien");
bestellungspositions = await Http.GetFromJsonAsync<List<Bestellungsposition>>("https://localhost:7076/api/bestellungspositionen");
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
menuitems = await Http.GetFromJsonAsync<List<Menuitem>>("https://localhost:7076/api/Menuitems");
menuitemkategories = await Http.GetFromJsonAsync<List<Menuitemkategorie>>("https://localhost:7076/api/Menuitemkategories");
menuitemueberkategories = await Http.GetFromJsonAsync<List<Menuitemueberkategorie>>("https://localhost:7076/api/Menuitemueberkategories");

View File

@ -89,6 +89,14 @@
{
localStorage.SetItem("RabattEinloesen", false);
localStorage.SetItem("Summe", summe);
if (summe >= 8)
{
if (kunde.Treuepunkte < 10)
{
kunde.Treuepunkte++;
Http.PutAsJsonAsync("https://localhost:7076/api/kunden/" + kunde.Idkunde, kunde);
}
}
}
// add bestellung to API
@ -108,6 +116,7 @@
}
}
}
foreach (var item in menuitemIds)
{
bestellungspositionId++;
@ -130,18 +139,25 @@
Http.PostAsJsonAsync("https://localhost:7076/api/bestellungspositionen", bestellungsposition);
//Add menuitems to bestellungspositionHasMenuItem
BestellungspositionHasMenuitem bestellungspositionHasMenuItem = new BestellungspositionHasMenuitem();
bestellungspositionHasMenuItem.Bestellungsposition_IDBestellung = bestellungsposition.Idbestellung;
bestellungspositionHasMenuItem.MenuItem_IDMenuItem = item.Key;
////Add menuitems to bestellungspositionHasMenuItem
//BestellungspositionHasMenuitem bestellungspositionHasMenuItem = new BestellungspositionHasMenuitem();
//bestellungspositionHasMenuItem.Bestellungsposition_IDBestellung = bestellungsposition.Idbestellung;
//bestellungspositionHasMenuItem.MenuItem_IDMenuItem = item.Key;
Http.PostAsJsonAsync("https://localhost:7076/api/bestellungspositionhasmenuitems", bestellungspositionHasMenuItem);
//Http.PostAsJsonAsync("https://localhost:7076/api/bestellungspositionhasmenuitems", bestellungspositionHasMenuItem);
var newBestellungsposition = new BestellungspositionHasMenuitem()
{
Bestellungsposition_IDBestellung = bestellungsposition.Idbestellung,
MenuItem_IDMenuItem = item.Key
};
Http.PostAsJsonAsync("https://localhost:7076/api/bestellungspositionhasmenuitems", newBestellungsposition);
}
// delete all localStorage
localStorage.SetItem("MenuItemIds", new Dictionary<int, int>());
//localStorage.SetItem("Hour", 0);
//localStorage.SetItem("Minute", 0);
localStorage.SetItem("Summe", 0);
localStorage.SetItem("RabattEinloesen", false);
@ -319,7 +335,7 @@
public class BestellungspositionHasMenuitem
{
public int? Bestellungsposition_IDBestellung { get; set; }
public int? MenuItem_IDMenuItem { get; set; }
public int Bestellungsposition_IDBestellung { get; set; }
public int MenuItem_IDMenuItem { get; set; }
}
}

View File

@ -96,7 +96,6 @@
menuitemueberkategories = await Http.GetFromJsonAsync<List<Menuitemueberkategorie>>("https://localhost:7076/api/Menuitemueberkategories");
rabatte = await Http.GetFromJsonAsync<List<Rabatt>>("https://localhost:7076/api/Rabatte");
// test use the first kunde
// get kunde from local storage
kunde = localStorage.GetItem<Kunde>("kunde");

View File

@ -4,14 +4,19 @@
@inject HttpClient Http
@inject Blazored.LocalStorage.ISyncLocalStorageService localStorage
@inject NavigationManager _navigationManager
@*// logout button*@
<div class="container col-lg-5 col-md-9 col-sm-12 d-flex flex-column " id="content">
<button type="button" class="btn" @onclick="@Logout">Logout</button>
</div>
<div class="container d-flex flex-column">
<div class="row">
<div class="col-lg-8">
<div class="col-12">
<br /><br />
<table class="table table-bordered">
<thead>
<tr>
<th colspan="2">Aktive Bestellungen @day.@month.@year</th>
<th>Aktive Bestellungen @day.@month.@year</th>
</tr>
</thead>
<tbody>
@ -37,9 +42,20 @@
month = bestellungsposition.Datum.Month;
year = bestellungsposition.Datum.Year;
@*print kunde.code, hour and minute from last bestellungsposition*@
@*print only if date is higher than now datum *@
if (bestellungsposition.Datum > DateTime.Now)
@*print only if date is higher than now datum, all expired hh:mm unvisible *@
@*if (bestellungsposition.Datum > DateTime.Now)
{
<tr>
<td>
<p @onclick="@(()=>BDetail(@kunde.Idkunde))" class="mb-0 pb-0">
#@kunde.Code &nbsp;
@hour:@minute
</p>
</td>
</tr>
}*@
@*print only if date is in current day month year *@
if (bestellungsposition.Datum.Day == DateTime.Now.Day && bestellungsposition.Datum.Month == DateTime.Now.Month && bestellungsposition.Datum.Year == DateTime.Now.Year)
{
<tr>
<td>
@ -50,7 +66,6 @@
</td>
</tr>
}
@*}*@
firstTime = false;
}
}
@ -59,8 +74,8 @@
</tbody>
</table>
</div>
@*<div class="col-lg-3">
<p id="text" readonly>Abholzeit</p>
<div class="col-lg-3">
@* <p id="text" readonly>Abholzeit</p>
<br />
<form id="button" action="Bestelluebersicht">
<input type="submit" value="30 Min" class="btn">
@ -70,9 +85,9 @@
</form>
<form id="button" action="Bestelluebersicht">
<input type="submit" value="1 Std" class="btn">
</form>
</form>*@
</div>*@
</div>
</div>
</div>
@ -90,6 +105,11 @@
private Kunde kunde = new Kunde();
public void Logout()
{
localStorage.Clear();
_navigationManager.NavigateTo("/");
}
public void BDetail(int id)
{
localStorage.SetItem<int>("KundeId", id);
@ -108,6 +128,22 @@
month = DateTime.Now.Month;
year = DateTime.Now.Year;
//sort bestellungspositions by datum
bestellungspositions = bestellungspositions.OrderByDescending(x => x.Datum).ToList();
//sort kunden by the order of bestellungspositions
List<Kunde> kundenSorted = new List<Kunde>();
foreach (var bestellungsposition in bestellungspositions)
{
foreach (var kunde in kunden)
{
if (bestellungsposition.KundeIdkunde == kunde.Idkunde && !kundenSorted.Contains(kunde))
{
kundenSorted.Add(kunde);
}
}
}
kunden = kundenSorted;
}
public class Bestellungsposition

View File

@ -5,8 +5,15 @@
@inject Blazored.LocalStorage.ISyncLocalStorageService localStorage
@inject NavigationManager _navigationManager
@*// logout button*@
<div class="container col-lg-5 col-md-9 col-sm-12 d-flex flex-column " id="content">
<button type="button" class="btn" @onclick="@Logout">Logout</button>
</div>
<div class="container">
<div class="row">
<div class="col-sm-12 col-lg-6">
@*Tabelle Ihre Bestellung*@
<div class="tbl-container">
@ -69,7 +76,7 @@
<div class="d-flex flex-column align-items-center ">
<div class="tbl-container w-100">
<!-- <== overflow: hidden applied to parent -->
<table class="table table-bordered bdr " style=" border-radius: 50px; margin-left: 50px;">
<table class="table table-bordered bdr " style=" border-radius: 50px; ">
<thead class="bg_green">
<tr>
<td class="d-flex justify-content-center align-items-center" style="border-bottom:0px;">
@ -92,7 +99,7 @@
<div class="d-flex flex-column" style="align-items: center; margin-left: 100px;">
@*<button class="btn_back w-75">Zurück</button>*@
@*<button class="btn btn-danger w-75" style="border-radius: 50px; padding-top:12px; padding-bottom:12px; color:black;">Bestellung auflösen</button>*@
@*<button class="btn btn-danger w-75" style="border-radius: 50px; padding-top:12px; padding-bottom:12px; color:black;" @onclick="Aufloesen">Bestellung auflösen</button>*@
@*<button class="btn_forward w-75">Bestellung abschließen</button>*@
</div>
@ -113,6 +120,7 @@
</div>
</div>
</div>*@
@code {
public int hour;
@ -137,6 +145,30 @@
private List<Rabatt> rabatte = new List<Rabatt>();
private List<BestellungspositionHasMenuitem> bestellungspositionHasMenuitems = new List<BestellungspositionHasMenuitem>();
public void Logout()
{
localStorage.Clear();
_navigationManager.NavigateTo("/");
}
//public void Aufloesen()
//{
// foreach (var bestellungsposition in bestellungspositions)
// {
// foreach (var bestellungspositionHasMenuitem in bestellungspositionHasMenuitems)
// {
// if (bestellungsposition.Idbestellung == bestellungspositionHasMenuitem.Bestellungsposition_IDBestellung)
// {
// Http.DeleteAsync("https://localhost:7076/api/BestellungspositionHasMenuitems/" + bestellungspositionHasMenuitem.Bestellungsposition_IDBestellung + "/" + bestellungspositionHasMenuitem.MenuItem_IDMenuItem);
// }
// }
// if (bestellungsposition.KundeIdkunde == kunde.Idkunde)
// {
// Http.DeleteAsync("https://localhost:7076/api/Bestellungspositionen/" + bestellungsposition.Idbestellung);
// }
// }
//}
protected override async Task OnInitializedAsync()
{
// get data from api

View File

@ -10,8 +10,9 @@
@*log out Button *@
<div class="container mt-auto">
<button class="btn" type="button" onclick="@Logout" id="button1">@button1</button>
<button class="btn" type="button" onclick="@Logout" id="button1">Abmelden</button>
</div>
<br />
<div class="container mt-auto">
<h4>AccountID: @kunde.Code</h4>

View File

@ -1,4 +1,10 @@
<nav class="navbar navbar-expand-md navbar-light mb-4 me-5 ms-5 ">
@inject HttpClient Http
@inject Blazored.LocalStorage.ISyncLocalStorageService localStorage
@inject NavigationManager _navigationManager
<nav class="navbar navbar-expand-md navbar-light mb-4 me-5 ms-5 ">
<div class="container-fluid">
@*<a class="navbar-brand" href="">Yummy4Friends</a>*@
<a class="navbar-brand" href="">
@ -37,7 +43,7 @@
</li>
<li class="nav-item">
<NavLink class="nav-link" href="Kontoverwaltung">
#12345
#@kunde.Code
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-person-fill" viewBox="0 0 16 16">
<path d="M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H3Zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z" />
</svg>
@ -58,4 +64,30 @@
{
collapseNavMenu = !collapseNavMenu;
}
private List<Kunde> kunden = new List<Kunde>();
private Kunde kunde = new Kunde();
protected override async Task OnInitializedAsync()
{
// kunde login start
kunden = await Http.GetFromJsonAsync<List<Kunde>>("https://localhost:7076/api/kunden");
if (localStorage.ContainKey("kunde"))
kunde = localStorage.GetItem<Kunde>("kunde");
else
_navigationManager.NavigateTo("/");
if (kunde != null && !kunden.Any(k => k.Code == kunde.Code))
_navigationManager.NavigateTo("/");
// kunde login end
}
public class Kunde
{
int Idkunde { get; set; }
public string Code { get; set; }
public int Treuepunkte { get; set; }
}
}

View File

@ -1,7 +1,12 @@
@page "/RegistrierungA"
@using System.Text;
@using System.Security.Cryptography;
@layout Registrierung
@inject NavigationManager NavManager
@inject HttpClient Http
@inject Blazored.LocalStorage.ISyncLocalStorageService localStorage
@inject NavigationManager _navigationManager
@inject IJSRuntime JSRuntime;
<div class="container col-lg-5 col-md-9 col-sm-12 d-flex flex-column " id="content">
<p>Benutzername:</p>
@ -16,21 +21,58 @@
</div>
@code {
public string inputName { get; set; } = string.Empty;
public string inputPassword { get; set; } = string.Empty;
public string inputName { get; set; }
public string inputPassword { get; set; }
public string inputPasswordEnc { get; set; }
public static string userName { get; set; } = string.Empty;
private List<Admin> admins = new List<Admin>();
private Admin admin = new Admin();
public void Login() {
if (inputName == userDataName && inputPassword == userDataPassword) {
localStorage.SetItem("name", inputName);
userName = localStorage.GetItem<string>("name");
NavManager.NavigateTo("/Bestelluebersicht");
public void Login()
{
// if inputName and inputPassword is not null
if (string.IsNullOrEmpty(inputName) || string.IsNullOrEmpty(inputPassword))
{
JSRuntime.InvokeVoidAsync("alert", "Benutzernamen oder Passwort ist falsch!");
return;
}
else
{
//encode inputpassword
inputPasswordEnc = Convert.ToHexString(SHA512.Create().ComputeHash(Encoding.UTF8.GetBytes(inputPassword)));
// if inputName is in admins with the encrypt SHA512 password
if (admins.Any(a => a.Username == inputName && a.Password == inputPasswordEnc))
{
localStorage.SetItem("admin", admins.First(a => a.Username == inputName && a.Password == inputPasswordEnc));
_navigationManager.NavigateTo("/Bestelluebersicht");
}
}
}
}
@code {
public string userDataName { get; set; } = "";
public string userDataPassword { get; set; } = "";
protected override async Task OnInitializedAsync()
{
admins = await Http.GetFromJsonAsync<List<Admin>>("https://localhost:7076/api/admins");
// if already logged in navigate to Bestelluebersicht
// if localsorage admin object is valid from the api
if (localStorage.ContainKey("admin"))
{
admin = localStorage.GetItem<Admin>("admin");
if (admin != null && !admins.Any(a => a.Username == admin.Username && a.Password == admin.Password))
_navigationManager.NavigateTo("/RegistrierungA");
else
_navigationManager.NavigateTo("/Bestelluebersicht");
}
}
public partial class Admin
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
}

View File

@ -1,16 +0,0 @@
<div class="alert alert-secondary mt-4">
<span class="oi oi-pencil me-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2186157">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
}

View File

@ -3,20 +3,29 @@
html, body {
margin: 0px;
padding: 0px;
overflow: hidden;
}
#content {
background-color: #C7FFD1;
padding: 5%;
margin-top: 1%;
border-radius: 10px;
position: center;
}
#button1 {
background-color: #89F9A5;
border-radius: 50px;
margin-bottom: 15px;
}
h1 {
margin: 0px;
padding: 0px;
}
.img {
height: auto;
max-width: 100%;
margin: 10%;
margin: 5%;
}
form {
@ -26,3 +35,17 @@ form {
}
p {
color: grey;
}
form {
margin-bottom: 20px;
margin-top: 5px;
}
.form-control {
border-radius: 50px;
margin-bottom: 5px;
}