Browse Source

Добавлен API

Ahatov Artur 7 months ago
parent
commit
98b6b5e1de
28 changed files with 1434 additions and 0 deletions
  1. 6 0
      src/DontHarm.sln
  2. 73 0
      src/DontHarmWebApi/Controllers/ClientsController.cs
  3. 44 0
      src/DontHarmWebApi/Controllers/EmployeeServicesController.cs
  4. 34 0
      src/DontHarmWebApi/Controllers/ServicesController.cs
  5. 28 0
      src/DontHarmWebApi/DontHarmWebApi.csproj
  6. 15 0
      src/DontHarmWebApi/DontHarmWebApi.csproj.user
  7. 36 0
      src/DontHarmWebApi/Entities/Client.cs
  8. 15 0
      src/DontHarmWebApi/Entities/EmployeeService.cs
  9. 17 0
      src/DontHarmWebApi/Entities/Invoice.cs
  10. 14 0
      src/DontHarmWebApi/Entities/LoginAttempt.cs
  11. 23 0
      src/DontHarmWebApi/Entities/Order.cs
  12. 20 0
      src/DontHarmWebApi/Entities/OrderService.cs
  13. 18 0
      src/DontHarmWebApi/Entities/Role.cs
  14. 23 0
      src/DontHarmWebApi/Entities/Service.cs
  15. 28 0
      src/DontHarmWebApi/Entities/User.cs
  16. 18 0
      src/DontHarmWebApi/Entities/Utilizer.cs
  17. 332 0
      src/DontHarmWebApi/Entities/user12Context.cs
  18. 37 0
      src/DontHarmWebApi/Program.cs
  19. 29 0
      src/DontHarmWebApi/Properties/launchSettings.json
  20. 113 0
      src/DontHarmWebApi/Views/Clients/Create.cshtml
  21. 123 0
      src/DontHarmWebApi/Views/Clients/Delete.cshtml
  22. 120 0
      src/DontHarmWebApi/Views/Clients/Details.cshtml
  23. 114 0
      src/DontHarmWebApi/Views/Clients/Edit.cshtml
  24. 131 0
      src/DontHarmWebApi/Views/Clients/Index.cshtml
  25. 2 0
      src/DontHarmWebApi/Views/Shared/_ValidationScriptsPartial.cshtml
  26. 8 0
      src/DontHarmWebApi/appsettings.Development.json
  27. 12 0
      src/DontHarmWebApi/appsettings.json
  28. 1 0
      tools/scaffold_example.txt

+ 6 - 0
src/DontHarm.sln

@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DontHarmDesktop", "DontHarm
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DontHarmImport", "DontHarmImport\DontHarmImport.csproj", "{1D8B065B-16BC-45A8-BBC5-907DFC9E9FBA}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DontHarmWebApi", "DontHarmWebApi\DontHarmWebApi.csproj", "{EB31F186-5271-414E-982B-2BA76F824339}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -21,6 +23,10 @@ Global
 		{1D8B065B-16BC-45A8-BBC5-907DFC9E9FBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{1D8B065B-16BC-45A8-BBC5-907DFC9E9FBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{1D8B065B-16BC-45A8-BBC5-907DFC9E9FBA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EB31F186-5271-414E-982B-2BA76F824339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EB31F186-5271-414E-982B-2BA76F824339}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EB31F186-5271-414E-982B-2BA76F824339}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EB31F186-5271-414E-982B-2BA76F824339}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 73 - 0
src/DontHarmWebApi/Controllers/ClientsController.cs

@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.EntityFrameworkCore;
+using DontHarmWebApi.Entities;
+
+namespace DontHarmWebApi.Controllers
+{
+    public class ClientsController : Controller
+    {
+        private readonly user12Context _context;
+
+        public ClientsController(user12Context context)
+        {
+            _context = context;
+        }
+
+        // GET: /Clients/Index
+        // Возвращает список всех клиентов
+        public async Task<IActionResult> Index()
+        {
+            if (_context.Clients == null)
+            {
+                return Problem("Entity set 'user12Context.Clients'  is null.");
+            }
+            return Json(await _context.Clients.ToListAsync());
+                          
+        }
+
+        // GET: /Clients/Index/<int>
+        // Возвращает детали клиента по его id
+        public async Task<IActionResult> Details(int? id)
+        {
+            if (id == null || _context.Clients == null)
+            {
+                return NotFound();
+            }
+
+            var client = await _context.Clients.FirstOrDefaultAsync(m => m.Id == id);
+            if (client == null)
+            {
+                return NotFound();
+            }
+
+            return Json(client);
+        }
+
+        // GET: Clients/Create
+        public IActionResult Create()
+        {
+            return View();
+        }
+
+        // POST: Clients/Create
+        // To protect from overposting attacks, enable the specific properties you want to bind to.
+        // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<IActionResult> Create([Bind("Id,Type,Login,Password,Surname,Name,Patronymic,Birthdate,PassportSeries,PassportNumber,Phone,Email,CompanyName,CompanyAddress,Inn,Account,Bik,Hidden")] Client client)
+        {
+            if (ModelState.IsValid)
+            {
+                _context.Add(client);
+                await _context.SaveChangesAsync();
+                return RedirectToAction(nameof(Index));
+            }
+            return Json(client);
+        }
+    }
+}

+ 44 - 0
src/DontHarmWebApi/Controllers/EmployeeServicesController.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.EntityFrameworkCore;
+using DontHarmWebApi.Entities;
+
+namespace DontHarmWebApi.Controllers
+{
+    public class EmployeeServicesController : Controller
+    {
+        private readonly user12Context _context;
+
+        public EmployeeServicesController(user12Context context)
+        {
+            _context = context;
+        }
+
+        // GET: ListByUserId/<int>
+        // Возвращает все услуги, предоставляемые сотрудником
+        public async Task<IActionResult> ListByUserId(int? id)
+        {
+            if (id == null || _context.EmployeeServices == null)
+            {
+                return NotFound();
+            }
+            var user12Context = _context.EmployeeServices.Where(e => e.UserId == id);
+            var services = await user12Context.ToListAsync();
+
+            var list = new List<object>();
+            foreach (var empService in services)
+            {
+                list.Add(new {
+                    id = empService.Id,
+                    serviceId = empService.ServiceId,
+                    employeeId = empService.UserId
+                });
+            }
+            return Json(list);
+        }
+    }
+}

+ 34 - 0
src/DontHarmWebApi/Controllers/ServicesController.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.EntityFrameworkCore;
+using DontHarmWebApi.Entities;
+
+namespace DontHarmWebApi.Controllers
+{
+    public class ServicesController : Controller
+    {
+        private readonly user12Context _context;
+
+        public ServicesController(user12Context context)
+        {
+            _context = context;
+        }
+
+        // Get: Services/Create?<...>
+        [HttpGet]
+        public async Task<IActionResult> Create([Bind("Name,Price,Code")] Service service)
+        {
+            if (ModelState.IsValid)
+            {
+                _context.Add(service);
+                await _context.SaveChangesAsync();
+                return Json(service);
+            }
+            return BadRequest();
+        }
+    }
+}

+ 28 - 0
src/DontHarmWebApi/DontHarmWebApi.csproj

@@ -0,0 +1,28 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.36">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.36" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.35">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.18" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Folder Include="Entities\" />
+  </ItemGroup>
+
+</Project>

+ 15 - 0
src/DontHarmWebApi/DontHarmWebApi.csproj.user

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Controller_SelectedScaffolderID>MvcControllerWithContextScaffolder</Controller_SelectedScaffolderID>
+    <Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
+    <WebStackScaffolding_ControllerDialogWidth>650</WebStackScaffolding_ControllerDialogWidth>
+    <WebStackScaffolding_IsLayoutPageSelected>True</WebStackScaffolding_IsLayoutPageSelected>
+    <WebStackScaffolding_IsPartialViewSelected>False</WebStackScaffolding_IsPartialViewSelected>
+    <WebStackScaffolding_IsReferencingScriptLibrariesSelected>True</WebStackScaffolding_IsReferencingScriptLibrariesSelected>
+    <WebStackScaffolding_LayoutPageFile />
+    <WebStackScaffolding_DbContextTypeFullName>DontHarmWebApi.Entities.user12Context</WebStackScaffolding_DbContextTypeFullName>
+    <WebStackScaffolding_IsAsyncSelected>False</WebStackScaffolding_IsAsyncSelected>
+    <WebStackScaffolding_IsViewGenerationSelected>False</WebStackScaffolding_IsViewGenerationSelected>
+  </PropertyGroup>
+</Project>

+ 36 - 0
src/DontHarmWebApi/Entities/Client.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Client
+    {
+        public Client()
+        {
+            Invoices = new HashSet<Invoice>();
+            Orders = new HashSet<Order>();
+        }
+
+        public int Id { get; set; }
+        public int Type { get; set; }
+        public string Login { get; set; } = null!;
+        public string Password { get; set; } = null!;
+        public string? Surname { get; set; }
+        public string? Name { get; set; }
+        public string? Patronymic { get; set; }
+        public DateTime? Birthdate { get; set; }
+        public int? PassportSeries { get; set; }
+        public int? PassportNumber { get; set; }
+        public string Phone { get; set; } = null!;
+        public string Email { get; set; } = null!;
+        public string? CompanyName { get; set; }
+        public string? CompanyAddress { get; set; }
+        public int Inn { get; set; }
+        public int Account { get; set; }
+        public int Bik { get; set; }
+        public bool Hidden { get; set; }
+
+        public virtual ICollection<Invoice> Invoices { get; set; }
+        public virtual ICollection<Order> Orders { get; set; }
+    }
+}

+ 15 - 0
src/DontHarmWebApi/Entities/EmployeeService.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class EmployeeService
+    {
+        public int Id { get; set; }
+        public int ServiceId { get; set; }
+        public int UserId { get; set; }
+
+        public virtual Service Service { get; set; } = null!;
+        public virtual User User { get; set; } = null!;
+    }
+}

+ 17 - 0
src/DontHarmWebApi/Entities/Invoice.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Invoice
+    {
+        public int Id { get; set; }
+        public int ClientId { get; set; }
+        public int AccountantId { get; set; }
+        public int OrderId { get; set; }
+
+        public virtual User Accountant { get; set; } = null!;
+        public virtual Client Client { get; set; } = null!;
+        public virtual Order Order { get; set; } = null!;
+    }
+}

+ 14 - 0
src/DontHarmWebApi/Entities/LoginAttempt.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class LoginAttempt
+    {
+        public int Id { get; set; }
+        public byte Successfull { get; set; }
+        public string Login { get; set; } = null!;
+        public string IpAddress { get; set; } = null!;
+        public DateTime CreatedAt { get; set; }
+    }
+}

+ 23 - 0
src/DontHarmWebApi/Entities/Order.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Order
+    {
+        public Order()
+        {
+            Invoices = new HashSet<Invoice>();
+            OrderServices = new HashSet<OrderService>();
+        }
+
+        public int Id { get; set; }
+        public DateTime CreatedAt { get; set; }
+        public int ClientId { get; set; }
+        public bool Hidden { get; set; }
+
+        public virtual Client Client { get; set; } = null!;
+        public virtual ICollection<Invoice> Invoices { get; set; }
+        public virtual ICollection<OrderService> OrderServices { get; set; }
+    }
+}

+ 20 - 0
src/DontHarmWebApi/Entities/OrderService.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class OrderService
+    {
+        public int Id { get; set; }
+        public int ServiceId { get; set; }
+        public int OrderId { get; set; }
+        public short Status { get; set; }
+        public int? UtilizerId { get; set; }
+        public DateTime? StartedAt { get; set; }
+        public DateTime? FinishedAt { get; set; }
+
+        public virtual Order Order { get; set; } = null!;
+        public virtual Service Service { get; set; } = null!;
+        public virtual Utilizer? Utilizer { get; set; }
+    }
+}

+ 18 - 0
src/DontHarmWebApi/Entities/Role.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Role
+    {
+        public Role()
+        {
+            Users = new HashSet<User>();
+        }
+
+        public int Id { get; set; }
+        public string Name { get; set; } = null!;
+
+        public virtual ICollection<User> Users { get; set; }
+    }
+}

+ 23 - 0
src/DontHarmWebApi/Entities/Service.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Service
+    {
+        public Service()
+        {
+            EmployeeServices = new HashSet<EmployeeService>();
+            OrderServices = new HashSet<OrderService>();
+        }
+
+        public int Id { get; set; }
+        public string Name { get; set; } = null!;
+        public decimal Price { get; set; }
+        public string Code { get; set; } = null!;
+        public bool Hidden { get; set; }
+
+        public virtual ICollection<EmployeeService> EmployeeServices { get; set; }
+        public virtual ICollection<OrderService> OrderServices { get; set; }
+    }
+}

+ 28 - 0
src/DontHarmWebApi/Entities/User.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class User
+    {
+        public User()
+        {
+            EmployeeServices = new HashSet<EmployeeService>();
+            Invoices = new HashSet<Invoice>();
+        }
+
+        public int Id { get; set; }
+        public int Role { get; set; }
+        public string Login { get; set; } = null!;
+        public string Password { get; set; } = null!;
+        public bool Hidden { get; set; }
+        public string Surname { get; set; } = null!;
+        public string Name { get; set; } = null!;
+        public string? Patronymic { get; set; }
+        public string? ImagePath { get; set; }
+
+        public virtual Role RoleNavigation { get; set; } = null!;
+        public virtual ICollection<EmployeeService> EmployeeServices { get; set; }
+        public virtual ICollection<Invoice> Invoices { get; set; }
+    }
+}

+ 18 - 0
src/DontHarmWebApi/Entities/Utilizer.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class Utilizer
+    {
+        public Utilizer()
+        {
+            OrderServices = new HashSet<OrderService>();
+        }
+
+        public int Id { get; set; }
+        public string Name { get; set; } = null!;
+
+        public virtual ICollection<OrderService> OrderServices { get; set; }
+    }
+}

+ 332 - 0
src/DontHarmWebApi/Entities/user12Context.cs

@@ -0,0 +1,332 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata;
+
+namespace DontHarmWebApi.Entities
+{
+    public partial class user12Context : DbContext
+    {
+        public user12Context()
+        {
+        }
+
+        public user12Context(DbContextOptions<user12Context> options)
+            : base(options)
+        {
+        }
+
+        public virtual DbSet<Client> Clients { get; set; } = null!;
+        public virtual DbSet<EmployeeService> EmployeeServices { get; set; } = null!;
+        public virtual DbSet<Invoice> Invoices { get; set; } = null!;
+        public virtual DbSet<LoginAttempt> LoginAttempts { get; set; } = null!;
+        public virtual DbSet<Order> Orders { get; set; } = null!;
+        public virtual DbSet<OrderService> OrderServices { get; set; } = null!;
+        public virtual DbSet<Role> Roles { get; set; } = null!;
+        public virtual DbSet<Service> Services { get; set; } = null!;
+        public virtual DbSet<User> Users { get; set; } = null!;
+        public virtual DbSet<Utilizer> Utilizers { get; set; } = null!;
+
+        protected override void OnModelCreating(ModelBuilder modelBuilder)
+        {
+            modelBuilder.Entity<Client>(entity =>
+            {
+                entity.ToTable("clients");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.Account).HasColumnName("account");
+
+                entity.Property(e => e.Bik).HasColumnName("bik");
+
+                entity.Property(e => e.Birthdate)
+                    .HasColumnType("date")
+                    .HasColumnName("birthdate");
+
+                entity.Property(e => e.CompanyAddress)
+                    .HasMaxLength(100)
+                    .IsUnicode(false)
+                    .HasColumnName("company_address");
+
+                entity.Property(e => e.CompanyName)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("company_name");
+
+                entity.Property(e => e.Email)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("email");
+
+                entity.Property(e => e.Hidden).HasColumnName("hidden");
+
+                entity.Property(e => e.Inn).HasColumnName("inn");
+
+                entity.Property(e => e.Login)
+                    .HasMaxLength(50)
+                    .HasColumnName("login");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(50)
+                    .HasColumnName("name");
+
+                entity.Property(e => e.PassportNumber).HasColumnName("passport_number");
+
+                entity.Property(e => e.PassportSeries).HasColumnName("passport_series");
+
+                entity.Property(e => e.Password)
+                    .HasMaxLength(64)
+                    .IsUnicode(false)
+                    .HasColumnName("password")
+                    .IsFixedLength();
+
+                entity.Property(e => e.Patronymic)
+                    .HasMaxLength(50)
+                    .HasColumnName("patronymic");
+
+                entity.Property(e => e.Phone)
+                    .HasMaxLength(16)
+                    .IsUnicode(false)
+                    .HasColumnName("phone")
+                    .IsFixedLength();
+
+                entity.Property(e => e.Surname)
+                    .HasMaxLength(50)
+                    .HasColumnName("surname");
+
+                entity.Property(e => e.Type).HasColumnName("type");
+            });
+
+            modelBuilder.Entity<EmployeeService>(entity =>
+            {
+                entity.ToTable("employee_services");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.ServiceId).HasColumnName("service_id");
+
+                entity.Property(e => e.UserId).HasColumnName("user_id");
+
+                entity.HasOne(d => d.Service)
+                    .WithMany(p => p.EmployeeServices)
+                    .HasForeignKey(d => d.ServiceId)
+                    .HasConstraintName("FK_employee_services_services");
+
+                entity.HasOne(d => d.User)
+                    .WithMany(p => p.EmployeeServices)
+                    .HasForeignKey(d => d.UserId)
+                    .OnDelete(DeleteBehavior.ClientSetNull)
+                    .HasConstraintName("FK_employee_services_users");
+            });
+
+            modelBuilder.Entity<Invoice>(entity =>
+            {
+                entity.ToTable("invoices");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.AccountantId).HasColumnName("accountant_id");
+
+                entity.Property(e => e.ClientId).HasColumnName("client_id");
+
+                entity.Property(e => e.OrderId).HasColumnName("order_id");
+
+                entity.HasOne(d => d.Accountant)
+                    .WithMany(p => p.Invoices)
+                    .HasForeignKey(d => d.AccountantId)
+                    .HasConstraintName("FK_invoices_users");
+
+                entity.HasOne(d => d.Client)
+                    .WithMany(p => p.Invoices)
+                    .HasForeignKey(d => d.ClientId)
+                    .HasConstraintName("FK_invoices_clients");
+
+                entity.HasOne(d => d.Order)
+                    .WithMany(p => p.Invoices)
+                    .HasForeignKey(d => d.OrderId)
+                    .OnDelete(DeleteBehavior.ClientSetNull)
+                    .HasConstraintName("FK_invoices_orders");
+            });
+
+            modelBuilder.Entity<LoginAttempt>(entity =>
+            {
+                entity.ToTable("login_attempts");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.CreatedAt).HasColumnName("created_at");
+
+                entity.Property(e => e.IpAddress)
+                    .HasMaxLength(32)
+                    .IsUnicode(false)
+                    .HasColumnName("ip_address");
+
+                entity.Property(e => e.Login)
+                    .HasMaxLength(150)
+                    .IsUnicode(false)
+                    .HasColumnName("login")
+                    .HasDefaultValueSql("(getdate())");
+
+                entity.Property(e => e.Successfull).HasColumnName("successfull");
+            });
+
+            modelBuilder.Entity<Order>(entity =>
+            {
+                entity.ToTable("orders");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.ClientId).HasColumnName("client_id");
+
+                entity.Property(e => e.CreatedAt)
+                    .HasColumnType("datetime")
+                    .HasColumnName("created_at")
+                    .HasDefaultValueSql("(getdate())");
+
+                entity.Property(e => e.Hidden).HasColumnName("hidden");
+
+                entity.HasOne(d => d.Client)
+                    .WithMany(p => p.Orders)
+                    .HasForeignKey(d => d.ClientId)
+                    .HasConstraintName("FK_orders_clients");
+            });
+
+            modelBuilder.Entity<OrderService>(entity =>
+            {
+                entity.ToTable("order_services");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.FinishedAt)
+                    .HasColumnType("datetime")
+                    .HasColumnName("finished_at");
+
+                entity.Property(e => e.OrderId).HasColumnName("order_id");
+
+                entity.Property(e => e.ServiceId).HasColumnName("service_id");
+
+                entity.Property(e => e.StartedAt)
+                    .HasColumnType("datetime")
+                    .HasColumnName("started_at");
+
+                entity.Property(e => e.Status).HasColumnName("status");
+
+                entity.Property(e => e.UtilizerId).HasColumnName("utilizer_id");
+
+                entity.HasOne(d => d.Order)
+                    .WithMany(p => p.OrderServices)
+                    .HasForeignKey(d => d.OrderId)
+                    .HasConstraintName("FK_order_services_orders");
+
+                entity.HasOne(d => d.Service)
+                    .WithMany(p => p.OrderServices)
+                    .HasForeignKey(d => d.ServiceId)
+                    .HasConstraintName("FK_order_services_services");
+
+                entity.HasOne(d => d.Utilizer)
+                    .WithMany(p => p.OrderServices)
+                    .HasForeignKey(d => d.UtilizerId)
+                    .OnDelete(DeleteBehavior.Cascade)
+                    .HasConstraintName("FK_order_services_utilizers");
+            });
+
+            modelBuilder.Entity<Role>(entity =>
+            {
+                entity.ToTable("roles");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("name");
+            });
+
+            modelBuilder.Entity<Service>(entity =>
+            {
+                entity.ToTable("services");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.Code)
+                    .HasMaxLength(10)
+                    .IsUnicode(false)
+                    .HasColumnName("code");
+
+                entity.Property(e => e.Hidden).HasColumnName("hidden");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(100)
+                    .IsUnicode(false)
+                    .HasColumnName("name");
+
+                entity.Property(e => e.Price)
+                    .HasColumnType("money")
+                    .HasColumnName("price");
+            });
+
+            modelBuilder.Entity<User>(entity =>
+            {
+                entity.ToTable("users");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.Hidden).HasColumnName("hidden");
+
+                entity.Property(e => e.ImagePath)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("image_path");
+
+                entity.Property(e => e.Login)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("login");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("name");
+
+                entity.Property(e => e.Password)
+                    .HasMaxLength(64)
+                    .IsUnicode(false)
+                    .HasColumnName("password");
+
+                entity.Property(e => e.Patronymic)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("patronymic");
+
+                entity.Property(e => e.Role).HasColumnName("role");
+
+                entity.Property(e => e.Surname)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("surname");
+
+                entity.HasOne(d => d.RoleNavigation)
+                    .WithMany(p => p.Users)
+                    .HasForeignKey(d => d.Role)
+                    .OnDelete(DeleteBehavior.ClientSetNull)
+                    .HasConstraintName("FK_users_roles");
+            });
+
+            modelBuilder.Entity<Utilizer>(entity =>
+            {
+                entity.ToTable("utilizers");
+
+                entity.Property(e => e.Id).HasColumnName("id");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(50)
+                    .IsUnicode(false)
+                    .HasColumnName("name");
+            });
+
+            OnModelCreatingPartial(modelBuilder);
+        }
+
+        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
+    }
+}

+ 37 - 0
src/DontHarmWebApi/Program.cs

@@ -0,0 +1,37 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace DontHarmWebApi
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            var builder = WebApplication.CreateBuilder(args);
+
+            builder.Services.AddControllers();
+            builder.Services.AddEndpointsApiExplorer();
+            builder.Services.AddSwaggerGen();
+            builder.Services.AddControllersWithViews();
+
+            // Ïîäêëþ÷åíèå EF
+            // https://metanit.com/sharp/aspnet6/12.1.php
+            string connection = builder.Configuration.GetConnectionString("vpmt");
+            builder.Services.AddDbContext<Entities.user12Context>(options => options.UseSqlServer(connection));
+
+            var app = builder.Build();
+
+            if (app.Environment.IsDevelopment())
+            {
+                app.UseSwagger();
+                app.UseSwaggerUI();
+            }
+
+            app.UseAuthorization();
+            app.MapControllerRoute(
+                name: "default",
+                pattern: "{controller=Home}/{action=Index}/{id?}");
+
+            app.Run();
+        }
+    }
+}

+ 29 - 0
src/DontHarmWebApi/Properties/launchSettings.json

@@ -0,0 +1,29 @@
+{
+  "profiles": {
+    "DontHarmWebApi": {
+      "commandName": "Project",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "dotnetRunMessages": true,
+      "applicationUrl": "http://localhost:5224"
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  },
+  "$schema": "https://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:42463",
+      "sslPort": 0
+    }
+  }
+}

+ 113 - 0
src/DontHarmWebApi/Views/Clients/Create.cshtml

@@ -0,0 +1,113 @@
+@model DontHarmWebApi.Entities.Client
+
+@{
+    ViewData["Title"] = "Create";
+}
+
+<h1>Create</h1>
+
+<h4>Client</h4>
+<hr />
+<div class="row">
+    <div class="col-md-4">
+        <form asp-action="Create">
+            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="Type" class="control-label"></label>
+                <input asp-for="Type" class="form-control" />
+                <span asp-validation-for="Type" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Login" class="control-label"></label>
+                <input asp-for="Login" class="form-control" />
+                <span asp-validation-for="Login" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Password" class="control-label"></label>
+                <input asp-for="Password" class="form-control" />
+                <span asp-validation-for="Password" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Surname" class="control-label"></label>
+                <input asp-for="Surname" class="form-control" />
+                <span asp-validation-for="Surname" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Name" class="control-label"></label>
+                <input asp-for="Name" class="form-control" />
+                <span asp-validation-for="Name" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Patronymic" class="control-label"></label>
+                <input asp-for="Patronymic" class="form-control" />
+                <span asp-validation-for="Patronymic" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Birthdate" class="control-label"></label>
+                <input asp-for="Birthdate" class="form-control" />
+                <span asp-validation-for="Birthdate" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="PassportSeries" class="control-label"></label>
+                <input asp-for="PassportSeries" class="form-control" />
+                <span asp-validation-for="PassportSeries" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="PassportNumber" class="control-label"></label>
+                <input asp-for="PassportNumber" class="form-control" />
+                <span asp-validation-for="PassportNumber" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Phone" class="control-label"></label>
+                <input asp-for="Phone" class="form-control" />
+                <span asp-validation-for="Phone" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Email" class="control-label"></label>
+                <input asp-for="Email" class="form-control" />
+                <span asp-validation-for="Email" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="CompanyName" class="control-label"></label>
+                <input asp-for="CompanyName" class="form-control" />
+                <span asp-validation-for="CompanyName" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="CompanyAddress" class="control-label"></label>
+                <input asp-for="CompanyAddress" class="form-control" />
+                <span asp-validation-for="CompanyAddress" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Inn" class="control-label"></label>
+                <input asp-for="Inn" class="form-control" />
+                <span asp-validation-for="Inn" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Account" class="control-label"></label>
+                <input asp-for="Account" class="form-control" />
+                <span asp-validation-for="Account" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Bik" class="control-label"></label>
+                <input asp-for="Bik" class="form-control" />
+                <span asp-validation-for="Bik" class="text-danger"></span>
+            </div>
+            <div class="form-group form-check">
+                <label class="form-check-label">
+                    <input class="form-check-input" asp-for="Hidden" /> @Html.DisplayNameFor(model => model.Hidden)
+                </label>
+            </div>
+            <div class="form-group">
+                <input type="submit" value="Create" class="btn btn-primary" />
+            </div>
+        </form>
+    </div>
+</div>
+
+<div>
+    <a asp-action="Index">Back to List</a>
+</div>
+
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
+}

+ 123 - 0
src/DontHarmWebApi/Views/Clients/Delete.cshtml

@@ -0,0 +1,123 @@
+@model DontHarmWebApi.Entities.Client
+
+@{
+    ViewData["Title"] = "Delete";
+}
+
+<h1>Delete</h1>
+
+<h3>Are you sure you want to delete this?</h3>
+<div>
+    <h4>Client</h4>
+    <hr />
+    <dl class="row">
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Type)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Type)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Login)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Login)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Password)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Password)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Surname)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Surname)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Name)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Name)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Patronymic)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Patronymic)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Birthdate)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Birthdate)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.PassportSeries)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.PassportSeries)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.PassportNumber)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.PassportNumber)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Phone)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Phone)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Email)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Email)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.CompanyName)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.CompanyName)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.CompanyAddress)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.CompanyAddress)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Inn)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Inn)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Account)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Account)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Bik)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Bik)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Hidden)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Hidden)
+        </dd>
+    </dl>
+    
+    <form asp-action="Delete">
+        <input type="hidden" asp-for="Id" />
+        <input type="submit" value="Delete" class="btn btn-danger" /> |
+        <a asp-action="Index">Back to List</a>
+    </form>
+</div>

+ 120 - 0
src/DontHarmWebApi/Views/Clients/Details.cshtml

@@ -0,0 +1,120 @@
+@model DontHarmWebApi.Entities.Client
+
+@{
+    ViewData["Title"] = "Details";
+}
+
+<h1>Details</h1>
+
+<div>
+    <h4>Client</h4>
+    <hr />
+    <dl class="row">
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Type)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Type)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Login)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Login)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Password)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Password)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Surname)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Surname)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Name)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Name)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Patronymic)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Patronymic)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Birthdate)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Birthdate)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.PassportSeries)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.PassportSeries)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.PassportNumber)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.PassportNumber)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Phone)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Phone)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Email)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Email)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.CompanyName)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.CompanyName)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.CompanyAddress)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.CompanyAddress)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Inn)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Inn)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Account)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Account)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Bik)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Bik)
+        </dd>
+        <dt class = "col-sm-2">
+            @Html.DisplayNameFor(model => model.Hidden)
+        </dt>
+        <dd class = "col-sm-10">
+            @Html.DisplayFor(model => model.Hidden)
+        </dd>
+    </dl>
+</div>
+<div>
+    <a asp-action="Edit" asp-route-id="@Model?.Id">Edit</a> |
+    <a asp-action="Index">Back to List</a>
+</div>

+ 114 - 0
src/DontHarmWebApi/Views/Clients/Edit.cshtml

@@ -0,0 +1,114 @@
+@model DontHarmWebApi.Entities.Client
+
+@{
+    ViewData["Title"] = "Edit";
+}
+
+<h1>Edit</h1>
+
+<h4>Client</h4>
+<hr />
+<div class="row">
+    <div class="col-md-4">
+        <form asp-action="Edit">
+            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
+            <input type="hidden" asp-for="Id" />
+            <div class="form-group">
+                <label asp-for="Type" class="control-label"></label>
+                <input asp-for="Type" class="form-control" />
+                <span asp-validation-for="Type" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Login" class="control-label"></label>
+                <input asp-for="Login" class="form-control" />
+                <span asp-validation-for="Login" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Password" class="control-label"></label>
+                <input asp-for="Password" class="form-control" />
+                <span asp-validation-for="Password" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Surname" class="control-label"></label>
+                <input asp-for="Surname" class="form-control" />
+                <span asp-validation-for="Surname" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Name" class="control-label"></label>
+                <input asp-for="Name" class="form-control" />
+                <span asp-validation-for="Name" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Patronymic" class="control-label"></label>
+                <input asp-for="Patronymic" class="form-control" />
+                <span asp-validation-for="Patronymic" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Birthdate" class="control-label"></label>
+                <input asp-for="Birthdate" class="form-control" />
+                <span asp-validation-for="Birthdate" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="PassportSeries" class="control-label"></label>
+                <input asp-for="PassportSeries" class="form-control" />
+                <span asp-validation-for="PassportSeries" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="PassportNumber" class="control-label"></label>
+                <input asp-for="PassportNumber" class="form-control" />
+                <span asp-validation-for="PassportNumber" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Phone" class="control-label"></label>
+                <input asp-for="Phone" class="form-control" />
+                <span asp-validation-for="Phone" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Email" class="control-label"></label>
+                <input asp-for="Email" class="form-control" />
+                <span asp-validation-for="Email" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="CompanyName" class="control-label"></label>
+                <input asp-for="CompanyName" class="form-control" />
+                <span asp-validation-for="CompanyName" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="CompanyAddress" class="control-label"></label>
+                <input asp-for="CompanyAddress" class="form-control" />
+                <span asp-validation-for="CompanyAddress" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Inn" class="control-label"></label>
+                <input asp-for="Inn" class="form-control" />
+                <span asp-validation-for="Inn" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Account" class="control-label"></label>
+                <input asp-for="Account" class="form-control" />
+                <span asp-validation-for="Account" class="text-danger"></span>
+            </div>
+            <div class="form-group">
+                <label asp-for="Bik" class="control-label"></label>
+                <input asp-for="Bik" class="form-control" />
+                <span asp-validation-for="Bik" class="text-danger"></span>
+            </div>
+            <div class="form-group form-check">
+                <label class="form-check-label">
+                    <input class="form-check-input" asp-for="Hidden" /> @Html.DisplayNameFor(model => model.Hidden)
+                </label>
+            </div>
+            <div class="form-group">
+                <input type="submit" value="Save" class="btn btn-primary" />
+            </div>
+        </form>
+    </div>
+</div>
+
+<div>
+    <a asp-action="Index">Back to List</a>
+</div>
+
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
+}

+ 131 - 0
src/DontHarmWebApi/Views/Clients/Index.cshtml

@@ -0,0 +1,131 @@
+@model IEnumerable<DontHarmWebApi.Entities.Client>
+
+@{
+    ViewData["Title"] = "Index";
+}
+
+<h1>Index</h1>
+
+<p>
+    <a asp-action="Create">Create New</a>
+</p>
+<table class="table">
+    <thead>
+        <tr>
+            <th>
+                @Html.DisplayNameFor(model => model.Type)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Login)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Password)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Surname)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Name)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Patronymic)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Birthdate)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.PassportSeries)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.PassportNumber)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Phone)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Email)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.CompanyName)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.CompanyAddress)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Inn)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Account)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Bik)
+            </th>
+            <th>
+                @Html.DisplayNameFor(model => model.Hidden)
+            </th>
+            <th></th>
+        </tr>
+    </thead>
+    <tbody>
+@foreach (var item in Model) {
+        <tr>
+            <td>
+                @Html.DisplayFor(modelItem => item.Type)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Login)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Password)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Surname)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Name)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Patronymic)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Birthdate)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.PassportSeries)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.PassportNumber)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Phone)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Email)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.CompanyName)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.CompanyAddress)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Inn)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Account)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Bik)
+            </td>
+            <td>
+                @Html.DisplayFor(modelItem => item.Hidden)
+            </td>
+            <td>
+                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
+                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
+                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
+            </td>
+        </tr>
+}
+    </tbody>
+</table>

+ 2 - 0
src/DontHarmWebApi/Views/Shared/_ValidationScriptsPartial.cshtml

@@ -0,0 +1,2 @@
+<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
+<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

+ 8 - 0
src/DontHarmWebApi/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 12 - 0
src/DontHarmWebApi/appsettings.json

@@ -0,0 +1,12 @@
+{
+  "ConnectionStrings": {
+    "vpmt": "Data Source=srv-wsr\\is4;User Id=user12;Password=is4-user12;Initial Catalog=user12;Encrypt=False"
+  },
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

+ 1 - 0
tools/scaffold_example.txt

@@ -0,0 +1 @@
+dotnet ef dbcontext scaffold "Data Source=srv-wsr\is4;User Id=user12;Password=is4-user12;Initial Catalog=user12;Encrypt=False" Microsoft.EntityFrameworkCore.SqlServer --output-dir=Entities