crud completely finished

This commit is contained in:
Denis 2023-05-18 00:40:11 +03:00
parent 8088518d83
commit f411d90acb
38 changed files with 703 additions and 453 deletions

View File

@ -116,7 +116,7 @@ namespace CanteenBusinessLogic.BusinessLogics
if (model.ManagerId <= 0)
{
throw new ArgumentNullException("id менеджера должен дыть больше 0", nameof(model.ManagerId));
throw new ArgumentNullException("id менеджера должен быть больше 0", nameof(model.ManagerId));
}
if (string.IsNullOrEmpty(model.Position))

View File

@ -7,6 +7,7 @@ using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@ -115,11 +116,6 @@ namespace CanteenBusinessLogic.BusinessLogics
throw new ArgumentNullException("Нет названия блюда", nameof(model.DishName));
}
if (model.Price <= 0)
{
throw new ArgumentNullException("Цена блюда должна быть больше 0", nameof(model.Price));
}
if (model.ManagerId <= 0)
{
throw new ArgumentNullException("id менеджера должен быть больше 0", nameof(model.ManagerId));
@ -133,5 +129,25 @@ namespace CanteenBusinessLogic.BusinessLogics
throw new InvalidOperationException("Блюдо с таким названием уже есть");
}
}
public bool AddCooksToProduct(DishSearchModel model, ProductViewModel product, int count)
{
var dish = _dishStorage.GetElement(model);
dish.DishProducts[product.Id] = (product, count);
if (_dishStorage.Update(new()
{
Id = dish.Id,
DishName = dish.DishName,
ManagerId = dish.ManagerId,
DishProducts = dish.DishProducts
}) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
}
}

View File

@ -12,6 +12,5 @@ namespace CanteenContracts.BindingModels
public int Id { get; set; }
public int VisitorId { get; set; }
public string TablewareName { get; set; } = string.Empty;
public int Count { get; set; }
}
}

View File

@ -16,5 +16,6 @@ namespace CanteenContracts.BusinessLogicsContracts
bool Create(DishBindingModel model);
bool Update(DishBindingModel model);
bool Delete(DishBindingModel model);
bool AddCooksToProduct(DishSearchModel model, ProductViewModel product, int count);
}
}

View File

@ -1,4 +1,5 @@
using CanteenDataModels.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -18,5 +19,11 @@ namespace CanteenContracts.View
public int ManagerId { get; set; }
public int Id { get; set; }
public Dictionary<int, (IProductModel, int)> DishProducts { get; set; }
public DishViewModel() { }
[JsonConstructor]
public DishViewModel(Dictionary<int, (ProductViewModel, int)> DishProducts)
{
this.DishProducts = DishProducts.ToDictionary(x => x.Key, x => (x.Value.Item1 as IProductModel, x.Value.Item2));
}
}
}

View File

@ -15,8 +15,6 @@ namespace CanteenContracts.View
[DisplayName("Название прибора")]
public string TablewareName { get; set; } = string.Empty;
[DisplayName("Количество")]
public int Count { get; set; }
[DisplayName("ID прибора")]
public int Id { get; set; }
}

View File

@ -10,6 +10,5 @@ namespace CanteenDataModels.Models
{
int VisitorId { get; }
string TablewareName { get; }
int Count { get; }
}
}

View File

@ -32,7 +32,7 @@ namespace CanteenDatabaseImplement.Implements
public List<DishViewModel> GetFilteredList(DishSearchModel model)
{
if (string.IsNullOrEmpty(model.DishName))
if (string.IsNullOrEmpty(model.DishName) && !model.ManagerId.HasValue)
{
return new();
}
@ -99,6 +99,8 @@ namespace CanteenDatabaseImplement.Implements
dish.Update(model);
context.SaveChanges();
if (model.DishProducts != null)
dish.UpdateDishProduct(context, model);
context.Database.CommitTransaction();
return dish.GetViewModel;

View File

@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace CanteenDatabaseImplement.Migrations
{
[DbContext(typeof(CanteenDatabase))]
[Migration("20230408175356_InitialMigr")]
partial class InitialMigr
[Migration("20230517172033_InitMigr")]
partial class InitMigr
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -210,6 +210,9 @@ namespace CanteenDatabaseImplement.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int?>("CountTablewares")
.HasColumnType("int");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("nvarchar(max)");
@ -217,7 +220,8 @@ namespace CanteenDatabaseImplement.Migrations
b.Property<double?>("Sum")
.HasColumnType("float");
b.Property<int>("TablewareId")
b.Property<int?>("TablewareId")
.IsRequired()
.HasColumnType("int");
b.Property<int>("VisitorId")
@ -322,9 +326,6 @@ namespace CanteenDatabaseImplement.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<string>("TablewareName")
.IsRequired()
.HasColumnType("nvarchar(max)");

View File

@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
namespace CanteenDatabaseImplement.Migrations
{
/// <inheritdoc />
public partial class InitialMigr : Migration
public partial class InitMigr : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
@ -137,8 +137,7 @@ namespace CanteenDatabaseImplement.Migrations
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
VisitorId = table.Column<int>(type: "int", nullable: false),
TablewareName = table.Column<string>(type: "nvarchar(max)", nullable: false),
Count = table.Column<int>(type: "int", nullable: false)
TablewareName = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
@ -230,6 +229,7 @@ namespace CanteenDatabaseImplement.Migrations
.Annotation("SqlServer:Identity", "1, 1"),
VisitorId = table.Column<int>(type: "int", nullable: false),
TablewareId = table.Column<int>(type: "int", nullable: false),
CountTablewares = table.Column<int>(type: "int", nullable: true),
Description = table.Column<string>(type: "nvarchar(max)", nullable: false),
Sum = table.Column<double>(type: "float", nullable: true)
},

View File

@ -207,6 +207,9 @@ namespace CanteenDatabaseImplement.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int?>("CountTablewares")
.HasColumnType("int");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("nvarchar(max)");
@ -214,7 +217,8 @@ namespace CanteenDatabaseImplement.Migrations
b.Property<double?>("Sum")
.HasColumnType("float");
b.Property<int>("TablewareId")
b.Property<int?>("TablewareId")
.IsRequired()
.HasColumnType("int");
b.Property<int>("VisitorId")
@ -319,9 +323,6 @@ namespace CanteenDatabaseImplement.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<string>("TablewareName")
.IsRequired()
.HasColumnType("nvarchar(max)");

View File

@ -12,84 +12,6 @@ using System.Threading.Tasks;
namespace CanteenDatabaseImplement.Models
{
//public class Dish : IDishModel
//{
// public int Id { get; private set; }
// [Required]
// public string DishName { get; private set; } = string.Empty;
// [Required]
// public double Cost { get; private set; }
// [Required]
// public int ManagerId { get; private set; }
// private Dictionary<int, (IProductModel, int)>? _dishProduct = null;
// public Dictionary<int, (IProductModel, int)> DishProduct
// {
// get
// {
// if (_dishProduct == null)
// {
// _dishProduct = Product
// .ToDictionary(recPC => recPC.ProductId, recPC => (recPC.Product as IProductModel, recPC.CountProductProduct));
// }
// return _dishProduct;
// }
// }
// [ForeignKey("DishId")]
// public virtual List<DishProduct> Product { get; set; } = new();
// public static Dish? Create(CanteenDatabase context, DishBindingModel model)
// {
// return new Dish()
// {
// Id = model.Id,
// DishName = model.DishName,
// Cost = model.Cost,
// Product = model.DishProduct.Select(x => new DishProduct
// {
// Product = context.Product.First(y => y.Id == x.Key)
// }).ToList()
// };
// }
// public void Update(DishBindingModel model)
// {
// DishName = model.DishName;
// Cost = model.Cost;
// }
// public DishViewModel GetViewModel => new()
// {
// Id = Id,
// DishName = DishName,
// Cost = Cost,
// DishProduct = DishProduct,
// ManagerId = ManagerId
// };
// public Dictionary<int, (IProductModel, int)> DishProduct => throw new NotImplementedException();
// public void UpdateProduct(CanteenDatabase context, DishBindingModel model)
// {
// var dishProduct = context.DishProduct.Where(record => record.ProductId == model.Id).ToList();
// if (dishProduct != null && dishProduct.CountProduct > 0)
// {
// context.DishProduct.RemoveRange(dishProduct.Where(record => !model.DishProduct.ContainsKey(record.ProductId)));
// context.SaveChanges();
// }
// var product = context.Product.First(x => x.Id == Id);
// foreach (var pc in model.DishProduct)
// {
// context.DishProduct.Add(new DishProduct
// {
// Product = product,
// Dish = context.Dishes.First(x => x.Id == pc.Key),
// });
// context.SaveChanges();
// }
// _dishProduct = null;
// }
//}
public class Dish : IDishModel
{
public int Id { get; set; }

View File

@ -10,7 +10,7 @@ namespace CanteenDatabaseImplement.Models
{
public class ProductCook
{
public int Id { get; private set; }
public int Id { get; set; }
[Required]
public int ProductId { get; set; }

View File

@ -19,8 +19,6 @@ namespace CanteenDatabaseImplement.Models
public int VisitorId { get; private set; }
[Required]
public string TablewareName { get; private set; } = string.Empty;
[Required]
public int Count { get; private set; }
[ForeignKey("TablewareId")]
public virtual List<Order> Orders { get; set; } = new();
public virtual Visitor Visitor { get; set; }
@ -35,8 +33,7 @@ namespace CanteenDatabaseImplement.Models
{
Id = model.Id,
VisitorId = model.VisitorId,
TablewareName = model.TablewareName,
Count = model.Count
TablewareName = model.TablewareName
};
}

View File

@ -77,8 +77,6 @@ namespace CanteenManagerApp.Controllers
});
Response.Redirect("Enter");
return;
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
@ -88,18 +86,18 @@ namespace CanteenManagerApp.Controllers
}
[HttpGet]
public IActionResult Cooks()
public IActionResult CookList()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Cooks = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist? ={APIClient.Manager.Id}");
ViewBag.CookList = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpGet]
public IActionResult CreateCook()
public IActionResult CookCreate()
{
if (APIClient.Manager == null)
{
@ -109,7 +107,7 @@ namespace CanteenManagerApp.Controllers
}
[HttpPost]
public void CreateCook(string FIO, string position)
public void CookCreate(string FIO, string position)
{
if (APIClient.Manager == null)
{
@ -121,77 +119,96 @@ namespace CanteenManagerApp.Controllers
throw new Exception("ФИО не должно быть пустым");
}
APIClient.PostRequest("api/main/createcook", new CookBindingModel
APIClient.PostRequest("api/main/cookcreate", new CookBindingModel
{
ManagerId = APIClient.Manager.Id,
FIO = FIO,
Position = position
});
Response.Redirect("Cooks");
Response.Redirect("CookList");
}
[HttpGet]
public IActionResult DeleteCook(int CookId)
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
APIClient.PostRequest("api/main/deletecook", new CookBindingModel { Id = CookId }); ;
return Redirect("~/Home/Cooks");
}
[HttpGet]
public IActionResult UpdateCook()
public IActionResult CookDelete()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.CookList = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void UpdateCook(string FIO, string postition)
public void CookDelete(int id)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/updatecook", new CookBindingModel
if (id <= 0)
{
Id = APIClient.Manager.Id,
FIO = FIO,
Position = postition
throw new Exception("Выберите повара");
}
APIClient.PostRequest("api/main/CookDelete", new CookBindingModel
{
Id = id
});
Response.Redirect("Cooks");
}
Response.Redirect("CookList");
}
[HttpGet]
public IActionResult Products()
public IActionResult CookUpdate()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Products = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpGet]
public IActionResult CreateProduct()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Cooks = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
ViewBag.CookList = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void CreateProduct(string name, double price)
public void CookUpdate(int Id, string FIO, string position)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/CookUpdate", new CookBindingModel
{
Id = Id,
FIO = FIO,
Position = position,
ManagerId = APIClient.Manager.Id
});
Response.Redirect("CookList");
}
[HttpGet]
public IActionResult ProductList()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.ProductList = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpGet]
public IActionResult ProductCreate()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.CookList = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void ProductCreate(string name, double price)
{
if (APIClient.Manager == null)
{
@ -202,29 +219,29 @@ namespace CanteenManagerApp.Controllers
{
throw new Exception("Наименование продукта не должно быть пустым");
}
APIClient.PostRequest("api/main/createproduct", new ProductBindingModel
APIClient.PostRequest("api/main/ProductCreate", new ProductBindingModel
{
ManagerId = APIClient.Manager.Id,
ProductName = name,
Price = price
});
Response.Redirect("Products");
Response.Redirect("ProductList");
}
[HttpGet]
public IActionResult AddCooksToProduct()
public IActionResult ProductAddCooks()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Products = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
ViewBag.Cooks = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
ViewBag.ProductList = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
ViewBag.CookList = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void AddCooksToProduct(int selectedProduct, int selectedCook)
public void ProductAddCooks(int selectedProduct, int selectedCook)
{
if (APIClient.Manager == null)
{
@ -239,64 +256,85 @@ namespace CanteenManagerApp.Controllers
{
throw new Exception("Должен быть выбран повар");
}
APIClient.PostRequest("api/main/addcookstoproduct", Tuple.Create
APIClient.PostRequest("api/main/ProductAddCooks", Tuple.Create
(
new ProductSearchModel { Id = selectedProduct },
new CookViewModel { Id = selectedCook }
));
Response.Redirect("Products");
Response.Redirect("ProductList");
}
[HttpGet]
public IActionResult DeleteProduct(int productId)
public IActionResult ProductDelete()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
APIClient.PostRequest("api/main/deleteproduct", new ProductBindingModel { Id = productId });
return Redirect("~/Home/Products");
}
[HttpGet]
public IActionResult UpdateProduct()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
return View();
ViewBag.ProductList = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
return Redirect("~/Home/ProductList");
}
[HttpPost]
public void UpdateProduct(string productName, double price)
public void ProductDelete(int id)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/updateproduct", new ProductBindingModel
if (id <= 0)
{
Id = APIClient.Manager.Id,
ProductName = productName,
Price = price
throw new Exception("Выберите продукт");
}
APIClient.PostRequest("api/main/ProductDelete", new ProductBindingModel
{
Id = id
});
Response.Redirect("Products");
Response.Redirect("ProductList");
}
[HttpGet]
public IActionResult Dishes()
public IActionResult ProductUpdate()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Dishes = APIClient.GetRequest<List<DishViewModel>>($"api/main/getdishlist?managerId={APIClient.Manager.Id}");
ViewBag.ProductList = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void ProductUpdate(int Id, string name, double price)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/productupdate", new ProductBindingModel
{
Id = Id,
ProductName = name,
Price = price,
ManagerId = APIClient.Manager.Id
});
Response.Redirect("ProductList");
}
[HttpGet]
public IActionResult DishList()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.DishList = APIClient.GetRequest<List<DishViewModel>>($"api/main/GetDishList?managerId={APIClient.Manager.Id}");
return View();
}
[HttpGet]
public IActionResult CreateDish()
public IActionResult DishCreate()
{
if (APIClient.Manager == null)
{
@ -306,63 +344,123 @@ namespace CanteenManagerApp.Controllers
}
[HttpPost]
public void CreateDish(string dishName, double price)
public void DishCreate(string name)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
if (string.IsNullOrEmpty(dishName))
if (string.IsNullOrEmpty(name))
{
throw new Exception("Наименование блюда не должно быть пустым");
}
APIClient.PostRequest("api/main/createdish", new DishBindingModel
APIClient.PostRequest("api/main/dishcreate", new DishBindingModel
{
ManagerId = APIClient.Manager.Id,
DishName = dishName,
Price = price
DishName = name
});
Response.Redirect("Dishes");
Response.Redirect("DishList");
}
[HttpGet]
public IActionResult DeleteDish(int dishId)
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
APIClient.PostRequest("api/main/deletedish", new DishBindingModel { Id = dishId });
return Redirect("~/Home/Dishes");
}
[HttpGet]
public IActionResult UpdateDish()
public IActionResult DishAddProducts()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.DishList = APIClient.GetRequest<List<DishViewModel>>($"api/main/getdishlist?managerId={APIClient.Manager.Id}");
ViewBag.productList = APIClient.GetRequest<List<ProductViewModel>>($"api/main/getproductlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void UpdateDish(string dishName, double price)
public void DishAddProducts(int selectedDish, int selectedProduct, int count)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/updatedish", new DishBindingModel
if (selectedDish <= 0)
{
Id = APIClient.Manager.Id,
DishName = dishName,
Price = price
throw new Exception("Должно быть выбрано блюдо");
}
if (selectedProduct <= 0)
{
throw new Exception("Должен быть выбран продукт");
}
if (count <= 0)
{
throw new Exception("Количество продукта должно быть больше 0");
}
APIClient.PostRequest("api/main/dishaddproducts", Tuple.Create
(
new DishSearchModel { Id = selectedDish },
new ProductViewModel { Id = selectedProduct },
count
));
Response.Redirect("DishList");
}
[HttpGet]
public IActionResult DishDelete()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.DishList = APIClient.GetRequest<List<DishViewModel>>($"api/main/getdishlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void DishDelete(int id)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
if (id <= 0)
{
throw new Exception("Выберите блюдо");
}
APIClient.PostRequest("api/main/DishDelete", new DishBindingModel
{
Id = id
});
Response.Redirect("Dishes");
Response.Redirect("ProductList");
}
[HttpGet]
public IActionResult DishUpdate()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.DishList = APIClient.GetRequest<List<DishViewModel>>($"api/main/getdishlist?managerId={APIClient.Manager.Id}");
return View();
}
[HttpPost]
public void DishUpdate(int Id, string name, double price)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
APIClient.PostRequest("api/main/DishUpdate", new DishBindingModel
{
Id = Id,
DishName = name,
Price = price,
ManagerId = APIClient.Manager.Id
});
Response.Redirect("DishList");
}
[HttpGet]
public IActionResult Graphic()

View File

@ -1,6 +1,6 @@

@{
ViewData["Title"] = "Cook";
ViewData["Title"] = "CookList";
}
<div class="text-center">
<h2 class="display-4">Добавление повара</h2>

View File

@ -13,7 +13,7 @@
<div class="row">
<div class="col-4">Выберите повара</div>
<div class="col-8">
<select id="cook" name="cook" class="form-control" asp-items="@(new SelectList(@ViewBag.Cooks, "Id"))"></select>
<select id="id" name="id" class="form-control" asp-items="@(new SelectList(@ViewBag.CookList, "Id", "FIO"))"></select>
</div>
</div>
<div class="row">

View File

@ -0,0 +1,30 @@
@{
ViewData["Title"] = "CookList";
}
<body>
<div class="container">
<h2>Список поваров</h2>
<a type="button" class="btn btn-success" href="/Home/CookCreate">Добавить повара</a>
<a type="button" class="btn btn-danger" href="/Home/CookDelete">Удалить повара</a>
<a type="button" class="btn btn-warning" href="/Home/CookUpdate">Обновить повара</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>ФИО</th>
<th>Должность</th>
</tr>
</thead>
<tbody>
@foreach (var cook in ViewBag.CookList)
{
<tr>
<td>@cook.Id</td>
<td>@cook.FIO</td>
<td>@cook.Position</td>
</tr>
}
</tbody>
</table>
</div>
</body>

View File

@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace CanteenManagerApp.Views.Home
namespace CanteenManagerApp.Views.Home.Cook
{
public class CooksModel : PageModel
{

View File

@ -0,0 +1,44 @@
@using Newtonsoft.Json;
@{
ViewData["Title"] = "CookUpdate";
}
<div class="text-center">
<h2 class="display-4">Данные повара</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Повар:</div>
<div class="col-8"><select id="Id" name="Id" class="form-control" onchange="populateFields()" asp-items="@(new SelectList(@ViewBag.CookList, "Id", "FIO"))"></select></div>
</div>
<div class="row">
<div class="col-4">ФИО:</div>
<div class="col-8"><input type="text" name="FIO" value="" /></div>
</div>
<div class="row">
<div class="col-4">Должность:</div>
<div class="col-8"><input type="text" name="position" value="" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Сохранить" class="btn btn-primary" /></div>
</div>
</form>
<script>
const cooks = [];
function populateFields() {
ViewBag.CookList.forEach(value => {
cooks.push(value);
});
var selectedCookId = document.getElementById("Id").value;
var selectedCook = cooks.find(function (cook) {
return cook.Id === selectedCookId;
});
//console.log(selectedCook.FIO);
if (selectedCook) {
document.getElementsByName("FIO")[0].value = selectedCook.FIO;
document.getElementsByName("position")[0].value = selectedCook.Position;
}
console.log(document.getElementsByName("FIO")[0].value);
}
</script>

View File

@ -1,59 +0,0 @@
@{
ViewData["Title"] = "Cooks";
}
<body>
<div class="container">
<h2>Список поваров</h2>
<a type="button" class="btn btn-success" href="/Home/CreateCook">Добавить повара</a>
<button type="submit" class="btn btn-danger" form="selectCookForm">Удалить повара</button>
<a type="button" class="btn btn-warning" href="/Home/UpdateCook">Обновить повара</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>ФИО</th>
<th>Должность</th>
</tr>
</thead>
<tbody>
@foreach (var cook in ViewBag.Cooks)
{
<tr onclick="selectCook(this)">
<td>@cook.Id</td>
<td>@cook.FIO</td>
<td>@cook.Position</td>
</tr>
}
</tbody>
</table>
</div>
</body>
<form id="selectCookForm" method="post" action="/Home/DeleteCook">
<input type="hidden" id="CookId" name="CookId" value="" />
</form>
<style>
.selected-row {
background-color: lightgray;
}
</style>
<script>
function selectCook(row) {
var CookId = document.getElementById("CookId");
var previousValue = CookId.value;
var currentValue = row.cells[0].innerText;
if (previousValue === currentValue) {
CookId.value = "";
row.classList.remove("selected-row");
} else {
CookId.value = currentValue;
var rows = document.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
rows[i].classList.remove("selected-row");
}
row.classList.add("selected-row");
}
}
</script>

View File

@ -0,0 +1,25 @@
@{
ViewData["Title"] = "DishDelete";
}
<div class="text-center">
<h2 class="display-4">Удаление блюда</h2>
</div>
<style>
.row {
margin-top: 10px;
}
</style>
<form method="post">
<div class="row">
<div class="col-4">Выберите блюдо</div>
<div class="col-8">
<select id="id" name="id" class="form-control" asp-items="@(new SelectList(@ViewBag.DishList, "Id", "DishName"))"></select>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Удалить" class="btn btn-primary" />
</div>
</div>
</form>

View File

@ -0,0 +1,48 @@
@using CanteenContracts.View;
@{
ViewData["Title"] = "DishAddProducts";
}
<div class="text-center">
<h2 class="display-4">Привязка продукта к блюду</h2>
</div>
<style>
.row {
margin-top: 10px;
}
</style>
<form method="post">
<div class="row">
<div class="col-4">Блюдо:</div>
<div class="col-8">
<select id="selectedDish" name="selectedDish">
@foreach (var dish in ViewBag.DishList as List<DishViewModel>)
{
<option value="@dish.Id">@dish.DishName</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Продукт:</div>
<div class="col-8">
<select name="selectedProduct">
@foreach (var product in ViewBag.ProductList as List<ProductViewModel>)
{
<option value="@product.Id">@product.ProductName</option>
}
</select>
</div>
</div>
<div class="row">
<div class="col-4">Количество:</div>
<div class="col-8">
<input type="text" name="count" id="count" />
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Добавить" class="btn btn-primary" />
</div>
</div>
</form>

View File

@ -1,6 +1,6 @@

@{
ViewData["Title"] = "Dish";
ViewData["Title"] = "DishCreate";
}
<div class="text-center">
<h2 class="display-4">Добавление блюда</h2>
@ -14,14 +14,7 @@
<div class="row">
<div class="col-4">Название блюда:</div>
<div class="col-8">
<input type="text" name="FIO" id="FIO" />
@* <select id="bouquet" name="bouquet" class="form-control" asp-items="@(new SelectList(@ViewBag.Bouquets, "Id", "BouquetName"))"></select>*@
</div>
</div>
<div class="row">
<div class="col-4">Цена:</div>
<div class="col-8">
<input type="text" name="position" id="position" />
<input type="text" name="name" id="name" />
</div>
</div>
<div class="row">

View File

@ -0,0 +1,31 @@
@{
ViewData["Title"] = "DishList";
}
<body>
<div class="container">
<h2>Список список продуктов</h2>
<a type="button" class="btn btn-success" href="/Home/DishCreate">Добавить блюдо</a>
<a type="button" class="btn btn-danger" href="/Home/DishDelete">Удалить блюдо</a>
<a type="button" class="btn btn-warning" href="/Home/DishUpdate">Обновить блюдо</a>
<a type="button" class="btn btn-warning" href="/Home/DishAddProducts">Привязать продукт</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>Название</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
@foreach (var cook in ViewBag.DishList)
{
<tr>
<td>@cook.Id</td>
<td>@cook.DishName</td>
<td>@cook.Price</td>
</tr>
}
</tbody>
</table>
</div>
</body>

View File

@ -0,0 +1,38 @@
@{
ViewData["Title"] = "DishUpdate";
}
<div class="text-center">
<h2 class="display-4">Данные блюда</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Блюдо:</div>
<div class="col-8"><select id="Id" name="Id" class="form-control" onchange="populateFields()" asp-items="@(new SelectList(@ViewBag.DishList, "Id", "DishName"))"></select></div>
</div>
<div class="row">
<div class="col-4">Название:</div>
<div class="col-8"><input type="text" name="name" value="" /></div>
</div>
<div class="row">
<div class="col-4">Цена:</div>
<div class="col-8"><input type="text" name="price" value="" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Сохранить" class="btn btn-primary" /></div>
</div>
</form>
<script>
function populateFields() {
var selectedDishId = document.getElementById("dish").value;
var dishes = @Json.Serialize(ViewBag.CookList);
var selectedDish = dishes.find(function (dish) {
return dish.Id === selectedDishId;
});
if (selectedDish) {
document.getElementsByName("name")[0].value = selectedDish.DishName;
document.getElementsByName("price")[0].value = selectedDish.Price;
}
}
</script>

View File

@ -1,59 +0,0 @@
@{
ViewData["Title"] = "Products";
}
<body>
<div class="container">
<h2>Список список продуктов</h2>
<a type="button" class="btn btn-success" href="/Home/CreateCook">Добавить продукт</a>
<button type="submit" class="btn btn-danger" form="selectCookForm">Удалить продукт</button>
<a type="button" class="btn btn-warning" href="/Home/UpdateCook">Обновить продукт</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>Название</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
@foreach (var cook in ViewBag.Cooks)
{
<tr onclick="selectCook(this)">
<td>@cook.Id</td>
<td>@cook.Name</td>
<td>@cook.Price</td>
</tr>
}
</tbody>
</table>
</div>
</body>
<form id="selectCookForm" method="post" action="/Home/DeleteCook">
<input type="hidden" id="ProductId" name="ProductId" value="" />
</form>
<style>
.selected-row {
background-color: lightgray;
}
</style>
<script>
function selectCook(row) {
var ProductId = document.getElementById("ProductId");
var previousValue = ProductId.value;
var currentValue = row.cells[0].innerText;
if (previousValue === currentValue) {
ProductId.value = "";
row.classList.remove("selected-row");
} else {
ProductId.value = currentValue;
var rows = document.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
rows[i].classList.remove("selected-row");
}
row.classList.add("selected-row");
}
}
</script>

View File

@ -1,6 +1,6 @@
@using CanteenContracts.View;
@{
ViewData["Title"] = "AddCooksToProduct";
ViewData["Title"] = "ProductAddCooks";
}
<div class="text-center">
<h2 class="display-4">Привязка повара к продукту</h2>
@ -15,7 +15,7 @@
<div class="col-4">Продукты:</div>
<div class="col-8">
<select name="selectedProduct">
@foreach (var product in ViewBag.Products as List<ProductViewModel>)
@foreach (var product in ViewBag.ProductList as List<ProductViewModel>)
{
<option value="@product.Id">@product.ProductName</option>
}
@ -26,7 +26,7 @@
<div class="col-4">Повар:</div>
<div class="col-8">
<select name="selectedCook">
@foreach (var cook in ViewBag.Cooks as List<CookViewModel>)
@foreach (var cook in ViewBag.CookList as List<CookViewModel>)
{
<option value="@cook.Id">@cook.FIO</option>
}

View File

@ -1,6 +1,6 @@
@using CanteenContracts.View;
@{
ViewData["Title"] = "Product";
ViewData["Title"] = "ProductCreate";
}
<div class="text-center">
<h2 class="display-4">Добавление продукта</h2>
@ -20,18 +20,7 @@
<div class="row">
<div class="col-4">Цена:</div>
<div class="col-8">
<input type="text" name="price" id="price" />
</div>
</div>
<div class="row">
<div class="col-4">Цена:</div>
<div class="col-8">
<select name="selectedCooks" multiple>
@foreach (var cook in ViewBag.Cooks as List<CookViewModel>)
{
<option value="@cook.Id">@cook.FIO</option>
}
</select>
<input type="number" name="price" id="price" />
</div>
</div>
<div class="row">

View File

@ -0,0 +1,25 @@
@{
ViewData["Title"] = "ProductDelete";
}
<div class="text-center">
<h2 class="display-4">Удаление продукта</h2>
</div>
<style>
.row {
margin-top: 10px;
}
</style>
<form method="post">
<div class="row">
<div class="col-4">Выберите продукт</div>
<div class="col-8">
<select id="id" name="id" class="form-control" asp-items="@(new SelectList(@ViewBag.ProductList, "Id", "ProductName"))"></select>
</div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4">
<input type="submit" value="Удалить" class="btn btn-primary" />
</div>
</div>
</form>

View File

@ -0,0 +1,32 @@
@using CanteenContracts.View;
@{
ViewData["Title"] = "ProductList";
}
<body>
<div class="container">
<h2>Список продуктов</h2>
<a type="button" class="btn btn-success" href="/Home/ProductCreate">Добавить продукт</a>
<a type="button" class="btn btn-danger" href="/Home/ProductDelete">Удалить продукт</a>
<a type="button" class="btn btn-warning" href="/Home/ProductUpdate">Обновить продукт</a>
<a type="button" class="btn btn-warning" href="/Home/ProductAddCooks">Привязать повара</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>Название</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
@foreach (var product in ViewBag.ProductList)
{
<tr>
<td>@product.Id</td>
<td>@product.ProductName</td>
<td>@product.Price</td>
</tr>
}
</tbody>
</table>
</div>
</body>

View File

@ -0,0 +1,38 @@
@{
ViewData["Title"] = "ProductUpdate";
}
<div class="text-center">
<h2 class="display-4">Данные продукта</h2>
</div>
<form method="post">
<div class="row">
<div class="col-4">Повар:</div>
<div class="col-8"><select id="Id" name="Id" class="form-control" onchange="populateFields()" asp-items="@(new SelectList(@ViewBag.ProductList, "Id", "ProductName"))"></select></div>
</div>
<div class="row">
<div class="col-4">ФИО:</div>
<div class="col-8"><input type="text" name="name" value="" /></div>
</div>
<div class="row">
<div class="col-4">Цена:</div>
<div class="col-8"><input type="text" name="price" value="" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Сохранить" class="btn btn-primary" /></div>
</div>
</form>
<script>
function populateFields() {
var selectedCookId = document.getElementById("product").value;
var cooks = @Json.Serialize(ViewBag.CookList);
var selectedCook = cooks.find(function (cook) {
return cook.Id === selectedCookId;
});
if (selectedCook) {
document.getElementsByName("name")[0].value = selectedCook.ProductName;
document.getElementsByName("price")[0].value = selectedCook.Price;
}
}
</script>

View File

@ -1,61 +0,0 @@
@using CanteenContracts.View;
@{
ViewData["Title"] = "Products";
}
<body>
<div class="container">
<h2>Список продуктов</h2>
<a type="button" class="btn btn-success" href="/Home/CreateProduct">Добавить продукт</a>
<button type="submit" class="btn btn-danger" form="selectProductForm">Удалить продукт</button>
<a type="button" class="btn btn-warning" href="/Home/UpdateProduct">Обновить продукт</a>
<a type="button" class="btn btn-warning" href="/Home/AddCooksToProduct">Привязать повара</a>
<table class="table">
<thead>
<tr>
<th>Номер</th>
<th>Название</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
@foreach (var product in ViewBag.Products)
{
<tr onclick="selectProduct(this)">
<td>@product.Id</td>
<td>@product.ProductName</td>
<td>@product.Price</td>
</tr>
}
</tbody>
</table>
</div>
</body>
<form id="selectProductForm" method="post" action="/Home/DeleteProduct">
<input type="hidden" id="ProductId" name="ProductId" value="" />
</form>
<style>
.selected-row {
background-color: lightgray;
}
</style>
<script>
function selectProduct(row) {
var productIdInput = document.getElementById("ProductId");
var previousValue = productIdInput.value;
var currentValue = row.cells[0].innerText;
if (previousValue === currentValue) {
productIdInput.value = "";
row.classList.remove("selected-row");
} else {
productIdInput.value = currentValue;
var rows = document.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++) {
rows[i].classList.remove("selected-row");
}
row.classList.add("selected-row");
}
}
</script>

View File

@ -1,5 +0,0 @@
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}

View File

@ -20,13 +20,13 @@
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Cooks">Повара</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="CookList">Повара</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Products">Продукты</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ProductList">Продукты</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Dishes">Блюда</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="DishList">Блюда</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Войти</a>

View File

@ -29,33 +29,7 @@ namespace CanteenRestApi.Controllers
_tableware = tableware;
_gl = gl;
}
[HttpGet]
public List<CookViewModel>? GetCookList(int managerId)
{
try
{
return _cook.ReadList(new CookSearchModel { ManagerId = managerId});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpGet]
public List<ProductViewModel>? GetProductList(int managerId)
{
try
{
return _product.ReadList(new ProductSearchModel { ManagerId = managerId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpGet]
public List<TablewareViewModel>? GetTablewareList()
{
@ -69,6 +43,7 @@ namespace CanteenRestApi.Controllers
throw;
}
}
[HttpPost]
public void CreateTableware(TablewareBindingModel model)
{
@ -82,8 +57,23 @@ namespace CanteenRestApi.Controllers
throw;
}
}
[HttpGet]
public List<CookViewModel>? GetCookList(int managerId)
{
try
{
return _cook.ReadList(new CookSearchModel { ManagerId = managerId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void CreateCook(CookBindingModel model)
public void CookCreate(CookBindingModel model)
{
try
{
@ -97,7 +87,7 @@ namespace CanteenRestApi.Controllers
}
[HttpPost]
public void DeleteCook(CookBindingModel model)
public void CookDelete(CookBindingModel model)
{
try
{
@ -111,7 +101,35 @@ namespace CanteenRestApi.Controllers
}
[HttpPost]
public void CreateDish(DishBindingModel model)
public void CookUpdate(CookBindingModel model)
{
try
{
_cook.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpGet]
public List<DishViewModel>? GetDishList(int managerId)
{
try
{
return _dish.ReadList(new DishSearchModel { ManagerId = managerId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void DishCreate(DishBindingModel model)
{
try
{
@ -124,7 +142,62 @@ namespace CanteenRestApi.Controllers
}
}
[HttpPost]
public void CreateProduct(ProductBindingModel model)
public void DishDelete(DishBindingModel model)
{
try
{
_dish.Delete(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void DishUpdate(DishBindingModel model)
{
try
{
_dish.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void DishAddProducts(Tuple<DishSearchModel, ProductViewModel, int> model)
{
try
{
_dish.AddCooksToProduct(model.Item1, model.Item2, model.Item3);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpGet]
public List<ProductViewModel>? GetProductList(int managerId)
{
try
{
return _product.ReadList(new ProductSearchModel { ManagerId = managerId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void ProductCreate(ProductBindingModel model)
{
try
{
@ -136,9 +209,36 @@ namespace CanteenRestApi.Controllers
throw;
}
}
[HttpPost]
public void ProductDelete(ProductBindingModel model)
{
try
{
_product.Delete(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void AddCooksToProduct(Tuple<ProductSearchModel, CookViewModel> model)
public void ProductUpdate(ProductBindingModel model)
{
try
{
_product.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void ProductAddCooks(Tuple<ProductSearchModel, CookViewModel> model)
{
try
{
@ -150,6 +250,7 @@ namespace CanteenRestApi.Controllers
throw;
}
}
[HttpGet]
public GraphicViewModel[] GetGraphic()
{

View File

@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>

View File

@ -67,8 +67,7 @@ namespace CanteenVisitorApp.Controllers
APIClient.PostRequest("api/main/CreateTableware", new TablewareBindingModel
{
VisitorId = 1,
TablewareName = TablewareName,
Count = TablewareCount
TablewareName = TablewareName
});
Response.Redirect("Tablewares");
}