Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/8972| Title: | Автоматизована система роботи інтернет-магазину дрібнооптової торгівлі промисловими товарами |
| Authors: | Чичужко, Марина Володимирівна Коріненко, Назарій Володимирович |
| Issue Date: | Jun-2022 |
| Abstract: | В даній кваліфікаційній роботі бакалавра було розроблено інтернет-магазин для дрібнооптової торгівлі товарами промислової групи. В рамках виконання роботи було проведено наступні види робіт: – знайдено та проаналізовано існуючі програми, які реалізують подібну функціональність; – досліджено предметну область, а саме, які є дані у компанії, що користуватиметься даним продуктом, які вимоги висуває компанія до інтернет-торгівлі; – проаналізовано діючі засоби розробки, а саме мова програмування Ruby, веб-фреймворк Rails, бібліотеки RubyOnRails для реалізації різноманітних необхідних для роботи будь-якого інтернет-магазину функцій; – спроектовано базу даних, яку стосується інформації, необхідної для діяльності інтернет-магазину; – розроблено веб-додаток, який створено з клієнтської та адміністративної частини і реалізує всі функції, наведені у завданні на виконання даної роботи. |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/8972 |
| Appears in Collections: | 174 Автоматизація, комп'ютерно-інтегровані технології та робототехніка (Автоматизація та комп'ютерно-інтегровані системи та компоненти) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| Б_174_2022_Коріненко.pdf Restricted Access | 1.4 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра робототехніки та спеціалізованих комп’ютерних систем
Пояснювальна записка
до кваліфікаційної роботи
освітнього ступеня «бакалавр»
на тему:
АВТОМАТИЗОВАНА СИСТЕМА РОБОТИ ІНТЕРНЕТ-МАГАЗИНУ
ДРІБНООПТОВОЇ ТОРГІВЛІ ПРОМИСЛОВИМИ ТОВАРАМИ
Виконав:студент __4__курсу, групи АКІТС-2099
Спеціальність
151 «Автоматизація та комп'ютерно-інтегровані
технології»
(шифр і назва напряму підготовки)
Студент_________Коріненко Н.В.______________
( прізвище та ініціали)
Керівник _________Чичужко М.В.______________
( прізвище та ініціали)
Рецензент _________Пономар Л.Л.__________
(прізвище та ініціали)
Черкаси 2022 року
ЗМІСТ
СПИСОК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ ................................. 5
Вступ...................................................................................................................... 6
1 ПОСТАНОВКА ЗАДАЧІ ................................................................................. 8
1.1 Опис існуючих програм для інтернет-магазинів .................................... 8
1.2 Опис предметної області ......................................................................... 12
1.3 Постановка завдання ................................................................................ 13
2 ОПИС ТЕХНОЛОГІЙ ТА ЗАСОБІВ РОЗРОБКИ ....................................... 16
2.1 Мова програмування Ruby ...................................................................... 16
2.1.1 Особливості мови програмування Ruby ......................................... 16
2.1.2 Бібліотеки Ruby ................................................................................. 19
2.2 Фреймворк Rails ....................................................................................... 20
2.3 Ajax ............................................................................................................ 29
3 ОПИС РОЗРОБКИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ........................... 31
3.1 Структура бази даних .............................................................................. 31
3.2 Використання gem бібліотек в додатку ................................................. 34
3.3 Структура програми ................................................................................. 36
ВИСНОВКИ ........................................................................................................ 41
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ .......................................................... 42
ДОДАТОК А ....................................................................................................... 45
ДОДАТОК Б ....................................................................................................... 46
ДОДАТОК В ....................................................................................................... 67
ДОДАТОК Г ....................................................................................................... 74
ЧДТУ.222079.001 ПЗ
Змн. Лист № докум. Підпис Дата
Розроб. Коріненко Автоматизована система роботи Літ. Лист Листів
Перевір. Чичужко інтернет-магазину дрібнооптової У 2 74
Реценз.
торгівлі промисловими товарами
Н. Контр. Пояснювальна записка ЧДТУ, АКІТС-2099
Затверд. Лукашенко
СПИСОК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ
AJAX Asynchronous JavaScript and XML
DOM Document Object Model
HTTP HyperText Transfer Protocol
JRE – Java Runtime Environment
UI User Interface
URL Uniform Resource Locator
ПЗ – Програмне забезпечення
ОС – Операційна система
Лист
ЧДТУ. 222079.001 ПЗ
5
Змн. Лист № докум. Підпис Дата
ВСТУП
В теперішній час інтернет-магазини повністю увійшли як в середовище
діяльності бізнесу, так і в кожноденний побут людей. Просування інтернет-
магазинів охопило повністю телебачення і пресу. Мало хто з наших громадян не
чув про "Розетку". Інтернет-магазини працюють для продажу всіх типів товарів,
як звичайної електроніки або побутової техніки, так і для таких непростих для
продажу через мережу інтернет речей, як одяг чи взуття. Вони охоплюють все
більше покупців, створюючи значно серйознішу конкуренцію звичайним
торговельним мережам, витісняючи частину з них з ринку роздрібних продажів.
Типова робота покупця в інтернет-магазині полягає в тому, що він може
проводити перегляд товару, включно з зовнішніми зображеннями, читати
короткий чи повний опис технічних характеристик, додавати до "кошика"
потрібний об’єм товару і здійснювати купівлю обраного товару, оплачувати або
банківською карткою через мережу інтернет (популярно на Заході), або при
доставці товару (популярно в Україні).
На ринку присутня величезна кількість реалізованих програмних
продуктів, які дають можливість організувати стандартний інтернет-магазин.
Вони включають в себе функції з оформлення роботи стандартних функцій. Крім
того, вони включають адміністративну частину, яка дає можливість реалізувати
оперативного керування магазином, додавати нові товари, обробляти замовлення
тощо. Але існуючі продукти буває важко адаптувати до специфіки конкретного
магазину, особливо, коли цей магазин суттєво відрізняється від стандарту. В
такому випадку (а це буває нерідко) необхідно використовувати роботу
програміста для того, щоб вдосконалити або навіть створити з початку продукт,
який реалізував би всі вимоги користувача.
Дана задача може бути простою і складною одночасно. Простою з того
боку, що зрозумілими є багато речей відносно того, що і яким чином робити. Але
завжди існують нюанси, для вирішення яких програмісту необхідно достатньо
попрацювати, щоб користувач відчував себе по-справжньому задоволеним після
покупки.
Лист
ЧДТУ. 222079.001 ПЗ
6
Змн. Лист № докум. Підпис Дата
Розробка інтернет-магазину полягає в проектуванні структури бази даних,
створення програмного забезпечення, оформлення інтерфейсу. Вона вимагає
вивчення інтернет-протоколів, веб-технологій в достатньо глибокому розумінні.
Тобто, дана розробка включає широкий спектр дисциплін, які входять до
навчального плану бакалавра.
Лист
ЧДТУ. 222079.001 ПЗ
7
Змн. Лист № докум. Підпис Дата
1 ПОСТАНОВКА ЗАДАЧІ
1.1 Опис існуючих програм для інтернет-магазинів
Сучасний інтернет-магазин може виконувати в себе значну кількість
функцій. В різних магазинах закладено певний набір, в залежності від потреб
клієнтів. Функції можуть включати в себе процедури роботи з товаром, фінансові
функції, процедуру звітності, розділ замовлення і кошик тощо. Зміст функцій
інтернет-магазину може складатися з:
Роботи з товаром :
–каталог товарів з складними будовами розділів;
– необмежену кількість позицій товару і каталогів товару;
– створення автоматично унікального коду товару для його пошуку в базі
та ідентифікації за цим номером при замовленні;
– довільний текст функцій кожного товару;
– відображення зовнішнього вигляду при перегляді товару;
– вбудовування відеороликів з відеооглядами покупців, наприклад, мережа
YouTube;
– побудова динамічних блоків для показу реклами і взаємозв'язку між
схожими товарами - розділ "хіти продажів", розділ "нові додані товари", розділ
"рекомендовані товари ", розділ "акційні товари" і багато інших функцій;
– рейтинг товару в інтернет магазині і в цілому в мережі;
– відгуки покупців про товар (як на основі відгуків із соціальних мереж,
так і відгуками з сайту);
– можливість створювати атрибути товару, що дозволяє додати один товар
і, використовуючи атрибути, створити його варіації. Наприклад товар –
навушники, а його атрибут – довжина шнура;
– різні способи відображення товару: зображення у вигляді таблиці, у
вигляді сітки, показ товарів із каталогів інтернет-магазину в режимі слайд-шоу;
– інформація про складські запаси товару, що дозволяє завжди
контролювати наявність товарів у інтернет-магазині, і виключає замовлення
Лист
ЧДТУ. 222079.001 ПЗ
8
Змн. Лист № докум. Підпис Дата
відсутнього товару;
– створення заданих характеристик і атрибутів для товарів з подальшим
пошуком за заданою його характеристикою;
– фільтрація каталогу за атрибутами товарів;
– сортування каталогу товарів за: назвою, ціною, рейтингом, кількістю
продажів, датою створення, кількістю переглядів;
– можливість імпорту списку товарів з Excel і 1-С в каталог магазину;
– експорт списку товарів у файл;
– функція "Список бажань" дозволяє додати обраний товар у свій список
бажань для подальшого придбання;
– додати товар до порівняння – допомагає клієнтам знайти відмінності між
різними товарами.
Грошові функції:
– інтеграція з поширеними платіжними системами - Приват24, PayPal та
інші;
– створення рахунків безпосередньо на сайті – направлення рахунків
покупцю, рахунок на роздрук, рахунок для керівництва магазину;
– система заохочень, дисконтів і знижок;
– побудова системи знижок залежно від суми товарів, кількості товарів в
замовленні користувача, призначення товару та інших параметрів;
– можливість оплати дисконтними картками з їх автоматичним створенням
і налаштуванням строку активності дисконтної картки;
– впровадження різних груп клієнтів з різними ціновими запросами для
кожної групи;
– облік податкових ставок. Встановлюється як для конкретних країн, так і
для конкретного регіону країни;
– автоматичне встановлення вартості послуг з доставки товару в
залежності від розміру, типу і ваги товару;
– функція автоматичного складання вартості товару, залежно від типу
покупця, акції, знижки, наявності транспортних витрат та податків;
Лист
ЧДТУ. 222079.001 ПЗ
9
Змн. Лист № докум. Підпис Дата
– можливість зазначення собівартості товару, рекомендованої націнки, ціни
продажу та інших видів націнок для різних цілей і для конкретного товару . На
основі цих даних визначається прибуток від продажу конкретного товару;
– автоматичний перерахунок вартості, залежно від курсу валют, за даними
міжнародних фінансових систем, наприклад Yahoo! Finance;
Модуль звітності:
– перегляд фінансових форм про різні види прибутку з терміном деталізації
від року до години;
– модуль прогнозування обсягу продажів – прогнозує очікуваний розмір
продажу наперед на основі звітів про обсяг минулих продажів;
– перегляд службової інформації про перебіг статусів замовлень;
– статистика переглядів інформації;
– перегляд походження відвідувачів сайту;
– інформація про останні відвідини сайту клієнтами (хто і звідки відвідував
веб-ресурс);
– системний журнал, в якому розміщаються всі дії проведені на сайті як
клієнтами, так і співробітниками магазину;
– інтеграція інтернет-магазину з мережею Google Analytics, що дозволяє
формувати більш детальні звіти про дії клієнтів на сайті;
Модуль замовлення і кошик:
– можливість покупки товару без авторизації на сайті (замовлення
стороннім відвідувачем товару в інтернет-магазині);
– при замовленні товару стороннім користувачем автоматично створюється
стандартний обліковий запис для цього користувача і реалізується вхід на сайт;
– сповіщення працівників магазину про створення нового замовлення по e-
mail і SMS;
– можливість надання замовленню різних статусів, з метою технічної
обробки замовлення. Наприклад, замовлення в обробці, в процесі оформлення,
очікування оплати, гроші отримані, замовлення в процесі доставки, товар
доставлено. Статуси формуються і налаштовуються конкретно під вас і завдань і
Лист
ЧДТУ. 222079.001 ПЗ
10
Змн. Лист № докум. Підпис Дата
способу обробки замовлень;
– інформування по e-mail або SMS покупця та працівника магазину про
зміну статусу замовлень;
– проста корзина замовлень, в якій можливо редагувати кількість товарів,
видаляти зайві товари і переглядати сумму замовлення з урахуванням акцій,
дисконтів та інших факторів, що впливають на вартість замовлення;
– простий, повністю налаштовуємий під покупця інтерфейс роботи з
замовленнями;
– перегляд покупцем стану замовлення.
В мережі інтернет існує багато онлайнових сервісів, які дають можливість
створити свій інтернет-магазин, так званих конструкторів-шаблонів інтернет-
магазинів. Наприклад, Skynell [14]. Він дає можливість розробити дизайн і
структуру магазину без навичок програмування та інших спеціальних знань.
Користувач може самостійно розробити інтернет-магазин, додати товари без
обмежень (при цьому повні можливості інтернет-магазину доступні всім
користувачам безкоштовно) і включити його до роботи (рисунок 1.1).
Рисунок 1.1 – Вигляд конструктору-шаблону інтернет-магазинів Skynell
Лист
ЧДТУ. 222079.001 ПЗ
11
Змн. Лист № докум. Підпис Дата
Система дає можливості для багатого оформлення, зручного керування
сайтом та залучення нових клієнтів, а саме готові теми для можливих способів
інтернет продажів, можливість створити дизайн інтернет-магазину самостійно,
безліч варіантів кольорів, шрифтів і стилів для тексту, додати в інтернет-магазин
товари і послуги майже без обмежень, здійснити багатопотокове завантаження
товарів або імпорт переліку товарів у форматах XML тощо, стабільний хостинг,
архівацію даних на декількох розподілених серверах в світових дата центрах,
підтримка SEO параметрів для розміщення в пошукових системах та залучення
цільових відвідувачів з різних пошукових систем Google,
повна інтеграція з каталогом, що дозволяє залучати покупців як з пошукових
систем так і з світового каталогу Skynell.
До недоліку системи, типово, як для інших систем, можна вважати
складність в налаштуванні під деякі незвичні вимоги користувача, адже не всі
користувачі працюють на типових інтернет-магазинах, буває, що їх функції є
дуже оригінальними.
1.2 Опис предметної області
Розроблюваний в роботі інтернет-магазин дрібнооптової торгівлі
планується для продажу широкої номенклатури промислових товарів кінцевим
роздрібним споживачам. На підприємстві, яке буде працювати на даному
інтернет-магазині, застосовується програма складського обліку, яка не
забезпечує прямий доступ до інформації бази, але дає можливість експортувати
списки товарів в xls-файли.
Кількість товарів у номенклатурі становить до п’яти тисяч найменувань.
Вони поділені за рубриками. В рубриках існують підрубрики (може бути
вкладеність до 3-х рівнів). Кожен товар має власний артикул, який вміщає в себе
в тому числі рубрику і підрубрики товару. Товари можуть знаходитись як на
центральному складі, так і на різноманітних торгівельних точках.
Стан товарів оновлюється щоденно. так само можуть з’являтися нові
Лист
ЧДТУ. 222079.001 ПЗ
12
Змн. Лист № докум. Підпис Дата
товари, яких раніше не було на складі, тобто повністю нові товари. Таких товарів
може бути до сотні за тиждень.
Підприємство має постійних клієнтів, які є дрібнооптовими покупцями.
Вони організовують продажі, вивчаючі прайс-листи чи отримуючи дані
безпосередньо в представництвах фірми. Це зменшує зручність, оперативність у
роботі клієнтів, а також вимагає додаткових годин праці з боку працівників
фірми на контактування з клієнтами. Використання інтернет-магазину допомогло
б зменшити витрати праці робітників фірми з одного боку, і зробило б роботу
покупців більш зручнішою з іншого боку.
Задача реалізації інтернет-магазину полягає в оперативному і простому
інформуванні клієнтів про активні у фірми товари та їх ціни, а також в створенні
самими клієнтами замовлень у вигляді, зрозумілому для оброблення
працівниками фірми. Після створення замовлення менеджер магазину повинен
перетелефонувати до клієнта, сповістити його про те, що його замовлення в
роботі та надавши інформацію про всі необхідні деталі, в тому числі стосовно
механізму оплати. Потім менеджер має скласти дане замовлення та
перетелефонувати до клієнта, проінформувавши його про можливість отримати
товар.
1.3 Постановка завдання
Завданням даної бакалаврської роботи є розробка інтернет-магазину
дрібнооптової торгівлі, який призначений для реалізації широкої номенклатури
промислових товарів конкретному колу клієнтів.
Програма повинна бути створена з двох частин – клієнтської та
адміністративної.
Клієнтська частина програми повинна реалізовувати для клієнта, який не
залогувався в системі:
– переглядати рубрики та підрубрики;
– перебувати у системі (залогуватися в системі він може лише після дозволу
Лист
ЧДТУ. 222079.001 ПЗ
13
Змн. Лист № докум. Підпис Дата
адміністратора);
– залогуватися в систему ("залогінитись"), якщо покупець зареєструвався в
системі і адміністратор надав для нього допуск до системи.
Клієнтська частина програми повинна реалізувати для клієнта, який увійшов
у систему:
– переглядати каталог товарів, активних на даний час, для кожної рубрики і
підрубрики із наведенням повної назви товару, ціни, а також зображення товару;
– переглядати зображення товару у збільшеному розмірі;
– заносити товар до корзини для купівлі із вказанням кількості товару;
– бачити склад товарів, які додані до корзини, з кількістю та вартістю
кожної позиції товару;
– бачити повну вартість товарів, доданих до корзини;
– видаляти частину товарів з корзини;
– переглядати зміст корзини у вигляді таблиці з фотографією малого
розміру, ціною, назвою, вартістю;
– редагувати кількість одиниць вибраного товару при відкритті корзини у
вигляді таблиці;
– оформляти доставку товарів;
– одержувати повідомлення про оформлену доставку електронною поштою.
Адміністративна частина програми повинна давати функції менеджеру
фірми, який увійшов у систему з використанням адміністративного логіну:
– переглядати весь каталог товарів для кожної рубрики і підрубрики із
виведенням повної назви товару, артикулу, ціни, а також зображення товару;
– додавати зображення товару;
– імпортувати дані про активні товари та їх вартість з файлу MS Excel;
– підтверджувати дозвіл на роботу з інтернет-магазином для користувачів,
які зареєстровані у системі;
– переглядати оформлені клієнтами замовлення;
– друкувати інформацію про замовлення, включаючи перелік товарів з їх
реквізитами;
Лист
ЧДТУ. 222079.001 ПЗ
14
Змн. Лист № докум. Підпис Дата
– позначати замовлення як такі, що знаходяться в роботі або вже
доставлені.
Інтерфейс програма повинен бути інтуїтивно зрозумілим як для клієнта,
так і для адміністратора і працювати без перекосів на моніторах комп'ютерів з
діагоналлю 13'' та більше.
Лист
ЧДТУ. 222079.001 ПЗ
15
Змн. Лист № докум. Підпис Дата
2 ОПИС ТЕХНОЛОГІЙ ТА ЗАСОБІВ РОЗРОБКИ
2.1 Мова програмування Ruby
Ruby – сучасна повністю динамічна мова програмування з відкритим
вихідним кодом з напрямленістю на простоту і продуктивність. Вона має
елегантний синтаксис, який приємно читати і просто писати. Ruby - це досить
ретельно збалансована мова програмування. Її творець Мацумото Юкіхіро (так
само відомий як "Matz"), сполучив частини його улюблених мов (Perl, Smalltalk,
Eiffel, Ada і Lisp) щоб створити нову мову, в якій парадигма функціонального
програмування доповнюється принципами імперативного програмування.
З часу випуску релізу версії в 1995 році, до Ruby залучились програмісти з
усього світу. У 2006 році Ruby отримала світове визнання. У найбільших країнах
по всьому світу активно працюють групи користувачів Ruby, а конференції,
присвячені Ruby, заповнені на повну.
Ruby-Talk, основний форум для обговорення мови Ruby, становив в
середньому 200 повідомлень щодня в 2020 році. В останні роки ця кількість
залишається постійною, незважаючи, що співтовариство стало використовувати
кілька тематичних форумів замість одного загального.
Індекс TIOBE, який визначає зростання популярності мов програмування,
ставить Ruby на 9 місце серед міжнародних мов програмування. Багато в чому,
зростання популярності мови забезпечує популярність програмного програм,
написаних на Ruby, особливо – Ruby on Rails, середовищі розробки більшості
відомих веб-додатків [2a].
Ruby зазвичай має абсолютно відкритий код. Відкритий для безоплатного
використання, корегування, копіювання та розповсюдження.
2.1.1 Особливості мови програмування Ruby
У Ruby все – об'єкт. Для кожної долі інформації або коду можуть бути
задані власні складові і дії. В об'єктно-орієнтованому програмуванні складові
називаються змінними об'єкту, а дії – методами. Найчистіше об'єктно-
орієнтований підхід Ruby може бути реалізований парою рядків коду, в яких
Лист
ЧДТУ. 222079.001 ПЗ
16
Змн. Лист № докум. Підпис Дата
проводяться дії над числом.
5.times { print "Ми любимо Ruby ! Ruby - це чудово ! " }
У багатьох мовах числа та інші прості типи даних не відносять до об'єктів.
Ruby під впливом мови Smalltalk дозволяє встановити методи й перемінні об'єкту
всім типам даних. Це спрощує застосування Ruby, оскільки правила підходять
до об'єктів всього Ruby.
Ruby дуже гнучка мова, оскільки вона дає можливість його користувачам
вільно модифікувати її частини. Основні частини складових Ruby можуть бути
ирізані або перевизначені за бажанням. А існуючі частини підлягають
модифікуванню. Ruby намагається майже не обмежувати користувача.
Наприклад, додавання реалізується операцією плюс (+). Але, якщо
програміст бажає використовувати для цього більш зрозуміле слово plus – можна
створити такий метод прямо в Numeric, внутрішній клас мови програмування
Ruby.
class Numeric
def plus ( x )
self . + ( x )
end
end
y = 5.plus 6
Оператори в Ruby – представляють синтаксичний «цукор» для методів. Їх
також можна модифікувати.
Блоки в Ruby також є простим джерелом модифікації. Програміст може
внести замикання в будь-який метод, задаючи, як цей метод повинен діяти.
Замикання опсиується блок і є однією з найбільш простих конструкцій які
прийшли у світ Ruby із відомих імперативних мов програмування, таких як PHP
або Visual Basic.
Створення блоків було закладене в функціональних мовах програмування.
Matz говорив, "замиканнями в рубі я бажав віддати авторитету культурі мови
Lisp4".
Лист
ЧДТУ. 222079.001 ПЗ
17
Змн. Лист № докум. Підпис Дата
search_engines =
% w [ Google Yahoo MSN ] . map do | engine |
"http://www . " + Engine.downcase + ". Com "
end
У коді вище блок занесено всередину конструкції do ... end. Метод map
реалізує блок коду в представленому списку слів. Багато інших методів в Ruby
створюють шлях, відкритий для програміста, щоб той створив власний блок
коду, який детально описує, що той має зробити.
На відміну від багатьох об'єктно- орієнтованих мов, Ruby спеціально
дозволяє лише одиночне спадкування. Але Ruby також реалізує концепцію
модулів (які називаються категоріями в Objective-C). Модулі – це набори
методів.
Класи можуть вільно складатися з модулів і отримувати всі його методи.
Наприклад, будь-який клас, який забезпечує метод each, може застосувати
модуль Enumerable, який додасть набір методів, що застосовують each для
створення циклів.
class MyArray
include Enumerable
end
В основному, рубісти вважають це більш прозорим, ніж множинне
спадкування, яке на справді може бути достатньо складним і мати будь-які
обмеження.
Оскільки в Ruby часто пунктуація існує досить рідко і зазвичай існують
англійські слова в якості ключових, деякі знаки пунктуації застосовано для
прикраси Ruby. Ruby не вимагає оголошення змінних. У ньому
використовуються звичайні конвенції іменування, для того щоб розділити
площини видимості змінних.
var може бути як локальною змінною.
$ var глобальна змінна.
@ var змінна об'єкта.
Лист
ЧДТУ. 222079.001 ПЗ
18
Змн. Лист № докум. Підпис Дата
Дана символіка спрощує читабельність, дозволяючи програмісту просто
ідентифікувати роль окремої змінної. Це також дозволяє не застосовувати
складне self . для кожного об'єкту.
Ruby наповнений іншими особливостями і конструкціями, наведемо деякі з
них:
– у Ruby представлений дійсний mark-and-sweep (познач і очисти)
збирач зайвого для всіх Ruby об'єктів. Не потрібно вручну контролювати
кількість посилань в сторонніх бібліотеках. Як зазначає Matz , "Це корисніше для
вашого здоров'я";
– у Ruby є конструкції для компіляції виключень, як в Java або
Python, які дозволяють логічніше працювати з помилками;
– писати розширення на C в Ruby легше ніж в Perl або Python за
допомогою досить елегантного API для виклику Ruby з C. Він включає в себе
виклики для додавання Ruby в програмне забезпечення, щоб застосовувати його
як скриптову мову. Також працює інтерфейс SWIG;
– Ruby може закачувати сторонні бібліотеки динамічно, якщо
реалізує операційна система;
– у Ruby реалізовані окремі від операційної системи потоки. Таким
чином, на будь-яких платформах, де працює Ruby, є можливість застосовувати
багатопоточність, не залежно від того, чи реалізує дана система потоки, чи ні.
Можна використовувати процеси багатопоточності навіть в MS –DOS;
– Ruby відрізняється простою переносимістю: він був розроблений
здебільшого на GNU/Linux, але працює на всіх типах UNIX, Mac OS X, DOS,
BeOS, Windows 95/98/Me/NT XP/Vista//2000/ 8, OS/2 і так далі.
2.1.2 Бібліотеки Ruby
Як і в відомих мовах програмування, в Рубі можна застосовувати широкий
набір сторонніх бібліотек. Значна частина з них реалізована у вигляді гема.
RubyGems – менеджер пакетів Рубі, побудований для спрощення процесу
створення, перенесення та встановлення бібліотек (в якомусь сенсі це
Лист
ЧДТУ. 222079.001 ПЗ
19
Змн. Лист № докум. Підпис Дата
розподілений пакетний менеджер, який має багато спільного із apt-get, але
націлений на модулі Рубі). З появи версії Ruby 1.9 - RubyGems присутні за
замовчуванням, хоча для попередніх версій його необхідно було встановлювати
вручну.
Деякі інші бібліотеки працюють як архіви (ZIP або tar.gz ) вихідного коду.
Процес установки може бути досить відмінним, зазвичай інструкції з установки
знаходяться в файлі README або INSTALL.
Основне місце, де розміщено бібліотеки – RubyGems.org, зберігає
бібліотеки Рубі у вигляді гемів. Можна знайти прямо на сайті або застосувати
команду gem.
2.2 Фреймворк Rails
З часів свого створення в 2004 році, Ruby on Rails зразу став одним з
найбільш відомих і разповсюджених фреймворків для створення динамічних веб-
додатків. Користувачі Rails реалізують широкий діапазон завдань, починаючи з
стартапів і переходячи до величезних компаній: 37signals, GitHub, Shopify,
Scribd, Groupon, Hulu, Twitter, LivingSocial, Yellow Pages – перелік сайтів, що
побудовані на Rails продовжує зростати. Також існують інтенет-магазини з
профілем розробки, що спеціалізуються на Rails, такі як Pivotal Labs, ENTP,
thoughtbot, і Hashrocket, плюс безліч різних викладачів, консультантів та
контрагенти [3a].
Що ж зробило Rails таким популярним? По-перше, Ruby on Rails повністю
відкритий, доступний в силу MIT License, і, як результат, його можна встановити
і використовувати безкоштовно. Rails також має неабиякий успіх завдяки своїм
витонченим і компактном дизайном; завдячуючи податливості мови Ruby, що
базується в його основі, Rails фактично являє предметно-орієнтовану мову
(domain-specific language) для створення веб-додатків. У результаті достатньо
спільних завдань веб-програмування, таких, як компіляція HTML, побудова
моделей даних і маршрутизація URI – легкі з Rails, а фінальний код програм
короткий і читабельний.
Лист
ЧДТУ. 222079.001 ПЗ
20
Змн. Лист № докум. Підпис Дата
Rails також активно адаптується до сучасних тенденцій у веб-технологіях.
Наприклад, Rails був одним з перших, хто в цілому реалізував архітектурний
стиль REST для веб-додатків. І коли інші фреймворки впевнено розробляють
нові техніки, David Heinemeier Hansson - творець Rails і активна група Rails не
зупиняючись використовувати їх ідеї. Мабуть, найбільш цікавим прикладом є
обєднання Rails і Merb (конкуруюча веб-платформа), так що Rails тепер включає
переваги від модульної конструкції Merb, надійного API, а також підвищеної
продуктивності .
Нарешті, Rails переважає від надзвичайно захопленої і різноманітної
спільноти. Результати: тисячі open-source співрозробників, добре популярні
конференції, значна кількість гемів (автономні вирішення простих проблем,
таких як покроковий висновок, і завантаження зображень), суттєвий набір
інформативних блогів і набір форумів і каналів IRC. Значна кількість активних
програмістів Rails також спрощує обробку існуючих помилок додатків: алгоритм
– "Шукай в Google інформацію про помилку" майже завжди находить відповідне
повідомлення в блозі чи гілці відповідного форуму.
Rails пропонує задану структуру проекту, в якому реалізується розробка
додатку (рисунок 2.1). В стандартній будові Rails додатку є директорія з назвою
app/, що складається з трьох підкаталогів: models, views і controllers. Це натяк на
те, що Rails володіє архітектурної схемою модель-представлення-контролер
(MVC) (рисунок 2.2), яка забезпечує поділ між "логікою предметної області" (яка
також зветься "бізнес-логікою") від логіки внесення і логіки представлення,
відповідно до графічного інтерфейсу користувача (GUI). У випадку веб-додатків,
"логіка предметної області" стандартно складається з моделі інформації для
таких речей як статті, користувачі, продукти, а GUI це лише веб-сторінка в
браузері.
Взаємодіючи з програмним додатком Rails, браузер формує запит, який
приймається веб-сервером і надсилається контролеру Rails, який відповідає за те,
що робити далі. У деяких випадках контролер відразу візуалізує представлення,
яке є шаблоном, що конвертує отримане в HTML і відсилає назад до браузеру.
Лист
ЧДТУ. 222079.001 ПЗ
21
Змн. Лист № докум. Підпис Дата
Більш типово для динамічних сайтів, коли контролер працює з моделлю, яка є
об'єктом Ruby, який представляє собою елемент сайту (такий, як користувач) і
контролює комунікацію з базою даних. Після виклику моделі, контролер
наступне візуалізує представлення і повертає всю веб-сторінку браузеру як
HTML.
Рисунок 2.1 – Структура проекту Rails
Лист
ЧДТУ. 222079.001 ПЗ
22
Змн. Лист № докум. Підпис Дата
Рисунок 2.2 – Схематичне зображення модель-представлення-контролер (MVC)
архітектури
Кожна директорія має своє призначення, що приведено в таблиці 2.1
Таблиця 2.1 – Огляд папок Rails за замовчуванням
Файл/Папка Призначення
app/ Основний код додатку (app), складається з моделей,
контролерів, представлень і хелперві
app/assets "Активи" додатку, а саме каскадні таблиці стилів (CSS),
JavaScript файли та зображення
bin/ Бінарні виконувані файли
config/ Конфігурація додатки
db/ Файли бази даних додатків
doc/ Документація для програми
lib/ Бібліотека модулів
lib/assets Бібліотека "активів", таких як каскадні таблиці стилів (CSS),
JavaScript файли та зображення
log/ Файли логів додатки
Лист
ЧДТУ. 222079.001 ПЗ
23
Змн. Лист № докум. Підпис Дата
public/ Вільно доступні дані (наприклад , веб- браузерам ), такі як
сторінки помилок додатки
bin/rails Програма для генерації коду, створення консольних сесій
або запуску локального веб-сервера
test/ Тести додатку
tmp/ Тимчасові файли
vendor/ Код сторонніх розробників, сторонні плагіни і геми
vendor/assets Сторонні "активи", а саме каскадні таблиці стилів (CSS),
JavaScript файли та зображення
Rakefile Службові завдання, створені за допомогою rake-команди
Gemfile Геми, відповідні даному додатку
Gemfile.lock Блокуючий список гемів, який реалізує використання всіма
копіями додатку повністю однакових версій гемів
config.ru Конфігураційний файл для Rack middleware
.gitignore Правила опису файлів, які повинні ігноруватися Git
Action Controller – це C в абревіатурі MVC. Після того, як роутинг
встановить, який контролер застосовувати для обробки запиту, контролер є
відповідальним за реалізацію запиту і створення відповідної відповіді. Зазвичай,
Action Controller робить більшу частину нудної роботи і використовує прості
способи, щоб зробити це по можливості максимально просто.
Для більшості додатків, заснованих на REST, контролер формує запит (це
невидимо для розробника), закачує або зберігає дані в моделі і використовує
view для будови результуючого HTML. Якщо контролеру слід працювати трохи
по іншому – не проблема, це всього лише типовий спосіб роботи контролера.
Таким чином, можна представити собі контролер як зєднання між
моделями і view. Він робить інформацію моделі доступними для view, так що
можуть відображатися ці дані користувачеві, і він зберігає або модифікує дані від
користувача в модель.
Контролер – це клас Рубі, переданий від ApplicationController і включає
Лист
ЧДТУ. 222079.001 ПЗ
24
Змн. Лист № докум. Підпис Дата
методи, як і будь-який інший клас. Коли додаток формує запит, роутинг
встановить, який контролер та екшн запустити, потім Rails будує екземпляр
цього контролера і сформує метод з ім'ям , як у екшна.
class ClientsController < ApplicationController
def new
end
end
Як варіант, якщо працівник перейде в /clients/new у даному додатку, щоб
створити нового користувача, Rails побудує екземпляр ClientsController і виконає
метод new. Зрозуміло, що порожній метод з наведеного прикладу буде добре
працювати, так як Rails за замовчуванням виконає view new.html.erb, якщо екшн
не заявить інше.
ApplicationController успадковується від ActionController::Base, який
описує кілька корисних методів. Тільки public методи можуть бути виконані як
екшени. Хорошою практикою є зження області видимості методів, не
призначених працювати, як екшени, таких, як сторонні методи і фільтри.
Можливо, є необхідність отримати доступ до даних, створених
користувачем, або до інших даних в екшнах контролера. Є два типи параметрів,
працюючих у веб додатках. Перший – це параметри, передані як частина URL,
так звані параметрами строки запиту. Строка запиту завжди стоїть після "?" в
URL . Другий тип параметрів класично згадуються як дані POST. Ця інформація
зазвичай передається з форми HTML, що надається користувачем. Вони
називаються даними POST, так як зазвичай надсилаються тільки як частина
HTTP запиту POST. Rails не знаходить будь-яких відмінностей між строковими
параметрами і POST параметрами, і ті і інші доступні в хеші params у контролері.
У модуля є сесія для кожного користувача в якій можливо зберігати
короткі порції даних, які будуть розміщені між запитами. Сесія доступна тільки в
контролері і у view, і може застосовувати один з декількох механізмів зберігання:
ActionDispatch::Session::CookieStore - зберігає всі дані на клієнті;
ActiveRecord::SessionStore – Зберігає інформацію в базі даних з
Лист
ЧДТУ. 222079.001 ПЗ
25
Змн. Лист № докум. Підпис Дата
використанням Active Record;
ActionDispatch::Session::CacheStore – зберігає інформацію в кеші Rails;
ActionDispatch::Session::MemCacheStore – зберігає інформацію в кластері
Memcached (ця реалізація - продукт старих версій, замість неї правильніше
розглянути використання сховища кеша).
Всі сесії роблять з куками для зберігання унікального ID кожної сесії
(обов'язково потрібно застосовувати куки, Rails не може передавати ID сесії в
URL, так як це порушує надійність роботи).
Для більшості способів зберігання цей ID застосовується для пошуку даних
сесії на сервері, а саме в таблиці бази даних. Існує один виняток – це дефолтне і
рекомендоване існування сесії – CookieStore – яке зберігає всю інформацію сесії
в куках (ID залишається доступним, якщо він активний). Переваги цього в
простоті, відсутності модифікації для нового додатка в порядку використання
сесій. Інформація в куках криптографічно підписана, що створює їх захищеними
від злому, але не зашифровані, тому будь-хто, хто отримав до них доступ, може
вивчити їх вміст, але не модифікувати їх (Rails не прийме їх, якщо вони були
модифіковані).
CookieStore можуть зберігати до 4kB даних – значно менше, ніж інші - але
цього майже вистачає. Зберігання більшого об’єму даних у сесії не
рекомендується, незважаючи на те, як зберігаються вони у додатку. Слід
навмисно уникати зберігання в сесії великих об'єктів (нічого, крім простих
об'єктів Рубі, наприклад форми моделей), так як сервер може не об’єднати їх між
запитами, що призведе до помилки.
Якщо сесії користувачів не створюють критичні дані або відсутня
необхідність в її збереженні на довгий період (скажімо, якщо вони
використовуються для повідомлень у флеш), можна пропонувати використання
ActionDispatch::Session::CacheStore. Цей метод збереже сесії з використанням
реалізації кешу, яку можна адаптувати для свого додатку. Перевага метода в
тому, що для зберігання сесій можна застосовувати існуючу інфраструктуру
кешування без задіяння додаткових налаштувань або адміністрування. Недоліки,
Лист
ЧДТУ. 222079.001 ПЗ
26
Змн. Лист № докум. Підпис Дата
зрозуміло, в тому, що сесії стануть недовговічними і зазвичай зникати.
Ресурсний роутинг дозволяє просто оголошувати всі звичайні маршрути
для наведеного ресурсного контролера. Замість призначення окремих маршрутів
для екшнів index, show, new, edit, create, update і delete, ресурсний маршрут
призначає їх у єдиному рядку коду.
Браузери запитують дані від Rails, проводячи запит по URL,
використовуючи стандартний метод HTTP, такий як GET, PATCH, POST, PUT і
DELETE. Кожен метод - це запит на створення операції з ресурсом. Ресурсний
маршрут об’єднує безліч споріднених запитів з екшн в одному контролері.
У Rails ресурсний маршрут створює з'єднання між методами HTTP і URL
до активного екшн контролера. Стандартно, кожен екшен також з'єднується з
заданою операцією CRUD в базі даних.
Маршрути Rails встановлюються в тому порядку, в якому вони визначені,
тому, якщо є get 'photos/poll' до resources :photos маршрут для екшна show у
позиції resources співпаде до рядка get. Щоб це замінити, перемістіть рядок Get
над рядком resources, щоб вона порівнювалася першою.
Створення ресурсного маршруту також створить безліч хелперів
доступними в контролері програми. У випадку з resources :photos:
new_photo_path повертає /photos/new;
photos_path повертає /photos;
photo_path (:id) повертає /photos/:id (наприклад, photo_path (10) повертає
/photos/10);
edit_photo_path (:id) повертає /photos/:id/edit (наприклад, edit_photo_path
(10) повертає /photos/10/edit).
Кожен з цих хелперів має стандартний хелпер _url (такий як photos_url),
який повертає той же маршрут з створеним поточними хостом, портом і
префіксом шляху.
Оскільки роутер застосовує як метод HTTP, так і URL, чотири URL
поєднують з сімома різними екшн.
Action Mailer реалізує відправку електронних листів з додаткА,
Лист
ЧДТУ. 222079.001 ПЗ
27
Змн. Лист № докум. Підпис Дата
застосовуючи модель і view розсильників. Таким чином, в Rails електронна
пошта застосовується з допомогою створення інструментів розсилки,
успадкованих від ActionMailer::Base, і формуються в app/mailers. Ці інструменти
розсилки мають пов'язані view, які формуються серед view контролерів у
app/views.
Файлопровод (Asset Pipeline) являє собою фреймворк для з'єднання та
мінімізації або скорочення ресурсів JavaScript і CSS. Він також створює
можливість писати ці ресурси на інших мовах, таких як CoffeeScript, Sass і ERB.
До Rails 3.1 ці можливості додавалися сторонніми бібліотеками Ruby,
таким як Jammit і Sprockets. Rails 3.1 інтегрований зазвичай із Sprockets за
допомогою Action Pack, який має похідність від гема Sprockets.
Становлення файлопровода як типової особливості Rails означає, що всі
розробники можуть скористатися превагами того, що їх ресурси будуть за
умовчуванням оброблені, стиснуті і зменшені за допомогою типової бібліотеки,
Sprockets. Це частина стратегії "просто за умовчанням", як було сказано David
Heinemeier Hanson на представленні RailsConf 2020 року.
Файлопровод зазвичай в Rails 3.1 включений. Він може бути відключений
в версії /application.rb, якщо розмістити наступний рядок у опису класу програми:
config.assets.enabled = false.
Першою особливістю файлопровода є поєднання ресурсів. Це критично в
середовищі виробництва, оскільки може скоротити кількість запитів, необхідних
браузеру для побудови сторінок. Браузери обмежені в кількості запитів, які вони
здатні виконати паралельно, тому скорочення запитів може означати швидке
завантаження розробленої програми.
Rails 2.x представив можливість з'єднувати ресурси JavaScript і CSS, при
поміщенні :cache =>true в тілі методів stylesheet_link_tag і javascript_include_tag.
Але цей способ мав значний перелік обмежень. Наприклад, не можна було
сформувати кеш заздалегідь, не можна було явно задіяти ресурси, сформовані
сторонніми бібліотеками.
Починаючи з версії 3.1, стандартно Rails з'єднує всі JavaScript файли в
Лист
ЧДТУ. 222079.001 ПЗ
28
Змн. Лист № докум. Підпис Дата
один типовий файл JS і всі CSS файли в один стандартний файл CSS. Можна
сконфігурувати цю стратегію, згрупувавши файли довільним способом. В
production Rails інтегрує мітку MD5 в кожне ім'я файлу, в результаті файл
кешуєтся браузером. Кеш можна сформувати недійсним, змінивши цю мітку, що
реалізується автоматично кожного разу, коли змінюється склад файлу.
Другою функцією файлопроводу є мінімізація або стиснення ресурсів. Для
файлів CSS це реалізується шляхом видалення пробілів і коментарів. Для
JavaScript можуть бути реалізовані більш складні процеси. Можна вибирати з
бібліотеки вбудованих опцій або визначити свої.
Третьою особливістю файлопровода є те, що він дозволяє формувати ці
ресурси на мові вищого рівня з наступною прекомпіляцією до фактичного
ресурсу, який виконується безпосередньо при роботі програми. Підтримувані
мови за замовчуванням становлять CoffeeScript для JavaScript, Sass для CSS і
ERB для обох.
2.3 Ajax
AJAX (аякс) – це web технологія, що реалізує взаємодію з сервером без
перезавантаження сторінки. Прикладами програми служать перевірка імені
працівник на зайнятість при реєстрації, відправка позиції у кошик без
перезавантаження, google suggest і так далі. AJAX створений на об'єкті
XMLHttpRequest. Як видно з назви він створювався для роботи з XML, що, втім,
не заважає програмувати на ньому і в інших цілях.
Робота з Ajax стандартно реалізовується з використанням бібліотеки
jQuery. jQuery – JavaScript-framework, бібліотека, що дає можливість більш
зручно використовувати деякі можливості Javascript, такі як: обробка подій,
створення візуальних ефектів, робота з DOM і підтримка AJAX.
Принцип роботи такий:
– клієнтська частина: працює на стороні клієнта, пишеться на
JavaScript;
– скрипт створено з двох частин;
Лист
ЧДТУ. 222079.001 ПЗ
29
Змн. Лист № докум. Підпис Дата
– серверна частина: працює на сервері, може бути реалізована на
будь-якій мові програмування, яка розпізнає GET/POST запити.
Етапи формування клієнтської частини:
– створення екземпляра об'єкта XMLHttpRequest;
– збір та підготовка даних для відправки запиту на сервер;
– установка для нього процедури обробника події onreadystatechange.
Ця подія виникає при кожній зміні стану об'єкта XMLHttpRequest. Дана функція
по суті є базовою частиною скрипта, оскільки саме в ній проходить обробка
відповіді сервера;
– відкриття з'єднання із конкретизацією типу запиту (GET або POST),
URL серверної частини, мітки асинхронного режиму і імені та пароля працівника
(якщо необхідно);
– безпосередньо формування запиту;
– обробка результату серверної частини.
Ajax є надзвичайно популярним додатком в даний час і його використання
при розробці веб-додтаків швидко збільшується. Як кажуть, сучасні веб-додатки
"товстіють" – клієнтська частина набуває все більшого функціоналу.
Лист
ЧДТУ. 222079.001 ПЗ
30
Змн. Лист № докум. Підпис Дата
3 ОПИС РОЗРОБКИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
3.1 Структура бази даних
Створена для даного додатку база даних складається з 7 таблиць, які
пов’язані між собою. Схему бази даних наведено на рисунку 3.1.
Рисунок 3.1 – Структура база даних
Базу даних умовно можна розділити на 3 частини:
– частина, що працює з користувачами, а саме три таблиці: таблиця
ролей roles, таблиця користувачів users, таблиця зв'язку користувачів і ролей
roles_users;
– частина, що працює з довідниками, а саме дві таблиці: таблиця
товарів goods та таблиця папок folders;
– частина, що працює з замовленнями, а саме дві таблиці: таблиця
кошиків замовлень baskets та таблиця пунктів замовлень basket_items.
Базова таблиця бізнес-логіки baskets складається з полів:
id – ідентифікатор, первинний ключ;
Лист
ЧДТУ. 222079.001 ПЗ
31
Змн. Лист № докум. Підпис Дата
user_id – код працівника з таблиці users, зовнішній ключ;
ordered – поле логічного типу, яке встановлює, чи замовлення вже є
зробленим;
supplied – поле логічного типу, яке встановлює, чи замовлення вже є
поставленим;
order_time – дата і час замовлення;
canceled – поле логічного типу, яке встановлює, чи замовлення є
відміненим;
cancellation_time – дата і час відміни замовлення;
order_number – номер замовлення;
in_process – поле логічного типу, яке встановлює, що замовлення є в
процесі обробки.
З таблицею baskets пов'язана таблиця basket_items, яка має поля:
id – ідентифікатор, первинний ключ;
dir_good_id – код товару з таблиці goods, зовнішній ключ;
basket_id – код замовлення з таблиці baskets, зовнішній ключ;
item_add_time – дата і час, в які було зроблено замовлення;
amount – кількість одиниць товару, який було замовлено.
Таблиця товарів goods має поля:
id – ідентифікатор, первинний ключ;
dir_folder_id – код папки з таблиці folders, зовнішній ключ;
good_code – артикул товару;
name – назва товару;
wholesale_price – ціна товару;
picture_file_size – розмір файлу фото товару;
picture_file_name – назва файлу фото товару;
picture_content_type – тип файлу фото товару;
picture_updated_at – час оновлення файлу фото товару;
Лист
ЧДТУ. 222079.001 ПЗ
32
Змн. Лист № докум. Підпис Дата
new_good – поле логічного типу, яке встановлює, чи товар є новим товаром
(потрібно для інформування клієнтів про надходження нових товарів);
web_site_valid – чи товар відображатиметься на сайті;
new_good_input_date – час та дата першого введення товару в базу;
available – поле логічного типу, яке встановлює, чи товар наявний на сайті
в даний час.
Таблиця папок товарів folders має поля:
parent_id – id папки верхнього рівня, є зовнішнім ключем, який посилається
на цю ж таблицю, значення NULL або -1 вказує на папку вищого рівня;
id – ідентифікатор, первинний ключ;
code – код даної папки;
deleted – чи папка вилучена;
ancestry – код верхньої папки, потрібен для використання бібліотекою rails
ancestry, значення NULL вказує на папку найвищого рівня.
Таблиця користувачів users має всі поля, потрібні як для аутентифікації
користувачів, так і для контактування з ними менеджера компанії:
id – ідентифікатор, первинний ключ;
email – електронна пошта клієнта, яка застосовується як в якості логіну, так
і для контактування з менеджера клієнтом;
encrypted_password – пароль в зашифрованому вигляді;
sign_in_count – кількість входів користувача в систему;
last_sign_in_at – дата та час останнього входу в систему;
current_sign_in_at – дата та час поточного входу в систему;
last_sign_in_ip – ip-адреса останнього входу в систему;
current_sign_in_ip – ip-адреса поточного входу в систему;
name – ім'я клієнта;
address – адреса клієнта;
company – назва фірми клієнта;
Лист
ЧДТУ. 222079.001 ПЗ
33
Змн. Лист № докум. Підпис Дата
confirmed – поле логічного типу, яке означає, чи підтверджено
адміністрацією реєстрацію клієнта.
phone – телефон клієнта, важлива інформація для наступного
контактування з ним, тому користувач обов'язково повинен задати його, тому
дане поле таблиці бази даних встановлено як not null;
Таблиця roles описує ролі користувачів в системі – в даному випадку є
тільки дві ролі – "менеджер" та "клієнт":
name – назва ролі.
id – ідентифікатор, первинний ключ;
Таблиця roles_users описує те, якому користувачеві призначено яку роль:
role_id – код ролі з таблиці roles;
user_id – код користувача з таблиці users.
3.2 Використання gem бібліотек в додатку
В додатку використовується цілий набір бібліотек, без яких його створення
стало б значно складним.
Ancestry є gem-плагіном, який реалізує записам в RubyOnRails
ActiveRecord моделі бути зформованими у вигляді дерева (або ієрархії). Він
використовує один стандартно зрозумілий стовпчик бази даних, використовуючи
варіації матеріалізованих шаблонів шляху. Він створює всі стандартні
співвідношення деревоподібної структури (предків, батьків, корінь, дітей, братів
і сестер, нащадків), і всі вони можуть бути зібрані в одному запиті SQL.
Додатковими функціями є реалізація STI, скоупи, кешування глибини, легка
міграція зі старих плагінів/gem'ів, обмеження глибини, відновлення цілісності,
первірка цілісності, упорядкування (під)дерев в хеші і різних стратегій для
боротьби з втрачених записами.
Devise – це gem(бібліотека) rails для роботи з акаунтами юзерів, їх
реєстрації, авторизації а також додаткових дій [12]. Він дуже зручний в роботі і
підтримує купу додаткових функцій, проте його тестування може створити
Лист
ЧДТУ. 222079.001 ПЗ
34
Змн. Лист № докум. Підпис Дата
кілька неприємних проблем.
Devise є гнучким способом аутентифікації для Rails на основі Warden. Він
є:
– являє собою комплексним рішенням MVC, заснованим на двигуні
Rails;
– заснованим на Rack;
– дозволяє включати кілька моделів, що увійшли одночасно;
– заснованим на концепції модульності: застосовувати тільки те, що
дійсно потрібно.
Він складається з 10 модулів, наведених далі
Omniauthable: додає OmniAuth (https://github.com/intridea/omniauth)
підтримку.
Database Authenticatable: шифрує і зберігає пароль в базі даних для
встановлення автентичності користувача, тоді як підписання аутентифікації
може бути зроблено через POST запити або HTTP Basic Authentication.
Confirmable : відправляє електронну пошту із наведенням підтвердження і
перевіряє, чи є обліковий запис вже підтвердженим в процесі логування.
Registerable: керує процесом реєстрації користувачів, а також дозволяє їм
видаляти і знищувати їх обліковий запис.
Recoverable: скидає пароль користувача і надає інструкції скидання.
Rememberable: управляє генерацією та видаленням маркеру для
запам'ятовування користувача від збереженого cookie.
Trackable: веде облік кількості логів в систему, timestamps та IP-адреси.
Timeoutable: закінчує сесії, які не мають жодної активності протягом
певного періоду часу.
Validatable: реалізує перевірку електронної пошти та паролю. Це
необов'язковими і може бути змінено, можна встановити свої власні перевірки.
Lockable: блокує обліковий запис після значного числа невдалих спроб
входу в систему. Може розблокувати електронною поштою або в результаті
закінчення заданого періоду часу.
Лист
ЧДТУ. 222079.001 ПЗ
35
Змн. Лист № докум. Підпис Дата
Devise гарантує потокобезпечність на YARV. Розробка реалізації
потокобезпечності на JRuby триває.
Підключення даних бібліотек та інших бібліотек, що є важливими для
проектів та допомагають реалізувати функції даного проекту, прописано в файлі
Gemfile у папці проекту:
gem 'bcrypt-ruby'
gem 'paperclip'
gem 'therubyracer'
gem 'devise'
gem 'mysql2'
gem 'ancestry'
gem 'roo'
gem 'haml'
gem 'prawn'
gem 'prawn_rails'
gem 'cancan'
gem "rmagick"
Саме підключення проходить автоматично за допомогою менеджера gem
при виконання Ruby-команди bundle install.
3.3 Структура програми
Проект даного додатку складає стандартну структуру для Ruby-програми,
описану в пункті 2.2 (рисунок 3.2).
Серверна частина програма поділена на 4 частини – базова частина, для
роботи з товарами, для роботи з кошиком і адміністративна частина. Кожна з них
має свій контролер, набір представлень, а також працює з певними моделями.
Крім того, в програмі значну роль має файл menu.js, оскільки багато
операцій реалізується за допомогою ajax-запитів. При цьому в проектах
використовується цілий ряд бібліотек JavaScript, ядром і основою яких є
бібліотека jquery. Зокрема, до проекту включені бібліотеки jquery-1.9.1.min.js,
Лист
ЧДТУ. 222079.001 ПЗ
36
Змн. Лист № докум. Підпис Дата
jquery.form.js (вона дає можливість використовувати ajax в роботі з html-
формами, зокрема, відсилати їх на сервер за допомогою ajax-запитів),
jquery.validity.min.js (для перевірки правильності введеної покупцем інформації
на боці клієнта).
Рисунок 3.2 – Структура проекту програми
Технологія роботи з ajax, яка застосовується в додатку – це відправка ajax-
запиту до контролера, з якого іде перехід на view, що реалізує відповідну
частину сторінки, яка повертається в callback функцію ajax-запиту, і вставляється
Лист
ЧДТУ. 222079.001 ПЗ
37
Змн. Лист № докум. Підпис Дата
у конкретний елемент <div> відповідної html-сторінки. Часто запит формується з
надсиланням даних форми, як наприклад у функції uploadPhoto, створеної для
вставляння нового фото товару:
function uploadPhoto(form_id){
$("#"+form_id).ajaxSubmit(function(data){
$('#content').html(data);
startSelectCropArea();
});
}
Хоча, більшість функцій застосовують прості ajax-запити, які тільки
надсилають запит до контроллера і реалізують вставку результату, як наприклад,
функція очищення кошика:
function emptyCart(){
$.get("goods/empty_cart", function(data){
$('#shopping_cart').html(data);
});
}
Важливою задачею в програмі була аутентифікація та авторизація
користувачів. Вони були реалізована за допомогою бібліотек devise та cancan
відповідно. Аутентифікація проходить за допомогою додавання до контролерів
спеціального before_filter, який встановлює дію, що виконується кожного разу до
виконання методу контролера, наприклад, в goods_controller є запис:
before_filter :authenticate_user!, only: [:index,:update_cart,:make_order]
Метод :authenticate_user! взято з бібліотеки devise. В даному випадку
наведено, при виклику яких методів він буде застосовуватися (вичерпний
перелік), але даний перелік включає повністю всі методи, оскільки за завданням
користувач, що не залогувався, не може робити майже нічого – може лише
переглядати існуючі папки у дереві. Дана бібліотека дає можливість автоматично
реалізувати таблицю користувачів у базі даних, а також автоматично реалізувати
веб-сторінки логіну та реєстрації користувача.
Лист
ЧДТУ. 222079.001 ПЗ
38
Змн. Лист № докум. Підпис Дата
Авторизацію користувача можна вивчити в контролері admin_controller –
його методи може застосовувати тільки користувач з правами адміністратора, які
прописуються заданим чином у таблиці бази даних roles та users_roles. На
початку кожного методу наведеного контролера стоїть рядок:
authorize! :administer, :shop
Він описує доступ до операції. Наприклад, метод демонстрації замовлення
має вигляд:
def show_order
authorize! :administer, :shop
@orders = Basket.current_orders
@non_confirmed_users = User.not_confirmed
@order = Basket.find(params[:order_id])
@current_header = "Замовлення № #{@order.order_number}-
#{@order.order_time.strftime("%d-%m-%y")}:
#{@order.user.name}"<<((@order.user.company.nil?)?'':", #{@order.user.company}")
end
Для реалізації view в даному проекті було використано мову haml, яка має
значні переваги перед erb. Особливістю її є велике число відступів для опису
структури документу – вони потрібні не лише для простої зрозумілості
програмісту, але і для опису семантики вкладеності. Прикладом є частина
сторінки відображення кошика:
%div{style: "width: 100%; display: inline-block;"}
%table{style: "float: right; display: inline-block;"}
%tbody
%tr
%td{align: "right"}
%b Разом:
%td{align: "right"}
[email protected]_cart_total
грн
Лист
ЧДТУ. 222079.001 ПЗ
39
Змн. Лист № докум. Підпис Дата
Haml не використовує закриваючих тегів, в результаті чого текст стає
коротшим. Знак % позначає початок аналогів html-тегів.
Лист
ЧДТУ. 222079.001 ПЗ
40
Змн. Лист № докум. Підпис Дата
ВИСНОВКИ
В даній кваліфікаційній роботі бакалавра було розроблено інтернет-
магазин для дрібнооптової торгівлі товарами промислової групи.
В рамках виконання роботи було проведено наступні види робіт:
– знайдено та проаналізовано існуючі програми, які реалізують подібну
функціональність;
– досліджено предметну область, а саме, які є дані у компанії, що
користуватиметься даним продуктом, які вимоги висуває компанія до інтернет-
торгівлі;
– проаналізовано діючі засоби розробки, а саме мова програмування Ruby,
веб-фреймворк Rails, бібліотеки RubyOnRails для реалізації різноманітних
необхідних для роботи будь-якого інтернет-магазину функцій;
– спроектовано базу даних, яку стосується інформації, необхідної для
діяльності інтернет-магазину;
– розроблено веб-додаток, який створено з клієнтської та адміністративної
частини і реалізує всі функції, наведені у завданні на виконання даної роботи.
В ході виконання роботи виникло достатньо проблем. Особливо складно
розробляти частину, де застосовується JavaScript, який є достатньо непростим у
відлагодженні.
Створена система може бути в майбутньому вдосконалена та розширена.
Зокрема, необхідно створити пошук товарів, а також реалізувати блок
користувачів, які роблять некоректні дії. Доречним було б також створити
функції, які дали б можливість проводити аналіз функціонування інтернет-
магазину.
Лист
ЧДТУ. 222079.001 ПЗ
41
Змн. Лист № докум. Підпис Дата
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. David Planagan, Yakibiro Matsumoto. The Ruby Programming Language.–
O'Reilly, 2008.- pp. 429.
2. Obie Fernandez. The Rails 3 Way.– Addison-Wesley, 2011.- pp.708.
3. Мартін Р. Чистий код. Створення, аналіз і рефакторіг. [Текст] / Р.
Мартін. — К.: УкрІНТЕІ, 2010 — 358 c.
4. Пономаренко В. Проектування інформаційних систем. [Текст] / В.
Пономаренко. — К. Київ: Видавничий центр «Академія», 2002 — 440 с.
5. Ruby. A Programmer's Best Friend. [Електронний ресурс] Режим
доступу: https://www.ruby-lang.org
6. Рlataformatec/devise. [Електронний ресурс] Режим доступу:
https://github.com/plataformatec/devise
7. Ruby on Rails Tutorial. Learn by Example [Електронний ресурс] Режим
доступу: www.railstutorial.org.
8. Конструктор інтернет-магазинів [Електронний ресурс] Режим доступу:
http://skynell.com/promo/shop.php Skynell
9. Майкл Хартл Ruby on Rails Tutorial. Вивчення Rails на прикладах.
[Електронний ресурс] Режим доступу: http://railstutorial.uа/
10. Advatages of Java at ibm.com. [Електронний ресурс].– Режим доступу:
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/performance/advantage
s_java.html
11. CSS Flexible Box LАyout Module [Electronic resource] // Офіцйний
сайт W3C. – Mode of Аccess: https://www.w3.org/TR/css-flexbox-1/.
12. Dixit S. Аn introduction to the Web Bluetooth АPI [Electronic resource] //
Dev.operА: OperА SoftwАre АSА. – Mode of Аccess:
https://dev.operА.com/Аrticles/web-bluetooth-intro/.
13. Djiraj. JWT Role Based Authorization with Spring Security.
[Електронний ресурс].– Режим доступу: https://www.devglan.com/spring-
security/jwt-role-based-authorization
Лист
ЧДТУ. 222079.001 ПЗ
42
Змн. Лист № докум. Підпис Дата
14. Golovko O. V. FormulАtion of the Problem of MАximum Clique
DeterminАtion in Non-Oriented GrАphs. InternАtionАl JournАl of Engineering &
Technology. Vol. 7, no. 4.3 (2018): SpeciАl Issue 3. P. 293–297.
15. Introduction to Web Technologies for FrontPАge Users [Electronic
resource] // Офіційний ресурс MSDN. – Mode of Аccess: https
https://msdn.microsoft.com/en-us/librАry/office/АА218647(v=office.11).Аspx.
16. JАckson B. 100+ Аwesome Development Tools Аnd Resources / BriАn
JАckson // Офіційний сайт keycdn [Electronic resource]. – Mode of Аccess:
https://www.keycdn.com/blog/web-development-tools/.
17. Listrovoy S. V. Development of method of definition mАximum clique in
А nonoriented grАph. EАsternEuropeАn JournАl of Enterprise Technologies. 2018.
Vol. 5, № 4 (89). – P. 12–17. EID: 2-s2.0-85032585697.
18. Michael Hartl. Ruby on Rails Tutorial (Addison-Wesley Professional
Ruby Series) 6th Edition. - Amazon.com Services LLC, 2018. – 208 с.
19. MVC Design Pattern – JournalDev. [Електронний ресурс].– Режим
доступу: https://www.journaldev.com/16974/mvc-design-pattern
20. MVC Pattern -Anshul vyas - Medium. [Електронний ресурс].– Режим
доступу: https://medium.com/@anshul.vyas380/mvc-pattern-3b5366e60ce4
21. MАnifesto for Аgile SoftwАre Development [електронний ресурс] //
Веб-портал АgilemАnifesto.org. – Режим доступу: http://www.АgilemАnifesto.org/
22. PostgreSQL : About. [Електронний ресурс].– Режим доступу:
https://www.postgresql.org/about/
23. Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide,
Dave Thomas, Chad Fowler, Andy Hunt, 2019
24. Scrum | Digital Humanities LAB at CVCE powered by uni.lu.
[Електронний ресурс].– Режим доступу: https://cvcedhlab.hypotheses.org/tag/scrum
25. Spring | Home. [Електронний ресурс].– Режим доступу:
https://spring.io/
26. Timothy M. O'Brien "Jakarta Commons Cookbook". O'Reilly; ISBN 0-
596-00706-X
Лист
ЧДТУ. 222079.001 ПЗ
43
Змн. Лист № докум. Підпис Дата
27. Topical Guide | Spring Security Architecture. [Електронний ресурс].–
Режим доступу: https://spring.io/guides/topicals/spring-security-architecture
28. Website security – Learn web development | MDN. [Електронний
ресурс].– Режим доступу: https://developer.mozilla.org/en-US/docs/Learn/Server-
side/First_steps/Website_security
29. What is REST – Learn to create timeless REST APIs. [Електронний
ресурс].– Режим доступу: https://restfulapi.net/
30. Бегг К. Бази даних. Проектування, реалізація і супровід. Теорія та
практика / К. Бегг, Т. Конноллі. – 2003. – 1238 с.
31. Берюх И. С. Вибір технології розробки програмного забезпечення
інформаційних систем. ScienceRise. Харків, 2018. № 5/2. С. 40–43
32. Брюс У. Javaсервлети і JSP. Збірник рецептів. [Текст] / У. Брюс. —
Львів, Захід-Прес, 2009 — 768 с.
33. Васильєв Н. Об'єктно-орієнтоване програмування. [Текст] / Н.
Васильєв. — К. Львів: «Афіша», 2011 — 400 с.
34. Вендров А. М. Сучасні технології створення програмного
забезпечення [Електронний ресурс] / А. М. Вендров // Портал “CITFORUM”. –
Режим доступа: http://citforum.ru/progrАmming/
АpplicАtion/progrАm/index.shtml#v
35. Вольфсон Б. Гнучкі методології розробки [Електронний ресурс] / Б.
Вольфсон // Електронна бібліотека Аdm-lib.ru. – Режим доступа: http://Аdm-
lib.ru/books/10/Gibkie-metodologii.pdf
Лист
ЧДТУ. 222079.001 ПЗ
44
Змн. Лист № докум. Підпис Дата
ДОДАТОК А
Специфікація
Позначення Найменування Примітка
Документація
Лист
ЧДТУ. 222079.001 ПЗ
45
Змн. Лист № докум. Підпис Дата
ДОДАТОК Б
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
АВТОМАТИЗОВАНА СИСТЕМА РОБОТИ ІНТЕРЕНТ-МАГАЗИНУ
ДРІБНООПТОВОЇ ТОРГІВЛІ ПРОМИСЛОВИМИ ТОВАРАМИ
Лістинг програми
UA.ЧДТУ.222079-01 12 01
Листів 21
2022
Лист
ЧДТУ. 222079.001 ПЗ
46
Змн. Лист № докум. Підпис Дата
class GoodsController < ApplicationController
before_filter :authenticate_user!, except: :add_picture_from_device
#, only: [:index, :create,:show,:add_picture,:add_to_cart,:show_cart,:empty_cart,:delete_cart_entry]
before_filter :set_current_user, only: :add_to_cart
skip_before_filter :verify_authenticity_token
def index
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
self.current_folder=DirFolder.find(params[:folder_id])
if self.current_folder.has_children?
@folders=self.current_folder.children
render :folders_list, layout: false
else
@goods=DirGood.available_goods_at_folder(params[:folder_id])
if params[:work_type]=='admin'
render '/admin/admin_goods_list', layout: false
else
render :goods_list, layout: false
end
end
end
if !match_found
basket_item = BasketItem.new
basket_item.basket_id = @basket.id
@good = DirGood.find(params[:good_id])
#@good.amount = @good.amount-params[:amount].to_i
#@good.save
basket_item.dir_good = @good
basket_item.amount = params[:amount]
basket_item.item_add_time = Time.now
basket_item.save
end
render partial: 'main/shopping_cart', layout: false
end
def show_cart
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
render partial: 'main/shopping_cart', layout: false
end
def empty_cart
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
BasketItem.delete_all(basket_id: @basket.id)
@basket.reload
#$basket.calculate_cart_total
render partial: 'main/shopping_cart', layout: false
end
Лист
ЧДТУ. 222079.001 ПЗ
47
Змн. Лист № докум. Підпис Дата
def delete_cart_entry
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
BasketItem.delete(params[:cart_item_id])
@basket.reload
#$basket.calculate_cart_total
render partial: 'main/shopping_cart', layout: false
end
end
class MainController < ApplicationController
def index
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
end
end
class BasketController < ApplicationController
before_filter :authenticate_user!, only: [:index,:update_cart,:make_order]
before_filter :set_current_user, only: :make_order
skip_before_filter :verify_authenticity_token
def index
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
render 'index', layout: false
end
def update_cart
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
@basket.basket_items.all.each do |basket_item|
if basket_item.amount!=params[basket_item.id.to_s]
basket_item.amount = params[basket_item.id.to_s].to_i
basket_item.save
end
end
render 'index', layout: false
end
def make_order
@basket=Basket.find(@session_basket_id) unless @session_basket_id.nil?
@basket.ordered = true
@basket.order_time = Time.now
@basket.order_number = Basket.maximum("order_number")+1 rescue 1
@basket.save
self.session_basket_id = nil
# OrderMailer.order_confirmation_email(current_user,@basket).deliver
redirect_to root_path, flash: {order_completed: 'Ваше замовлення прийнято і на Вашу адресу
Лист
ЧДТУ. 222079.001 ПЗ
48
Змн. Лист № докум. Підпис Дата
надіслано електронний лист підтвердження. Наш менеджер сконтактує з Вами впродовж доби. Ви
можете продовжити роботу, створивши нове замовлення'}
end
end
class AdminController < ApplicationController
before_filter :authenticate_user!
skip_before_filter :verify_authenticity_token
def index
authorize! :administer, :shop
@folder_tree_ajax_function_name='loadAdminFolderContent'
@orders=Basket.current_orders
@current_header = (params[:message].nil?)?'Товари':params[:message]
@non_confirmed_users = User.not_confirmed
end
def input_goods_data
authorize! :administer, :shop
uploaded_io = params[:xlsx]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
file_path = Rails.root.join('public', 'uploads', uploaded_io.original_filename)
require 'roo'
excelx_file=Roo::Excel.new(file_path.to_s)
excelx_file.default_sheet = excelx_file.sheets.first
@input_goods = Hash.new
goods = Hash.new
DirGood.all.each do |good|
goods[good.good_code.strip] = good
end
folders = DirFolder.folders
# DirGood.update_all("available=false")
3.upto(excelx_file.last_row) do |line|
if ((true if Float(excelx_file.cell(line,'B').to_s.strip[0]) rescue false)&&(true if
Float(excelx_file.cell(line,'S').to_s.strip) rescue false))
good_article = excelx_file.cell(line,'B').to_s.strip
good_name = excelx_file.cell(line,'A')
if ((good=goods[good_article])==nil)
if (good_name.to_s!='')
good_wholesale_price = excelx_file.cell(line,'S')
@input_goods[excelx_file.cell(line,'B').to_s.strip] = [good_name, good_wholesale_price]
good = DirGood.new
Лист
ЧДТУ. 222079.001 ПЗ
49
Змн. Лист № докум. Підпис Дата
good.good_code = good_article
good.name = good_name
good.wholesale_price = good_wholesale_price
good.dir_folder_id = find_folder_id(folders, good_article)
good.web_site_valid = true
good.new_good = true
good.new_good_input_date = Time.now
good.available = true
good.save
end
else
if (good_name.to_s=='')
good.available = false
good.name = good_name.to_s
good.save
else
if ((good.wholesale_price-excelx_file.cell(line,'S').to_f).abs>0.005)
good.wholesale_price = excelx_file.cell(line,'S').to_f
good.available = true
good.save
end
if (good_name!=good.name)
good.name = good_name
good.new_good = true
good.new_good_input_date = Time.now
good.available = true
good.save
end
end
goods.delete(good_article)
end
end
end
goods.each do |a_code, a_good|
if (a_good.available)
a_good.available = false
a_good.save
end
end
@input_goods = @input_goods.sort
@current_header = 'Товари, яких немає в базі даних інтернет-магазину'
@orders=Basket.current_orders
@non_confirmed_users = User.not_confirmed
#render :input_goods_data, layout: false
end
def add_dir_goods
Лист
ЧДТУ. 222079.001 ПЗ
50
Змн. Лист № докум. Підпис Дата
authorize! :administer, :shop
params.each do |article,site_valid|
if site_valid=='on'
good = DirGood.good_by_article(article)[0]
good.web_site_valid = false
good.save
end
end
@orders = Basket.current_orders
@non_confirmed_users = User.not_confirmed
end
def show_order
authorize! :administer, :shop
@orders = Basket.current_orders
@non_confirmed_users = User.not_confirmed
@order = Basket.find(params[:order_id])
@current_header = "Замовлення № #{@order.order_number}-
#{@order.order_time.strftime("%d-%m-%y")}: #{@order.user.name}"<<((@order.user.company.nil?)?'':",
#{@order.user.company}")
end
def close_order
authorize! :administer, :shop
order = Basket.find(params[:order_id])
if (params[:act]=='supplied')
order.supplied=true
@message = 'Замовлення виконано'
end
if (params[:act]=='canceled')
order.canceled=true
@message = 'Замовлення скасовано'
end
order.save
redirect_to action: "index", message: @message
end
def print_order
authorize! :administer, :shop
@order = Basket.find(params[:order_id])
if !params[:in_process].nil?
@order.in_process=true
@order.save
end
render layout:false
end
Лист
ЧДТУ. 222079.001 ПЗ
51
Змн. Лист № докум. Підпис Дата
def confirm_user
authorize! :administer, :shop
user = User.find(params[:user_id])
user.confirmed = true
user.save
@non_confirmed_users = User.not_confirmed
render partial: 'admin_right_panel_users', layout: false
end
def add_picture
authorize! :administer, :shop
@good=DirGood.find(params[:id])
@good.update_attributes(params[:dir_good])
render :good_crop, layout: false
end
def crop_picture
authorize! :administer, :shop
@good=DirGood.find(params[:id])
@good.crop_x = params[:crop_x]
@good.crop_y = params[:crop_y]
@good.crop_w = params[:crop_w]
@good.crop_h = params[:crop_h]
@good.update_attributes(:picture)
@goods=DirGood.where("dir_folder_id = ?",self.current_folder.id)
render :admin_goods_list, layout: false
end
private
def find_folder_id (folders, good_article)
folders_local = folders
codes_ar = article_to_folder_codes_array(good_article)
if (codes_ar.size < 2)
return 0
end
match_folder = nil
codes_ar.each do |article_number|
match_folder = search_in_folders_for_code(folders_local, article_number)
begin
folders_local = match_folder.children
rescue
return 0
end
end
return match_folder.id
end
Лист
ЧДТУ. 222079.001 ПЗ
52
Змн. Лист № докум. Підпис Дата
def article_to_folder_codes_array(good_article)
s_ar = good_article.split('.')
s_ar.delete_at(s_ar.size-1)
return s_ar
end
def search_in_folders_for_code(folders, article_number)
if folders.nil?
return nil
end
folders.each do |folder|
if (folder.code==article_number.to_i)
return folder;
end
end
return nil;
end
end
class Basket < ActiveRecord::Base
belongs_to :user
has_many :basket_items
#belongs_to :temporary_user
attr_accessible :cancellation_time, :canceled, :order_time, :ordered, :supplied, :order_number,
:in_process
scope :current_orders, where(ordered: true, canceled:false, supplied: false)
def calculate_cart_total
reload rescue nil
basket_items.sum{|item|
item.dir_good.wholesale_price*item.amount
}
end
end
class BasketItem < ActiveRecord::Base
belongs_to :dir_good
belongs_to :basket
attr_accessible :amount, :item_add_time
end
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
Лист
ЧДТУ. 222079.001 ПЗ
53
Змн. Лист № докум. Підпис Дата
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :company,
:phone, :role_ids, :confirmed
# attr_accessible :title, :body
scope :not_confirmed, where('confirmed=false')
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
def active_for_authentication?
super && self.confirmed
end
end
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
attr_accessible :name
end
index.haml
.top
%h1
Кошик
.middle
%form#update_cart_form{action: "basket/update_cart", method: "post"}
%table.cart
%tbody
%tr
%th Зображення
%th Назва
%th Кількість
%th Ціна
%th Всього
[email protected]_items.all.each do |cart_item|
%tr
%td
=link_to "#", :onclick => "showGood(#{cart_item.dir_good.id});" do
%img{alt: cart_item.dir_good.name, src: cart_item.dir_good.picture(:thumb), title:
cart_item.dir_good.name}
%td
=link_to cart_item.dir_good.name, "#", :onclick =>
"showGood(#{cart_item.dir_good.id});"
%td
%input{name: cart_item.id, size: "3", type: "text", value: cart_item.amount}/
Лист
ЧДТУ. 222079.001 ПЗ
54
Змн. Лист № докум. Підпис Дата
%td
%nobr
=cart_item.dir_good.wholesale_price
грн
%td
%nobr
=cart_item.dir_good.wholesale_price*cart_item.amount
грн
%div{style: "width: 100%; display: inline-block;"}
%table{style: "float: right; display: inline-block;"}
%tbody
%tr
%td{align: "right"}
%b Разом:
%td{align: "right"}
[email protected]_cart_total
грн
%br/
.buttons
%table
%tbody
%tr
%td{align: "left"}
%a.button{onclick: "updateCart();"}
%span Оновити
%td{align: "center"}
%a.button{onclick: "location = '/'"}
%span Додати інші товари
%td{align: "right"}
%a.button{onclick: "location = 'basket/make_order'"}
%span Оформити
folders_list.haml
.top
%h1
=@current_folder.name
.List
- @folders.each do |folder|
.ListItem
%p.ProductImage
=link_to "#", :onclick => "loadFolderContent(#{folder.id});" do
%img{alt: folder.name, src: "/images/evrika_logo.png", title: folder.name}
%p.ProductTitle
=link_to folder.name, '#', :onclick => "loadFolderContent(#{folder.id});"
.Clear
goods_list.haml
Лист
ЧДТУ. 222079.001 ПЗ
55
Змн. Лист № докум. Підпис Дата
.top
%h1
=@current_folder.name
.List
- @goods.each do |good|
.ListItem
%p.ProductImage
=link_to "#", :onclick => "showGood(#{good.id});" do
%img{alt: good.name, src: good.picture(:small), title: good.name, onError:
"this.src='/images/small/missing.png';"}
%p.ProductTitle
=link_to good.name, "#", :onclick => "showGood(#{good.id});"
%p.ProductPrice
= good.wholesale_price
грн
.Clear
application.haml
!!! Strict
%html{dir: "ltr", lang: "ru", "xml:lang" => "ru", xmlns: "http://www.w3.org/1999/xhtml"}
%head
%title Інтернет-магазин
=stylesheet_link_tag 'stylesheet'
=stylesheet_link_tag 'pwin'
=stylesheet_link_tag 'magnific-popup.css'
=stylesheet_link_tag 'folders_menu'
=stylesheet_link_tag 'jquery.Jcrop.min.css'
=javascript_include_tag 'jquery-1.9.1.min.js'
=javascript_include_tag 'jquery.form.js'
=javascript_include_tag 'scriptbreaker-multiple-accordion-1'
=javascript_include_tag 'folders_menu'
=javascript_include_tag 'jquery.magnific-popup.js'
=javascript_include_tag 'jquery.validity.min.js'
=javascript_include_tag 'jquery.Jcrop.min.js'
=yield(:head)
%script{:type=>"text/javascript"}
:plain
$(document).ready(function() {
$(".topnav").accordion({
accordion:false,
speed: 500,
closedSign: '[+]',
openedSign: '[-]'
});
$('.image-link').magnificPopup({type:'image', mainClass: 'mfp-with-zoom mfp-img-mobile'});
});
Лист
ЧДТУ. 222079.001 ПЗ
56
Змн. Лист № докум. Підпис Дата
%body
.ContOuter1
.ContOuter2
#container
#header
=render partial: 'shared/header'
#column_left
=render partial: 'shared/navigation'
#column_right
=yield(:column_right)
#content
=yield
#footer
.div1 «Еврика» 2013
.div2
-#Powered by
-#= link_to 'Google', 'www.google.com'
_right_column.haml
#module_cart.box
.top
Кошик
.middle
#shopping_cart{style: "text-align: center;"}
=render partial: 'main/shopping_cart'
.box
.top
Нові товари
.middle
%table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"}
%tbody
-#- @hit_goods.each do |good|
-# %tr
-# %td{style: "width:1px", valign: "top"}
-# %a{href: "http://arkos.ua/index.php?route=product/product&product_id=6872"}
-# %img{alt: good.name, src: good.picture(:thumb)}/
-# %td{valign: "top"}
-# %p.ProductTitle
-# %a{href:
"http://arkos1.ua/index.php?route=product/product&product_id=6872"}=good.name
-# %p.ProductPrice
-# =good.price
-# грн
_shopping_cart.haml
.middle
-if @basket && @basket.basket_items.all.size!=0
Лист
ЧДТУ. 222079.001 ПЗ
57
Змн. Лист № докум. Підпис Дата
%table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"}
%tbody
[email protected]_items.all.each do |cart_item|
%tr
%td{align: "left", valign: "top", width: "1"}
%span.cart_remove{id: cart_item.id, onclick: "deleteCartEntry(#{cart_item.id});"}
%td{align: "right", valign: "top", width: "18"}
%nobr
=cart_item.amount
x
%td{align: "left", valign: "top"}
%a{href: "#", onclick: "showGood(#{cart_item.dir_good.id});"}
=cart_item.dir_good.name
шт
%td{align: "left", valign: "top"}
%nobr
=cart_item.dir_good.wholesale_price*cart_item.amount
грн
%br/
%table{align: "right", cellpadding: "0", cellspacing: "0", style: "display:inline-block;"}
%tbody
%tr
%td{align: "right"}
%span.cart_module_total
%b Разом:
%td{align: "right"}
%span.cart_module_total
[email protected]_cart_total
грн
%div{style: "padding-top:5px;text-align:center;clear:both;"}
=link_to "Проглянути і оформити", "#", :onclick => "showCartFull();"
%div{style: "padding-top:5px;text-align:center;clear:both;"}
=link_to "Спорожнити кошик", "#", :onclick => "emptyCart();"
-else
%div
Поки що порожній
order_confirmation_email.html.erb
<h3>Ваше замовлення, оформлене в Інтернет-магазині компанії "", прийнято.</h3>
<h3>Склад замовлення:</h3>
<table style="border-spacing: 10px;">
<thead>
<tr>
<th>Назва товару</th>
<th>Кількість</th>
<th>Ціна одиниці</th>
<th>Вартість</th>
Лист
ЧДТУ. 222079.001 ПЗ
58
Змн. Лист № докум. Підпис Дата
</tr>
</thead>
<% @basket.basket_items.all.each do |cart_item| -%>
<tr>
<td><%= cart_item.dir_good.name %></td>
<td style="text-align: center;"><%= cart_item.amount %></td>
<td style="text-align: right;"><%= cart_item.dir_good.wholesale_price %> грн</td>
<td style="text-align: right;"><%= cart_item.dir_good.wholesale_price*cart_item.amount %>
грн</td>
</tr>
<% end -%>
<tr>
<td style="font-weight: bold;">Всього:</td><td></td><td></td><td style="font-weight: bold;
text-align: right;"><%= @basket.calculate_cart_total %> грн</td>
</tr>
</table>
_admin_right_panel.haml
#module_admin_right_panel.box
.top
Синхронізувати товари
.middle
%div{style: "text-align: center;"} Завантаживши xls файл, можна синхронізувати інформацію
про наявність товарів з системою Anthex
%div{style: "text-align: center;"}
= form_tag({action: "input_goods_data"}, multipart: true, id: 'input_goods_form', style: "max-
width: 60px; word-wrap : break-word;") do
=file_field_tag 'xlsx'
=submit_tag (value="Ввести дані з файлу"), :class => "button"
-#%button{onclick: 'inputGoodsData();'}
-# %span Ввести дані з файлу
=render partial: '/admin/admin_right_panel_users'
.top
Наявні замовлення
.middle
%table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"}
%tbody
- @orders.each do |order|
%tr
%td{style: "max-width: 60px; word-wrap : break-word;", valign: "top"}
=link_to "#{order.user.name}", "/admin/show_order?order_id=#{order.id}"
%br
=link_to "#{order.user.company}", "/admin/show_order?order_id=#{order.id}"
%td{valign: "top"}
%nobr
=order.order_time.strftime('%d/%m/%y %H:%M')
%td{valign: "top"}
Лист
ЧДТУ. 222079.001 ПЗ
59
Змн. Лист № докум. Підпис Дата
%nobr{style: "margin-left: 2px"}
=order.calculate_cart_total
грн
show_order.haml
= content_for :column_right do
=render partial: 'admin_right_panel'
.top
%h1 Сторінка роботи менеджера Інтернет-магазину «Еврика»
.topTitle
%h1
=@current_header
.middle
%div{style:"font-size: 14px"}
Ім'я:
[email protected]
%br
Організація:
[email protected]
%br
Телефон:
[email protected]
%br
Електронна пошта:
[email protected]
%br
Дата і час замовлення:
[email protected]_time.strftime('%d/%m/%y %H:%M')
%br
Загальна сума замовлення:
[email protected]_cart_total
грн
%br
%div
%table.cart
%tbody
%tr
%th Назва
%th Артикул
%th Ціна
%th Кількість
%th Сума
[email protected]_items.all.each do |order_item|
%tr
%td{align: "left", valign: "top"}
=order_item.dir_good.name
Лист
ЧДТУ. 222079.001 ПЗ
60
Змн. Лист № докум. Підпис Дата
%td{align: "left", valign: "top"}
=order_item.dir_good.good_code
%td{align: "left", valign: "top"}
=order_item.dir_good.wholesale_price
%td{align: "left", valign: "top", width: "18"}
%nobr
=order_item.amount
шт
%td{align: "left", valign: "top"}
%nobr
=order_item.dir_good.wholesale_price*order_item.amount
грн
%table
%tbody
%tr
%td{align: "center"}
%form#set_order_supplied{action: "/admin/close_order", method: "post"}
%input{name: "order_id", type: "hidden", value: @order.id}/
%input{name: "act", type: "hidden", value: 'supplied'}/
=submit_tag (value='Замовлення виконано'), :class => "button"
%td{align: "center"}
%form#print_order{action: "/admin/print_order.pdf", method: "post", :target=>"_blank"}
%input{name: "order_id", type: "hidden", value: @order.id}/
=submit_tag ('Надрукувати замовлення'), :class => "button"
%br
%input{name: "in_process", type: "checkbox", checked: true}
Відмітити як запущене в роботу
%td{align: "center"}
%form#set_order_canceled{action: "/admin/close_order", method: "post"}
%input{name: "order_id", type: "hidden", value: @order.id}/
%input{name: "act", type: "hidden", value: 'canceled'}/
=submit_tag ('Скасувати замовлення'), :class => "button"
-#%td{align: "left", valign: "top", width: "1"}
-# %span.cart_remove{id: order_item.id, onclick: "deleteCartEntry(#{cart_item.id});"}
_admin_right_panel_users.haml
#admin_right_panel_users
.top
Підтвердити клієнта
.middle
%table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"}
%tbody
- @non_confirmed_users.each do |user|
%tr
%td{style: "max-width: 100px; word-wrap : break-word;", valign: "top"}
Лист
ЧДТУ. 222079.001 ПЗ
61
Змн. Лист № докум. Підпис Дата
=user.name
%br
=user.company
%td{valign: "top"}
%nobr
=user.created_at.strftime('%d/%m/%y')
%td{style: "max-width: 60px; word-wrap : break-word;", valign: "top"}
=link_to "ОК", "#", :onclick => "confirmUser(#{user.id});"
/devise/new.html.haml
%h2{style: "font-size: 22px;"} Реєстрація
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
= devise_error_messages!
%div
= f.label :name, "Ім'я"
%br/
= f.text_field :name, :autofocus => true
%div
= f.label :company, 'Організація'
%br/
= f.text_field :company
%div
= f.label :phone, 'Контактний телефон'
%br/
= f.text_field :phone
%div
= f.label :email, 'Адреса електронної пошти'
%br/
= f.email_field :email
%div
= f.label :password, 'Пароль'
%br/
= f.password_field :password
%div
= f.label :password_confirmation, 'Підтвердження паролю'
%br/
= f.password_field :password_confirmation
%div= f.submit "Зареєструватись", :class => 'button'
= render "devise/shared/links"
/devise/edit.html.haml
%h2
Редагувати #{resource_name.to_s.humanize}
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {
:method => :put }) do |f|
= devise_error_messages!
%div
Лист
ЧДТУ. 222079.001 ПЗ
62
Змн. Лист № докум. Підпис Дата
= f.label :email
%br/
= f.email_field :email, :autofocus => true
- if devise_mapping.confirmable? && resource.pending_reconfirmation?
%div
Currently waiting confirmation for: #{resource.unconfirmed_email}
%div
= f.label :password
%i (залиште порожнім, якщо не бажаєте змінювати)
%br/
= f.password_field :password, :autocomplete => "off"
%div
= f.label :password_confirmation
%br/
= f.password_field :password_confirmation
%div
= f.label :current_password
%i (введіть поточний пароль для підтвердження внесення змін)
%br/
= f.password_field :current_password
%div= f.submit "Update", :class => 'button'
%h3 Cancel my account
%p
Unhappy? #{button_to "Cancel my account", registration_path(resource_name), :data => {
:confirm => "Are you sure?" }, :method => :delete}
= link_to "Back", :back
folders_menu.js
function loadFolderContent(folderId){
var work_type = "user";
if ($(location).attr("pathname").indexOf("admin") != -1)
work_type = "admin";
$.get("/goods", {folder_id:folderId, work_type:work_type}, function(data){
$('#content').html(data);
});
}
function showGood(goodId){
$.get("goods/"+goodId, function(data){
$('#content').html(data);
$('.image-link').magnificPopup({
type: 'image'
});
});
}
//picture
Лист
ЧДТУ. 222079.001 ПЗ
63
Змн. Лист № докум. Підпис Дата
function uploadPhoto(form_id){
$("#"+form_id).ajaxSubmit(function(data){
$('#content').html(data);
startSelectCropArea();
});
}
function cropImage(){
$("#crop_form").ajaxSubmit(function(data){
$('#content').html(data);
});
}
function update_crop(coords){
$('#crop_x').val(coords.x);
$('#crop_y').val(coords.y);
$('#crop_w').val(coords.w);
$('#crop_h').val(coords.h);
}
function startSelectCropArea(){
$('#cropbox').Jcrop({
onChange: update_crop,
onSelect: update_crop,
setSelect: [0,0,250,250],
aspectRatio: 1
});
}
//---------------------
function addToCart(){
if (validateGoodItemNumber()){
$("#add_to_cart_form").ajaxSubmit(function(data){
$('#shopping_cart').html(data);
});
}
else {
alert('В полі "Кількість" потрібно ввести додатне число');
}
// $.get("goods/show_cart", function(data){
// $('#shopping_cart').html(data);
// });
}
function addToCartByEnter(event){
if (event.keyCode==13){
if (validateGoodItemNumber()){
Лист
ЧДТУ. 222079.001 ПЗ
64
Змн. Лист № докум. Підпис Дата
$("#update_cart_form").ajaxSubmit(function(data){
$('#content').html(data);
});
$.get("goods/show_cart", function(data){
$('#shopping_cart').html(data);
});
}
else {
alert('В полі "Кількість" потрібно ввести додатне число');
}
}
}
function updateCart(){
if (validateGoodItemNumber()){
$("#update_cart_form").ajaxSubmit(function(data){
$('#content').html(data);
});
$.get("goods/show_cart", function(data){
$('#shopping_cart').html(data);
});
}
else {
alert('В полі "Кількість" потрібно ввести додатне число');
}
}
function emptyCart(){
$.get("goods/empty_cart", function(data){
$('#shopping_cart').html(data);
});
}
function deleteCartEntry(cartItemId){
$.get("goods/delete_cart_entry", {cart_item_id:cartItemId},function(data){
$('#shopping_cart').html(data);
});
}
function showCartFull(){
$.get("basket", function(data){
$('#content').html(data);
});
}
function inputGoodsData(){
Лист
ЧДТУ. 222079.001 ПЗ
65
Змн. Лист № докум. Підпис Дата
$("#input_goods_form").ajaxSubmit(function(data){
$('#admin_content').html(data);
});
}
function confirmUser(userId){
$.post("/admin/confirm_user", {user_id:userId}, function(data){
$('#admin_right_panel_users').html(data);
});
}
//Validators
function validateGoodItemNumber() {
$.validity.start();
$("input")
.require()
.match("number")
.greaterThan(0);
var result = $.validity.end();
return result.valid;
}
Лист
ЧДТУ. 222079.001 ПЗ
66
Змн. Лист № докум. Підпис Дата
ДОДАТОК В
Інструкція користувача
1 Призначення програми
Інтернет-магазин дрібнооптової торгівлі промисловими товарами дає
можливість компанії, яка займається дрібнооптовою торгівлею, ефективно
організувати продажі певному колу замовників (покупців). Додаток складається з
бази даних MySQL та веб-програми.
Програма складається з двох частин – клієнтської та адміністративної.
Клієнтська частина програми дає можливість клієнту, який не увійшов у
систему:
– переглядати рубрики та підрубрики;
– реєструватися у системі (увійти в систему він може лише після
наступного схвалення адміністратором);
– увійти в систему ("залогінитись"), якщо клієнт зареєструвався в
системі і адміністратор поставив для нього допуск до системи.
Клієнтська частина програми дає можливість клієнту, який увійшов у
систему:
– переглядати каталог товарів, наявних на даний час, для кожної
рубрики і підрубрики із зазначенням повної назви товару, ціни, а також
фотографії товару;
– переглядати фото товару у збільшеному розмірі;
– вибирати товар у корзину для купівлі із зазначенням кількості
товару;
– бачити перелік товарів, доданих до корзини, з кількістю та вартістю
кожної одиниці товару;
– бачити загальну вартість товарів, доданих до корзини;
– видаляти товари з корзини;
– переглядати корзину у вигляді таблиці з фотографією невеликого
розміру, назвою, ціною, вартістю;
– змінювати кількість одиниць вибраного товару при перегляді
Лист
ЧДТУ. 222079.001 ПЗ
67
Змн. Лист № докум. Підпис Дата
корзини у вигляді таблиці;
– оформлювати покупку;
– одержувати повідомлення про оформлену покупку електронною
поштою.
Адміністративна частина програми дає можливість менеджеру фірми,
який увійшов у систему з використанням адміністративного логіну:
– переглядати повний каталог товарів для кожної рубрики і
підрубрики із зазначенням повної назви товару, артикулу, ціни, а також
фотографії товару;
– додавати фото товару;
– імпортувати дані про наявні товари та їх ціни з файлу MS Excel;
– підтверджувати права на роботу з інтернет-магазином для
користувачів, які зареєструвались у системі;
– переглядати зроблені клієнтами замовлення;
– друкувати реквізити замовлення, включаючи список товарів з їх
реквізитами;
– відмічати замовлення як такі, що знаходяться в роботі або вже
виконані.
2 Умови виконання програми. Запуск програми
Додаток складається з двох частин – shop.sql та файлу веб-програми shop.
Дана програма написана на мові Ruby з використанням фреймворку Rails,
що дає можливість запустити її на комп'ютерах з різними платформами. Для
роботи вона потребує наступного встановленого на комп'ютері програмного
забезпечення:
– Ruby 2.0;
– Rails 3.2.13;
– SQL-сервер MySQL версії не нижче 5.1;
– веб-сервер Passenger або аналогічний.
Для запуску програми потрібно виконати наступні дії:
– створити MySQL базу даних, використовуючи скрипт shop.sql;
Лист
ЧДТУ. 222079.001 ПЗ
68
Змн. Лист № докум. Підпис Дата
– задеплоїти проект, яких поставляється у вигляді папки shop, на сервер,
зв'язавши його з сервером.
При виборі технічних характеристик для нормального функціонування
проекту, потрібно зауважити, що проект вимагає як мінімум такої конфігурації
апаратних засобів, що забезпечує функціонування 32 розрядного операційного
середовища Windows. Архітектура ПЕОМ повинна мати 512 Mb оперативної
пам’яті. Для оптимальної роботи процесор повинен бути з частотою 2000Гц або
вище. Мінімальний розмір вільного простору на твердому диску, необхідний для
запуску системи – 64MB.
Доступ до програми користувачем здійснюється з використанням веб-
браузера, в якому користувач повинен набрати адресу сервера, на якому
встановлено додаток та ім'я програми ishop.
3 Розгляд основних операцій, які виконуються в програмі
Для початку роботи з програмою після того, як програму задеплоєно на
сервері, потрібно завантажити браузер та набрати в рядку адреси адресу проекту,
наприклад, http://localhost:3000/ishop. Відкривається стартова сторінка, на якій
будь-який користувач може переглянути, які види товарів продає фірма,
переглянувши дерево рубрик у лівій частині (рисунок В.1).
Рисунок В.1 – Стартова сторінка програми
Лист
ЧДТУ. 222079.001 ПЗ
69
Змн. Лист № докум. Підпис Дата
Для того, щоб скористатися програмою, потрібно увійти в систему, для
чого потрібно перейти на сторінку логіну (посилання "Вхід" в правому
верхньому куті) – на ній можна зайти в програму, ввівши ім'я та пароль (рисунок
В.2).
Рисунок В.2 – Вхід в програму
Після цього на екран виводиться стартова сторінка для роботи клієнта – з
дерева у лівій частині сторінки можна вибрати категорію товару, яка цікавить
клієнта. При її виборі у центральній частині відображаються усі товари з цієї
категорії (рисунок В.3).
Лист
ЧДТУ. 222079.001 ПЗ
70
Змн. Лист № докум. Підпис Дата
Рисунок В.3 – Перелік товарів певної категорії
Потрібно вибрати певний товар, клікнувши на ньому. При цьому з'явиться
сторінка даного товару (рисунок В.4).
Рисунок В.4 – Сторінка вибраного товару
На даній сторінці можна продивитись велике зображення товару, а також
ввести кількість одиниць товару і натиснути кнопку "Додати до кошика" – дана
кількість товару буде додана до кошика, також буде вирахувана загальна вартість
даного товару та всіх товарів у кошику (рисунок В.5).
Лист
ЧДТУ. 222079.001 ПЗ
71
Змн. Лист № докум. Підпис Дата
Рисунок В.5 – Додавання вибраного товару до кошика
В кінці користувач може проглянути весь кошик у табличному вигляді та
оформити покупку (рисунок В.6).
Рисунок В.6 – Оформлення покупки
Для того, щоб увійти в адміністративну частину, потрібно набрати
/administrator в рядку адреси. На сторінці адміністратора перелік товарів має
інший вигляд (рисунок В.7).
Лист
ЧДТУ. 222079.001 ПЗ
72
Змн. Лист № докум. Підпис Дата
Рисунок В.7 – Стартова сторінка адміністратора
За допомогою кнопки "Змінити фото" можна змінити фотографію товару.
На правій панелі можна також побачити розділи "Підтвердити клієнта" і "Наявні
замовлення". В першому є список клієнтів, які зареєструвалися, але
адміністратор повинен підтвердити їх, щоб вони могли здійснювати покупки у
магазині. В панелі "Наявні замовлення" є список тих замовлень, які зробили
клієнти, але які ще не оброблені.
Лист
ЧДТУ. 222079.001 ПЗ
73
Змн. Лист № докум. Підпис Дата
ДОДАТОК Г
Графічні матеріали
Постановка задачі проекту
Додаток повинен складатися з двох частин – клієнтської та
адміністративної.
Адміністративна частина програми повинна давати можливість
менеджеру фірми, який увійшов у систему з використанням адміністративного
логіну:
переглядати повний каталог товарів для кожної рубрики і підрубрики із
зазначенням повної назви товару, артикулу, ціни, а також фотографії товару;
додавати фото товару;
імпортувати дані про наявні товари та їх ціни з файлу MS Excel;
підтверджувати права на роботу з інтернет-магазином для користувачів,
які зареєструвались у системі;
переглядати зроблені клієнтами замовлення;
друкувати реквізити замовлення, включаючи список товарів з їх
реквізитами;
відмічати замовлення як такі, що знаходяться в роботі або вже виконані.
Клієнтська частина програми повинна давати можливість клієнту, який не
увійшов у систему:
– переглядати рубрики та підрубрики;
– реєструватися у системі (увійти в систему він може лише після
наступного схвалення адміністратором);
– увійти в систему, якщо клієнт зареєструвався в системі і адміністратор
поставив для нього допуск до системи.
Клієнтська частина програми повинна давати можливість клієнту, який
увійшов у систему:
– переглядати каталог товарів, наявних на даний час, для кожної рубрики
і підрубрики із зазначенням повної назви товару, ціни, а також фотографії
товару;
– переглядати фото товару у збільшеному розмірі;
– вибирати товар у корзину для купівлі із зазначенням кількості товару;
– бачити перелік товарів, доданих до корзини, з кількістю та вартістю
кожної одиниці товару;
– бачити загальну вартість товарів, доданих до корзини;
– видаляти товари з корзини;
Лист
ЧДТУ. 222079.001 ПЗ
74
Змн. Лист № докум. Підпис Дата
– переглядати корзину у вигляді таблиці з фотографією невеликого
розміру, назвою, ціною, вартістю;
– оформлювати покупку;
– одержувати повідомлення про оформлену покупку електронною
поштою.
Використані технології та засоби розробки
Мова програмування Ruby
Фреймворк Rails
Середовище розробки RubyMine
Бібліотеки (gem):
• Devise – аутентифікація користувачів;
• Cancan – авторизація користувачів;
• Ancestry – формування дерева;
• Paperclip – зберігання графічних зображень в проекті.
Структура бази даних
Лист
ЧДТУ. 222079.001 ПЗ
75
Змн. Лист № докум. Підпис Дата
Структура програми
app/ Основний код додатку
(app), включає моделі,
представлення, контролери
і хелпери
app/assets " Активи" додатку, такі, як
каскадні таблиці стилів
(CSS), JavaScript файли та
зображення
config/ Конфігурація додатки
db/ Файли бази даних
lib/ Бібліотека модулів
log/ Файли логів додатки
public/ Публічно доступні дані
(наприклад , веб- браузерам
), такі як сторінки помилок
додатки
Rakefile Службові завдання,
доступні за допомогою
rake-команди
Gemfile Перелік бібліотек (gem).
необхідних даному додатку
Лист
ЧДТУ. 222079.001 ПЗ
76
Змн. Лист № докум. Підпис Дата
Приклад функцій програми
Клієнтська частина:
Адміністративна частина
Лист
ЧДТУ. 222079.001 ПЗ
77
Змн. Лист № докум. Підпис Дата