Сделал все crud на сайте(остался только отчет и mail). Так же немного поменял логику

This commit is contained in:
Extrimal 2024-05-27 14:27:46 +04:00
parent e8c134f8d3
commit 73068876ef
32 changed files with 721 additions and 228 deletions

View File

@ -10,8 +10,9 @@ namespace HotelAdministratorApp
private static readonly HttpClient _administrator = new();
public static AdministratorViewModel? Administrator { get; set; } = null;
public static DinnerViewModel? Dinner { get; set; } = null;
public static void Connect(IConfiguration configuration)
public static void Connect(IConfiguration configuration)
{
_administrator.BaseAddress = new Uri(configuration["IPAddress"]);
_administrator.DefaultRequestHeaders.Accept.Clear();

View File

@ -1,16 +1,26 @@
using HotelAdministratorApp.Models;
using HotelContracts.BindingModels;
using HotelContracts.BusinessLogicsContracts;
using HotelContracts.SearchModels;
using HotelContracts.ViewModels;
using HotelDataBaseImplement.Models;
using HotelDataModels.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Diagnostics;
using System.Numerics;
namespace HotelAdministratorApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IDinnerLogic _dinner;
public HomeController(ILogger<HomeController> logger)
public HomeController(ILogger<HomeController> logger, IDinnerLogic dinner)
{
_logger = logger;
_dinner = dinner;
}
public IActionResult Index()
@ -19,32 +29,113 @@ namespace HotelAdministratorApp.Controllers
}
public IActionResult Dinners()
{
return View();
}
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<DinnerViewModel>>($"api/main/getdinnerlist?administratorId={APIClient.Administrator.Id}"));
}
public IActionResult Rooms()
{
return View();
}
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<RoomViewModel>>($"api/main/getroomlist?administratorId={APIClient.Administrator.Id}"));
}
public IActionResult ConferenceBookings()
{
return View();
}
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.GetRequest<List<ConferenceBookingViewModel>>($"api/main/getConferenceBookinglist?administratorId={APIClient.Administrator.Id}"));
}
public IActionResult ConferenceBookingToConference()
{
return View();
}
public IActionResult Privacy()
[HttpGet]
public IActionResult Privacy()
{
return View();
}
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
return View(APIClient.Administrator);
}
[HttpPost]
public void Privacy(string login, string email, string password, string fio, string phone)
{
if (APIClient.Administrator == null)
{
throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
}
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio) || string.IsNullOrEmpty(email) || string.IsNullOrEmpty(phone))
{
throw new Exception("Введите логин, пароль и ФИО");
}
APIClient.PostRequest("api/administrator/updatedata", new AdministratorBindingModel
{
Id = APIClient.Administrator.Id,
AdministratorFIO = fio,
AdministratorLogin = login,
AdministratorPassword = password,
AdministratorEmail = email,
AdministratorPhone = phone
});
APIClient.Administrator.AdministratorFIO = fio;
APIClient.Administrator.AdministratorLogin = login;
APIClient.Administrator.AdministratorPassword = password;
APIClient.Administrator.AdministratorEmail = email;
APIClient.Administrator.AdministratorPhone = phone;
Response.Redirect("Index");
}
[HttpGet]
public IActionResult Register()
{
return View();
}
public IActionResult Enter()
[HttpPost]
public void Register(string fio, string login, string email, string password, string phone)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio) || string.IsNullOrEmpty(phone) || string.IsNullOrEmpty(email))
{
throw new Exception("Введите все данные");
}
APIClient.PostRequest("api/administrator/register", new AdministratorBindingModel
{
AdministratorFIO = fio,
AdministratorLogin = login,
AdministratorPassword = password,
AdministratorEmail = email,
AdministratorPhone = phone
});
Response.Redirect("Enter");
return;
}
[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.Administrator = APIClient.GetRequest<AdministratorViewModel>($"api/administrator/login?login={login}&password={password}");
if (APIClient.Administrator == null)
{
throw new Exception("Неверный логин/пароль");
}
Response.Redirect("Index");
}
public IActionResult AddDinnerRoomToFiles()
{
return View();
@ -56,55 +147,338 @@ namespace HotelAdministratorApp.Controllers
}
public IActionResult CreateDinner()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
return View();
}
[HttpPost]
public void CreateDinner(double dinnerPrice, string dinnerName, int dinnerСalorie)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (string.IsNullOrEmpty(dinnerName) || dinnerPrice<=0 || dinnerСalorie<=0)
{
throw new Exception("Введите данные");
}
APIClient.PostRequest("api/main/createdinner", new DinnerBindingModel
{
DinnerPrice = dinnerPrice,
DinnerName = dinnerName,
DinnerСalorieСontent = dinnerСalorie,
AdministratorId = APIClient.Administrator.Id,
});
Response.Redirect("Dinners");
}
public IActionResult UpdateDinner()
{
return View();
}
public IActionResult DeleteDinner()
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Dinners = APIClient.GetRequest<List<DinnerViewModel>>($"api/main/getdinnerlist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void UpdateDinner(int dinner, string dinnerName, double dinnerPrice, int dinnerСalorie)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (string.IsNullOrEmpty(dinnerName) || string.IsNullOrEmpty(dinnerPrice.ToString()) || string.IsNullOrEmpty(dinnerСalorie.ToString()))
{
throw new Exception("Данные пустые");
}
APIClient.PostRequest("api/main/updatedinner", new DinnerBindingModel
{
Id = dinner,
DinnerName = dinnerName,
DinnerPrice = dinnerPrice,
DinnerСalorieСontent = dinnerСalorie,
AdministratorId = APIClient.Administrator.Id,
});
Response.Redirect("Dinners");
}
public IActionResult DeleteDinner()
{
return View();
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Dinners = APIClient.GetRequest<List<DinnerViewModel>>($"api/main/getdinnerlist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void DeleteDinner(int dinner)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
APIClient.PostRequest("api/main/deletedinner", new DinnerBindingModel
{
Id = dinner
});
Response.Redirect("Dinners");
}
[HttpGet]
public DinnerViewModel? GetDinner(int dinnerId)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
var result = APIClient.GetRequest<DinnerViewModel>($"api/main/getdinner?dinnerid={dinnerId}");
if (result == null)
{
return default;
}
return result;
}
public IActionResult CreateRoom()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
var list = _dinner.ReadList(new DinnerSearchModel { AdministratorId = APIClient.Administrator.Id });
var simpDinner = list.Select(x => new { DinnerId = x.Id, DinnerName = x.DinnerName });
ViewBag.Dinners = new MultiSelectList(simpDinner, "DinnerId", "DinnerName");
return View();
}
[HttpPost]
public void CreateRoom(int roomNumber, double roomPrice, int[] dinners, DateTime dateCreate)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (roomNumber<=0 || roomPrice<=0 || dinners.Length == 0)
{
throw new Exception("Введите данные");
}
Dictionary<int, IDinnerModel> RoomDinners = new Dictionary<int, IDinnerModel>();
foreach (int id in dinners)
{
RoomDinners.Add(id, _dinner.ReadElement(new DinnerSearchModel { Id = id }));
}
APIClient.PostRequest("api/main/createroom", new RoomBindingModel
{
RoomNumber = roomNumber,
RoomPrice = roomPrice,
DateCreate = dateCreate,
AdministratorId = APIClient.Administrator.Id,
});
for (int i = 0; i < dinners.Length; i++)
{
APIClient.PostRequest("api/main/AddDinnerToRoom", Tuple.Create(
new RoomSearchModel() { RoomNumber = roomNumber },
new DinnerViewModel() { Id = dinners[i] }
));
}
Response.Redirect("Rooms");
}
public IActionResult UpdateRoom()
{
return View();
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
var list = _dinner.ReadList(new DinnerSearchModel { AdministratorId = APIClient.Administrator.Id });
var simpDinner = list.Select(x => new { DinnerId = x.Id, DinnerName = x.DinnerName });
ViewBag.Dinners = new MultiSelectList(simpDinner, "DinnerId", "DinnerName");
ViewBag.Rooms = APIClient.GetRequest<List<RoomViewModel>>($"api/main/getroomlist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void UpdateRoom(int room, int roomNumber, double roomPrice, DateTime dateCreate)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (roomNumber <= 0 || roomPrice <= 0)
{
throw new Exception("Введите данные");
}
APIClient.PostRequest("api/main/updateroom", new RoomBindingModel
{
Id = room,
RoomNumber = roomNumber,
RoomPrice = roomPrice,
DateCreate = dateCreate,
AdministratorId = APIClient.Administrator.Id,
});
Response.Redirect("Rooms");
}
public IActionResult DeleteRoom()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.Rooms = APIClient.GetRequest<List<RoomViewModel>>($"api/main/getroomlist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void DeleteRoom(int room)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
APIClient.PostRequest("api/main/deleteroom", new RoomBindingModel
{
Id = room
});
Response.Redirect("Rooms");
}
public IActionResult CreateConferenceBooking()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
var list = _dinner.ReadList(new DinnerSearchModel { AdministratorId = APIClient.Administrator.Id });
var simpDinner = list.Select(x => new { DinnerId = x.Id, DinnerName = x.DinnerName });
ViewBag.Dinners = new MultiSelectList(simpDinner, "DinnerId", "DinnerName");
return View();
}
[HttpPost]
public void CreateConferenceBooking(string placeСonference, int[] dinners, DateTime dateСonference)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (string.IsNullOrEmpty(placeСonference))
{
throw new Exception("Введите данные");
}
Dictionary<int, IDinnerModel> ConferenceBookingDinners = new Dictionary<int, IDinnerModel>();
foreach (int id in dinners)
{
ConferenceBookingDinners.Add(id, _dinner.ReadElement(new DinnerSearchModel { Id = id }));
}
APIClient.PostRequest("api/main/createconferencebooking", new ConferenceBookingBindingModel
{
PlaceСonference = placeСonference,
DateСonference = dateСonference,
AdministratorId = APIClient.Administrator.Id,
});
for (int i = 0; i < dinners.Length; i++)
{
APIClient.PostRequest("api/main/AddDinnerToConferenceBooking", Tuple.Create(
new ConferenceBookingSearchModel() { PlaceСonference = placeСonference },
new DinnerViewModel() { Id = dinners[i] }
));
}
Response.Redirect("ConferenceBookings");
}
public IActionResult UpdateConferenceBooking()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
var list = _dinner.ReadList(new DinnerSearchModel { AdministratorId = APIClient.Administrator.Id });
var simpDinner = list.Select(x => new { DinnerId = x.Id, DinnerName = x.DinnerName });
ViewBag.Dinners = new MultiSelectList(simpDinner, "DinnerId", "DinnerName");
ViewBag.ConferenceBookings = APIClient.GetRequest<List<ConferenceBookingViewModel>>($"api/main/getConferenceBookinglist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void UpdateConferenceBooking(int conferencebooking, string placeСonference, DateTime dateСonference)
{
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
if (string.IsNullOrEmpty(placeСonference))
{
throw new Exception("Введите данные");
}
APIClient.PostRequest("api/main/updateConferenceBooking", new ConferenceBookingBindingModel
{
Id = conferencebooking,
PlaceСonference = placeСonference,
DateСonference = dateСonference,
AdministratorId = APIClient.Administrator.Id,
});
Response.Redirect("ConferenceBookings");
}
public IActionResult DeleteConferenceBooking()
{
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.ConferenceBookings = APIClient.GetRequest<List<ConferenceBookingViewModel>>($"api/main/getConferenceBookinglist?administratorId={APIClient.Administrator.Id}");
return View();
}
public IActionResult AddDinnerToRoom()
[HttpPost]
public void DeleteConferenceBooking(int conferencebooking)
{
return View();
if (APIClient.Administrator == null)
{
throw new Exception("Необходима авторизация");
}
APIClient.PostRequest("api/main/deleteconferencebooking", new ConferenceBookingBindingModel
{
Id = conferencebooking
});
Response.Redirect("ConferenceBookings");
}
public IActionResult AddDinnerToConferenceBooking()
[HttpGet]
public IActionResult AddRoomToMealPlan()
{
return View();
}
public IActionResult AddRoomToMealPlan()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
if (APIClient.Administrator == null)
{
return Redirect("~/Home/Enter");
}
ViewBag.MealPlans = APIClient.GetRequest<List<MealPlanViewModel>>($"api/main/getmealplans");
ViewBag.Rooms = APIClient.GetRequest<List<RoomViewModel>>($"api/main/getroomlist?administratorId={APIClient.Administrator.Id}");
return View();
}
[HttpPost]
public void AddRoomToMealPlan(int room, int mealplan)
{
if (APIClient.Administrator == null)
{
throw new Exception("Вы как сюда попали? Сюда вход только авторизованным");
}
var roomElem = APIClient.GetRequest<RoomViewModel>($"api/main/getroombyid?roomId={room}");
APIClient.PostRequest("api/main/updateroom", new RoomBindingModel
{
Id = room,
MealPlanId = mealplan,
RoomNumber = roomElem.RoomNumber,
DateCreate = roomElem.DateCreate,
RoomPrice = roomElem.RoomPrice,
AdministratorId = roomElem.AdministratorId,
});
Response.Redirect("Rooms");
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });

View File

@ -1,9 +1,16 @@
using HotelAdministratorApp;
using HotelBusinessLogic.BusinessLogic;
using HotelContracts.BusinessLogicsContracts;
using HotelContracts.StoragesContracts;
using HotelDataBaseImplement.Implements;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddTransient<IDinnerStorage, DinnerStorage>();
builder.Services.AddTransient<IDinnerLogic, DinnerLogic>();
builder.Services.AddTransient<IRoomStorage, RoomStorage>();
builder.Services.AddTransient<IRoomLogic, RoomLogic>();
var app = builder.Build();
APIClient.Connect(builder.Configuration);
// Configure the HTTP request pipeline.

View File

@ -1,37 +0,0 @@
@{
ViewData["Title"] = "AddDinnerToConferenceBooking";
}
<head>
<link rel="stylesheet" href="~/css/style.css" asp-append-version="true" />
</head>
<div class="text-center">
<h2 class="u-text u-text-custom-color-1 u-text-default u-text-1"> Добавить обед в бронь по конференциям</h2>
</div>
<form method="post">
<div class="form-group">
<label for="room">Выберите бронь</label>
<select id="room" name="room" class="form-control">
</select>
</div>
<div class="form-group">
<label class="list-words-add">Выберите обеды</label>
<table class="table">
<thead>
<tr>
<th>Наименование</th>
<th>Калорийность</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<br>
<div class="button">
<button class="button-action">Сохранить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="ConferenceBookings" class="button-action">Назад</a>
</div>
</form>

View File

@ -1,38 +0,0 @@
@{
ViewData["Title"] = "AddDinnerToRoom";
}
<head>
<link rel="stylesheet" href="~/css/style.css" asp-append-version="true" />
</head>
<div class="text-center">
<h2 class="u-text u-text-custom-color-1 u-text-default u-text-1"> Добавить обед в комнату</h2>
</div>
<form method="post">
<div class="form-group">
<label for="room">Выберите номер</label>
<select id="room" name="room" class="form-control">
</select>
</div>
<div class="form-group">
<label class="list-words-add">Выберите обеды</label>
<table class="table">
<thead>
<tr>
<th>Наименование</th>
<th>Калорийность</th>
<th>Цена</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<br>
<div class="button">
<button class="button-action">Сохранить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Rooms" class="button-action">Назад</a>
</div>
</form>

View File

@ -11,11 +11,11 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Номер комнаты: </label>
<select class="form-control"></select>
<select id="room" name="room" class="form-control" asp-items="@(new SelectList(@ViewBag.Rooms, "Id", "RoomNumber"))"></select>
</div>
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Название плана питания: </label>
<select class="form-control"></select>
<select id="mealplan" name="mealplan" class="form-control" asp-items="@(new SelectList(@ViewBag.MealPlans, "Id", "MealPlanName"))"></select>
</div>
<div class="button">
<button class="button-action">Добавить привязку</button>

View File

@ -1,4 +1,7 @@
@{
@using HotelContracts.ViewModels
@model List<ConferenceBookingViewModel>
@{
ViewData["Title"] = "ConferenceBookings";
}
@ -25,6 +28,20 @@
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr style="height: 75px">
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.PlaceСonference)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateСonference)
</td>
</tr>
}
</tbody>
</table>
<div class="buttons-action-with-conferencebooking">
@ -37,9 +54,6 @@
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="DeleteConferenceBooking" class="button-action" style="width: 130px">Удалить</a>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="AddDinnerToConferenceBooking" class="button-action" style="width: 130px">Добавить обед</a>
</div>
</div>
</div>
</form>

View File

@ -1,4 +1,7 @@
@{
@using HotelContracts.ViewModels
@model DinnerViewModel
@{
ViewData["Title"] = "CreateConferenceBooking";
}
<head>
@ -8,9 +11,15 @@
<h2 class="u-text u-text-custom-color-1 u-text-default u-text-1"> Добавить бронь по конференциям</h2>
</div>
<form method="post">
<input style="margin-bottom: 20px" type="text" placeholder="Введите место конференции" class="form-control" />
<input name="placeСonference" style="margin-bottom: 20px" type="text" placeholder="Введите место конференции" class="form-control" />
<label class="u-label u-text-custom-color-1 u-label-1" >Дата бронирования:</label>
<input type="datetime-local" class="form-control" style="margin-bottom: 20px">
<input name="dateСonference" type="datetime-local" class="form-control" style="margin-bottom: 20px">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Обеды: </label>
<div>
@Html.ListBox("dinners", (MultiSelectList)ViewBag.Dinners, new { @class = "form-control", size = "10" })
</div>
</div>
<div class="button">
<button class="button-action">Сохранить</button>
</div>

View File

@ -8,11 +8,11 @@
<h2 class="u-text u-text-custom-color-1 u-text-default u-text-1"> Добавить обед</h2>
</div>
<form method="post">
<input style="margin-bottom: 20px" type="text" placeholder="Введите название обеда" class="form-control" />
<input style="margin-bottom: 20px" type="text" placeholder="Введите калорийность обеда" class="form-control" />
<input style="margin-bottom: 20px" type="number" placeholder="Введите стоимость обеда" class="form-control" step="1" />
<input style="margin-bottom: 20px" type="text" name="dinnerName" placeholder="Введите название обеда" class="form-control" />
<input style="margin-bottom: 20px" type="text" name="dinnerСalorie" placeholder="Введите калорийность обеда" class="form-control" />
<input style="margin-bottom: 20px" type="number" name="dinnerPrice" placeholder="Введите стоимость обеда" class="form-control" step="1" />
<div class="button">
<button class="button-action">Сохранить</button>
<button type ="submit" class="button-action">Сохранить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Dinners" class="button-action">Назад</a>

View File

@ -1,4 +1,7 @@
@{
@using HotelContracts.ViewModels
@model DinnerViewModel
@{
ViewData["Title"] = "CreateRoom";
}
<head>
@ -8,11 +11,18 @@
<h2 class="u-text u-text-custom-color-1 u-text-default u-text-1"> Добавить комнату</h2>
</div>
<form method="post">
<input style="margin-bottom: 20px" type="text" placeholder="Введите название комнаты" class="form-control" />
<input style="margin-bottom: 20px" type="number" placeholder="Введите кол. спальных мест" class="form-control" step="1" />
<input style="margin-bottom: 20px" type="number" placeholder="Введите стоимость комнаты" class="form-control" step="1" />
<input name="roomNumber" style="margin-bottom: 20px" type="text" placeholder="Введите номер комнаты" class="form-control" />
<input name="roomPrice" style="margin-bottom: 20px" type="number" placeholder="Введите стоимость комнаты" class="form-control" step="1" />
<label for="dateFrom" class="form-label text-custom-color-1">Дата номера:</label>
<input type="datetime-local" name="DateCreate" class="form-control" placeholder="Выберите дату начала периода">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Обеды: </label>
<div>
@Html.ListBox("dinners", (MultiSelectList)ViewBag.Dinners, new { @class = "form-control", size = "10" })
</div>
</div>
<div class="button">
<button class="button-action">Сохранить</button>
<button class="button-action" type="submit">Сохранить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Rooms" class="button-action">Назад</a>

View File

@ -11,10 +11,10 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Место конференции: </label>
<select class="form-control"></select>
<select id="conferencebooking" name="conferencebooking" class="form-control" asp-items="@(new SelectList(@ViewBag.ConferenceBookings, "Id", "PlaceСonference"))"></select>
</div>
<div class="button">
<button class="button-action">Сохранить</button>
<button class="button-action">Удалить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="ConferenceBookings" class="button-action">Назад</a>

View File

@ -11,10 +11,10 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Обеды: </label>
<select class="form-control"></select>
<select id="dinner" name="dinner" class="form-control" asp-items="@(new SelectList(@ViewBag.Dinners, "Id", "DinnerName"))"></select>
</div>
<div class="button">
<button class="button-action">Сохранить</button>
<button class="button-action" type="submit">Удалить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Dinners" class="button-action">Назад</a>

View File

@ -11,10 +11,10 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Комната: </label>
<select class="form-control"></select>
<select id="room" name="room" class="form-control" asp-items="@(new SelectList(@ViewBag.Rooms, "Id", "RoomNumber"))"></select>
</div>
<div class="button">
<button class="button-action">Сохранить</button>
<button type="submit" class="button-action">Удалить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Rooms" class="button-action">Назад</a>

View File

@ -1,4 +1,8 @@
@{
@using HotelContracts.ViewModels
@model List<DinnerViewModel>
@{
ViewData["Title"] = "Dinners";
}
@ -29,8 +33,24 @@
</tr>
</thead>
<tbody>
</tbody>
@foreach (var item in Model)
{
<tr style="height: 75px">
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.DinnerName)
</td>
<td>
@Html.DisplayFor(modelItem => item.DinnerСalorieСontent)
</td>
<td>
@Html.DisplayFor(modelItem => item.DinnerPrice)
</td>
</tr>
}
</tbody>
</table>
<div class="buttons-action-with-dinner">
<div class="button">

View File

@ -14,14 +14,14 @@
<div class="main_block">
<div class="main_fields">
<div class="main_field_one">
<input type="text" placeholder="логин/почта">
<input type="text" placeholder="логин/почта" name="login">
</div>
<div class="main_field_two">
<input type="text" placeholder="пароль">
<input type="password" placeholder="пароль" name="password">
</div>
</div>
<div class="class_login">
<button class="button_login">
<button class="button_login" type="submit">
Вход
</button>
</div>

View File

@ -26,22 +26,26 @@
<form method="post">
<label class="u-label u-text-custom-color-1 u-label-1" style="display:flex;justify-content:center">Логин </label>
<div class="pole">
<input type="text" class="form-control" />
<input type="text" name="login" class="form-control" value="@Model.AdministratorLogin" />
</div>
<label class="u-label u-text-custom-color-1 u-label-1" style="display:flex;justify-content:center">Почта </label>
<div class="pole">
<input type="text" class="form-control" />
<input type="email" name="email" class="form-control" value="@Model.AdministratorEmail" />
</div>
<label class="u-label u-text-custom-color-1 u-label-1" style="display:flex;justify-content:center">Пароль </label>
<div class="pole">
<input type="password" class="form-control" />
<input type="password" name="password" class="form-control" value="@Model.AdministratorPassword" />
</div>
<label class="u-label u-text-custom-color-1 u-label-1" style="display:flex;justify-content:center">ФИО </label>
<div class="pole">
<input type="text" class="form-control" />
<input type="text" name="fio" class="form-control" value="@Model.AdministratorFIO" />
</div>
<label class="u-label u-text-custom-color-1 u-label-1" style="display:flex;justify-content:center">Телефон </label>
<div class="pole">
<input type="text" name="phone" class="form-control" value="@Model.AdministratorPhone" />
</div>
<div class="button" style="display:flex;justify-content:center">
<button class="button-action">Сохранить</button>
<button class="button-action" type="submit">Сохранить</button>
</div>
</form>

View File

@ -20,22 +20,19 @@
</p>
</div>
<div class="main_field">
<input type="text" placeholder="ФИО">
<input type="text" placeholder="ФИО" name="fio">
</div>
<div class="main_field">
<input type="text" placeholder="Логин">
<input type="text" placeholder="Логин" name="login">
</div>
<div class="main_field">
<input type="text" placeholder="Эл. почта">
<input type="email" placeholder="Эл. почта" name="email">
</div>
<div class="main_field">
<input type="text" placeholder="Номер телефона">
<input type="password" placeholder="Пароль" name="password">
</div>
<div class="main_field">
<input type="text" placeholder="Пароль">
</div>
<div class="main_field">
<input type="text" placeholder="Номер телефона">
<input type="text" placeholder="Номер телефона" name="phone">
</div>
</div>
<div class="class_login">

View File

@ -1,7 +1,9 @@
@{
@using HotelContracts.ViewModels
@model List<RoomViewModel>
@{
ViewData["Title"] = "Rooms";
}
<head>
<link rel="stylesheet" href="~/css/style.css" asp-append-version="true" />
</head>
@ -21,14 +23,31 @@
Номер комнаты
</th>
<th>
Кол. спальных мест
Цена
</th>
<th>
Цена
Время
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr style="height: 75px">
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.RoomNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.RoomPrice)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateCreate)
</td>
</tr>
}
</tbody>
</table>
<div class="buttons-action-with-room">
@ -41,9 +60,6 @@
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="DeleteRoom" class="button-action" style="width: 130px">Удалить</a>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="AddDinnerToRoom" class="button-action" style="width: 130px">Добавить обед</a>
</div>
</div>
</div>
</form>

View File

@ -10,35 +10,15 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Бронь по конференциям: </label>
<select class="form-control"></select>
<select id="conferencebooking" name="conferencebooking" class="form-control" asp-items="@(new SelectList(@ViewBag.ConferenceBookings, "Id", "PlaceСonference"))"></select>
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="text" placeholder="Введите место конференции" class="form-control" />
<input name="placeСonference" style="margin-bottom: 20px" type="text" placeholder="Введите место конференции" class="form-control" />
</div>
<div class="form-group">
<input type="datetime-local" class="form-control">
<input name="dateСonference" type="datetime-local" class="form-control">
</div>
<label class="word-dinner">Обеды </label>
<table class="table">
<thead>
<tr>
<th>
Номер
</th>
<th>
Название
</th>
<th>
Калорийность
</th>
<th>
Цена
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div class="button">
<button class="button-action">Сохранить</button>
</div>
@ -46,4 +26,27 @@
<a asp-area="" asp-controller="Home" asp-action="ConferenceBookings" class="button-action">Назад</a>
</div>
</form>
</form>
@section Scripts
{
<script>
function check() {
var conferencebooking = $('#conferencebooking').val();
if (conferencebooking) {
$.ajax({
method: "GET",
url: "/Home/GetConferenceBooking",
data: { conferencebookingId: conferencebooking },
success: function (result) {
$('#placeСonference').val(result.PlaceСonference);
$('#dateСonference').val(result.DateСonference);
}
});
};
}
check();
$('#conferencebooking').on('change', function () {
check();
});
</script>
}

View File

@ -1,4 +1,7 @@
@{
@using HotelContracts.ViewModels
@model DinnerViewModel
@{
ViewData["Title"] = "UpdateDinner";
}
<head>
@ -10,21 +13,45 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Обеды: </label>
<select class="form-control"></select>
<select id="dinner" name="dinner" class="form-control" asp-items="@(new SelectList(@ViewBag.Dinners, "Id", "DinnerName"))"></select>
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="text" placeholder="Введите название обеда" class="form-control" />
<input style="margin-bottom: 20px" name="dinnerName" type="text" placeholder="Введите название обеда" class="form-control" />
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="text" placeholder="Введите калорийность обеда" class="form-control" />
<input style="margin-bottom: 20px" name="dinnerСalorie" type="text" placeholder="Введите калорийность обеда" class="form-control" />
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="number" placeholder="Введите стоимость обеда" class="form-control" step="1" />
<input style="margin-bottom: 20px" name="dinnerPrice" type="number" placeholder="Введите стоимость обеда" class="form-control" step="1" />
</div>
<div class="button">
<button class="button-action">Сохранить</button>
<button class="button-action" type="submit">Сохранить</button>
</div>
<div class="button">
<a asp-area="" asp-controller="Home" asp-action="Dinners" class="button-action">Назад</a>
</div>
</form>
</form>
@section Scripts
{
<script>
function check() {
var dinner = $('#dinner').val();
if (dinner) {
$.ajax({
method: "GET",
url: "/Home/GetDinner",
data: { dinnerId: dinner },
success: function (result) {
$('#dinnerName').val(result.DinnerName);
$('#dinnerPrice').val(result.DinnerPrice);
$('#dinnerСalorie').val(result.DinnerСalorie);
}
});
};
}
check();
$('#dinner').on('change', function () {
check();
});
</script>
}

View File

@ -10,38 +10,19 @@
<form method="post">
<div class="spisok">
<label class="u-label u-text-custom-color-1 u-label-1">Комнаты: </label>
<select class="form-control"></select>
<select id="room" name="room" class="form-control" asp-items="@(new SelectList(@ViewBag.Rooms, "Id", "RoomNumber"))"></select>
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="text" placeholder="Введите номер комнаты" class="form-control" />
<input name="roomNumber" style="margin-bottom: 20px" type="text" placeholder="Введите номер комнаты" class="form-control" />
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="number" placeholder="Введите кол. спальных мест" class="form-control" step="1" />
<input name="roomPrice" style="margin-bottom: 20px" type="number" placeholder="Введите стоимость комнаты" class="form-control" step="1" />
</div>
<div class="form-group">
<input style="margin-bottom: 20px" type="number" placeholder="Введите стоимость комнаты" class="form-control" step="1" />
<label for="dateFrom" class="form-label text-custom-color-1">Дата номера:</label>
<input type="datetime-local" name="dateCreate" class="form-control" placeholder="Выберите дату начала периода">
</div>
<label class="word-dinner">Обеды </label>
<table class="table">
<thead>
<tr>
<th>
Номер
</th>
<th>
Название
</th>
<th>
Калорийность
</th>
<th>
Цена
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br>
<div class="button">
<button class="button-action">Сохранить</button>
</div>
@ -49,4 +30,28 @@
<a asp-area="" asp-controller="Home" asp-action="Rooms" class="button-action">Назад</a>
</div>
</form>
</form>
@section Scripts
{
<script>
function check() {
var room = $('#room').val();
if (room) {
$.ajax({
method: "GET",
url: "/Home/GetRoom",
data: { roomId: room },
success: function (result) {
$('#roomNumber').val(result.roomNumber);
$('#roomPrice').val(result.RoomPrice);
$('#dateCreate').val(result.DateCreate);
}
});
};
}
check();
$('#room').on('change', function () {
check();
});
</script>
}

View File

@ -8,6 +8,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace HotelBusinessLogic.BusinessLogic
@ -16,7 +17,8 @@ namespace HotelBusinessLogic.BusinessLogic
{
private readonly int _loginMaxLength = 25;
private readonly int _passwordMaxLength = 50;
private readonly ILogger _logger;
private readonly int _passwordMinLength = 5;
private readonly ILogger _logger;
private readonly IAdministratorStorage _administratorStorage;
public AdministratorLogic(ILogger<AdministratorLogic> logger, IAdministratorStorage administratorStorage)
@ -127,9 +129,9 @@ namespace HotelBusinessLogic.BusinessLogic
{
throw new ArgumentNullException("Нет пароля администратора", nameof(model.AdministratorPassword));
}
if (model.AdministratorPassword.Length > _passwordMaxLength)
if (model.AdministratorPassword.Length > _passwordMaxLength || model.AdministratorPassword.Length < _passwordMinLength || !Regex.IsMatch(model.AdministratorPassword, @"^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$"))
{
throw new ArgumentNullException("Пароль превышает допустимое количество символов", nameof(model.AdministratorPassword));
throw new ArgumentNullException("Пароль превышает допустимое количество символов или их недостаточно", nameof(model.AdministratorPassword));
}
_logger.LogInformation("Administrator. AdministratorFIO: {AdministratorFIO}. AdministratorLogin: {AdministratorLogin}. AdministratorPhone: {AdministratorPhone}.AdministratorEmail: {AdministratorEmail}.AdministratorPassword: {AdministratorPassword}.Id: {Id}",
model.AdministratorFIO, model.AdministratorLogin, model.AdministratorPhone, model.AdministratorEmail, model.AdministratorPassword, model.Id);

View File

@ -121,8 +121,15 @@ namespace HotelBusinessLogic.BusinessLogic
{
throw new ArgumentNullException("Калорийность обеда не может быть меньше 0", nameof(model.DinnerСalorieСontent));
}
_logger.LogInformation("Dinner. DinnerName:{DinnerName}.DinnerPrice:{DinnerPrice}.DinnerСalorieСontent:{DinnerСalorieСontent}. Id: { Id}", model.DinnerName, model.DinnerPrice, model.DinnerСalorieСontent, model.Id);
var elementName = _dinnerStorage.GetElement(new DinnerSearchModel
{
DinnerName = model.DinnerName
});
if (elementName != null && elementName.Id != model.Id)
{
throw new InvalidOperationException("Обед с таким названием уже есть");
}
_logger.LogInformation("Dinner. DinnerName:{DinnerName}.DinnerPrice:{DinnerPrice}.DinnerСalorieСontent:{DinnerСalorieСontent}. Id: { Id}", model.DinnerName, model.DinnerPrice, model.DinnerСalorieСontent, model.Id);
}
}
}

View File

@ -152,8 +152,15 @@ namespace HotelBusinessLogic.BusinessLogic
{
throw new ArgumentNullException("Цена комнаты не может быть меньше 0", nameof(model.RoomPrice));
}
_logger.LogInformation("Room. RoomNumber:{RoomNumber}.RoomPrice:{RoomPrice}. Id: {Id}", model.RoomNumber, model.RoomPrice, model.Id);
var elementNumber = _roomStorage.GetElement(new RoomSearchModel
{
RoomNumber = model.RoomNumber
});
if (elementNumber != null && elementNumber.Id != model.Id)
{
throw new InvalidOperationException("Комната с таким номером уже есть");
}
_logger.LogInformation("Room. RoomNumber:{RoomNumber}.RoomPrice:{RoomPrice}. Id: {Id}", model.RoomNumber, model.RoomPrice, model.Id);
}
}
}

View File

@ -6,6 +6,10 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\HotelDataModels\HotelDataModels.csproj" />
</ItemGroup>

View File

@ -5,6 +5,7 @@ using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HotelContracts.ViewModels
{
@ -17,5 +18,11 @@ namespace HotelContracts.ViewModels
[DisplayName("Дата конференции")]
public DateTime? DateСonference { get; set; }
public Dictionary<int, IDinnerModel> ConferenceBookingDinners { get; set; } = new();
}
public ConferenceBookingViewModel() { }
[JsonConstructor]
public ConferenceBookingViewModel(Dictionary<int, DinnerViewModel> ConferenceBookingDinners)
{
this.ConferenceBookingDinners = ConferenceBookingDinners.ToDictionary(x => x.Key, x => x.Value as IDinnerModel);
}
}
}

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HotelContracts.ViewModels
{
@ -20,5 +20,12 @@ namespace HotelContracts.ViewModels
public int AdministratorId { get; set; }
public int? MealPlanId { get; set; }
public Dictionary<int, IDinnerModel> RoomDinners { get; set; } = new();
}
public RoomViewModel() { }
[JsonConstructor]
public RoomViewModel(Dictionary<int, DinnerViewModel> RoomDinners)
{
this.RoomDinners = RoomDinners.ToDictionary(x => x.Key, x => x.Value as IDinnerModel);
}
}
}

View File

@ -67,7 +67,16 @@ namespace HotelDataBaseImplement.Implements
.FirstOrDefault(x => x.AdministratorEmail.Equals(model.AdministratorEmail))?
.GetViewModel;
}
return null;
if (!string.IsNullOrEmpty(model.AdministratorLogin) && string.IsNullOrEmpty(model.AdministratorEmail) && !string.IsNullOrEmpty(model.AdministratorPassword))
{
return context.Administrators
.Include(x => x.ConferenceBookings)
.Include(x => x.Dinners)
.Include(x => x.Rooms)
.FirstOrDefault(x => x.AdministratorLogin.Equals(model.AdministratorLogin) && x.AdministratorPassword.Equals(model.AdministratorPassword))?
.GetViewModel;
}
return null;
}
public AdministratorViewModel? Insert(AdministratorBindingModel model)

View File

@ -82,7 +82,7 @@ namespace HotelDataBaseImplement.Implements
public RoomViewModel? GetElement(RoomSearchModel model)
{
if (!model.Id.HasValue && model.RoomNumber != null)
if (!model.Id.HasValue && model.RoomNumber == null)
{
return null;
}

View File

@ -48,7 +48,8 @@ namespace HotelDataBaseImplement.Models
ConferenceId = model.ConferenceId,
AdministratorId = model.AdministratorId,
PlaceСonference = model.PlaceСonference,
Dinners = model.ConferenceBookingDinners.Select(x => new ConferenceBookingDinner
DateСonference = model.DateСonference,
Dinners = model.ConferenceBookingDinners.Select(x => new ConferenceBookingDinner
{
Dinner = context.Dinners.First(y => y.Id == x.Key),
}).ToList()

View File

@ -22,10 +22,18 @@ namespace HotelRestApi.Controllers
{
try
{
return _logic.ReadElement(new AdministratorSearchModel
if (login.Contains("@"))
{
return _logic.ReadElement(new AdministratorSearchModel
{
AdministratorEmail = login,
AdministratorPassword = password
});
}
return _logic.ReadElement(new AdministratorSearchModel
{
AdministratorLogin = login,
AdministratorPassword = password
AdministratorLogin = login,
AdministratorPassword = password
});
}
catch (Exception ex)

View File

@ -541,5 +541,34 @@ namespace HotelRestApi.Controllers
throw;
}
}
[HttpGet]
public List<MealPlanViewModel>? GetMealPlans()
{
try
{
return _mealPlan.ReadList(null);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка конференций");
throw;
}
}
[HttpGet]
public RoomViewModel GetRoomById(int roomId)
{
try
{
var elem = _room.ReadElement(new RoomSearchModel { Id = roomId });
if (elem == null)
return null;
return elem;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения по id={Id}", roomId);
throw;
}
}
}
}