diff --git a/ComputersShop/ComputersShop/FormClient.Designer.cs b/ComputersShop/ComputersShop/FormClient.Designer.cs
new file mode 100644
index 0000000..d9a78ef
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormClient.Designer.cs
@@ -0,0 +1,39 @@
+namespace ComputersShopView
+{
+ partial class FormClient
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 450);
+ this.Text = "FormClient";
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormClient.cs b/ComputersShop/ComputersShop/FormClient.cs
new file mode 100644
index 0000000..cb70e7e
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormClient.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ComputersShopView
+{
+ public partial class FormClient : Form
+ {
+ public FormClient()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/ComputersShop/ComputersShop/FormClient.resx b/ComputersShop/ComputersShop/FormClient.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormClient.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs b/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
index cae0c6f..b81e05e 100644
--- a/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
+++ b/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
@@ -10,9 +10,11 @@ namespace ComputersShopFileImplement
private readonly string ComponentFileName = "Component.xml";
private readonly string OrderFileName = "Order.xml";
private readonly string ComputerFileName = "Computer.xml";
+ private readonly string ClientFileName = "Client.xml";
public List Components { get; private set; }
public List Orders { get; private set; }
public List Computers { get; private set; }
+ public List Clients { get; private set; }
public static DataFileSingleton GetInstance()
{
if (instance == null)
@@ -24,11 +26,13 @@ namespace ComputersShopFileImplement
public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement);
public void SaveComputers() => SaveData(Computers, ComputerFileName, "Computers", x => x.GetXElement);
public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
+ public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement);
private DataFileSingleton()
{
Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
Computers = LoadData(ComputerFileName, "Computer", x => Computer.Create(x)!)!;
Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
+ Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!;
}
private static List? LoadData(string filename, string xmlNodeName,
Func selectFunction)
diff --git a/ComputersShop/ComputersShopFileImplement/Implements/ClientStorage.cs b/ComputersShop/ComputersShopFileImplement/Implements/ClientStorage.cs
new file mode 100644
index 0000000..3122279
--- /dev/null
+++ b/ComputersShop/ComputersShopFileImplement/Implements/ClientStorage.cs
@@ -0,0 +1,84 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using ComputersShopFileImplement.Models;
+
+namespace ComputersShopFileImplement.Implements
+{
+ public class ClientStorage : IClientStorage
+ {
+ private readonly DataFileSingleton source;
+ public ClientStorage()
+ {
+ source = DataFileSingleton.GetInstance();
+ }
+ public List GetFullList()
+ {
+ return source.Clients
+ .Select(x => x.GetViewModel)
+ .ToList();
+ }
+ public List GetFilteredList(ClientSearchModel model)
+ {
+ if (string.IsNullOrEmpty(model.Email))
+ {
+ return new();
+ }
+ return source.Clients
+ .Where(x => x.Email.Contains(model.Email))
+ .Select(x => x.GetViewModel)
+ .ToList();
+ }
+ public ClientViewModel? GetElement(ClientSearchModel model)
+ {
+ if (model.Id.HasValue)//сначала ищем по Id
+ {
+ return source.Clients.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
+ }
+ else if (!string.IsNullOrEmpty(model.Email) && string.IsNullOrEmpty(model.Password))//затем по логину
+ {
+ return source.Clients.FirstOrDefault(x => x.Email == model.Email)?.GetViewModel;
+ }
+ else if (!string.IsNullOrEmpty(model.Email) && !string.IsNullOrEmpty(model.Password))//затем по логину и паролю
+ {
+ return source.Clients.FirstOrDefault(x => x.Email == model.Email && x.Password == model.Password)?.GetViewModel;
+ }
+ return null;
+ }
+ public ClientViewModel? Insert(ClientBindingModel model)
+ {
+ model.Id = source.Clients.Count > 0 ? source.Clients.Max(x => x.Id) + 1 : 1;
+ var newClient = Client.Create(model);
+ if (newClient == null)
+ {
+ return null;
+ }
+ source.Clients.Add(newClient);
+ source.SaveClients();
+ return newClient.GetViewModel;
+ }
+ public ClientViewModel? Update(ClientBindingModel model)
+ {
+ var client = source.Clients.FirstOrDefault(x => x.Id == model.Id);
+ if (client == null)
+ {
+ return null;
+ }
+ client.Update(model);
+ source.SaveClients();
+ return client.GetViewModel;
+ }
+ public ClientViewModel? Delete(ClientBindingModel model)
+ {
+ var element = source.Clients.FirstOrDefault(x => x.Id == model.Id);
+ if (element != null)
+ {
+ source.Clients.Remove(element);
+ source.SaveClients();
+ return element.GetViewModel;
+ }
+ return null;
+ }
+ }
+}
diff --git a/ComputersShop/ComputersShopFileImplement/Models/Client.cs b/ComputersShop/ComputersShopFileImplement/Models/Client.cs
new file mode 100644
index 0000000..cb837dd
--- /dev/null
+++ b/ComputersShop/ComputersShopFileImplement/Models/Client.cs
@@ -0,0 +1,68 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Models;
+using System.Xml.Linq;
+
+namespace ComputersShopFileImplement.Models
+{
+ public class Client : IClientModel
+ {
+ public int Id { get; private set; }
+ public string ClientFIO { get; private set; } = string.Empty;
+ public string Email { get; private set; } = string.Empty;
+ public string Password { get; private set; } = string.Empty;
+ public static Client? Create(ClientBindingModel model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ return new Client()
+ {
+ Id = model.Id,
+ ClientFIO = model.ClientFIO,
+ Email = model.Email,
+ Password = model.Password
+ };
+ }
+ public static Client? Create(XElement element)
+ {
+ if (element == null)
+ {
+ return null;
+ }
+ return new Client()
+ {
+ Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+ ClientFIO = element.Element("ClientFIO")!.Value,
+ Email = element.Element("Email")!.Value,
+ Password = element.Element("Password")!.Value,
+ };
+ }
+ public void Update(ClientBindingModel model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+ ClientFIO = model.ClientFIO;
+ Email = model.Email;
+ Password = model.Password;
+ }
+ public ClientViewModel GetViewModel => new()
+ {
+ Id = Id,
+ ClientFIO = ClientFIO,
+ Email = Email,
+ Password = Password
+ };
+ public XElement GetXElement => new
+ (
+ "Client",
+ new XAttribute("Id", Id),
+ new XElement("ClientFIO", ClientFIO),
+ new XElement("Email", Email),
+ new XElement("Password", Password)
+ );
+ }
+}
diff --git a/ComputersShop/ComputersShopImplement/DataListSingleton.cs b/ComputersShop/ComputersShopImplement/DataListSingleton.cs
index 1b0012b..06ebdfa 100644
--- a/ComputersShop/ComputersShopImplement/DataListSingleton.cs
+++ b/ComputersShop/ComputersShopImplement/DataListSingleton.cs
@@ -8,11 +8,13 @@ namespace ComputersShopListImplement
public List Components { get; set; }
public List Orders { get; set; }
public List Computers { get; set; }
+ public List Clients { get; set; }
private DataListSingleton()
{
Components = new List();
Orders = new List();
Computers = new List();
+ Clients = new List();
}
public static DataListSingleton GetInstance()
{
diff --git a/ComputersShop/ComputersShopImplement/Implements/ClientStorage.cs b/ComputersShop/ComputersShopImplement/Implements/ClientStorage.cs
new file mode 100644
index 0000000..a1ce706
--- /dev/null
+++ b/ComputersShop/ComputersShopImplement/Implements/ClientStorage.cs
@@ -0,0 +1,110 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using ComputersShopListImplement.Models;
+
+namespace ComputersShopListImplement.Implements
+{
+ public class ClientStorage : IClientStorage
+ {
+ private readonly DataListSingleton _source;
+ public ClientStorage()
+ {
+ _source = DataListSingleton.GetInstance();
+ }
+ public List GetFullList()
+ {
+ var result = new List();
+ foreach (var client in _source.Clients)
+ {
+ result.Add(client.GetViewModel);
+ }
+ return result;
+ }
+ public List GetFilteredList(ClientSearchModel model)
+ {
+ if (model == null)
+ {
+ return new();
+ }
+ var result = new List();
+ if (string.IsNullOrEmpty(model.ClientFIO) && string.IsNullOrEmpty(model.Email))
+ {
+ return result;
+ }
+ if (model.Email != null)
+ {
+ foreach (var client in _source.Clients)
+ {
+ if (client.Email.Contains(model.Email))
+ {
+ result.Add(client.GetViewModel);
+ }
+ }
+ }
+ return result;
+ }
+ public ClientViewModel? GetElement(ClientSearchModel model)
+ {
+ foreach (var client in _source.Clients)
+ {
+ if (model.Id.HasValue && model.Id == client.Id)//сначала ищем по айди
+ {
+ return client.GetViewModel;
+ }
+ if (model.Email != null && client.Email.Contains(model.Email) && model.Password == null)//затем по логину
+ {
+ return client.GetViewModel;
+ }
+ if (model.Email != null && client.Email.Contains(model.Email) && model.Password != null && client.Password.Contains(model.Password))//затем по логину и паролю
+ {
+ return client.GetViewModel;
+ }
+ }
+ return null;
+ }
+ public ClientViewModel? Insert(ClientBindingModel model)
+ {
+ model.Id = 1;
+ foreach (var client in _source.Clients)
+ {
+ if (model.Id <= client.Id)
+ {
+ model.Id = client.Id + 1;
+ }
+ }
+ var res = Client.Create(model);
+ if (res != null)
+ {
+ _source.Clients.Add(res);
+ }
+ return res?.GetViewModel;
+ }
+ public ClientViewModel? Update(ClientBindingModel model)
+ {
+ foreach (var client in _source.Clients)
+ {
+ if (client.Id == model.Id)
+ {
+ client.Update(model);
+ return client.GetViewModel;
+ }
+ }
+ return null;
+ }
+ public ClientViewModel? Delete(ClientBindingModel model)
+ {
+ for (int i = 0; i < _source.Clients.Count; ++i)
+ {
+ if (_source.Clients[i].Id == model.Id)
+ {
+ var element = _source.Clients[i];
+ _source.Clients.RemoveAt(i);
+ return element.GetViewModel;
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/ComputersShop/ComputersShopImplement/Models/Client.cs b/ComputersShop/ComputersShopImplement/Models/Client.cs
new file mode 100644
index 0000000..b621141
--- /dev/null
+++ b/ComputersShop/ComputersShopImplement/Models/Client.cs
@@ -0,0 +1,45 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Models;
+
+namespace ComputersShopListImplement.Models
+{
+ public class Client : IClientModel
+ {
+ public int Id { get; private set; }
+ public string ClientFIO { get; private set; } = string.Empty;
+ public string Email { get; private set; } = string.Empty;
+ public string Password { get; private set; } = string.Empty;
+ public static Client? Create(ClientBindingModel model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ return new()
+ {
+ Id = model.Id,
+ ClientFIO = model.ClientFIO,
+ Email = model.Email,
+ Password = model.Password
+ };
+ }
+ public void Update(ClientBindingModel model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+ ClientFIO = model.ClientFIO;
+ Email = model.Email;
+ Password = model.Password;
+ }
+ public ClientViewModel GetViewModel => new()
+ {
+ Id = Id,
+ ClientFIO = ClientFIO,
+ Email = Email,
+ Password = Password,
+ };
+ }
+}