Ура победа,Ура победа, да будет страничка с отчётами в вебу

This commit is contained in:
Игорь Гордеев 2024-05-30 19:37:45 +04:00
parent 84895f8374
commit 8c92f0d4dd
11 changed files with 608 additions and 8 deletions

View File

@ -23,5 +23,6 @@ namespace ElectronicsShopDataBaseImplement
public virtual DbSet<Employee> Employees { set; get; }
public virtual DbSet<CostItem> CostItems { set; get; }
public virtual DbSet<Paymeant> Paymeants { get; set; }
public virtual DbSet<MessageInfo> Messages { set; get; }
}
}

View File

@ -0,0 +1,53 @@
using ElectronicsShopContracts.BindingModels;
using ElectronicsShopContracts.SearchModels;
using ElectronicsShopContracts.StorageContracts;
using ElectronicsShopContracts.ViewModels;
using ElectronicsShopDataBaseImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ElectronicsShopDataBaseImplement.Implements
{
public class MessageInfoStorage : IMessageInfoStorage
{
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
{
using var context = new Database();
if (model.MessageID != null)
{
return context.Messages.FirstOrDefault(x => x.MessageID == model.MessageID)?.GetViewModel;
}
return null;
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
{
using var context = new Database();
return context.Messages
.Where(x => x.MessageID == model.MessageID).Select(x => x.GetViewModel).ToList();
}
public List<MessageInfoViewModel> GetFullList()
{
using var context = new Database();
return context.Messages.Select(x => x.GetViewModel).ToList();
}
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
{
using var context = new Database();
var newMessage = MessageInfo.Create(model);
if (newMessage == null || context.Messages.Any(x => x.MessageID.Equals(model.MessageID)))
{
return null;
}
context.Messages.Add(newMessage);
context.SaveChanges();
return newMessage.GetViewModel;
}
}
}

View File

@ -0,0 +1,322 @@
// <auto-generated />
using System;
using ElectronicsShopDataBaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace ElectronicsShopDataBaseImplement.Migrations
{
[DbContext(typeof(Database))]
[Migration("20240530150159_AddMessages")]
partial class AddMessages
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Client", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("ClientFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Clients");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.CostItem", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("CostNum")
.HasColumnType("int");
b.Property<int>("EmployeeID")
.HasColumnType("int");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<double>("Price")
.HasColumnType("float");
b.HasKey("ID");
b.HasIndex("EmployeeID");
b.ToTable("CostItems");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Employee", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<string>("EmployeeFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Login")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.ToTable("Employees");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.MessageInfo", b =>
{
b.Property<string>("MessageID")
.HasColumnType("nvarchar(450)");
b.Property<string>("Body")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int?>("ClientID")
.HasColumnType("int");
b.Property<DateTime>("DateDelivery")
.HasColumnType("datetime2");
b.Property<string>("SenderName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Subject")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("MessageID");
b.HasIndex("ClientID");
b.ToTable("Messages");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Order", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("ClientID")
.HasColumnType("int");
b.Property<DateTime>("DateCreate")
.HasColumnType("datetime2");
b.Property<double>("Sum")
.HasColumnType("float");
b.HasKey("ID");
b.HasIndex("ClientID");
b.ToTable("Orders");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.OrderProduct", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("OrderID")
.HasColumnType("int");
b.Property<int>("ProductID")
.HasColumnType("int");
b.Property<int?>("_productID")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("ProductID");
b.HasIndex("_productID");
b.ToTable("OrderProducts");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Paymeant", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("OrderID")
.HasColumnType("int");
b.Property<int>("PayOption")
.HasColumnType("int");
b.Property<int?>("PaymentID")
.HasColumnType("int");
b.Property<int>("ProductID")
.HasColumnType("int");
b.Property<double>("SumPayment")
.HasColumnType("float");
b.HasKey("ID");
b.HasIndex("PaymentID");
b.ToTable("Paymeants");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Product", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
b.Property<int>("CostItemID")
.HasColumnType("int");
b.Property<double>("Price")
.HasColumnType("float");
b.Property<string>("ProductName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("ID");
b.HasIndex("CostItemID");
b.ToTable("Products");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.CostItem", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Employee", "Employee")
.WithMany()
.HasForeignKey("EmployeeID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Employee");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.MessageInfo", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Client", "Client")
.WithMany()
.HasForeignKey("ClientID");
b.Navigation("Client");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Order", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Client", null)
.WithMany("Orders")
.HasForeignKey("ClientID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.OrderProduct", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Order", "_order")
.WithMany("Products")
.HasForeignKey("ProductID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ElectronicsShopDataBaseImplement.Models.Product", "_product")
.WithMany()
.HasForeignKey("_productID");
b.Navigation("_order");
b.Navigation("_product");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Paymeant", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Order", null)
.WithMany("Payments")
.HasForeignKey("PaymentID");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Product", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.CostItem", "CostItem")
.WithMany()
.HasForeignKey("CostItemID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("CostItem");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Client", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Order", b =>
{
b.Navigation("Payments");
b.Navigation("Products");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,48 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ElectronicsShopDataBaseImplement.Migrations
{
/// <inheritdoc />
public partial class AddMessages : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Messages",
columns: table => new
{
MessageID = table.Column<string>(type: "nvarchar(450)", nullable: false),
ClientID = table.Column<int>(type: "int", nullable: true),
SenderName = table.Column<string>(type: "nvarchar(max)", nullable: false),
DateDelivery = table.Column<DateTime>(type: "datetime2", nullable: false),
Subject = table.Column<string>(type: "nvarchar(max)", nullable: false),
Body = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Messages", x => x.MessageID);
table.ForeignKey(
name: "FK_Messages_Clients_ClientID",
column: x => x.ClientID,
principalTable: "Clients",
principalColumn: "ID");
});
migrationBuilder.CreateIndex(
name: "IX_Messages_ClientID",
table: "Messages",
column: "ClientID");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Messages");
}
}
}

View File

@ -100,6 +100,36 @@ namespace ElectronicsShopDataBaseImplement.Migrations
b.ToTable("Employees");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.MessageInfo", b =>
{
b.Property<string>("MessageID")
.HasColumnType("nvarchar(450)");
b.Property<string>("Body")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int?>("ClientID")
.HasColumnType("int");
b.Property<DateTime>("DateDelivery")
.HasColumnType("datetime2");
b.Property<string>("SenderName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Subject")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("MessageID");
b.HasIndex("ClientID");
b.ToTable("Messages");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Order", b =>
{
b.Property<int>("ID")
@ -219,6 +249,15 @@ namespace ElectronicsShopDataBaseImplement.Migrations
b.Navigation("Employee");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.MessageInfo", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Client", "Client")
.WithMany()
.HasForeignKey("ClientID");
b.Navigation("Client");
});
modelBuilder.Entity("ElectronicsShopDataBaseImplement.Models.Order", b =>
{
b.HasOne("ElectronicsShopDataBaseImplement.Models.Client", null)

View File

@ -0,0 +1,58 @@
using ElectronicsShopContracts.BindingModels;
using ElectronicsShopContracts.ViewModels;
using ElectronicsShopDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ElectronicsShopDataBaseImplement.Models
{
public class MessageInfo : IMessageInfoModel
{
[Key]
public string MessageID { get; private set; } = string.Empty;
public int? ClientID { get; private set; }
public string SenderName { get; private set; } = string.Empty;
public DateTime DateDelivery { get; private set; } = DateTime.Now;
public string Subject { get; private set; } = string.Empty;
public string Body { get; private set; } = string.Empty;
public Client? Client { get; private set; }
public static MessageInfo? Create(MessageInfoBindingModel model)
{
if (model == null)
{
return null;
}
return new()
{
Body = model.Body,
Subject = model.Subject,
ClientID = model.ClientID,
MessageID = model.MessageID,
SenderName = model.SenderName,
DateDelivery = model.DateDelivery,
};
}
public MessageInfoViewModel GetViewModel => new()
{
Body = Body,
Subject = Subject,
ClientID = ClientID,
MessageID = MessageID,
SenderName = SenderName,
DateDelivery = DateDelivery,
};
}
}

View File

@ -14,6 +14,7 @@ namespace ElectronicsShopRestAPI.Controllers {
private readonly ILogger _logger;
private readonly IProductLogic _product;
private readonly IOrderLogic _order;
private readonly IMessageInfoLogic _message;
public MainController(ILogger<MainController> logger, IProductLogic product,
@ -55,7 +56,7 @@ namespace ElectronicsShopRestAPI.Controllers {
{
return _order.ReadList(new OrderSearchModel
{
ID = _clientID
ClientID = _clientID
});
}
catch (Exception ex)
@ -98,7 +99,7 @@ namespace ElectronicsShopRestAPI.Controllers {
}
[HttpPost]
[HttpGet]
public void AddProduct(OrderBindingModel model)
{
try
@ -116,5 +117,21 @@ namespace ElectronicsShopRestAPI.Controllers {
throw;
}
}
[HttpGet]
public List<MessageInfoViewModel>? GetMessages(int _clientID)
{
try
{
return _message?.ReadList(new MessageInfoSearchModel
{
ClientID = _clientID
});
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка заказов клиента id = {Id} ", _clientID);
throw;
}
}
}
}

View File

@ -5,5 +5,11 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"SmtpClientHost": "smtp.gmail.com",
"SmtpClientPort": "587",
"PopHost": "pop.gmail.com",
"PopPort": "995",
"MailLogin": "electronicsshop437@gmail.com",
"MailPassword": "ntlt xijz ckup zglg"
}

View File

@ -12,11 +12,9 @@ using System.Runtime.Serialization;
namespace ElectronicsShopUserApp.Controllers {
public class HomeController : Controller {
private readonly ILogger<HomeController> _logger;
//private readonly IOrderLogic _order;
public HomeController(ILogger<HomeController> logger/*, IOrderLogic orderLogic*/) {
public HomeController(ILogger<HomeController> logger) {
_logger = logger;
//_order = orderLogic;
}
public IActionResult Index() {
@ -151,5 +149,11 @@ namespace ElectronicsShopUserApp.Controllers {
Response.Redirect("CreateOrder");
}
[HttpGet]
public IActionResult Message()
{
ViewBag.Massages = APIClient.GetRequset<List<MessageInfoViewModel>>("api/main/getmessages");
return View();
}
}
}

View File

@ -0,0 +1,49 @@
@using ElectronicsShopContracts.ViewModels
@model List<MessageInfoViewModel>
@{
ViewData["Title"] = "Message";
}
<div class="text-center">
<h1 class="display-4">Отчёты</h1>
<a asp-action="CreateProduct">Создать товар</a>
</div>
<div class="text-center">
@{
<table class="table">
<thead>
<tr>
<th>
Заголовок
</th>
<th>
Тело письма
</th>
<th>
Дата письма
</th>
</tr>
</thead>
<tbody>
@if (Model != null)
{
@foreach (var item in Model)
{
<th>
<th>
@Html.DisplayFor(modelItem => item.Subject)
</th>
<th>
@Html.DisplayFor(modelItem => item.Body)
</th>
<th>
@Html.DisplayFor(modelItem => item.DateDelivery)
</th>
</th>
}
}
</tbody>
</table>
}
</div>

View File

@ -37,6 +37,9 @@
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="AddProduct">Каталог</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Message">Отчёты</a>
</li>
</ul>
</div>
</div>