Дипломная работа на тему Разработка справочно-информационной системы “Афиша города” для платформы Android

Содержание

Введение

1. Аналитический обзор

1.1 Постановка задачи

1.2 Анализ похожих решений

2. Проектирование системы

2.1 Определение требований

2.2 Разработка структурно – функциональной модели

2.3 Разработка модели данных

2.4 Выбор инструментальных средств

3. Программная реализация

3.1 Определение программных модулей

3.2 Разработка алгоритмов

3.3 Особенности программной реализации

4. Тестирование

4.1 Функциональное тестирование

4.2 Тестирование производительности

5. Вопросы безопасности

5.1 Анализ возможных угроз

5.2 Предложения по безопасности

Заключение

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

Приложение

Введение

Сегодня трудно представить себе человека без мобильного устройства. Мы привыкли к тому, что оно всегда у нас под рукой. Теперь это не просто средство общения, а многофункциональное, многозадачное устройство.

Смартфоны, а также персональные компьютеры, обладают различными операционными системами или, как их еще называют, платформами. Поскольку мобильные продажи во всем мире растут, это непременно ведет к росту спроса на различные приложения для них. Теперь почти каждая компания стремится иметь, по меньшей мере, одно мобильное приложение. А существование некоторых компаний сложно представить без мобильных и специализированных приложений, с помощью которых можно, например, управлять данными или состоянием своего продукта на рынке в любой момент времени.

Устройства становятся все более и более персонализированными с возможностью доступа к ним в любое время из любого места. На переднем плане этого процесса стоят мобильные устройства, которые трансформируются в вычислительные платформы, выполняющие широкий спектр вычислительных задач, эти устройства становятся новым поколением персональных компьютеров.

Сейчас в индустрии информационных технологий увеличивается объем программного обеспечения для мобильных устройств. Эта тенденция открывает большие возможности как для разработчиков, так и для потребителей, конечных пользователей. Соответственно, на сегодняшний день разработка мобильных приложений как никогда актуальна.

Целью данной выпускной квалификационной работы является разработка информационно — справочной системы для одной из самых популярных в мире мобильных платформ – Android.

1. Аналитический обзор

1.1 Постановка задачи

В качестве направления разработки мною была выбрана тема разработки мобильных приложений. На мой взгляд, эта тема очень актуальна в наше время. Прежде всего актуальность обусловлена популярностью мобильных устройств: смартфонов, планшетов и других портативных устройств.

Мобильные устройства, в особенности смартфоны — наши постоянные спутники, и мы постоянно ими пользуемся. Ведь действительно, люди со смартфонами повсюду. В некоторых европейских городах власти даже установили дорожные знаки, информирующие участников дорожного движения о людях, идущих со смартфонами.

Смартфон уже давно перестал быть роскошью, а рынок изобилует огромным количеством различных устройств. Так, согласно подсчетам и оценкам компаний, занимающихся аналитической деятельностью, в частности таких, как International Data Corporation, J’son & Partners Consulting и Связной, в 2016 году объем российского рынка мобильных устройств в натуральном выражении составил около 30 миллионов устройств. Если сравнивать с предыдущим годом, то рынок вырос в среднем на 4,4?% [1].

Таким образом, наблюдается огромный спрос на смартфоны, и это неотъемлемо ведёт к огромному спросу на мобильные приложения. В подтверждение вышесказанному ниже приведены еще некоторые интересные аналитические данные.

Например, согласно данным исследовательской компании Forrester, люди берут в руки свои мобильные устройства в среднем от 150 до 200 раз в день, в результате получается почти 30 миллиардов случаев использования мобильных устройств в сутки [1].

Когда мы говорим о смартфонах, то нельзя обойти стороной их операционные системы – программное обеспечение, предназначенное для управления ресурсами устройства и организации взаимодействия с пользователем.

На сегодняшний день самыми популярными мобильными операционными системами или, говоря языком разработчиков, платформами являются:

– Android компании Google;

– iOS компании Apple;

– Windows Phone компании Microsoft.

Дальше приведена статистика использования каждой из вышеперечисленных операционных систем в мире и в России, предоставленная веб-сервисом StatCounter, который анализирует веб-трафик [2].

Итак, в январе 2017-го в мире были зафиксированы следующие значения распространённости операционных систем в процентах, где в скобках показаны изменения, произошедшие за год: Windows Phone – 1.13% (-0.11%), iOS – 19.73 (+0.84%), Android – 71.58% (-0.39%). Ниже для наглядности приведено изображение, на котором расположен график популярности ОС в мире с января 2016 года по январь 2017 года.

Рисунок 1.1 – Мировая популярность мобильных операционных систем

В России мобильные устройства на Windows Phone составляют 2.54% (-0.3%), iOS – 26.56% (+1.04%), Android – 68.87% (-0.32%). Ниже также для наглядности приведено изображение.

Рисунок 1.2 – Популярность мобильных операционных систем в России

Таким образом, лидирующую позицию занимает операционная система Android, которую выбрали около 70% пользователей, второе место занимает iOS, последнее – Windows Phone.

Исходя из всего вышеперечисленного, можно сделать вывод, что мобильные приложения для устройств с операционной системой Android на сегодняшний день чрезвычайно популярны, а, следовательно, и их разработка является актуальной.

Далее будет рассмотрен вопрос того, что конкретно необходимо сделать в данной работе.

Итак, если говорить в общих чертах, то в данной работе необходимо разработать мобильное приложение под названием “Афиша города” для платформы Android, которое предоставляет актуальную информацию о событиях, происходящих в городе.

Событие – это некоторое явление, происшествие, мероприятие, которое имеет свое место и время. Это могут быть кинопоказы, театральные выступления, выставки, концерты и другие.

Детальное описание функциональных требований приведено в следующей главе, а здесь приведены основные функциональные возможности, которые необходимо реализовать в рамках работы:

– отображение списка событий;

– просмотр конкретного события;

– поиск конкретного события;

– добавление события календарь;

– возможность поделиться событием в социальных сетях;

– возможность посмотреть место проведения события на карте;

– возможность сохранить понравившееся событие.

Кроме того, приложения должно иметь ряд ограничений, которые связаны с тем, что в последнее время наблюдается тенденция того, что аудитория хочет получить легкодоступный контент, как можно быстрее; необходимо обеспечить приложение рядом особенностей:

– интеграция с популярными приложениями;

– отсутствие регистрации;

– простота и удобство интерфейса пользователя;

– наличие интернет соединения.

Говоря о том, что хочет аудитория, нельзя обойти стороной вопрос: для кого это приложения? Вообще приложение может быть интересно многим пользователям. Оно может быть интересно как активным людям, людям, которые любят посещать различные мероприятия, будь то кино, выставки или музыкальные концерты, так и людям, которым просто интересно, что происходит в их городе.

Таким образом, в результате работы должно быть реализовано приложения о событиях города для операционной системы Android, которое должно полностью удовлетворять заявленным требованиям.

1.2 Анализ похожих решений

Для того, чтобы проанализировать похожие решения, их нужно определить. Для этих целей можно воспользоваться сервисом Google Play – магазином приложений, позволяющим владельцам устройств с операционной системой Android приобретать различные приложения [3].

Согласно результатам поиска в сервисе, самыми популярными приложениями данной категории в России являются:

– Афиша;

– KudaGo.

Первое приложение установили себе на устройство 1 миллион пользователей, второе – 100 тысяч.

В целом, функциональные возможности этих приложений схожи между собой. Однако, есть ряд особенностей, которыми они отличаются друг от друга, в частности, в приложении “Афиша” есть возможность покупки билета, а в приложении “KudaGo” можно посмотреть карту, на которой отмечены места проведения событий.

Ниже приведена таблица, в которой отмечены основные функциональные возможности и их наличие или отсутствие в каждом из приложений. Наличие возможности в таблице отмечено знаком “+”, а отсутствие – знаком “-“.

Таблица 1.1 – Сравнение функциональных возможностей приложений

Функциональная возможность

Наличие или отсутствие функциональной возможности

Афиша

KudaGo

Просмотр списка событий

+

+

Просмотр конкретного события

+

+

Функциональная возможность

Афиша

KudaGo

Поиск событий

+

+

Возможность фильтрации

+

+

Возможность поделиться событием в социальных сетях

+

+

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

+

+

Возможность сохранить событие

+

+

Возможность добавить событие в календарь

+

Просмотр событий по категориям

+

+

Возможность зарегистрироваться и оставлять отзывы

+

+

Возможность оценить событие и посмотреть рейтинг

+

Глядя на таблицу, можно сделать вывод, что приложения обладают довольно схожим функционалом.

Кроме всего прочего, приложения довольно быстрые и удобные, ими приятно пользоваться. Хорошие оценки и отзывы в магазине Google Play это подтверждают: 4.3 из 5 стоит у приложения “Афиша”, и 4.4 у приложения “KudaGo”.

2. Проектирование системы

2.1 Определение требований

Анализ требований — это одна из частей процесса разработки программного обеспечения, которая включает в себя сбор требований к программному обеспечению, их дальнейшую систематизацию, выявление взаимосвязей между ними , а также документирование.

На основании анализа предметной области и обзора похожих решений был выделен ряд функциональных требований к системе — требований, которые описывают то, что необходимо реализовать в системе. Они перечислены и описаны в таблице ниже.

Таблица 2.1 – Функциональные требования

Требование

Описание требования

1

Просмотр списка событий

Пользователь должен иметь возможность просматривать список событий, при этом в начале должны отображаться самые новые события (события с самой последней датой регистрации). События, которые уже прошли, отображать не нужно.

2

Просмотр конкретного события

Пользователь должен иметь возможность посмотреть конкретное событие. При детальном просмотре должны отображаться следующие атрибуты события: название, описание, время начала, время окончания, место проведения на карте, фотографии.

3

Поиск конкретного события

Пользователь должен иметь возможность искать интересующие его события по названию, по дате проведения, но не считая прошедшие события.

4

Возможность добавить событие в календарь

Пользователь должен иметь возможность добавить событие в календарь, при этом поля: название, время и место при добавлении события в календарь должны автоматически заполняться.

5

Возможность поделиться событием в социальных сетях

Пользователь должен иметь возможность поделиться событием в социальных сетях, отправив ссылку на событие с сообщением: “Смотри, что будет у нас в городе”. Возможные социальные сети: Вконтакте, Telegram, Twitter.

6

Возможность посмотреть место проведения события на карте

Пользователь должен иметь возможность посмотреть место проведения события на карте. На карте в месте проведения события должна стоять соответствующая отметка (маркер).

7

Возможность сохранить событие

Пользователь должен иметь возможность сохранить понравившееся ему событие в соответствующий список, который затем можно отдельно посмотреть. Также должна быть предусмотрена возможность удаления сохраненных событий из этого списка.

8

Отсутствие регистрации

Чтобы пользоваться всеми возможностями приложения, пользователь не должен регистрироваться. Регистрация в приложении не предусмотрена.

К разрабатываемой системе также определен ряд нефункциональных требований – требований, которые описывают то, как должна работать система и какими свойствами или характеристиками она должна обладать. Эти требования перечислены и описаны в таблице ниже.

Таблица 2.2 – Нефункциональные требования

Требование

Описание требования

1

Удобство использования

С точки зрения пользователя приложения должно быть удобным и интуитивно понятным.

2

Доступность

Приложение должно быть доступным. Система не должна превышать максимально допустимое время простоя.

3

Надежность

Приложения должно быть надежным. Система должна вести себя адекватно в нештатных ситуациях.

4

Безопасность

Приложения должно быть безопасным. Необходимо обеспечить выполнение требований, связанных с разграничением доступа, требований, связанных с работой с приватными данным, и требований, направленных на снижение рисков от внешних атак.

5

Производительность

Приложение должно быть производительным. Система должна обеспечивать время отклика не более 30 секунд.

Таким образом, к системе определены функциональные и нефункциональные требования, на следующем этапе будет разработана её структурно – функциональная модель.

2.2 Разработка структурно-функциональной модели

В качестве архитектуры для данной системы подходит классическая клиент — серверная (веб) архитектура.

Клиент – серверная архитектура – это вычислительная или сетевая архитектура, в которой вычисления распределены между поставщиками услуг, называемыми серверами, и заказчиками услуг, называемыми клиентами.

В нашем случае клиентом будет выступать мобильное приложение, а сервером – отдельное приложение, которое будет запущено на выделенном сервере и будет в свою очередь обращаться в API других сайтов (например, сайт https://vk.com) за данными.

API–набор готовых методов, предоставляемых приложением (библиотекой, сервисом) или операционной системой для использования во внешних программных продуктах.

Общую структуру системы можно представить следующим образом:

Рисунок 2.1 – Общая структура системы

Исходя из всего вышеописанного можно выделить следующие структурные элементы в системе:

– пользователь;

– мобильное приложение;

– другие мобильные приложения;

– сервер.

Пользователь взаимодействует с приложением, которое в свою очередь будет обращаться к серверу за необходимыми данными или обмениваться данными с другими установленными на устройстве мобильными приложениями, например такими, как Google Календарь, Вконтакте, Telegram, Twitter.

Структурно – функциональная модель системы представлена в приложении 1.

2.3 Разработка модели данных

На данном этапе в качестве модели данных было принято решение выделить всего одну основную сущность под названием “Событие”. Это решение обусловлено прежде всего отказом от необходимости регистрации пользователя, что в свою очередь привело к сокращению хранимых и передаваемых данных.

Кроме того для хранения данных о месте проведения события была выделена дополнительная сущность под названием “Место”.

Ниже в таблицах 2.3 и 2.4 приведены атрибутные составы этих сущностей.

Таблица 2.3 – Атрибутный состав сущности “Событие”

Название атрибута

Тип данных

Описание

1

id

Целочисленный

Идентификатор события

2

name

Строковый

Название события

3

description

Строковый

Описание события

4

image

Строковый

Ссылка на изображение

5

link

Строковый

Ссылка на сайт (страницу) события

6

startDate

Дата и время

Дата и время начала события

7

endDate

Дата и время

Дата и время окончания события

8

place

Тип данных “Место”

Место проведения события

Таблица 2.4 – Атрибутный состав сущности “Место”

Название атрибута

Тип данных

Описание

1

id

Целочисленный

Идентификатор места

2

name

Строковый

Название места

3

latitude

Число с плавающей точкой

Координата широты места на карте

4

longitude

Число с плавающей точкой

Координата долготы места на карте

В приложении 2 представлена UML – диаграмма приведенных выше сущностей.

2.4 Выбор инструментальных средств

Для системы необходимо разработать как серверную, так и клиентскую части, и это требует ответственного отношения к выбору инструментальных средств анализа, проектирования, разработки и сборки разрабатываемого проекта.

Для написания серверной части был выбран язык программирования Java и написанный на нем фреймворк Jooby.

Язык Java — это объектно-ориентированный строго типизированный язык программирования, который обладает большой вычислительной мощностью, производительностью, переносимостью. Язык хорошо поддерживается разработчиками, имеет обширную документацию и постоянно развивается. Для выполнения программ, написанных на Java, требуется специальная виртуальная машина, что является ключевой особенностью языка.

Фреймворк — это готовый набор решений конкретной задачи или проблемы, чаще всего использующий простую концептуальную структуру.

Jooby — это фреймворк, который обладает довольно простой и эффективной программной моделью для разработки как маленьких, так и больших веб-приложений. Jooby имеет простую систему маршрутизации и способен работать с различными серверами, базами данных, сессией, средствами безопасности, системами кэширования и многим другим благодаря концепции модулей. Если необходимо подключить базу данных, то нужно просто определить соответствующий модуль и настроить его в специальном файле [4].

Клиентская часть, а точнее приложение для платформы Android, разрабатывается с помощью набора программных средств для разработки гибридных приложений таких, как:

– Cordova;

– Ionic;

– Angular2.

Гибридное приложение – это приложение, написанное с использованием технологий HTML, CSS и JavaScript, которое в конечном счете трансформируется в мобильное приложение.

Cordova — это утилита, которая осуществляет сборку приложения в готовый пакет мобильного приложения. Поддерживаемые платформы: iOS, Android, Windows Phone, Browser. Для платформы Android пакет будет иметь расширение apk (формат архивных исполняемых файлов-приложений для ОС Android) [5].

Angular2 — это фреймворк для создания различных приложений: мобильных, веб–приложений и приложений для настольного компьютера. Он написан на языке TypeScript и его ключевой особенностью является повторное использование компонентов, внедрение зависимостей и делегирование бизнес — логики в специальные сервисы. Компонент в Angular2 — это совокупность шаблона (представления) и кода, который его контролирует. Внедрение зависимости — это процесс предоставления внешней зависимости программному компоненту [6].

TypeScript — это расширение языка JavaScript, позволяющее писать код в объектно-ориентированном стиле и определять типы данных, как в статически-типизированных языках [7].

Фреймворк Ionic предоставляет набор готовых компонентов Angular2, стилей для проектирования интерфейса мобильного приложения. Это могут быть компоненты навигации в мобильном приложении, контекстного меню, всплывающих окон и другие полезные компоненты. Для каждой мобильной платформы определены свои стили [8].

3. Программная реализация

3.1 Определение программных модулей

Модуль – это ключевой концепт для создания многократно используемых и настраиваемых частей программного обеспечения.

Как было отмечено в предыдущей главе, для реализации серверной части используется веб – фреймворк Jooby, написанный на Java. Фреймворк сам по себе состоит из модулей, которые представляют собой Java – классы, реализующие интерфейс Module.

Jooby поддерживает большой набор готовых к использованию модулей, помимо этого есть возможность определять свои.

При реализации серверной части были использованы следующие программные модули:

– Модуль App;

– Модуль Auth;

– Модуль Jackson;

– Модуль Vk.

App — это главный модуль приложения, который содержит в себе другие модули и является точкой входа в приложение. В этом модуле происходит определение и конфигурация других модулей, а также определяются маршруты (адреса) к API приложения, реализующие методы GET, POST, PUT, DELETE протокола HTTP посредством переопределения соответствующих методов get(), post(), put(), delete() класса Router.

Auth – это готовый модуль аутентификации, при помощи которого можно защитить API серверного приложения от несанкционированного доступа. Этот модуль является оберткой над популярной java–библиотекой безопасности pac4j, которая в свою очередь поддерживает различные клиенты и протоколы аутентификации. В нашем случае, в качестве протокола аутентификации выступает OAuth — открытый протокол, который позволяет третьей стороне получить доступ к защищенным ресурсам без необходимости передавать логин и пароль.

Jackson – это готовый модуль, который автоматически приводит содержимое (тело) приходящих на сервер приложений HTTP–запросов, а также отправляемых с него ответов в формат JSON. JSON – это удобочитаемый текстовый формат обмена данными, основанный на JavaScript. Этот формат отлично подходит для взаимодействия клиентской и серверной частей системы, так как клиентская часть написана на языке JavaScript имеющем встроенную поддержку данного формата.

Vk – это модуль, позволяющий взаимодействовать с API сайта Вконтакте через java–библиотеку, которую предоставляют разработчики данной социальной сети. В данном API интерес представляют два класса: Search и Group. Методы первого класса позволяют найти с помощью глобального поиска все события (встречи), получить их идентификаторы, а затем с помощью методов класса Group по идентификатору получить информацию о событии [9].

Структурная схема Jooby – модулей представлена на изображении ниже.

Рисунок 3.1 — Структурная схема модулей

Клиентская часть реализована при помощи фреймворка Angular2, который также обладает модульной системой.

Модуль Angular2 – это класс, который помечен декоратором @NgModule, принимающим метаданные, которые подсказывают компилятору, как компилировать и запускать данный модуль. Он в свою очередь идентифицирует свои компоненты и сервисы, делая их доступными модулю, который его использует.

Следующие модули Angular2 были использованы при разработке:

– AppModule

– IonicModule

– BrowserModule

– HttpModule

– LocalStorageModule

– AgmCoreModule

AppModule – это главный модуль Angular2 приложения. Он содержит в себе другие модули и является входной точкой в приложение. Все создаваемые компоненты и услуги содержатся и поставляются данным модулем.

IonicModule – это модуль, который занимается начальной загрузкой всех компонентов и сервисов фреймворка Ionic. Все компоненты и сервисы становятся доступными в главном модуле. Именно этот модуль определяет внешний вид гибридного приложения.

BrowserModule – это модуль, позволяющий корректно отобразить запущенное Angular2 приложение в браузере.

HttpModule – это модуль доступа к web. Данный модуль обладает набором сервисов, при помощи которых можно отправлять HTTP–запросы на сервера и получать HTTP–ответы. Запросы можно отправлять как синхронно, так и асинхронно. Преимущество асинхронных запросов в том, что они позволяют не прерывать поток выполнения приложения, а доверить результат запроса специальному объекту Promise, из которого затем можно извлечь соответствующий ответ, если он успешен, иначе обработать ошибку.

LocalStorageModule – это модуль, реализующий локальное хранилище данных, которое позволяет хранить данные в веб–браузере. При помощи этого модуля реализовано хранение мероприятий (событий) на мобильном устройстве.

AgmCoreModule – это модуль, реализующий API Google Карты. Данный модуль предоставляет готовый компонент AgmMap, с помощью которого можно отобразить карты, а также компонент AgmMarker, который представляет собой маркер в определенном месте карты. Для того, чтобы задать точку на карте, необходимо инициализировать атрибуты latitude (широта) и longitude (долгота) этих компонентов.

Структурная схема Angular2 – модулей представлена на изображении ниже.

Рисунок 3.2 — Структурная схема модулей

Листинг программного кода с объявлением модулей приведен в приложении 3.

3.2 Разработка алгоритмов

В общем случае функционирование системы можно представить следующей схемой.

Мобильное приложение при помощи методов модуля HttpModule отправляет асинхронный HTTP – запрос на сервер. В результате вызова методов этого модуля HttpModule возвращается объект Promise, который имеет две функции обратного вызова (callback), которые срабатывают в случаях, если запрос выполнен успешно или с ошибками. Благодаря асинхронному запросу интерфейс приложения не блокируется [10].

Рисунок 3.3 — Общая схема функционирования системы

Сервер предоставляет мобильному приложению свое API для получения списка событий, события по идентификатору, по имени и т. п. Он настроен таким образом, что прослушивает приходящие на него запросы и передает их маршрутизатору, в котором описаны маршруты приложения.

Маршрут описывает интерфейс, на который направляются запросы к приложению. Он сочетает в себе HTTP — метод и шаблон пути (path pattern, url). Маршрут имеет ассоциированный с ним обработчик, который выполняет какую — либо работу и производит выходные данные, HTTP — ответ.

Обработчик в нашем случае обращается к API сайта Вконтакте при помощи модуля Vk, получает оттуда запрашиваемые данные и формирует ответ мобильному приложению.

Формирование ответа происходит после того, как получен ответ от сервера Вконтакте и включает в себя маппинг (отображение состояния одного объекта на состояние другого) полученных данных в объект события Event, который в дальнейшем при помощи модуля Jackson преобразуется в формат для передачи данных JSON.

Сформированный ответ направляется обратно мобильному приложению в виде HTTP – ответа с содержимым в виде JSON – объекта. Обработчик асинхронного запроса, инициированного в мобильном приложении, срабатывает и приложение отображает полученные данные в своем интерфейсе.

Таким образом можно описать общий алгоритм работы системы, но помимо этого, стоит более подробно остановиться на следующих алгоритмах системы:

– алгоритм получения списка событий с помощью API сайта Вконтакте;

– алгоритм поиска события в мобильном приложении.

Алгоритм получения списка событий с помощью API сайта Вконтакте описан ниже.

Сначала, для того, чтобы получить доступ к API сайта Вконтакте, необходимо создать новое приложение на странице приложений сайта Вконтакте и получить специальные ключи: APP_ID (идентификатор приложения), CLIENT_SECRET (секретный ключ) и REDIRECT_URI (доверенный адрес переадресации).

Далее нужно создать экземпляр специального объекта API VkApiClient, передав в него любой подходящий транспортный клиент, например HttpTransportClient и пройти авторизацию с помощью механизма Authorization Code Flow, основанного на технологии OAuth []. После этого в GET запросе будет получен специальный ключ «code», который необходимо передать в метод userAuthorizationCodeFlow() в качестве параметра вместе с другими: APP_ID, CLIENT_SECRET и REDIRECT_URI. В результате выполнения метода будет возвращен объект класса UserAuthResponse, при помощью которого создается класс UserActor. UserActor – это пользователь, от имени которого можно обращаться к API Вконтакте [9].

Часть алгоритма, связанная с авторизацией, выполняется администратором после запуска сервера.

Для того, чтобы получить список событий или точнее список групп Вконтакте с типом event, нужно сначала их найти. Для этого следует обратиться от имени пользователя к методу getHints() объекта Search API с параметром фильтрации, установленным в значение groups и параметром global_search, равным 1. В результате будет возвращен массив «сырых» объектов, содержащих идентификаторы, из которого нужно извлечь группы.

Группы имеют идентификаторы. Для того, чтобы получить полную информацию о группе, нужно обратиться к методу getById() объекта Group API. Это необходимо сделать для каждого объекта, полученного в результате поиска. Таким образом будет получен список объектов Group. Объекты списка нужно преобразовать в объект Event. Для лучшего понимания ниже представлена блок — схема данного алгоритма.

Рисунок 3.4 — Блок – схема алгоритма получения списка событий с помощью API Вконтакте

Алгоритм поиска события в мобильном приложении описан ниже.

В мобильном приложении присутствует функция поиска событий по названию. Когда пользователь вводит какой — либо символ или последовательность символов, то ему возвращается список с мероприятиями, в названиях которых содержатся данные символы. Для этих целей используются асинхронные запросы к API нашего сервера, которые возвращают объекты Observable, вместо Promise.

Observable – это поток каких–либо, который можно обрабатывать операторами, которые применимы к массиву. Данный объект позволяет создавать запрос, отменять его не дожидаясь ответа и затем создавать новый. Такой механизм трудно реализовать с помощью Promise [11].

Когда пользователь вводит символ в специальном окне ввода компонента приложения, то компонент прослушивает событие keyUp (нажатие клавиши), и прежде чем на сервер отправляется запрос, приложение ожидает 300 миллисекунд для того, чтобы не делать частые запросы. Запрос не отправляется, если пользователь ввёл символ, соответствующий предыдущему.

Рисунок 3.5 — Блок — схема алгоритма поиска событий в мобильном приложении

В результате запроса возвращается список объектов Observable, который с помощью оператора приведения преобразуются в список объектов Event, список может быть пустым. Если в результате произошла ошибка, то также возвращается пустой список мероприятий.

Блок — схема алгоритма представлена на изображении 3.5 на следующей странице.

Таким образом, в этом разделе были рассмотрены алгоритмы приложения, особое внимание было уделено алгоритмам обращения к API сайта Вконтакте и поиска события в мобильном приложении. Остальные алгоритмы, используемые в приложении, были уже реализованы фреймворками.

В приложении 4 представлены листинги кода реализованных алгоритмов системы.

3.3 Особенности программной реализации

Главной особенностью программной реализации, на мой взгляд, является модульность и использование готовых решений: библиотек, фреймворков, инструментов. Модульность позволяет повторно использовать какие — либо части программной системы и настраивать их определенным образом. При реализации серверной части был использован модульный фреймворк Jooby, а при реализации клиентской — Angular2. Подобные средства позволяют «не изобретать велосипед заново», а использовать надежное, качественное, чётко — структурированное решение конкретной проблемы, реализованное и поддерживаемое профессиональными разработчиками.

Еще одной особенностью является использование объектно — ориентированных языков программирования (ООП) c возможностями функциональных языков программирования, таких как Java (версия 8) и TypeScript. ООП позволяет выделять реальные объекты окружающего мира и работать с ними, определив их состояния и поведения. Так, в проекте были выделены два объекта Event и Place, представляющие городское мероприятие и место его проведения. Функциональное программирование повышает надёжность кода и позволяет применять к программам достаточно сложные методы автоматической оптимизации, улучшая тем самым производительность.

Еще одной особенностью реализации является использование сетевой клиент — серверной архитектуры. Для передачи данных между клиентом и сервером применяется повсеместно используемый протокол прикладного уровня HTTP.

Особенностью серверной части является использование встроенного в приложение сервера приложений. Это означает, что приложение не нужно разворачивать на каком — то отдельном сервере приложений, а достаточно его (приложение) запустить, следом за ним запустится встроенный сервер, прослушивающий входящие запросы на настроенном имени хоста и порту.

Клиентское приложение на платформе Android особенно тем, что является гибридным. Оно основано на технологиях HTML, CSS и JavaScript и их расширений, с помощью которых создается веб – проект. Затем этот проект с помощью специальной программной утилиты Cordova собирается в готовый пакет приложения Android.

Таким образом, были рассмотрены основные особенности программной реализации системы.

4. Тестирование

4.1 Функциональное тестирование

Функциональное тестирование — это тестирование программного обеспечения, целью которого является проверка реализуемости функциональных требований, то есть способности программного обеспечения в определенных условиях решать заявленные задачи.

Функционал серверной части информационно — справочной системы тестировался при помощи модульных и интеграционных тестов. Модульное тестирование — это тестирование отдельного компонента системы в изоляции от других. Интеграционное — это тестирование, при котором отдельные компоненты объединяются и тестируются в месте.

Основная часть функционала системы была реализована в клиентском приложении.

Рисунок 4.1 — Просмотр списка событий и детальный просмотр

Рисунок 4.2 — Просмотр места проведения событий на карте и поиск

Рисунок 4.3 — Возможность поделиться в соц. сетях и сохранить событие

На рисунках 4.1 — 4.3 следующей страницы приведены изображения интерфейса приложения на платформе Android с реализованными функциями, такими, как: просмотр списка событий, просмотр конкретного события с отметкой на карте, поиск конкретного события, возможность добавить событие в календарь, возможность поделиться событием в социальных сетях, возможность сохранить событие.

Приложение тестировалось в эмуляторе, поэтому некоторые функции протестировать не удалось, в частности: возможность поделиться событием в социальных сетях и добавление события в календарь; на устройстве данные функции полностью поддерживаются.

4.2 Тестирование производительности

Тестирование производительности — это тестирование, которое проводится с целью определения времени работы программного обеспечения или его части под определенной нагрузкой. Оно также может служить для проверки и подтверждения других показателей системы, таких как масштабируемость, надёжность и потребление ресурсов.

Тестирование системы на производительность в нашем случае может носить только оценочных характер, так как тестирование проводилось на локальной машине. Развертывании системы на более мощных серверах может повысить показатели.

Тестировалась серверная часть системы, то есть получение списка событий, получение события по идентификатору, получение события по названию.

Тестирование производительности проводилось с помощью свободно — распространяемого инструмента для нагрузочного тестирования Apache JMeter, в конфигурации перед запуском тестов которого указываются группа потоков (количество пользователей), шаблон запроса (тип запроса, хост, порт и шаблон пути) и таймер (время паузы между запросами) [12].

В качестве шаблона запроса к API системы был HTTP – запрос типа GET со следующими шаблонами пути (id – число, идентификатор события, name — строка, название события):

– http://localhost:8080/afisha-app/api/events;

– http://localhost:8080/afisha-app/api/event/id;

– http://localhost:8080/afisha-app/api/event/name.

В качестве группы потоков был указан один пользователь, но постепенно количество пользователей увеличивалось до 1000. Таймер был установлен в 5 миллисекунд.

Результаты тестирования получения списка событий представлены в таблице ниже:

Таблица 4.1 — Результаты нагрузочного тестирования

Кол-во пользователей

Производительность, запросы/сек

Время ответа, мс

Загрузка ЦП, %

1

24

4

2

2

44

4

2

4

86

4

2

8

162

4

3

16

315

6

5

32

624

12

9

64

1 208

15

12

125

2 366

23

23

250

4 613

34

45

500

5 559

45

82

1000

5 584

48

99

Ниже, на следующей странице представлено изображение с диаграммой, на которой представлена зависимость производительности системы и загрузки центрального процессора сервера от количества пользователей.

Результаты тестирования получения события по идентификатору представлены в таблице ниже:

Рисунок 4.4 — Диаграмма зависимости производительности системы и загрузки центрального процессора от количества пользователей

Таблица 4.2 — Результаты нагрузочного тестирования

Кол-во пользователей

Производительность, запросы/сек

Время ответа, мс

Загрузка ЦП, %

1

10

2

1

2

23

2

1

4

45

2

1

8

87

2

2

16

172

3

4

32

313

4

9

64

678

6

12

125

1 266

11

24

250

2 113

13

45

500

4 331

23

81

1000

5 412

37

97

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

Результаты тестирования получения события по названию представлены в таблице ниже.

Рисунок 4.5 — Диаграмма зависимости производительности системы и загрузки центрального процессора от количества пользователей

Таблица 4.3 — Результаты нагрузочного тестирования

Кол-во пользователей

Производительность, запросы/сек

Время ответа, мс

Загрузка ЦП, %

1

9

2

1

2

19

2

1

4

41

2

1

8

85

2

2

16

173

3

3

32

289

3

8

64

610

5

12

125

1 231

9

24

250

2 002

13

43

500

4 304

25

79

1000

5 158

38

97

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

Рисунок 4.6 — Диаграмма зависимости производительности системы и загрузки центрального процессора от количества пользователей

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

мобильный программа серверный

5. Вопросы безопасности

5.1 Анализ возможных угроз

Безопасность информационной системы — один из наиболее острых вопросов информационной безопасности. Как правило, большинство систем имеют различного рода уязвимости и постоянно подвергаются атакам. Основными разновидностями угроз информационной безопасности веб-приложения принято считать:

– угрозы конфиденциальности;

– угрозы целостности;

– угрозы доступности.

Угрозы конфиденциальности определяют несанкционированный доступ к данным, угрозы целостности – несанкционированное искажение или уничтожение данных, а угрозы доступности – ограничение или блокирование доступа к данным.

Обычно основным источником угроз информационной безопасности веб-приложения являются внешние нарушители. Внешний нарушитель – это лицо, мотивированное, как правило, коммерческим интересом, имеющее возможность доступа к сайту компании, не обладающий знаниями об исследуемой информационной системе, имеющий высокую квалификацию в вопросах обеспечения сетевой безопасности и большой опыт в реализации сетевых атак на различные типы информационных систем. Таким образом, основной угрозой безопасности системы является хакерская атака, которая может иметь конечную цель, либо нести бессистемный характер.

В первом случае злоумышленник может выявлять максимально возможное количество векторов атаки для составления и реализации потенциально успешных сценариев взлома, во втором же объекты атакуются массово, обычно использую несколько поверхностных уязвимостей.

Угрозы безопасности связаны с несколькими факторами: в первую очередь это уязвимости веб-приложений или их компонентов. Во вторую — с используемыми механизмами проверки идентификации. В третью очередь угрозы безопасности относятся к атакам на самих пользователей, клиент-сайд атаки. Четвертый вид угроз — утечка или разглашение критичной информации. Пятый вид угроз — логические атаки.

Чем это может грозить? Во-первых, это несет угрозу работоспособности веб – приложения. Во-вторых — сохранность пользовательских данных. Из этих причин вытекает логичное следствие — финансовые и репутационные потери.

Хакеры могут использовать сайт для атак на другие ресурсы, в качестве опорного плацдарма, для рассылки спама или проведения атак, направленных на выведение системы из строя.

Также, все эти атаки могут быть нацелены на дальнейшее заражение пользователей, например с помощью эксплоит-паков — средств эксплуатации уязвимостей браузеров и их компонентов, в том числе и с применением социотехнических векторов атаки [13].

5.2 Предложения по безопасности

Распространение атак на веб-приложения связаны с двумя основными факторами: халатное отношение к безопасности сайта и низкий порог входа потенциальных злоумышленников.

В большинстве случаев на сайтах не используются специальные средства обнаружения, мониторинга и защиты, а также нет ответственного персонала и осведомленности об угрозах безопасности сайта. Качеству кода и безопасной настройке веб-приложения (и веб-сервера) уделяется мало внимания. Распространение утилит и сканеров безопасности веб-приложений обуславливает низкий порог вхождения потенциальных злоумышленников. А многочисленные общества и форумы способствуют распространению техник атак среди всех желающих. Также этому способствует широкая и довольно оперативная огласка об обнаружении новых уязвимостей или технических аспектах атак.

Необходимо не забывать о соблюдении базовых мер безопасности при разработке и поддержке работы сайта: обновлять компоненты; регулярно менять пароли; отказаться от использования устаревших протоколов; настроить и использовать такие протоколы, как HTTPS и HSTS.

Также стоит использовать средства проактивной защиты веб – приложений для своевременного обнаружения и блокирования различных атак. Это позволит защитить веб-приложение от хакерских атак и их последствий [13].

Заключение

В данной выпускной квалификационной работе была разработана информационно — справочная система, которая состояла из серверной и клиентской частей. Клиентская часть представляла собой приложение на платформе Android.

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

Было проведено проектирование системы. Здесь были выявлены функциональные требования к системе, разработана структурно — функциональная модель, определена модель данных и проведен обзор инструментальных средств, используемых при реализации системы.

Система была реализована. Процесс реализации включал в себя: определение программных модулей, разработку алгоритмов и описание особенностей программной реализации.

Были проведены функциональное и нагрузочное тестирования. Задачей первого было определение соответствия реализованных функций требованиям, второго — проверка производительности разработанной системы.

Также были рассмотрены вопросы, касающиеся безопасности системы. В частности, был проведен анализ возможных угроз системы и предложены меры по безопасности.

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

1. Интернет — портал Тэдвайзер: интернет — портал / Информационная компания «Тэдвайзер». – Москва.

2. Сервис StatCounter

3. Сервис Google Play

4. Документация веб — фреймворка Jooby

5. Документация инструмента Cordova

6. Документация веб — фреймворка Angular2

7. Документация языка TypeScript

8. Документация фреймворка Ionic

9. Документация по API сайта Вконтакте

10. Документация по объекту Promise

11. Документация по объекту Observable

12. Документация инструмента JMeter

13. Основные угрозы безопасности сайта

Приложение 1

Приложение 2

UML – диаграмма модели данных

Приложение 3

Листинг кода программных модулей серверной части (Java):

package com.dynnoil.afisha;

import org.jooby.Jooby;

import org.jooby.auth.Auth;

import org.jooby.jackson.Jackson;

import com.dynnoil.afisha.modules.vk.*;

public class App extends Jooby {

{

use(new Jackson());

use(new Vk());

use(new Auth().client(config -> {

final String key = config.getString(“vk.app_id”);

final String secret = config.getString(“vk.client_secret”);

return new VkClient(key, secret);

}));

}

public static void main(final String[] args) {

run(App::new, args);

}

}

Листинг кода программных модулей клиентской части (TypeScript):

import { NgModule, ErrorHandler } from ‘@angular/core’;

import { BrowserModule } from ‘@angular/platform-browser’;

import { IonicApp, IonicModule, IonicErrorHandler } from ‘ionic-angular’;

import { MyApp } from ‘./app.component’;

import { LocalStorageModule } from ‘angular-2-local-storage’;

import { AgmCoreModule } from ‘@agm/core’;

import { HttpModule } from ‘@angular/http’;

import { SearchPage } from ‘../pages/search/search’;

import { FavoritesPage } from ‘../pages/favorites/favorites’;

import { HomePage } from ‘../pages/home/home’;

import { TabsPage } from ‘../pages/tabs/tabs’;

import { DetailsPage } from ‘../pages/details/details’;

import { EventCardComponent } from ‘../components/event-card/event-card.component’;

import { GoogleMapsComponent } from ‘../components/google-maps/google-maps.component’;

import { StatusBar } from ‘@ionic-native/status-bar’;

import { SplashScreen } from ‘@ionic-native/splash-screen’;

import { SocialSharing } from ‘@ionic-native/social-sharing’;

import { Calendar } from ‘@ionic-native/calendar’;

import { InMemoryWebApiModule } from ‘angular-in-memory-web-api’;

import { AlertsService } from ‘../services/alerts.service’;

import { ActionSheetService } from ‘../services/action-sheet.service’;

import { ToastService } from ‘../services/toast.service’;

import { EventService } from ‘../services/event.service’;

import { SharingService } from ‘../services/sharing.service’;

import { EventStorageService } from ‘../services/event-storage.service’;

import { InMemoryDataService } from ‘../services/in-memory-data.service’;

@NgModule({

declarations: [

MyApp,

SearchPage,

FavoritesPage,

HomePage,

TabsPage,

DetailsPage,

EventCardComponent,

GoogleMapsComponent

],

imports: [

BrowserModule,

HttpModule,

LocalStorageModule.withConfig({

prefix: ‘afisha-app’,

storageType: ‘localStorage’

}),

AgmCoreModule.forRoot({

apiKey: ‘AIzaSyDsBqAWWUYSX5XmYSmuTHCvmaxzGrIR_8w’

}),

InMemoryWebApiModule.forRoot(InMemoryDataService),

IonicModule.forRoot(MyApp)

],

bootstrap: [IonicApp],

entryComponents: [

MyApp,

SearchPage,

FavoritesPage,

HomePage,

TabsPage,

DetailsPage

],

providers: [

StatusBar,

SplashScreen,

SocialSharing,

Calendar,

{ provide: ErrorHandler, useClass: IonicErrorHandler },

AlertsService,

ActionSheetService,

ToastService,

EventService,

SharingService,

EventStorageService

]

})

export class AppModule { }

Приложение 4

Листинг кода алгоритма получения списка событий с помощью API сайта Вконтакте (Java):

package com.dynnoil.afisha.modules.vk;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.google.inject.Binder;

import com.typesafe.config.Config;

import com.typesafe.config.ConfigFactory;

import com.vk.api.sdk.client.TransportClient;

import com.vk.api.sdk.client.VkApiClient;

import com.vk.api.sdk.client.actors.UserActor;

import com.vk.api.sdk.httpclient.HttpTransportClient;

import com.vk.api.sdk.objects.UserAuthResponse;

import com.vk.api.sdk.objects.groups.Group;

import com.vk.api.sdk.objects.groups.GroupType;

import com.vk.api.sdk.objects.groups.responses.SearchResponse;

import org.jooby.*;

import java.util.List;

/**

* Vk module

* <p>

* Created by SBT-Krukov-LYu on 14.03.2017.

*/

public class Vk implements Jooby.Module {

private UserActor actor;

private VkApiClient vkApiClient;

@Override

public void configure(Env env, Config config, Binder binderthrows Throwable {

env.onStart(() -> {

TransportClient transportClient = HttpTransportClient.getInstance();

vkApiClient = new VkApiClient(transportClient);

});

Router router = env.router();

router.get(“/auth”, (Request rq, Response rs) -> {

final String code = rq.param(“code”).to(String.class, MediaType.plain);

initializeUserActor(config, code);

rs.send(“Done!”);

});

router.get(“/api/”, (rq, rs) -> {

SearchResponse searchResponse = vkApiClient.groups().search(actor, “”)

.type(GroupType.EVENT.getValue())

.countryId(1)

.cityId(41)

.future(true)

.execute();

List<Group> groups = searchResponse.getItems();

String json = new ObjectMapper().writeValueAsString(groups);

rs.send(Results.json(json));

});

}

@Override

public Config config() {

return ConfigFactory.parseResources(Vk.class, “vk.conf”);

}

private void initializeUserActor(Config config, String code) throws Throwable {

final Integer appId = Integer.valueOf(config.getString(“vk.app_id”));

final String clientSecret = config.getString(“vk.client_secret”);

final String redirectUri = config.getString(“vk.redirect_uri”);

UserAuthResponse authResponse = vkApiClient.oauth()

.userAuthorizationCodeFlow(appId, clientSecret, redirectUri, code)

.execute();

actor = new UserActor(authResponse.getUserId(), authResponse.getAccessToken());

}

}

Листинг кода алгоритма поиска события в мобильном приложении (TypeScript):

import { Component, OnInit } from ‘@angular/core’;

import { NavController } from ‘ionic-angular’;

import { Observable } from ‘rxjs/Observable’;

import { Subject } from ‘rxjs/Subject’;

import ‘rxjs/add/observable/of’;

import ‘rxjs/add/operator/catch’;

import ‘rxjs/add/operator/debounceTime’;

import ‘rxjs/add/operator/distinctUntilChanged’;

import ‘rxjs/add/operator/switchMap’;

import { Event } from ‘../../model/event’;

import { EventSearchService } from ‘../../services/event-search.service’;

@Component({

selector: ‘page-search’,

templateUrl: ‘search.html’,

providers: [EventSearchService]

})

export class SearchPage implements OnInit {

private searchTerms = new Subject<string>();

events: Observable<Event[]>;

constructor(

private navCtrl: NavController,

private eventSearchService: EventSearchService

) { }

search(term: string): void {

this.searchTerms.next(term);

}

ngOnInit(): void {

this.events = this.searchTerms

.debounceTime(300)

.distinctUntilChanged()

.switchMap(term => term

// return the http search observable

? this.eventSearchService.search(term)

// or the observable of empty heroes if there was no search term

: Observable.of<Event[]>([]))

.catch(error => {

console.log(error);

return Observable.of<Event[]>([]);

});

}

}

<ion-header>

<ion-toolbar>

<ion-searchbar #searchBar (ionInput)=”search(searchBar.value)”></ion-searchbar>

</ion-toolbar>

</ion-header>

<ion-content padding>

<ion-list>

<ion-item *ngFor=”let event of events | async”>

{{ event.name }}

</ion-item>

</ion-list>

</ion-content>

import { Injectable } from ‘@angular/core’;

import { Http } from ‘@angular/http’;

import { Observable } from ‘rxjs/Observable’;

import ‘rxjs/add/operator/map’;

import { Event } from ‘../model/event’;

@Injectable()

export class EventSearchService {

constructor(private http: Http) { }

search(term: string): Observable<Event[]> {

return this.http

.get(`api/events/?name=${term}`)

.map(response => response.json().data as Event[]);

}

}

Поделиться статьёй
Поделиться в telegram
Поделиться в whatsapp
Поделиться в vk
Поделиться в facebook
Поделиться в twitter
Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.

Ещё статьи

Нет времени делать работу? Закажите!
Вид работы
Тема
Email

Отправляя форму, вы соглашаетесь с политикой конфиденциальности и обработкой ваших персональных данных.