Мобильное приложение "Магазин строительных инструментов Мастак"
Проектирование мобильного приложения "Мастак", которое представляет собой магазин, специализирующийся на продаже строительных инструментов. Обзор аналогов приложений. Локальная и глобальная база данных. Страница создания аккаунта мобильного приложения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.05.2023 |
Размер файла | 7,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Учреждение образования «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ»
Факультет Информационных технологийКафедра Информационные системы и технологии
Специальность 1-98 01 03 “Программное обеспечение информационной безопасности мобильных систем”
Специализация Инженер-программист
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОМУ ПРОЕКТУ НА ТЕМУ:
«Мобильное приложение “магазин строительных инструментов Мастак”»
Выполнил студент Макрица Фёдор Николаевич
Руководитель проектаст. преподаватель Блинова Е.А.
Минск 2023
Содержание
Введение
1.Постановка задачи и аналитический обзор литературы
1.1 Приложение «Wildberries»
1.2 Приложение «Ozon»
1.3Выводы по главе «Обзор аналогов приложений»
2.Проектирование информационной системы
2.1 Локальная и глобальная база данных
2.2 Проектирование мобильного приложения
2.3 Проектирование веб-сервера
2.4Вывод по главе «Проектирование информационной системы»
3.Разработка информационной системы
3.1Разработка базы данных
3.2 Разработка мобильного приложения
3.3 Разработка веб-приложения
3.2Вывод по главе «Разработка информационной системы»
4. Обеспечение безопасности информационной системы
Заключение
Список использованных источников
Приложение А
Приложение B
Приложение С
Введение
С каждым годом интернет-технологии занимают все более важное место в повседневной жизни людей. Сейчас подавляющее большинство магазинов различных направлений имеют свои онлайн-версии. Это позволяет наиболее эффективным образом продавать и доставлять товары, а также удобно хранить данные о продажах. В сети можно купить практически все, но остается множество магазинов, которые только начинают свой онлайн-путь. В этом контексте можно отметить такие ниши рынка, как продажа профессионального строительного инструмента и оборудования. Мобильное приложение "Мастак" представляет собой магазин, специализирующийся на продаже строительных инструментов.
Мобильно приложение будет сделано с помощью Android Studio на языке Java. Так же будет использован Node.js для создания сервера на котором будет храниться база данных.
Будет возможность работать при отключении интернета. Приложение будет держать всю информацию, а после подключения интернета информация будет перенесена в базу данных и сохранена.
Таким образом, данное приложение очень полезно для многих людей, которые организовывают мероприятия или же какие-то собрания.
1.Постановка задачи и аналитический обзор литературы
1.1 Приложение «Wildberries»
Важным этапом создания различных проектов является ознакомление с разных литературных источников и аналитический разбор.
Я проанализировал несколько разных программных средств связанных с моей тематикой.
Приложение Wildberries позволяет совершать интернет-покупки одежды, обуви и аксессуаров. У магазина Wildberries есть и свое приложение для смартфонов, которое очень удобно использовать. Самый большой плюс этого приложения - это простой и понятный интерфейс. В плане навигации и поиска товаров, приложение Wildberries оставляет только положительные эмоции. Большой ассортимент товаров, простая и понятная фильтрация, наличие акций и скидок - все это делает приложение Wildberries одним из лучших в виртуальном мире.
Рис. 1.1 - Мобильное приложение.
Данное приложение так же имеет и десктопнаю версию, которая показана на рисунке ниже (рисунок 1.2).
Рис. 1.2 - Версия для компьютеров.
1.2 Приложение «Ozon»
Есть еще более удобное приложение под название «Ozon».
Это многофункциональный интернет-магазин, который предлагает широкий ассортимент товаров, начиная от бытовой техники, продуктов питания, книг и заканчивая парфюмерией и косметикой. Один из недостатков данный магазин - это не слишком удобный интерфейс в приложении. Несмотря на это, если вы знаете, что хотите купить, на Ozon можно быстро найти то, что вам нужно, настроив при этом фильтры так, как вы считаете удобным. Также на сайте и в приложении Ozon есть множество акций и скидок, которые могут сохранить ваш бюджет. Удобной функцией является возможность оплаты заказа при получении товара и приложение может работать на разных телефонах с разными разрешениями экрана.
Рис. 1.3 - Ozon - дизайн под телефон.
Рис. 1.4 - Интерфейс пользователя и администратора.
В моей программе будут сохранены товары в избранное, которые можно будут удалять. Это позволит не тратить время на поиск. Пользователи могут создать и авторизоваться в свою учетную запись.
Выводы по главе «Обзор аналогов приложений»
В данной главе были показаны два популярных приложения, которые являются аналогами приложения «Мастак»: «Wildberries» и «Ozon». В результате подытожим сравнения.
Таким образом, сравнение этих двух магазинов показало, что у каждого из них есть свои достоинства и недостатки. Wildberries позволяет с легкостью найти и заказать желаемый товар, обеспечивая при этом легкую навигацию, множество скидок и акций. Ozon же направлен на усовершенствование своего сервиса и расширение ассортимента товаров. Несмотря на особенности каждого магазина, оба из них предлагают высокое качество обслуживания. Выбор между ними зависит только от потребностей и предпочтений покупателя.
2. Проектирование информационной системы
2.1 Локальная и глобальная база данных
Задачей курсового проекта создать приложение, которое будет иметь заданный функционал:
Просмотр товара
Заказ товара
Управление заказанных товаров в корзине клиента
Авторизация и регистрация аккаунта
В базе данных данного приложения созданы для использования 3 таблицы. Скрипт создания БД и таблиц находится в Приложении А. Ниже представлена их характеристика.
Схема базы данных представлена в таблице 2.1 - 2.9.
Таблица 2.1- схема таблицы Users.
Имя атрибута |
Типы данных |
Назначение |
|
id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
name |
String |
Имя пользователя |
|
password |
String |
Пароль пользователя в хешированном виде |
|
isAdmin |
Bool |
Определяет права пользователя |
|
image |
String |
Изображение пользователя |
В таблице «Users» содержится информация для авторизации пользователей. Столбцы данной таблицы:
id - уникальный идентификатор, который придумывает сам пользователь, является первичным ключом;
name - строковый тип данных, максимальная длина 20;
password - строковый тип данных, максимальной длины 12, хешируется на сервере и на мобильном приложении с помощью bcrypt
isAdmin - булевый тип данных, определяющий права доступа
Image - строковый тип данных, определяющий изображение пользователя(Приложение В);
Таблица 2.2 - схема таблицы Favorite.
Имя атрибута |
Тип данных |
Назначение |
|
Favorite_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
User_id |
Integer |
Идентификатор пользователя |
|
Product_id |
Integer |
Идентификатор мероприятия |
В таблице «Favorite» содержатся пользователи и товары, на которые они хотят приобрести. Столбцы данной таблицы:
id - целочисленный тип данных, первичный ключ, имеется AUTOINCREMENT позволяющий автоматически ставит id;
user_id - целочисленный тип данных, вторичный ключ, ссылается на первичный ключ таблицы Users, служит для связи этих таблиц;
event_id - целочисленный тип данных, вторичный ключ, ссылается на первичный ключ таблицы Product, служит для связи этих таблиц;
Таблица 2.3 - схема таблицы Product.
Имя атрибута |
Тип данных |
Назначение |
|
id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
product_name |
String |
Название товара |
|
price |
Double |
Цена товара |
|
quantity |
Integer |
Количество товара |
|
supplier |
String |
Поставщик товара |
|
image |
String |
Изображение товара |
|
category |
String |
Категория товара |
В таблице «Product» содержится информация о товаров. Столбцы данной таблицы:
id - целочисленный тип данных, первичный ключ, имеется AUTOINCREMENT позволяющий автоматически ставит id товара;
product_name - строковый тип данных, не допускается null;
price - строковый тип данных;
quantity - целочисленный тип данных;
supplier - содержит дату проведения мероприятия, тип данных дата, неуникальное значение, не допускается null, удаляется автоматически после истечения времени;
image - строковый тип данных, содержит информацию о изображении;
category - строковый тип данных;
Таблица 2.4 - схема таблицы Ordering.
Имя атрибута |
Тип данных |
Назначение |
|
ordering_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
order_number |
String |
Номер заказа |
|
order_date |
Double |
Дата заказа |
|
status |
Integer |
Статус заказа |
|
name_on_card |
String |
Имя карточки (имя на карточке) |
|
card_number |
String |
Номер карты |
|
expiration_date |
Date |
дата истечения срока действия |
|
user_id |
Integer |
Идентификатор пользователя |
|
product_id |
Integer |
Идентификатор мероприятия |
Таблица 2.5 - схема таблицы Cart.
Имя атрибута |
Тип данных |
Назначение |
|
user_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
|
product_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с product и ordering. |
Таблица 2.6 - схема таблицы History.
Имя атрибута |
Тип данных |
Назначение |
|
history_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
user_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
|
product_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
Таблица 2.7 - схема таблицы Shipping.
Имя атрибута |
Тип данных |
Назначение |
|
shipping_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
address |
String |
Адрес пользователя |
|
city |
String |
Город пользователя |
|
country |
String |
Страна пользователя |
|
zip |
String |
Почтовый индекс |
|
phone |
String |
Номер телефона |
|
user_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
|
product_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
Таблица 2.8 - схема таблицы poster.
Имя атрибута |
Тип данных |
Назначение |
|
poster_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
image |
String |
Имя картинки для poster |
Таблица 2.9 - схема таблицы review.
Имя атрибута |
Тип данных |
Назначение |
|
review_id |
Integer |
Первичный ключ. Определяет уникальный идентификатор записи. |
|
user_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
|
product_id |
Integer |
Вторичный ключ. Определяет уникальный идентификатор cart с user и ordering. |
|
feedback |
Varchar (150) |
обратная связь |
|
rate |
Float (11,1) |
Оценка |
|
review_date |
Date |
Дата Оценки |
Рис. 2.4 - структура базы данных
В таблице Users будут все данные о зарегистрированных пользователях: их имя и фамилия, пароль, который они же смогут поменять, если решат, что он не надежный и их права, которые будут отвечать, могут ли пользователи добавлять товар.
В таблице Favorite содержатся пользователи и товары, на которые они хотят приобрести.
В таблице Product содержаться информация о товаре.
2.2 Проектирование мобильного приложения
В данной курсовой работе необходимо было разработать приложение, позволяющее пользователям совершать онлайн покупки инструментов.
Если пользователь запускает приложение на устройстве в первый раз, то открывается страница с именем магазина рисунок 2.5, а затем идет переход к экрану регистрации рисунок 2.6.
Рис. 2.5 - Пользователь запускает приложение
Рис. 2.6 - Страница регистрации
На этом экране есть можно зарегистрироваться или же создать свой аккаунт. Для регистрации пользователю нужно возможность ввести email и пароль. Если же email, который вводит пользователь нету в базе данных, то выскакивает соответствующее сообщение. По умолчанию у всех пользователей нету прав для добавления товаров, права выдает администратор. Для создания нового аккаунта нужно будет нажать на “Создать свой ученую запись” и приложение перейдет на страницу создания аккаунта рисунок 2.7.
Рис 2.7 - Страница создания аккаунта
мобильное приложение магазин
Пользователь необходимо ввести имя, почту и пароль, который должен быть не менее 8 символов. При введении пользователем электронной почты, которая уже есть приложение выдаст сообщение о том, что такой пользователь существует. После успешной пройденной регистрации пользователь переходит на страницу со всеми товарами рисунок 2.8.
Рис 2.8 - Страница со всеми товарами
Пользователь, нажав на иконку, перейдет на станицу товара. На странице товара пользователь может добавить товар в корзину, купить, написать отзыв и посмотреть все отзывы. Нажав на иконку, тележка в верхнем правом углу, мы можем посмотреть содержимое корзины. Также нажав на иконку, три полоски в левом углу, откроется меню, тут пользователь может выбрать категорию товара, посмотреть свой заказ, настроить аккаунт, список желаний и ленту новостей.
Рис. 2.9 - диаграмма использования мобильного приложения для пользователей
2.3 Проектирование веб-сервера
Веб-приложение -- клиент-серверное приложение, в котором клиент взаимодействует с веб-сервером при помощи браузера. Логика веб-приложения распределена между сервером и клиентом, хранение данных осуществляется, преимущественно, на сервере, обмен информацией происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому веб-приложения являются межплатформенными службами.
Веб приложение состоит из двух компонентов: веб сервера и клиента. Веб. Веб сервер имеет REST архитектуру и осуществляет взаимодействие с базой данных. Сервер содержит в себе реализованные сервисы для взаимодействия с каждой сущностью базы данных.
При обращении к серверу по заданному маршруту и определенному HTTP методу сервер будет определять с какой сущностью базы данных необходимо взаимодействовать и какие действия над данными необходимо будет произвести.
При помощи HTTP метода GET сервер будет возвращать данные клиенту, ссылаясь на аргументы в запросе, как на условие для выборки данных. Метод POST в свою очередь позволяет передать данные на сервер для последующей обработки. Метод PUT позволяет обновить соответствующие данные, переданные с клиента. Метод DELETE удаляет с базы данных заданную запись.
Веб-приложение состоит их двух частей: клиент и сервер. Клиент в свою очередь выступает в роле интерфейса веб-приложения.
Вывод по главе «Проектирование информационной системы»
В данной главе было рассмотрено проектирование каждого отдельного компонента приложения.
По части мобильного приложения был определен основной функционал приложения, также были разработаны диаграмма вариантов использования приложения и описаны варианты использования программного средства.
Была также спроектирована база данных, где были определены необходимые таблицы, охарактеризованы поля каждой из них, определены типы данных и ограничения целостности. Также были установлены связи между таблицами, заключающиеся в создании первичных и внешних ключей.
При проектировании серверного приложения был определен архитектурный стиль взаимодействия между сервером и клиентом.
3. Разработка информационной системы
Для разработки приложений курсового проекта были использованы следующие технические средства:
SQLite - компактная встраиваемая реляционная база данных.
MySQL - свободная реляционная система управления базами данных.
SQL - декларативный язык программирования, применяемый для создания, модификации, и управления данными в РБД.
Android Studio - интегрированная среда разработки для работы с платформой Android.
Visual Studio Code - редактор исходного кода.
Java - строго типизированный объектно-ориентированный язык программирования.
Node.js -- это платформа с открытым исходным кодом для работы с языком JavaScript.
Postman - набор инструментов тестирования API.
3.1 Разработка базы данных
Для хранения данных на телефоне будет использоваться встраиваемая СУБД SQLite. Для сервера будет использована СУБД MySQL.
Также были созданы функции и хранимые процедуры, для взаимодействия с таблицами базы данных.
CREATE TABLE `cart` (
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `favorite` (
`favorite_id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `history` (
`history_id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ordering` (
`ordering_id` int(11) NOT NULL,
`order_number` int(11) DEFAULT NULL,
`order_date` date DEFAULT NULL,
`status` text,
`name_on_card` text,
`card_number` text,
`expiration_date` date DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `poster` (
`poster_id` int(11) NOT NULL,
`image` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `poster` (`poster_id`, `image`) VALUES
(4, 'storage_poster\\poster.jpg'),
(5, 'storage_poster\\poster1.jpg'),
(6, 'storage_poster\\poster2.jpg');
CREATE TABLE `product` (
`id` int(11) NOT NULL,
`product_name` text,
`price` double(11,2) NOT NULL,
`quantity` int(11) NOT NULL,
`supplier` text NOT NULL,
`image` text NOT NULL,
`category` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `review` (
`review_id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL ,
`product_id` int(11) DEFAULT NULL,
`feedback` varchar(150) DEFAULT NULL,
`rate` float(11,1) DEFAULT NULL,
`review_date` date DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `shipping` (
`shipping_id` int(11) NOT NULL,
`address` text,
`city` text,
`country` text,
`zip` text,
`phone` text,
`user_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` text NOT NULL,
`email` text NOT NULL,
`password` text NOT NULL,
`gender` text NOT NULL,
`age` int(11) NOT NULL,
`image` text NOT NULL,
`isAdmin` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Листинг 1 - база данных на сервере
CREATE DEFINER=`root`@`localhost` PROCEDURE `deleteUser`(IN userId INT)
BEGIN
DELETE FROM user WHERE id = userId;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `getUserById`(IN userId INT)
BEGIN
SELECT id, name, email, password, IF(isAdmin=1, 'true', 'false') AS isAdmin
FROM user
WHERE id = userId;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `getUserIDByEmail`(IN userEmail VARCHAR(255))
BEGIN
SELECT id FROM user
WHERE email = userEmail;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `getUsers`(IN limitNum INT, IN offsetNum INT)
BEGIN
SELECT * FROM user
LIMIT limitNum
OFFSET offsetNum;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_user`(
IN u_name VARCHAR(255),
IN u_email VARCHAR(255),
IN u_password VARCHAR(255),
IN u_gender VARCHAR(10),
IN u_age INT(11),
IN u_image LONGTEXT
)
BEGIN
INSERT INTO user(name, email, password, gender, age, image)
VALUES(u_name, u_email, u_password, u_gender, u_age, u_image);
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_user`(
IN user_name VARCHAR(255),
IN user_email VARCHAR(255),
IN user_id INT)
BEGIN
UPDATE user
SET name = user_name,
email = user_email
WHERE id = user_id;
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `updateUserPasswordByID`(IN userID INT, IN userPassword VARCHAR(255))
BEGIN
UPDATE user
SET password = userPassword
WHERE id = userID;
END
Листинг 2 - Хранимые процедуры
3.2 Разработка мобильного приложения
Мобильное приложение было реализовано в среде разработки - Android Studio. Для написания приложения был использован язык программирования Java.
Графическая структура проекта представлена на рисунке 3.
Рис. 3 - Графическая структура проекта
Для взаимодействия мобильного приложения и сервера используется Retrofit. Для его подключения в build.gradle подключаем нужные библиотеки как показано на рисунке 3.1.
Рис. 3.1 - Подключение библиотек для Retrofit.
С помощью класса RetrofitClient мы настраиваем соединения для дальнейшей работы. В методе RetrofitClient помещаем путь, по которому будет подключаться к серверу наше приложение. В данном случае, наш путь будет прописан так: http://наше_ip_адрес:порт_сервера.
Рис. 3.2 - Метод для подключения к серверу
Рис. 3.3 - RetrofitClient для подключения к серверу
Сам же Retrofit реализован в файле Api. В нем реализован интерфейс запросов и классы необходимые для работы с запросами (POST, DELETE, GET, PUT).
public interface Api {
@POST("users/register")
Call<RegisterApiResponse> createUser(@Body User user);
@GET("users/login")
Call<LoginApiResponse> logInUser(@Query("email") String email, @Query("password") String password);
@DELETE("users/{userId}")
Call<ResponseBody> deleteAccount(@Header("authorization") String token , @Path("userId") int userId);
@Multipart
@PUT("users/upload")
Call<ResponseBody> uploadPhoto(@Header("authorization") String token , @Part MultipartBody.Part userPhoto, @Part("id") RequestBody userId);
@PUT("users/info")
Call<ResponseBody> updatePassword(@Header("authorization") String token, @Query("password") String password, @Query("id") int userId);
@Multipart
@POST("products/insert")
Call<ResponseBody> insertProduct(@Header("authorization") String token, @PartMap Map<String, RequestBody> productInfo, @Part MultipartBody.Part image);
@GET("users/getImage")
Call<Image> getUserImage(@Query("id") int userId);
@GET("users/otp")
Call<Otp> getOtp(@Header("authorization") String token, @Query("email") String email);
@GET("products")
Call<ProductApiResponse> getProductsByCategory(@Query("category") String category, @Query("userId") int userId,@Query("page") int page);
@GET("products/search")
Call<ProductApiResponse> searchForProduct(@Query("q") String keyword, @Query("userId") int userId);
@POST("favorites/add")
Call<ResponseBody> addFavorite(@Body Favorite favorite);
@DELETE("favorites/remove")
Call<ResponseBody> removeFavorite(@Query("userId") int userId, @Query("productId") int productId);
@GET("favorites")
Call<FavoriteApiResponse> getFavorites(@Query("userId") int userId);
@POST("carts/add")
Call<ResponseBody> addToCart(@Body Cart cart);
@DELETE("carts/remove")
Call<ResponseBody> removeFromCart(@Query("userId") int userId, @Query("productId") int productId);
@GET("carts")
Call<CartApiResponse> getProductsInCart(@Query("userId") int userId);
@POST("history/add")
Call<ResponseBody> addToHistory(@Body History history);
@DELETE("history/remove")
Call<ResponseBody> removeAllFromHistory();
@GET("history")
Call<HistoryApiResponse> getProductsInHistory(@Query("userId") int userId, @Query("page") int page);
@POST("review/add")
Call<ResponseBody> addReview(@Body Review review);
@GET("review")
Call<ReviewApiResponse> getAllReviews(@Query("productId") int productId);
@GET("posters")
Call<NewsFeedResponse> getPosters();
@GET("orders/get")
Call<OrderApiResponse> getOrders(@Query("userId") int userId);
@POST("address/add")
Call<ResponseBody> addShippingAddress(@Body Shipping shipping);
@POST("orders/add")
Call<ResponseBody> orderProduct(@Body Ordering ordering);
}
Листинг 3 - создание методов POST, DELETE, PUT и GET в файле Api
Если пользователь хочет создать учетную запись в классе SignUpActivity, то при вводе корректных данных вызывается POST метод isLoggedIn у IRetrofit. Тем самым он передает данные на сервер, где сервер уже выполняет данный запрос и заполняет или же нет данные в таблицу.
Рис. 3.4 - выполнения метода POST для регистрации
Класс SignUpActivity служит отправной точкой всей программы. От сюда пользователь выбирает что ему нужно (регистрация или авторизация) и выполняется соответствующее действие.
3.3 Разработка веб-приложения
Веб-сервер разработан с использование языка программирование JavaScript и среды исполнения NodeJS. NodeJS -- программная платформа, основанная на движке V8 (компилирующем JavaScript в машинный код), превращающая JavaScript из узкоспециализированного языка в язык общего назначения.
Веб сервер разработан с использованием архитектуры REST. Каждая программная сущность определена в отдельный модуль. В общем случае каждая программная сущность описывается тремя компонентами: контроллер, сервис и роутер. Такое разделение позволяет независимо разрабатывать каждый компонент модуля по отдельности, а также позволяет относительно легко применить юнит тестирование к программному модулю.
Для создания курсового проекта использовался фреймворк Express. Данный фреймворк позволяет более удобным образом сконфигурировать и создать HTTP сервер, а также позволяет гибко настраивать маршрутизацию.
Роутер служит для описания маршрутов к конечным точкам веб-сервера (рисунок 3.5). Контроллер осуществляет передачу параметров запроса и обработку результата ответа. Сервис нужен для выполнения бизнес логики приложения.
Рис. 3.5 - структура веб-сервера
Роутер создается с помощью фреймворка Express. Для создания конечные точек необходимо вызвать нужный HTTP метод роутера и передать некоторые параметры: путь к конечной точке и функцию, которая будет срабатывать при отправке запроса по этому пути. Второй аргумент, который является ссылкой на функцию оборачивается в специальный класс обертку, который предназначен для обработки исключений и генерации ответов при ошибках.
Рис. 3.6 - Контроллер веб-сервера
Вывод по главе «Разработка информационной системы»
В данной главе было рассмотрена разработка каждого отдельного компонента приложения.
На первоначальном этапе были рассмотрены технологии, которые применены для разработки курсового проекта.
Вторым этапом была разработка структуры базы данных на стороне сервера и клиента.
Третьим этапом стала разработка мобильного приложения, где была представлена графическая структура приложения, рассмотрены некоторые классы и их методы, в частности.
Четвертый этап - это разработка веб-приложения, где была представлена графическая структура веб-сервера и веб-клиента, рассмотрены некоторые классы и их методы.
4. Обеспечение безопасности информационной системы
Для обеспечения защиты персональных данных пользователей применялись методы хеширования и криптографии. Пароли пользователей информационной системы хранятся в базе данных в хешированном виде. Хеширование - это процесс преобразования входной строки переменной длины в выходную строку фиксированной длины, называемой хеш-кодом или дайджестом сообщения. Процесс хеширования реализуется путем использования криптографической хеш-функции (Приложение B). Хеширование паролей не позволяет злоумышленнику получить доступ к аккаунту пользователя информационной системы.
В данном приложении реализована функция хеширование пароля с помощью bcrypt. Он надежнее чем MD5, так как не может из хешированных данных получить пароль. Вместо этого он сравнивает два разных хеша и смотрит на совпадение. Если хеши совпадают, значит пароль введен правильно.
Заключение
Целью моего курсового проекта было предоставить пользователям возможность легко и удобно покупать товары.
Были решены следующие поставленные задачи:
обзор аналогов;
В результате было рассмотрено 2 приложения и были выявлены их положительные и отрицательные стороны. Эта информация была использована для улучшения функционала приложения и пользовательского интерфейса.
проектирование приложения;
Был спроектирован каждый отдельный компонент приложения. В мобильном и веб-приложении был определен основной функционал, также была разработана диаграмма вариантов использования. При проектировании базы данных, были определены необходимые таблицы и разработана схема базы данных. В серверном приложении был определен архитектурный стиль взаимодействия между клиентом и сервером, формат передаваемых данных и HTTP методы для работы с серверной частью.
реализация приложения;
Данная задача была реализована с помощью следующих технических средств: MySQL, сред разработки Android Studio и Visual Studio Code, языков программирования JavaScript, Java, библиотеки Retrofit 2.
Были реализованы базы данных на стороне сервера и клиента.
При решении данной задачи была достигнута поставленная цель, и был создан проект Мастак, который включает в себя android-клиент, веб-клиент и веб-сервер.
Список использованных источников
Retrofit 2. Upgrade Guide [Электронный ресурс] / futurestud.io. - Режим доступа: https://futurestud.io/tutorials/retrofit-2-upgrade-guide-from-1-9
Архитектура REST [Электронный ресурс] - habr.com - Режим доступа: https://habr.com/ru/post/38730/
Solutions on Stackoverflow [Электронный ресурс] - Режим доступа: https://stackoverflow.com.
«Сайт Александра Климова» по Android [Электронный ресурс] - Режим доступа: http://developer.alexanderklimov.ru
Simple POST request on Android Kotlin using Retrofit [Электронный ресурс] - Режим доступа: https://medium.com/swlh/simplest-post-request-on-android-kotlin-using-retrofit-e0a9db81f11a
Приложение А
const express = require('express')
const bodyParser = require('body-parser')
require('dotenv').config();
const app = express()
// User can read pictures from it
app.use('/storage_user', express.static('storage_user'));
app.use('/storage_product', express.static('storage_product'));
app.use('/storage_poster', express.static('storage_poster'));
// Import my file
const userRouter = require('./api/routes/users')
const productRouter = require('./api/routes/products')
const favoriteRouter = require('./api/routes/favorites')
const cartRouter = require('./api/routes/carts')
const historyRouter = require('./api/routes/history')
const reviewRouter = require('./api/routes/review')
const posterRouter = require('./api/routes/posters')
const addressRouter = require('./api/routes/address')
const orderRouter = require('./api/routes/orders')
const port = 3000
// Middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// Use methods from my file
app.use('/users', userRouter)
app.use('/products',productRouter)
app.use('/favorites',favoriteRouter)
app.use('/carts',cartRouter)
app.use('/history',historyRouter)
app.use('/review',reviewRouter)
app.use('/posters',posterRouter)
app.use('/address',addressRouter)
app.use('/orders',orderRouter)
app.get('/', (req, res) => {
res.send(`
<h1>Главная страница</h1>
<ul>
<li><a href="/users">Пользователи</a></li>
<li><a href="/products/all">Продукты</a></li>
<li><a href="/orders/allrouter">Заказы</a></li>
<li><a href="/review/full">Отзывы</a></li>
</ul>
`);
});
// Make my server work on port 3000 and listen when user use it
app.listen(port, () => console.log("Server Started"))
console.log("http://localhost:"+port);
Приложение B
public interface Api {
@POST("users/register")
Call<RegisterApiResponse> createUser(@Body User user);
@GET("users/login")
Call<LoginApiResponse> logInUser(@Query("email") String email, @Query("password") String password);
@DELETE("users/{userId}")
Call<ResponseBody> deleteAccount(@Header("authorization") String token , @Path("userId") int userId);
@Multipart
@PUT("users/upload")
Call<ResponseBody> uploadPhoto(@Header("authorization") String token , @Part MultipartBody.Part userPhoto, @Part("id") RequestBody userId);
@PUT("users/info")
Call<ResponseBody> updatePassword(@Header("authorization") String token, @Query("password") String password, @Query("id") int userId);
@Multipart
@POST("products/insert")
Call<ResponseBody> insertProduct(@Header("authorization") String token, @PartMap Map<String, RequestBody> productInfo, @Part MultipartBody.Part image);
@GET("users/getImage")
Call<Image> getUserImage(@Query("id") int userId);
@GET("users/otp")
Call<Otp> getOtp(@Header("authorization") String token, @Query("email") String email);
@GET("products")
Call<ProductApiResponse> getProductsByCategory(@Query("category") String category, @Query("userId") int userId,@Query("page") int page);
@GET("products/search")
Call<ProductApiResponse> searchForProduct(@Query("q") String keyword, @Query("userId") int userId);
@POST("favorites/add")
Call<ResponseBody> addFavorite(@Body Favorite favorite);
@DELETE("favorites/remove")
Call<ResponseBody> removeFavorite(@Query("userId") int userId, @Query("productId") int productId);
@GET("favorites")
Call<FavoriteApiResponse> getFavorites(@Query("userId") int userId);
@POST("carts/add")
Call<ResponseBody> addToCart(@Body Cart cart);
@DELETE("carts/remove")
Call<ResponseBody> removeFromCart(@Query("userId") int userId, @Query("productId") int productId);
@GET("carts")
Call<CartApiResponse> getProductsInCart(@Query("userId") int userId);
@POST("history/add")
Call<ResponseBody> addToHistory(@Body History history);
@DELETE("history/remove")
Call<ResponseBody> removeAllFromHistory();
@GET("history")
Call<HistoryApiResponse> getProductsInHistory(@Query("userId") int userId, @Query("page") int page);
@POST("review/add")
Call<ResponseBody> addReview(@Body Review review);
@GET("review")
Call<ReviewApiResponse> getAllReviews(@Query("productId") int productId);
@GET("posters")
Call<NewsFeedResponse> getPosters();
@GET("orders/get")
Call<OrderApiResponse> getOrders(@Query("userId") int userId);
@POST("address/add")
Call<ResponseBody> addShippingAddress(@Body Shipping shipping);
@POST("orders/add")
Call<ResponseBody> orderProduct(@Body Ordering ordering);
}
Приложение С
public class RetrofitClient {
private static final String BASE_URL = LOCALHOST;
private static RetrofitClient mInstance;
private final Retrofit retrofit;
// Конструктор RetrofitClient, который инициализирует экземпляр Retrofit с помощью строителя Retrofit.Builder.
// Здесь мы указываем основной URL-адрес сервера, используемый для запросов, и определяем, что должно использоваться для сериализации
// и десериализации JSON, с помощью конвертера GsonConverterFactory.
private RetrofitClient() {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
//Метод getInstance, который используется для получения единственного экземпляра RetrofitClient.
// Если экземпляр не был создан, то данный метод создает новый экземпляр.
public static synchronized RetrofitClient getInstance() {
if (mInstance == null) {
mInstance = new RetrofitClient();
}
return mInstance;
}
//Метод getApi, который возвращает экземпляр интерфейса Api.
//Он используется для выполнения HTTP-запросов на сервер. Вызов retrofit.create() возращает экземпляр Api.class, который содержит методы для выполнения запросов.
public Api getApi() {
return retrofit.create(Api.class);
}
//Таким образом, этот класс предоставляет инстанс Retrofit, который может быть использован для запросов на сервер, с использованием API, реализованного в классе Api.
}
Размещено на Allbest.ru
Подобные документы
Анализ российского рынка мобильных приложений. Мобильное приложение как новый канал коммуникации с целевой аудиторией. Этапы создания мобильного приложения. План продвижения мобильного приложения в сети Интернет. Бесплатные инструменты продвижения.
дипломная работа [1,6 M], добавлен 23.06.2016Обзор рынка мобильных приложений, социальных сетей, аналогов. Обзор инструментов разработки: Android Studio, Microsoft visual С# 2012, PostgreeSQL, API Открытых данных Вологодской области, API Социальных сетей. Программный код, разработка интерфейса.
дипломная работа [2,6 M], добавлен 10.07.2017Разработка приложения для проверки использования времен глаголов в английском языке. Создание базы данных. Анализ используемых средств для реализации автоматического разбора текста. Проектирование мобильного приложения с помощью диаграмм деятельности.
дипломная работа [2,6 M], добавлен 13.09.2017Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.
курсовая работа [987,1 K], добавлен 27.06.2019Проектирование удобного приложения для комфортной навигации по файлам облачного хранилища в одном файловом менеджере. Выбор интегрированной среды разработки. Выбор инструментов для визуализации приложения. Выбор средств отслеживания HTTPзапросов.
курсовая работа [3,6 M], добавлен 16.07.2016Мобильное приложение и его предназначение для организации информационного обмена между мобильными сотрудниками компании (водитель эвакуатора, мастер техпомощи) и CRM системой. Синхронизация данных о заказах. Пользовательский интерфейс приложения.
дипломная работа [594,5 K], добавлен 12.08.2017Общая характеристика и анализ требований к разрабатываемому приложению, функциональные особенности и сферы практического применения. Проектирование базы данных и выбор системы управления ею. Тестирование приложения и выбор языка программирования.
дипломная работа [791,8 K], добавлен 10.07.2017Обзор подходов к разработке музейных приложений с элементами дополненной реальности, формирование требований к ним. Выбор методов разработки приложения, разработка пользовательского интерфейса. Принципы тестирования. Реализация раздела "Распознавание".
дипломная работа [2,8 M], добавлен 03.07.2017Разработка и формализация эффективного подхода к оценке качества каналов трафика мобильного приложения. Преимущества работы с социальными сетями. Тестирование возможных типов каналов по привлечению установок приложения. Расчёт средней стоимости лидов.
дипломная работа [2,6 M], добавлен 09.02.2017Реализация приложения "Книжный магазин" средствами систем управления базами данных. Проектирование структуры базы данных, определение сущности и атрибутов. Логическое проектирование базы данных и реализация базы данных в СУБД Microsoft Office Access.
курсовая работа [7,8 M], добавлен 13.02.2023