Материал: Разработка автоматизированной системы для магазина автозапчастей

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

.        Правильность выполнения SQL - запросов к БД. Регистрация и авторизация

.        Слайдер Slick

 

5.2.1 Правильность выполнения функций по нажатию кнопок и переходов по гиперссылкам

Кнопки, зафиксированные в шапке (Рисунок 5.17) как гиперссылки выполняются адекватно, кнопка «О нас» активирует скрипт по плавному перемещению в подвал сайта, также выполняется правильно и без лишних задержек.

Рисунок 5.17. Шапка сайта

После нажатия на кнопку «Товар в наличии» пользователь попадает на страницу выбора категории товара (Рисунок 5.18), где каждая гиперссылка выполняет переход абсолютно верно.

Рисунок 5.18. Категории

Гиперссылка, находящаяся в подвале сайта (Рисунок 5.19) осуществляет переход в группу магазина в социальной сети ВКонтакте. Переход осуществляется адекватно.

Рисунок 5.19. Подвал сайта

 

5.2.2 Правильность выполнения SQL-запросов к БД

Некоторые кнопки активируют конструкцию, написанную на языке PHP, предназначенную для выполнения SQL - запроса, поэтому рассмотрим эти кнопки в данном пункте. Начнем с работы формы регистрации (Рисунок 5.20).

Рисунок 5.20. Страница регистрации

Для проверки отправки данных после нажатия на кнопку «Зарегистрироваться» зарегистрируем нового пользователя «Иванов Пётр Петрович», логин: «abcd9», пароль: «11111». После регистрации перейдем в панель управления БД PhpMyAdmin (Рисунок 5.21), где убедимся, что данные отправлены успешно в нужные поля, а конструкция «$user->password = password_hash($data['password'], PASSWORD_DEFAULT);» для шифрования пароля выполняется успешно. Данная конструкция является стандартной в технологии RedBean. Использование этой технологии позволяет увеличить защиту проекта с использованием несложных готовых конструкций.

Рисунок 5.21. Пользователь успешно зарегистрирован, пароль зашифрован

Страница авторизации позволяет пользователю войти на сайт под своим именем и получить функции, которые недоступны гостю (личный кабинет, резервирование товара). Для страницы регистрации и авторизации поставлены условия для вывода ошибок ввода данных (Рисунок 5.22). Эти сообщения выводятся сверху на красном фоне для идентификации поля, которое введено неверно или данные не являются адекватными для данного поля. На рисунке 5.22. пароль введен неверно, но если все данные совпали, то пользователь попадает на главную страницу и может пользоваться всеми возможностями сайта.

Рисунок 5.22. Поле заполнено неверно

Отметим, что страница регистрации и авторизации прошли тестирование отлично, поэтому перейдем к выводу товаров (Рисунок 5.23).

Рисунок 5.23. Вывод ассортимента

Товар выводится правильно в зависимости от выбора категории. Зарезервируем 1ед. товара «Дверь передняя» для автомобиля «Nissan Almera Classic» на пользователя dima11. Проверим в клиентском приложении наличие данного резерва (Рисунок 5.24).

Рисунок 5.24. Результат работы кнопки «Зарезервировать»

SQL - запрос по занесению в БД данных о резерве на конкретного пользователя работает корректно. Далее проверили следующие конструкции:

.        «$result11 = $mysqli->query("UPDATE Товары,Резервирование set Товары.Остаток_шт=Товары.Остаток_шт+Резервирование.Количество WHERE Код_товара = Резервирование.Код_тов and Резервирование.Дата_резерва < (NOW() - INTERVAL 3 DAY)");

2.      «$result22 = $mysqli->query("DELETE FROM Резервирование WHERE Дата_резерва < (NOW() - INTERVAL 3 DAY)");»

Первая конструкция возвращает товар на склад в нужном количестве через 3 дня после резервирования пользователем, если его не выкупили. Вторая конструкция удаляет сразу же после выполнения первой конструкции данный резерв из соответствующей таблицы базы данных. Данные конструкции сработали корректно по истечению трёх дней.

 


5.2.3 Тестирование слайдера «Slick»

Слайдер работает корректно, без замечаний. Изображения автоматически перелистываются каждые три секунды, также можно выбирать фотографии благодаря нажатиям на круглые, которые расположены под самим слайдером (Рисунок 5.25). Кнопки работают правильно, без нареканий.

Рисунок 5.25. Внешний вид слайдера «Slick»

6. Внедрение продукта в производство


Для внедрения проекта в производство следует составить план действий, представленный в таблице 6.1.

Таблица 6.1. Этапы внедрения ПП в производство

Этап работы

Результат

Срок

Подготовка рабочего места на предприятии

Приобретение со стороны предприятия необходимого ПО и аппаратного обеспечения

10 дней

Установка 1

Установка ПО для ПП

1 день

Установка 2

Установка клиентского приложения посредством запуска установочной программы, установка БД

1 день

Внедрение сайта

Покупка домена, хостинга, загрузка сайта на хостинг

1 день

Обучение персонала

Персонал и администрация успешно используют функции АСУ

10 дней

Работы с БД

Наполнение магазина ассортиментом, клиентами, пользователями и т.д.

3 дня

Проведение предварительных испытаний

Испытания системы на работоспособность и соответствие техзаданию, устранение неисправностей

10 дней

Проведение опытной эксплуатации

Опытная эксплуатация. Доработка ПО и дополнительная наладка технических средств

10 дней

Проведение приёмочных испытаний

Испытания системы в соответствии с ПИМ проведены. Устранение неисправностей и внесение изменений в документацию проведено.

5 дней


 

Заключение


На данный момент проект разработан. Из промежуточного тестирования интерфейса и функций ПП можно сказать, что и клиентское приложение, и сайт работают корректно и выполняют свои функции достаточно быстро. Интерфейс можно назвать интуитивно понятным из результатов тестирования на реальных пользователях разных возрастов, поэтому можно сказать, что цель по созданию удобного для пользователя интерфейса достигнута. Задача по улучшению читабельности кода, инкапсуляции объектов, добавлению новых функций с применением шаблонов проектирования достигнута. Доработка существующего функционала программного продукта в данный момент не будет составлять особой сложности из-за повышения читабельности и структурированности кода. После добавления шаблона Singleton объем программного кода уменьшился на 900 строк. Работа с экономическим анализом продаж за определенный промежуток времени стала намного удобнее из-за применения шаблона Adapter. Браузер обрёл несколько важных функций с применением шаблона Command. Примерный срок для полноценного внедрения в производство: 52 рабочих дня. На данный момент абсолютно все функции сайта и клиентского приложения выполняются правильно, выдают адекватные результаты без сбоев, а также выполняются быстро.

Список использованных источников


1.      CloudShop [Электронный ресурс]: офиц. сайт. - Режим доступа: https://cloudshop.ru.

2.      ABM Retail [Электронный ресурс]: офиц. сайт. - Режим доступа: http://abmcloud.com/solution/upravleniye-magazinami/

.        1С [Электронный ресурс]: офиц. сайт. - Режим доступа: http://solutions.1c.ru/catalog/service-center/features

.        Wikipedia - свободная энциклопедия [Электронный ресурс]: офиц. сайт. - Режим доступа: https://ru.wikipedia.org

6.      prj-exp [Электронный ресурс]: офиц. сайт. - Режим доступа: http://www.prj-exp.ru/dwh/dwh_stages_of_development.php

.        Смирнов Д.А. УМНЫЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ ДЛЯ АСУ МАГАЗИНА АВТОЗАПЧАСТЕЙ//Молодёжь и XXI век - 2017. Материалы международной молодёжной научной конференции., 22 февраля 2017г. /ЮЗГУ. - Курск, 2017 - Т.3, С. 66 - 69.

.        Смирнов Д.А. РАЗРАБОТКА АСУ ДЛЯ МАГАЗИНА АВТОЗАПЧАСТЕЙ // Материалы межрегиональной научной конференции Х ежегодной научной сессии аспирантов и молодых ученых. /,. - Вологда, 2017 - Т.1, С. 104 - 107.

Приложение 1


Программный код формы авторизации:

#pragma endregion: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для синхронизации вводимых имени польз и пароля

try {^ cmd = "select * from autorun2.users where user_name='" + this->username_txt->Text

+ "' and password='" + this->password_txt->Text + "';";^ myReader = ConnToDB::getSingleton()->doSQLCommand(cmd);count = 0;(myReader->Read()) {

count = count + 1;

}(count == 1) {

//Если имя польз. и пароль введены верно, то переходим на форм2

this->Hide();^ f2 = gcnew form2();->ShowDialog();>Close();

}if (count > 1) {

MessageBox::Show("Дублированные имя пользователя и пароль");

}{::Show("Имя пользователя и пароль введены неверно");

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {->Text = System::DateTime::Now.Date.ToShortDateString();::String^ WeekDayName;(System::DateTime::Now.DayOfWeek) {System::DayOfWeek::Sunday:= "воскресенье" + ","; break;System::DayOfWeek::Monday:= "понедельник" + ","; break;System::DayOfWeek::Tuesday:= "вторник" + ","; break;System::DayOfWeek::Wednesday:= "среда" + ","; break;System::DayOfWeek::Thursday:= "четверг" + ","; break;System::DayOfWeek::Friday:= "пятница" + ","; break;System::DayOfWeek::Saturday:= "суббота" + ","; break;

}->Text = WeekDayName;(System::DateTime::Now.TimeOfDay.Minutes < 10) {->Text = System::DateTime::Now.TimeOfDay.Hours + ":0" + System::DateTime::Now.TimeOfDay.Minutes;

}{->Text = System::DateTime::Now.TimeOfDay.Hours + ":" + System::DateTime::Now.TimeOfDay.Minutes;

}

}: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {::Exit();

}

};

}

Приложение 2


Программный код Form 2.h:(void)

{();= gcnew ArrayList();= gcnew ArrayList();>Height = 445;(gcnew NavigateCommand(browser, "http://google.com"));

//////choose_cli заполнение_cli->Items->Clear();

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Ф_И_О from autorun2.Клиенты ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Ф_И_О"));

}each (String^ name in names) {_cli->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}_tov->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Название_товара from autorun2.Товары where Категория = '"+categ->Text+"' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Название_товара"));

}each (String^ name in names) {_tov->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names1 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name1 in names1) {->Items->Add(name1);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names2 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name2 in names2) {->Items->Add(name2);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names3 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name3 in names3) {->Items->Add(name3);

}

}(Exception^ex) {::Show(ex->Message);

}>Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Категория"));

}each (String^ name in names) {>Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}_cli2->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select * from autorun2.Клиенты ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Ф_И_О"));

}each (String^ name in names) {_cli2->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}(txt_sum->Text == "") {>Enabled = false;

}

}:

~form2()

{(components)

{components;

}

}: ArrayList^ browserExecuted;: ArrayList^ browserUnexecuted;

#pragma endregion: void execute(Command^ command) {>Clear();>execute();>Add(command);

}: void undo() {(browserExecuted->Count == 0) {;

}^ command = dynamic_cast<Command^>(browserExecuted[browserExecuted->Count - 1]);>RemoveAt(browserExecuted->Count - 1);>undo();>Add(command);

}: void redo() {(browserUnexecuted->Count == 0) {;

}^ command = dynamic_cast<Command^>(browserUnexecuted[browserUnexecuted->Count - 1]);>RemoveAt(browserUnexecuted->Count - 1);>execute();>Add(command);

}

//Кнопка "выход": System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {::Exit();

}

//кнопка вывода информации из таблицы "клиенты"

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Лишние кнопки делаем невидимыми

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код клиента";

lbl2->Text = "Ф.И.О";

lbl3->Text = "Телефон";

lbl4->Text = "Автомобиль";

lbl5->Text = "WIN";

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_клиента,Ф_И_О as 'Ф.И.О',Телефон,Автомобиль,WIN from autorun2.Клиенты ;");

}

//кнопка вывода информации из таблицы "товары"

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние кнопки делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код товара";

lbl2->Text = "Категория";

lbl3->Text = "Брэнд";

lbl4->Text = "Наименование";

lbl5->Text = "Стоимость закупки";

lbl6->Text = "Стоимость продажи";

lbl7->Text = "Остаток шт.";

lbl8->Text = "Для автомобиля";

lbl9->Text = "Размеры";

lbl10->Text = "Характеристики";

//Чистим видимые текстбоксы при повторном нажатии на кнопку

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_товара as 'Код товара', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.', Для_авто as 'Для автомобиля',Размеры,Характеристики,Категория as 'Категория' from autorun2.Товары;");

}

//кнопка вывода информации из таблицы "поставщики"

private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {

Источник: https://www.bibliofond.ru/view.aspx?id=897012