added selecting records by user and partially implemented crud for the site

This commit is contained in:
Denis 2023-05-16 18:13:19 +03:00
parent d4e4e44d4c
commit 40c8117b7f
27 changed files with 393 additions and 34 deletions

View File

@ -131,7 +131,7 @@ namespace CanteenBusinessLogic.BusinessLogics
_logger.LogInformation("Manager. Login: {Login}. Password: {Password}. PhoneNumber: {PhoneNumber}. Id: {Id}", model.Login, model.Password, model.PhoneNumber, model.Id);
var element = _managerStorage.GetElement(new ManagerSearchModel { Login = model.Login , Password = model.Password});
var element = _managerStorage.GetElement(new ManagerSearchModel { Login = model.Login, PhoneNumber = model.PhoneNumber });
if (element != null && element.Id != model.Id)
{
throw new InvalidOperationException("Такой менеджер уже есть");

View File

@ -10,5 +10,6 @@ namespace CanteenContracts.SearchModel
{
public int? Id { get; set; }
public string? FIO { get; set; }
public int? ManagerId { get; set; }
}
}

View File

@ -9,6 +9,7 @@ namespace CanteenContracts.SearchModel
public class DishSearchModel
{
public int? Id { get; set; }
public int? ManagerId { get; set; }
public string? DishName { get; set; }
}
}

View File

@ -9,6 +9,7 @@ namespace CanteenContracts.SearchModel
public class ProductSearchModel
{
public int? Id { get; set; }
public int? ManagerId { get; set; }
public string? ProductName { get; set; }
}
}

View File

@ -9,6 +9,7 @@ namespace CanteenContracts.SearchModel
public class TablewareSearchModel
{
public int? Id { get; set; }
public int? VisitorId { get; set; }
public string? TablewareName { get; set; }
}
}

View File

@ -11,7 +11,7 @@ namespace CanteenDatabaseImplement
{
if (optionsBuilder.IsConfigured == false)
{
optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-A68O3K0;Initial Catalog=CanteenDataBase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-PA5STI0\SQLEXPRESS;Initial Catalog=CanteenDataBase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
}
base.OnConfiguring(optionsBuilder);
}

View File

@ -4,6 +4,7 @@ using CanteenContracts.StoragesContracts;
using CanteenContracts.View;
using CanteenDatabaseImplement.Models;
using CanteenDataModels.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
@ -32,7 +33,8 @@ namespace CanteenDatabaseImplement.Implements
using var context = new CanteenDatabase();
return context.Cooks
.Where(x => !model.Id.HasValue || x.Id == model.Id)
.Include(x => x.Manager)
.Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ManagerId.HasValue && model.ManagerId == x.ManagerId))
.Select(x => x.GetViewModel)
.ToList();
}

View File

@ -42,7 +42,7 @@ namespace CanteenDatabaseImplement.Implements
return context.Dishes
.Include(x => x.Products)
.ThenInclude(x => x.Product)
.Where(x => x.DishName == model.DishName).Select(x => x.GetViewModel).ToList();
.Where(x => x.DishName == model.DishName || (model.ManagerId.HasValue && model.ManagerId == x.ManagerId)).Select(x => x.GetViewModel).ToList();
}
public List<DishViewModel> GetFullList()

View File

@ -54,7 +54,10 @@ namespace CanteenDatabaseImplement.Implements
return context.Lunches
.Include(x => x.Products)
.ThenInclude(x => x.Product)
.Where(x => x.DateCreate >= model.DateFrom && x.DateImplement <= model.DateTo)
.Where(x =>
(x.DateCreate >= model.DateFrom && x.DateImplement <= model.DateTo) ||
(model.Id.HasValue && x.Id == model.Id) ||
(model.VisitorId.HasValue && model.VisitorId == x.VisitorId))
.Select(x => x.GetViewModel).ToList();
}

View File

@ -23,7 +23,7 @@ namespace CanteenDatabaseImplement.Implements
using var context = new CanteenDatabase();
return context.Managers.FirstOrDefault(x =>
(!string.IsNullOrEmpty(model.Login) && x.Login == model.Login) || (!string.IsNullOrEmpty(model.Password) && x.Login == model.Password) ||
((!string.IsNullOrEmpty(model.Login) && x.Login == model.Login) && (!string.IsNullOrEmpty(model.Password) && x.Password == model.Password)) ||
(model.Id.HasValue && x.Id == model.Id)
)?.GetViewModel;
}

View File

@ -56,7 +56,7 @@ namespace CanteenDatabaseImplement.Implements
return context.Orders
.Include(x => x.Cooks)
.ThenInclude(x => x.Cook)
.Where(x => model.VisitorId.HasValue && (model.VisitorId == x.VisitorId)).Select(x => x.GetViewModel).ToList();
.Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.VisitorId.HasValue && model.VisitorId == x.VisitorId)).Select(x => x.GetViewModel).ToList();
}
public List<OrderViewModel> GetFullList()

View File

@ -53,7 +53,11 @@ namespace CanteenDatabaseImplement.Implements
using var context = new CanteenDatabase();
return context.Products.Include(x => x.Cooks).ThenInclude(x => x.Cook).Where(x => x.ProductName.Contains(model.ProductName)).Select(x => x.GetViewModel).ToList();
return context.Products
.Include(x => x.Cooks)
.ThenInclude(x => x.Cook)
.Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ManagerId.HasValue && model.ManagerId == x.ManagerId))
.Select(x => x.GetViewModel).ToList();
}
public List<ProductViewModel> GetFullList()

View File

@ -34,7 +34,7 @@ namespace CanteenDatabaseImplement.Implements
using var context = new CanteenDatabase();
return context.Tablewares
.Where(x => x.TablewareName.Contains(model.TablewareName))
.Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.VisitorId.HasValue && model.VisitorId == x.VisitorId))
.Select(x => x.GetViewModel).ToList();
}

View File

@ -6,6 +6,10 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.13" />
</ItemGroup>

View File

@ -1,4 +1,5 @@
using CanteenContracts.View;
using CanteenContracts.BindingModels;
using CanteenContracts.View;
using CanteenManagerApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
@ -17,13 +18,21 @@ namespace CanteenManagerApp.Controllers
public IActionResult Index()
{
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
return View();
}
public IActionResult Cooks()
{
ViewBag.Cooks = APIClient.GetRequest<List<CookViewModel>>("api/main/getcooklist");
if (APIClient.Manager == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Cooks = APIClient.GetRequest<List<CookViewModel>>($"api/main/getcooklist?managerId={APIClient.Manager.Id}");
return View();
}
@ -44,12 +53,39 @@ namespace CanteenManagerApp.Controllers
{
return View();
}
[HttpGet]
public IActionResult CreateCook()
{
return View();
}
[HttpPost]
public void CreateCook(string FIO, string position)
{
if (APIClient.Manager == null)
{
throw new Exception("Доступ возможен только авторизованным пользователям");
}
if (string.IsNullOrEmpty(FIO))
{
throw new Exception("ФИО не должно быть пустым");
}
APIClient.PostRequest("api/main/createcook", new CookBindingModel
{
ManagerId = APIClient.Manager.Id,
FIO = FIO,
Position = position
});
Response.Redirect("Cooks");
}
[HttpPost]
public IActionResult DeleteCook(int CookId)
{
APIClient.PostRequest("api/main/deletecook", new CookBindingModel { Id = CookId }); ;
return Redirect("~/Home/Cooks");
}
[HttpGet]
public IActionResult CreateProduct()
@ -64,6 +100,56 @@ namespace CanteenManagerApp.Controllers
}
[HttpGet]
public IActionResult Enter()
{
return View();
}
[HttpPost]
public void Enter(string login, string password)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
throw new Exception("Введите логин и пароль");
}
APIClient.Manager = APIClient.GetRequest<ManagerViewModel>($"api/manager/login?login={login}&password={password}");
if (APIClient.Manager == null)
{
throw new Exception("Неверный логин/пароль");
}
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
public void Register(string login, string password, string fio, string phoneNumber)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
{
throw new Exception("Введите логин, пароль и ФИО");
}
APIClient.PostRequest("api/manager/register", new ManagerBindingModel
{
FIO = fio,
Login = login,
Password = password,
PhoneNumber = phoneNumber
});
Response.Redirect("Enter");
return;
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{

View File

@ -4,31 +4,56 @@
<body>
<div class="container">
<h2>Список поваров</h2>
<button type="button" class="btn btn-info" onclick="location.href='@Url.Action("CreateCook", "Home")'">Добавить повара</button>
<button type="button" class="btn btn-danger" onclick="location.href='@Url.Action("CreateCook", "Home")'">Удалить повара</button>
<button type="button" class="btn btn-warning" onclick="location.href='@Url.Action("CreateCook", "Home")'">Обновить повара</button>
<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>
<th>Должность</th>
<th>Менеджер</th>
</tr>
</thead>
<tbody>
@foreach (var cook in ViewBag.Cooks)
{
<tr>
<td><input type="radio" name="selectedProducts" value="@cook.Id" /></td>
<td>@cook.Id</td>
<td>@cook.FIO</td>
<td>@cook.Position</td>
<td>@cook.ManagerId</td>
</tr>
<tr onclick="selectCook(this)">
<td>@cook.Id</td>
<td>@cook.FIO</td>
<td>@cook.Position</td>
</tr>
}
</tbody>
</table>
</div>
</body>
</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

@ -15,7 +15,6 @@
<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">

View File

@ -0,0 +1,25 @@
@{
ViewData["Title"] = "DeleteCook";
}
<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="cook" name="cook" class="form-control" asp-items="@(new SelectList(@ViewBag.Cooks, "Id"))"></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,20 @@
@{
ViewData["Title"] = "Enter";
}
<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"><input type="text" name="login" /></div>
</div>
<div class="row">
<div class="col-4">Пароль:</div>
<div class="col-8"><input type="password" name="password" /></div>
</div>
<div class="row">
<div class="col-8"></div>
<div class="col-4"><input type="submit" value="Вход" class="btn btnprimary" /></div>
</div>
</form>

View File

@ -1,6 +1,24 @@
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>
<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"><input type="text" name="login" value="@Model.Login" /></div>
</div>
<div class="row">
<div class="col-4">Пароль:</div>
<div class="col-8"><input type="password" name="password" value="@Model.Password" /></div>
</div>
<div class="row">
<div class="col-4">ФИО:</div>
<div class="col-8"><input type="text" name="fio" value="@Model.ClientFIO" /></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,29 @@
@{
ViewData["Title"] = "Register";
}
<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"><input type="text" name="login" /></div>
</div>
<div class="row">
<div class="col-4">Пароль:</div>
<div class="col-8"><input type="password" name="password" /></div>
</div>
<div class="row">
<div class="col-4">ФИО:</div><div class="col-8"><input type="text" name="fio" /></div>
</div>
<div class="row">
<div class="col-4">Номер телефона:</div>
<div class="col-8"><input type="text" name="phoneNumber" /></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,5 @@
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}

View File

@ -12,7 +12,7 @@
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ManagerApp</a>
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Enter">ManagerApp</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
@ -28,6 +28,12 @@
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Dishes">Блюда</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Войти</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Register">Регистрация</a>
</li>
</ul>
</div>
</div>

View File

@ -6,6 +6,10 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="6.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />

View File

@ -1,5 +1,6 @@
using CanteenContracts.BindingModels;
using CanteenContracts.BusinessLogicsContracts;
using CanteenContracts.SearchModel;
using CanteenContracts.View;
using Microsoft.AspNetCore.Mvc;
@ -25,11 +26,11 @@ namespace CanteenRestApi.Controllers
}
[HttpGet]
public List<CookViewModel>? GetCookList()
public List<CookViewModel>? GetCookList(int managerId)
{
try
{
return _cook.ReadList(null);
return _cook.ReadList(new CookSearchModel { ManagerId = managerId});
}
catch (Exception ex)
{
@ -63,5 +64,57 @@ namespace CanteenRestApi.Controllers
throw;
}
}
[HttpPost]
public void CreateCook(CookBindingModel model)
{
try
{
_cook.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void DeleteCook(CookBindingModel model)
{
try
{
_cook.Delete(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void CreateDish(DishBindingModel model)
{
try
{
_dish.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
[HttpPost]
public void CreateProduct(ProductBindingModel model)
{
try
{
_product.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during loading list of bouquets");
throw;
}
}
}
}

View File

@ -0,0 +1,68 @@
using CanteenContracts.BindingModels;
using CanteenContracts.BusinessLogicsContracts;
using CanteenContracts.SearchModel;
using CanteenContracts.View;
using Microsoft.AspNetCore.Mvc;
namespace CanteenRestApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ManagerController : Controller
{
private readonly ILogger _logger;
private readonly IManagerLogic _logic;
public ManagerController(IManagerLogic logic, ILogger<ManagerController> logger)
{
_logger = logger;
_logic = logic;
}
[HttpGet]
public ManagerViewModel? Login(string login, string password)
{
try
{
return _logic.ReadElement(new ManagerSearchModel
{
Login = login,
Password = password
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during logging in");
throw;
}
}
[HttpPost]
public void Register(ManagerBindingModel model)
{
try
{
_logic.Create(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during registration");
throw;
}
}
[HttpPost]
public void UpdateData(ManagerBindingModel model)
{
try
{
_logic.Update(model);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during updating");
throw;
}
}
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
@ -6,6 +6,10 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>