Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 27

Звіт

з обчислювальної практики
з дисципліни «Об’єктно-орієнтовне програмування»
на тему :
«Система контролю асортименту книгарні та обслуговування
покупців із виконанням шаблонів»

Виконав студент 244 групи


Кошельний Владислав Миколайович
Керівник:
Томка Юрій Ярославович
Зміст
1. Розділ 1
2. Розділ 2
3. Розділ 3
4. Висновок
Розділ 1. Основна задача. Функціонал. Технології

Із винайденням письма людству було приречено змінитись. Спроби запису будь-


якої інформації призвело до винайдення книги. З часом книги поширювалися і разом з
їхнім накопиченням виникли бібліотеки. Ця система вдосконалювалася не одне
століття і в наші дні ми вже сміливо можемо сказати, що майже із будь-якої точки
нашої планети ми декількома жестами отримуємо вільний доступ до сотні тисяч книг.

Мета кожного з нас – це продовжувати поширювати інформацію в будь-якому


вигляді.

Розглянемо книгарню. Її основна задача , як і у всіх комерційних будівлях –


обслуговування клієнтів. Для цього в команду співробітників повинні входити
продавці, продавці із правами адміністратора і самі ж адміністратори. Задача продавця
– допомогти зробити покупку клієнтам. До задачі продавців із правами адміністратора
додається ще один обов’язок – грамотно розпорядитися новинками. А задача
адміністратора – керувати двома попередніми.

Щоб все це злагоджено працювало нам потрібно вирішити наступні задачі:

 Як правильно передати інформацію про книгу в базу даних?


 Як потрібно організувати цю базу даних?
 Як продавцеві оформити покупку?
 Що потрібно зробити щоб продати цю книгу?
 Як зареєструвати продавця?

В даному додатку доданий наступний функціонал:

 додавання/зміна/видалення книги в/із бази даних;


 додавання/зміна/видалення облікового запису в/із бази даних;
 керування знижками та додавання промокоду в спеціальний список;

Під час створення програмного продукту, використано наступні технології:


 C# — об'єктно-орієнтована мова програмування з безпечною системою
типізації для платформи .NET. Використовуючи синтаксис мови
програмування C# в додатку можна визначити класи для сутностей,
потрібних для подальшого працювання з ними.
 Система WPF використорується для графічного відображення об’єктів,
використовуючи мову розмітки XAML. Вона є частоко легкою для
розуміння для тих, хто вже має навики працювання HTML. Грамотне
розташування форм дозволяє користувачам легко зрозуміти , як
працювати з нею.
 ADO.NET це набір бібліотек, що поставляється з Microsoft .NET
Framework і призначений для взаємодії з різними сховищами даних
з .NET-застосунків. За допомогою цієї бібліотеки можна взаємодіяти із
зовнішніми базами даних.
 GitHub — один з найбільших веб-сервісів для спільної
розробки програмного забезпечення. Під час розробки, щоб мати доступ
до проекту, було вирішено завантажити проект на GitHub в приватний
репозиторій з подальшим дозавантажуванням змін, яким можна дати
назву, що називаться комітами (commit). Це дозволяє побачити загальний
ріст проекту від початку до кінця.
Розділ 2. Проектування бази даних. Опис класів. Їх відносини між ними.

Для проектування подальшої БД визначено наступний тип сутностей: Книга,


Користувач, Промокод.(Рис. 1)

Для сутності «Книга» визначені наступні поля:

 Name (nchar(100)); //Назва книги


 AuthorName (nchar(50)); //Ім’я автора книги
 Price (float); //Ціна книги
 About (nchar(500)); //Опис книги
 Genre (int); //Жанр
 Discount_Rate (float); //Коефіцієнт знижки (1 по замовчуванню)
 Image_Path (nchar(250)); //Шлях до картинки
 Count_Selled (int); //Кількість проданих екземплярів

Для cутності «Користувач» визначені наступні поля:

 Name (nchar(20)); //П.І.Б. користувача


 Login (nchar(20)); //Логін
 Password (nchar(20)); //Пароль
 Count (int); //Кількість проданих
 isAdmin (bit); //Чи є адміністратором цей користувач

Для сутності «Промокод» визначені наступні поля:

 NameProm (nchar(25)); //Код промокоду


 EndTime (date); //Час реєстрації

Рисунок 1 -Діаграма моделей класів

В проекті реалізовані наступні класи:

Book – описує сутність книги. Має назву, ім'я автора, ціну, опис, жанр,
відносний шлях до картинки, коефіцієнт знижки і скільки разів її продали.
Дозволяє змінювати поля цієї сутності.
public class Book
{
public string Name { get; set; }
public string Author {get;set;} //Назва книги і її автор
public double price { get; set; } // ціна книги
public int Genre { get; set; } // ID жанру
public double discount { get; set; } //коеф знижки
public string ImagePath { get; set; }//шлях до зображення
public int Count_Selled { get; set; }// кількість проданих книг
public string About { get; set; } // коротко про книгу
public Book(string A, string B, double C, string D, int E,double F,string G,int H)
{
Name = A;
Author = B;
price = C;
About = D;
Genre = E;
discount = F;
ImagePath = G;
Count_Selled = H;
}
public void ChName(string A)
{
Name = A;
}
public void ChAuthor(string A)
{
Author = A;
}
public void ChPrice(double A)
{
price = A;
}
public void ChGenre(int A)
{
Genre = A;
}
public void ChPath(string A)
{
ImagePath = A;
}
public void ChAbout(string A)
{
About = A;
}
}
В класі визначений конструктор, який приймає значення для всіх полей.
Визначені наступні методи:

 void ChName(string A) – змінює назву книги;


 void ChAuthor(string A) – змінює ім’я автора;
 void ChPrice(double A) – змінює ціну;
 void ChCenre(int A) – змінює жанр;
 void ChPath(string A) – змінює шлях до картинки;
 void ChAbout(string A) – змінює опис книги;

BaseOfBooks – описує сутність бібліотеки. Дозволяє працювати із базою


даних. Зберігає в собі всі книги (Book). Додає ,видаляє, змінює книги в собі.
class BaseOfBooks
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
List<Book> l = new List<Book> { };
public BaseOfBooks(List<Book> f)
{
foreach (Book i in f)
l.Add(i);
}
public BaseOfBooks()
{
string c = "SELECT * FROM Books order by Books.Count_Selled desc";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();

if (DD.HasRows)
{
while (DD.Read())
{
string x1 = DD.GetValue(0).ToString().Trim();
string x2 = DD.GetValue(1).ToString().Trim();
double x3 = Convert.ToDouble(DD.GetValue(2));
string x4 = DD.GetValue(3).ToString().Trim();
int x5 = Convert.ToInt32(DD.GetValue(4));
double x6 = Convert.ToDouble(DD.GetValue(5));
string x7 = DD.GetValue(6).ToString().Trim();
int x8 = Convert.ToInt32(DD.GetValue(7));
l.Add(new Book(x1, x2, x3, x4, x5, x6, x7, x8));
}
}
}
}
public List<Book> getList()
{
var d = from i in l
orderby i.Count_Selled descending
select i;

List<Book> ddd = new List<Book>() { };


foreach (var i in d)
{
ddd.Add(i);
}
return ddd;
}
public Book GetBookByID(int a)
{
return l.ElementAt(a);
}
public void DelBook(Book A)
{
string c = "DELETE FROM Books WHERE Name='" + A.Name + "' AND AuthorName ='" +
A.Author + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
l.Remove(A);
}
public void AddBook(Book A)
{
l.Add(A);
string c = "INSERT INTO Books
(Name,AuthorName,Price,About,Genre,Discount_Rate,Image_Path,Count_Selled) VALUES ('" + A.Name
+ "','" + A.Author + "'," + A.price + ",'" + A.About + "'," + A.Genre + "," + A.discount +
",'" + A.ImagePath + "'," + A.Count_Selled + ")";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public List<Book> OneTypeBooks(int g)//повертає список книг із визначеним жанром
{
List<Book> A = new List<Book> { };
var d = from i in l
orderby i.Count_Selled descending
where i.Genre==g
select i;

foreach (Book i in d)
{
if (i.Genre == g)
{
A.Add(i);
}
}

return A;
}
public void DiscountUpdate(string A,string B,double C)
{
foreach(var i in l)
{
if(i.Name==A && i.Author==B)
{
i.discount = C;
}
}
}
public void DiscountUpdate(string A, double C)
{
foreach (var i in l)
{
if (i.Name == A)
{
i.discount = C;
}
}
}
public void DiscountUpdate()
{
foreach (var i in l)
{
i.discount = 1;
}
}
public void CHName(string A, string B,string C)
{
foreach (Book i in l)
{
if (i.Name== A && i.Author==B)
{
i.Name = C;
}
}
string c = "UPDATE Books SET Name='" + C + "' WHERE Name='" + A + "' AND
AuthorName='"+B+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHAuthor(string A, string B, string C)
{
foreach (Book i in l)
{
if (i.Name == A && i.Author == B)
{
i.Author = C;
}
}
string c = "UPDATE Books SET AuthorName='" + C + "' WHERE Name='" + A + "' AND
AuthorName='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHGenre(string A, string B, int C)
{
foreach (Book i in l)
{
if (i.Name == A && i.Author == B)
{
i.Genre = C;
}
}
string c = "UPDATE Books SET Genre='" + C + "' WHERE Name='" + A + "' AND
AuthorName='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHAbout(string A, string B, string C)
{
foreach (Book i in l)
{
if (i.Name == A && i.Author == B)
{
i.About = C;
}
}
string c = "UPDATE Books SET About='" + C + "' WHERE Name='" + A + "' AND
AuthorName='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHPrice(string A, string B, double C)
{
foreach (Book i in l)
{
if (i.Name == A && i.Author == B)
{
i.price = C;
}
}
string c = "UPDATE Books SET Price=" + C + " WHERE Name='" + A + "' AND
AuthorName='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHImage_path(string A, string B, string C)
{
foreach (Book i in l)
{
if (i.Name == A && i.Author == B)
{
i.ImagePath = C;
}
}
string c = "UPDATE Books SET Image_Path='" + C + "' WHERE Name='" + A + "' AND
AuthorName='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
void SellBook(Book A)
{
string c = "Update Books Set Count_Selled = Count_Selled + 1 Where Name =
'"+A.Name+"' And AuthorName = '"+A.Author+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void SellBooks(List<Book> A)
{
foreach(var i in A)
{
SellBook(i);
foreach(var j in l)
{
if(j.Author==i.Author&&j.Name==i.Name)
{
j.Count_Selled++;
}
}
}
}
}

Має 2 конструктори:

 BaseOfBooks() – витягує всі дані із бази даних і приймає їх у


список l;
 BaseOfBooks(List<Book> f) – приймає із списку f всі книги до l;

Має наступні методи:

 List<Book> getlist() – повертає список всіх об'єктів типу Book;


 Book GetBookByID(int a) – повертає із списку один об’єкт по
нумерації;
 void DelBook(Book A) – видаляє із списку і із бази даних 1 книгу;
 void AddBook(Book A) – додає в список і в базу даних 1 книгу;
 List<Book> OneTypeBooks(int g) – повертає список із книг одного
жанру g;
 void DisocuntUpdate(string A,string B,double C) – змінює коефіцієнт
знижки на С книжці із назвою А і автором В;
 void DiscountUpdate(string A,double C) – змінює коефіцієнт знижки
на С книжці із автором А;
 void DisocuntUpdate() – змінює всім книгам коефіцієнт знижки на
1;
 void CHName(string A,string B,string C) –змінює назву книги С із
назвою А і автором В;
 void CHAuthor(string A,string B,string C) – змінює ім’я автора книги
С із назвою А і автором В;
 void CHGenre(string A,string B,int C) – змінює жанр книги С із
назвою А і автором В;
 void CHAbout(string A,string B,string C) – змінює опис книги С із
назвою А і автором В;
 void CHPrice(string A,string B,double C) – змінює ціну книги С із
назвою А і автором В;
 void CHImage_path(string A,string B,string C) – змінює шлях
картинки С із назвою А і автором В;
 void SellBook(Book A) – збільшує кількість проданих екземплярів
книги А на 1;
 void SellBooks(List<Book> A) – збільшує кількість проданих
екземплярів книжок із списку А;

BasketBook – описує сутність кошика. Дозволяє зберігати в собі книги, які


потім продаються. Додає, видаляє книги в собі. Перебуває в двох станах
(BasketWithDiscount і BasketWithoutDiscount), використовуючи патерн State.
Обчислює загальну суму для покупки.
class BasketBook
{
public IBasketState State { get; set; }
List<Book> books;
public BasketBook(IBasketState ws)
{
State = ws;
books = new List<Book>() { };
}
public void setPromocode()
{
State.setPromocode(this);
}
public double getSumm()
{
double s = 0;
foreach (var i in books)
{
s += i.price * i.discount;
}
if (State.ishavediscount())
return s * 0.9;
else
return s;
}
public Book getBookAt(int a)
{
return books[a - 1];
}
public List<Book> getlist()
{
return books;
}
public int getCount()
{
return books.Count;
}
public void AddBook(Book a)
{
books.Add(a);
}
public void DeleteBook(Book a)
{
books.Remove(a);
}
public void DeleteBook(int a)
{
books.RemoveAt(a);
}
}

interface IBasketState
{
void setPromocode(BasketBook basket);
bool ishavediscount();
}

class BasketWithDiscount : IBasketState


{
public void setPromocode(BasketBook basket)
{
basket.State = new BasketWithDiscount();
}
public bool ishavediscount()
{
return true;
}
}
class BasketWithoutDiscount : IBasketState
{
public void setPromocode(BasketBook basket)
{
basket.State = new BasketWithDiscount();
}
public bool ishavediscount()
{
return false;
}
}

Має конструктор, який приймає один із типів стратегії :new BasketWithDiscount()


або BasketWithoutDicount()

 BasketBook(IBasketState ws);

Має наступні методи

 void setPromocode() – підтверджує промокод;


 double getSumm() – повертає загальну суму;
 Book getBookAt(int a) – повертає об’єкт книги під номером а;
 List<Book> getlist() – повертає весь список книг;
 int getCount() – повертає розмір кошика;
 void AddBook(Book a) – додає книгу а в кошик;
 void DeleteBook(Book a) – видаляє книгу а з кошика;
 void DeleteBook(int a) – видаляє книгу під номером а із кошика;

Account – описує сутність облікового запису. Дозволяє змінювати поля цієї


сутності.
class Account
{
public string Name { get; set; } //Нік співробітника
public string Login { get; set; } //Логін співробітника
public string password { get; set; } //пароль співробітника
public int count_selled {get;set;} //кількість проданих книг
public bool isAdmin { get; set; } //чи є адміністратор
public Account(string Nic, string Log, string pass,int count,bool isadmin)
{
Name = Nic;
Login = Log;
password = pass;
count_selled = count;
isAdmin = isadmin;
}
public Account(Account l)
{
this.Name = l.Name;
this.Login = l.Login;
this.password = l.password;
this.count_selled = l.count_selled;
this.isAdmin = l.isAdmin;
}
public Account(string Nic, string Log, string pass)
{
Name = Nic;
Login = Log;
password = pass;
count_selled = 0;
isAdmin = false;
}
public void ChangePass(string A)
{
password = A;
}
public void ChangeLogin(string A)
{
Login = A;
}
public void AddOne()
{
count_selled++;
}

Має 3 конструктори:

 Account(string Nic,string Log,string pass,int count,bool isadmin);


 Account(Account l);
 Account(string Nic,string Log, string pass);

Має наступні методи:

 void ChangePass(string A) – змінює поле з паролем;


 void ChangeLogin(string A) – змінює поле з логіном;
 void AddOne() – збільшує поле із кількість проданих книг на 1;

LictAcc – описує сутність колективу. Дозволяє працювати із базою даних.


Зберігає в собі всі облікові записи (Account). Додає ,видаляє, змінює облікові
записи в собі.
class ListAcc
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
List<Account> l = new List<Account> { };
public ListAcc(List<Account> f)
{
foreach (Account i in f)
l.Add(i);
}
public ListAcc()
{
string c = "SELECT * FROM Accounts";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();

if (DD.HasRows)
{
while (DD.Read())
{
object x1 = DD.GetValue(0);
object x2 = DD.GetValue(1);
object x3 = DD.GetValue(2);
object x4 = DD.GetValue(3);
object x5 = DD.GetValue(4);
l.Add(new Account(Convert.ToString(x1).Trim(),
Convert.ToString(x2).Trim(),
Convert.ToString(x3).Trim(),Convert.ToInt32(x4),Convert.ToBoolean(x5)));
}
}
}
}
public List<Account> getList()
{
return l;
}
public int SearchAcc(string A, string B)//перевіряє, чи знайдений такий акаунт, якзо
не знайдений, то повертвє -1
{
int Searched = -1;
int j= 0;
foreach(var i in l)
{
if (i.Login.Replace(" ", "") == A && i.password.Replace(" ", "") == B)
{
Searched = j;
}
j++;
}
return Searched;
}
public int SearchAcc(string Login)//перевіряє, чи знайдений такий акаунт, якзо не
знайдений, то повертвє -1
{
int Searched = -1;
int j = 0;
foreach (var i in l)
{
if (i.Login.Replace(" ", "") == Login)
{
Searched = j;
}
j++;
}
return Searched;
}
public Account GetAccountByID(int a)
{
return l.ElementAt(a);
}
public void CHPass(string A, string B)
{
foreach (Account i in l)
{
if (i.password.Replace(" ", "") == A)
i.ChangePass(B);
}
string c = "UPDATE Accounts SET Password="+B+" WHERE Name='"+A+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void CHLogin(string A, string B)
{
foreach (Account i in l)
{
if (i.Login.Replace(" ", "") == A)
i.ChangeLogin(B);
}
string c = "UPDATE Accounts SET Login=" + B + " WHERE Name='" + A + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void DelAcc(Account A)
{
string c = "DELETE FROM Accounts WHERE Name='"+A.Name+"' AND Login='"+A.Login+"'
AND Password='"+A.password+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
l.Remove(A);
}
public void AddAccount(Account a)
{
l.Add(a);
string c = "INSERT INTO Accounts (Name,Login,Password,Count,isAdmin) VALUES ('" +
a.Name + "','" + a.Login + "','" + a.password + "','" + 0 + "','False')";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void Sell(int a,Account b)
{
foreach (Account i in l)
{
if (i.Login==b.Login)
{
int a1 = i.count_selled;
i.count_selled += a;
if(a1<500 && i.count_selled>=500)
{
MessageBox.Show(i.Name+", ви щойно продали понад 500 книг. Будь ласка,
перезайдіть!");
}
}
}
string c = "UPDATE Accounts SET Count=Count+" + a + " WHERE Name='" + b.Name +
"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
public void setAdmin(int a)
{
foreach( var i in l)
{
i.isAdmin = false;
}
GetAccountByID(a).isAdmin = true;
string c = "UPDATE Accounts SET isAdmin = 0 UPDATE Accounts set isAdmin = 1 where
Login = '"+GetAccountByID(a).Login+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
}

Має 2 конструктори:

 ListAcc();
 ListAcc(List<Account> f);

Має наступні методи:

 List<Account> getList() – повертає список всіх облікових записів;


 int SearchAcc(string A,string B) – перевіряє чи знайдений такий
обліковий запис по логіну А і паролю В, якщо ні – то -1;
 int SearchAcc(string Login) – перевіряє чи знайдений по логіну Login,
якщо ні – то -1;
 Account GetAccoutByID(int a) – бере один об’єкт Account по
порядковому порядку;
 void CHPass(string A,string B) – змінює пароль B користувача відносно
логіну A;
 void CHLogin(string A,string B) – змінює логін B користувача відносно
логіну А;
 void DelAcc(Account a) – видаляє обліковий а із бази даних;
 void Sell(int a,Account b) – збільшує кількість проданих книга на а;
 void setAdmin(int a) – встановлює поле isLogin обліковому запису під
номером а;
Seller – описує сутність поточного продавця. Зберігає в собі всі властивості
облікового запису. Використовує патерн Singleton.
class Seller : Account
{
public Seller(Account l):base(l)
{
}
private static Seller instance;

public static Seller getInstance(Account l)


{
if (instance == null)
instance = new Seller(l);
return instance;
}
}

Має конструктор:

 Seller(Account l);

Має наступний метод:

 Static Seller getInstance(Account l) – виклакається для створення


об’єкту, якщо об’єкт відсутній або рівний null;

Discount – працює із системою знижок. Міняє поля discount в класі Book. Має
декілька способів надання знижки. Реалізований за допомогою патерна
Strategy.
public interface IDiscount
{
void ExecuteDiscount(string A,string B,double C);
}

public class JustDiscount : IDiscount


{
public void ExecuteDiscount(string A,string B,double C)
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
string c = "UPDATE Books SET Discount_Rate=" + (C + "").Replace(",", ".") + "
WHERE Name='" + A + "' AND AuthorName ='"+B+"'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
}

public class DiscountByAuthor : IDiscount


{
public void ExecuteDiscount(string A, string B, double C)
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
string c = "UPDATE Books SET Discount_Rate=" + (C+"").Replace(",",".") + " WHERE
AuthorName ='" + B + "'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
}

public class DiscountPromocode : IDiscount


{
public void ExecuteDiscount(string A, string B, double C)
{
DateTime dt = DateTime.Now;
string b=dt.Year+"-"+dt.Month+"-"+dt.Day;
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
string c = "INSERT INTO Promocode (NameProm,EndTime) VALUES ('" + A+"','"+b+"')";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
}

public class RemoveDiscount : IDiscount


{
public void ExecuteDiscount(string A, string B, double C)
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
string c = "UPDATE Books SET Discount_Rate=1";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();
}
}
}

public class Discount


{
public IDiscount ContextStrategy { get; set; }

public Discount(IDiscount _strategy)


{
ContextStrategy = _strategy;
}

public void ExecuteDiscount(string A,string B,double C)


{
ContextStrategy.ExecuteDiscount(A,B,C);
}
}
Має конструктор:

 Discount(IDiscount _strategy);

Має методи:

 void ExecuteDiscount(string A,string B,double C) – виконує одну із


варіацій надання знижок;

Promocodedb – зберігає в собі список актуальних промокодів. Кожен


промокод дає знижку 10% на загальну покупку. Діє 2 тижні. Можна
використати 1 раз за покупку
class Promocodedb
{
string connectionString = @"Data Source=.\SQLEXPRESS;Initial
Catalog=Proekta_2;Integrated Security=True";
public List<string> list = new List<string>() { };
public Promocodedb()
{
string c = "Select A.NameProm from Promocode A Where
DATEDIFF(day,a.EndTime,GETDATE())<=14";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(c, connection);
SqlDataReader DD = command.ExecuteReader();

if (DD.HasRows)
{
while (DD.Read())
{
string x1 = DD.GetValue(0).ToString().Replace(" ","");
list.Add(x1);
}
}
}
}
public bool isChecked(string a)
{
bool b = false;
foreach(var i in list)
{
if (i == a)
b = true;
}
return b;
}
}

Має конструктор:

 Promocodedb();

Має метод:

 bool isChecked(string a) – перевіряє, чи існує і чи актуальний промокод


а в базі даних;

Рисунок 2. UML діаграма всіх класів (1\3).


Рисунок 3. UML діаграма всіх класів (2\3)

Рисунок 4. UML діаграма всіх класів (3\3)


Розділ 3. UI. Робота із базою даних. Патерни.

Після запуску програми нас зустрічає наступне вікно.

Тут ми можемо ввести вхідні дані для авторизації (логін і пароль). Якщо
користувач ще не зареєструвався, йому потрібно натиснути кнопку «Новий аккаунт»,
після чого появиться наступна форма:

Після того, як користувач зайшов, його зустрічає наступне:


Зліва появиться меню, а справа його зустрічає кошик. Зверху посередині є поле,
в якому можна ввести дані для пошуку (шукає по назві книги і її автору). Зліва ми
можемо вибрать один із дванадцяти жанрів, або показати всі. В залежності від статусу
користувача, меню відрізняються – якщо користувач є звичайним продавцем, то йому
буде доступна тільки кнопки «Обліковий запис» і «Вихід».

При натисненні кнопки «Обліковий запис» в виведуться всі поточні дані


продавця, а також можливість змінити логін чи пароль в будь-який момент.

Якщо користувач є продавцем із правами адміністратора, йому буде доступна


кнопка «Керування асортиментом», після чого відкриється вікно , в якому можна
редагувати асортимент.
Тут він створювати нову книгу, видалення і редагування існуючої.

Щоб створити нову книгу, потрібно заповнити всі поля, вибрати картинку і
натиснути книгу (додати нову книгу).

Щоб видалити книгу із бази , потрібно вибрати рядок із книгою і натиснути на


іконку із корзиною.

Щоб змінити дані в книзі, потрібно вибрати рядок із книгою і натиснути на


іконку, схожу на «i». Після чого ми зможемо змінити будь-яку книгу в асортименті.

Якщо натиснути на іконку із процентом, то ми зможемо керувати знижками.


Тут ми можемо дати знижку на книги по автору, дати знижку окремій книзі,
відмінити всі знижки чи активувати промокод на 14 днів.

Інформацію про книгу можна знайти, натиснувши на іконку «і».


Щоб продавець організував покупку, потрібно просто вибрати всі потрібні
книги, які самі автоматично додаватимуться в кошик. Відкривши праву бічну панель.

Якщо покупцеві відомий промокод, то продавець його вводить. У випадку, коли


промокод підтверджений , то покупець отримує знижку 10% від всієї суми. Після цього
покупку можна завершити, або скасувати.

Після цього кошик готовий для нового замовлення.

Для взаємодії із базою даних використовується технологія ADO.Net

Платформа .NET визначає ряд просторів імен, які дозволяють безпосередньо


взаємодіяти з локальними і віддаленими базами даних. Разом ці простору імен відомі як
ADO.NET. Розглядаються два рівня роботи з ADO.NET:

 підключений рівень (connected layer) - дозволяє взаємодіяти з базою


даних за допомогою об'єктів підключення, читання даних і команд
конкретного постачальника даних;
 відключений рівень (disconnected layer) - дозволяє змоделювати в
пам'яті дані з бази даних за допомогою численних класів з простору
імен System.Data (DataSet, DataTable і т.д.)
Ця технологія дозволяє виконувати всі T-SQL-запити, що дозволяє заповнювати,
редагувати дані й таблиці.

Використовувалися клас SqlConnection, SqlCommand i SqlDataReader із


бібліотеки System.Data.SqlClient

Для реалізації проекту використані 3 патерни:

 Singleton
 Strategy
 State

Singleton використаний для реалізації продавця.

Рисунок 5. Singleton
Strategy використаний для реалізації системи знижок

Рисунок 6. Strategy
State використаний для реалізації кошика
Рисунок 7. State
Висновок.

На даний момент реалізована можливість швидкого редагування , із можливістю


надавання знижок. Реалізована можливість передача прав адміністратора іншому
користувачу. Реалізована можливість видалення облікового запису з боку
адміністратора.

В наступних версіях планується додати:

 різновид асортименту (не тільки книги, а й інший вид друкованої


продукції (журн));
 можливість перегляду декількох сторінок;
 новинки та рекомендації;
 вибір теми;
 використання технології EntityFramewok;
Список літератури:

 ПАТЕРНИ ПРОЕКТУВАННЯ [Електронний ресурс] // Олександр Швець.


– 2014. – Режим доступу до ресурсу: https://refactoring.guru/uk/design-
patterns.

C# 4.0: полное руководство.: Пер. с англ. — М.: ООО "И.Д. Вильямс",


2011. —
 1056 с.: ил. — Парал. тит. англ.

You might also like