Диплом: Адаптивная динамическая информационная система управления сайтом

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
65
системы находится в главе 3.2. (Разработка клиентской части информационной
системы управления сайтом). Для описания пользователей, пользовательских
статей, комментариев и других данных, в данном приложении используется
Domain Model (модель области определения) - паттерн проектирования,
создающий зачастую взаимосвязанные объекты, причем каждый объект
представляет собой отдельную сущность (далее модель). В частности, классы и
структуры данных для описания пользователей и их ролей находятся в пакете
com.platform.domain.user, и представляют собой классы User, CurrentUser,
UserCreateForm и перечисляемый тип (Enum) Role, определяющий роли
пользователя (такие как ADMIN или USER) (Рисунок 3).
Рисунок 3 – Диаграмма классов пакета com.platform.domain.user
На данной диаграмме класс модели User (Приложение 5) описывает
описание модели пользователей приложения, в которой пользователь имеет
значимые поля email, служащие для идентификации пользователей,
passwordHash, являющийся его зашифрованным в BCrypt паролем, и ролью
(возможные роли пользователей описываются в классе перечислений Role). Так
же данный класс содержит обязательный пустой конструктор (по требованиям
спецификации JPA (Java Persistence API)) и методы доступа к этим полям
(геттеры и сеттеры).
66
Основными компонентами для взаимодействия с базами данных в Spring
Data являются репозитории. Стоит заметить, что каждый репозиторий должен
работать только со своим классом-моделью.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findOneByEmail(String email);
}
В данном случае интерфейс UserRepository, расширяющий интерфейс
JpaRepository имеет переданные типы User являющиеся классом модели, а тип
Long – первичным ключом. Во время инициализации контекста приложения
Spring Data самостоятельно отыщет данный интерфейс и создаст компонент,
его реализующий. В Spring Data cсуществует несколько реализаций
репозиториев, различающихся между собой по набору возможностей:
CrudRepository – интерфейс, предоставляющий только базовый
набор методов для доступа к данным (Create, Remove, Update,
Delete).
Repository — является базовым типом репозиториев, и не содержит
каких-либо методов.
PagingAndSortingRepository — интерфейс, который расширяет
интерфейс CrudRepository и добавляет поддержку пагинации и
сортировки.
JpaRepository — интерфейс, добавляющий возможности,
специфичные для JPA.
QueryDslJpaRepository и SimpleJpaRepository – интерфейсы для
реализации методов с нестандартным поведением.
На данный момент все интерфейсы-репозитории в проекте
(UserRepository, MainDataRepository, CommentRepository, ArticleRepository)
используют реализацию JpaRepository, так как на данный момент возможностей
предоставляемым данным интерфейсом вполне достаточно.
67
Далее для облегчения тестирования и оценки общей работоспособности
системы следует добавить базу данных некоторые начальные данные. Для этого
в файл data.sql (Приложение 3) каталога resources помещаются данные для
входа администратора системы управления содержимым, тестового
пользователя с ролью безопасности USER, и тестовые данные для статей, и
другие данные. При указании параметра spring.jpa.hibernate.ddl-auto=create в
файле настроек application.properties эти данные будут автоматически занесены
в СУБД при развертке приложения. В данных SQL запросах происходит
вставка в базу данных логин пользователя, зашифрованный пароль
пользователя его роль, и другие данные приложения. Следует отметить, что в
этом случае настройка СУРБД Microsoft SQL Server сводится только к
установке СУРБД, создании пользователя базы данных и пустой базы данных
(в данном случае Platform с именем пользователя и паролем platform). Так же
стоит отметить, что первоначальные данные можно добавить с использованием
уже существующих методов JPA (Java Persistence API), но на данный момент
это бы только усложнило процесс разработки и тестирования приложения.
Валидация данных является чрезвычайно важной частью любого
приложения по той причине, что при ее отсутствии пользователи системы
могут умышленно или неумышленно отправить в систему некорректные
данные, что может привести в лучшем случае к отказу системы, а в худших – к
ее непредсказуемому поведению, или даже повышению прав пользователя. В
данном приложении все классы валидации данных находятся в пакете
com.platform.domain.validator. Классы валидации данных реализуют интерфейс
Validation, имеют аннотацию @Component, что служит для связывания класса и
инфраструктуры фаеймворка Spring.
private void validatePasswords(Errors errors, UserCreateForm form) {
if (!form.getPassword().equals(form.getPasswordRepeated())) {
errors.reject("password.not_match", "Passwords not match");
}
}
68
private void validateEmail(Errors errors, UserCreateForm form) {
if (userService.getUserByEmail(form.getEmail()).isPresent()) {
errors.reject("email.exists", "User with the email already exists");
}
}
В данном случае метод validatePasswords проверяет совпадения паролей
введенным пользователем, а метод validateEmail служит для проверки логина
пользователя (в данном случае он является e-mail), на существование при
создании новых пользователей.
3.1.4. Реализация внутренней логики приложения
Внутренняя логика приложения так же, как и все приложение построена
с использованием паттерна программирования MVC (Model View Controller), и
состоит из модели, отображения и контроллера. Но при этом в Spring часто
используется сервисный слой – слой для реализации бизнес-логики
приложения. В данном приложении он используется для получения данных, их
трансформации и отдачи контроллеру. На сервисном слое приложения
(интерфейсы и классы которого находятся в пакете com.platform.service),
требуется получить имена пользователей, статей и комментариев по связанным
с ними id, email, и вывести их список, и создать возможность из создания и
удаления. В случае пользователей для этой цели требуется создать интерфейс
UserService и его реализацию UserServiceImpl (Рисунок 4).
Рисунок 4 – Структура интерфейса UserService и его реализация
69
В интерфейсе UserService описаны необходимые методы для
реализации, а в классе UserServiceImpl, реализация данных методов.
Рассмотрим некоторые из них подробнее. Метод getUserById служит для
получения информации о пользователе по его уникальному id, который в
данном конкретном случае является первичным ключом таблицы users. Таким
образом при работе этого метода выходные данные – id, email, password_hash,
role пользователя системы. Метод getUserByEmail получает те же самые данные
пользователя, но при поиске по его email. Метод getAllUsers возвращает
коллекцию, состоящую из всех пользователей таблицы users. Методы create и
delete служат для создания и удаления пользователей соответственно.
По аналогии создаются сервисные интерфейсы, классы и реализации
необходимых методов для работы со статьями и комментариями к ним. Разница
состоит лишь в различных источниках данных, и методах, например, интерфейс
MainDataService, предназначенный для описания методов доставки данных для
пользовательского интерфейса содержит гораздо больше методов.
Так же на сервисном слое (в пакете com.platform.service.storage)
находятся интерфейсы и классы для работы с изображениями, и в дальнейшем
как с обычными текстовыми файлами, так и с файлами формата pdf с
использованием дополнительной библиотеки (Apache PDFBox).
3.2. Разработка клиентской части информационной системы управления
сайтом
Клиентская часть приложения служит для взаимодействия с
пользователями и отображения данных. Зачастую для работы с отображениями
в проектах, написанных на языке программирования Java используется
JavaServer Faces (JSF) - спецификация для построения интерфейсов состоящих
из различных компонентов. Несмотря на хорошую поддержку, множество как
платных, так и бесплатных реализаций и простоту разработки, JSF обладает
очень серьёзными недостатками, такими как крайняя низкая скорость работы
(во многом из-за работы на стороне сервера), и сложностей при изменении
70
внешнего вида и поведения компонентов. Исключительно из-за этих
недостатков для данного проекта был выбран альтернативный способ
построения пользовательского интерфейса, который заключается в
использовании шаблонизатора Apache FreeMarker, и JavaScript фреймворка
Twitter Bootstrap.
Apache FreeMarker представляет из себя одну из реализаций механизма
шаблонов и является Java библиотекой для генерации текстового вывода,
такого как например HTML-страниц, электронных писем, файлов
конфигурации или даже исходного кода. Шаблоны приложения написаны на
языке шаблонов FTL, который является простым специализированным языком
разметки. FreeMarker является шаблоном MVC (Model View Controller),
который имеет возможность эффективно разделять отображение и логику
приложения, что, например, позволяет менять внешний вид приложения без
перекомпиляции кода приложения (данную возможность сложно переоценить в
больших и сложных проектах).
Для примера рассмотрим шаблон главной страницы приложения
(index.ftl):
<html lang="en">
<#include "layout/default/head-default.ftl"/>
<body>
<#if !currentUser??>
<#include "layout/default/navbar-default.ftl"/>
<#include "layout/index/carousel.ftl"/>
<#include "layout/index/columns.ftl"/>
</#if>
<ul>
<#if currentUser??>
<li>
<form action="/logout" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit">Log out</button>
71
</form>
</li>
<li><a href="/user/${currentUser.id}">View myself</a></li>
</#if>
<#if currentUser?? && currentUser.role == "ADMIN">
<li><a href="/user/create">Create a new user</a></li>
<li><a href="/users">View all users</a></li>
</#if>
</ul>
<#include "layout/default/footer-default.ftl"/>
</body>
</html>
Как можно заметить, данный ftl шаблон по структуре представляет из
себя HTML разметку, в которую директивой #include вставлены другие часто
используемые блоки, такие как:
head-default - заголовок страницы.
navbar-default - основной блок навигации.
сarousel – основной информационный блок.
сolumns – вторичный информационный блок.
footer-default – так называемый подвал страницы (ее нижняя часть).
Далее в зависимости от того, вошел ли пользователь в систему, ему
предоставляется возможность либо совершить вход, или выход. Стоит
заметить, что на странице имеется код, защищающий от CSRF атак
ежсайтовых подделок запросов). Все включенные шаблоны представляют из
себя документы, использующие библиотеку Twitter Bootstrap.
На данный момент Twitter Bootstrap является самым распространенным
HTML, CSS, и JS фреймворком для разработки адаптивных и мобильных Web-
сайтов. Библиотека позволяет без особых усилий создавать удобные и красивые
пользовательские интерфейсы, при этом не нагружая сервера, что
72
положительно сказывается на скорости работы и отзывчивости страниц. В
данном же случае за счет использования шаблонизатора и кеширования,
страницы отлично выглядят, и работают даже на маломощных мобильных
устройствах.
Для того, чтобы приступить к работе с данным фреймворком,
необходимо в стандартный html файл (а в данном случае шаблон Freemarker)
добавить следующие CSS и JavaScript файлы:
<link rel='stylesheet' type="text/css" media="all" href="/css/bootstrap.css">
Является базовым набором стилей для библиотеки.
<link rel="stylesheet" type="text/css" media="all" href="/css/bootstrap-theme.css"/>
Служит для поддержки тем оформления bootstrap.
<link rel="stylesheet" type="text/css" media="all" href="/css/style.css"/>
В style.css находятся все изменения вышеописанных файлов таблиц стилей.
Наличие этого файла стилей обусловлено тем, что все изменения стилей
хранятся только в нем, что позволяет не изменять оригинальные файлы стилей
библиотеки, что очень важно при переносе или клонировании проекта. В
данном файле стилей все изменения помечаются директивой !important, которая
имеет больший приоритет при обработке стилей страниц. Это дает
возможность переписать стили с высшим приоритетом для приложения.
<script src = "/webjars/jquery/1.11.3/jquery.min.js"></script>
В данном фрагменте кода происходит подключение JavaScript библиотеки
jQuery, которая предназначена для взаимодействия JavaScript и HTML. Данная
библиотека позволяет получать доступ к любому элементу DOM (от англ.
Document Object Model — «объектная модель документа»), обращаться к
атрибутам и содержимому элементов DOM и производить над ними какие-либо
действия. Библиотека jQuery необходима для работы фреймворка Twitter
Bootstrap.
<script src = "/webjars/holderjs/2.5.2/holder.js"></script>
Библиотека holder.js предназначена для генерации изображений -
заглушек. Заглушки используются в том случае, если есть необходимость
73
посмотреть конечный результат дизайна страницы без заполнения ее
контентом, что очень полезно для ее макетирования.
<script src = "/webjars/bootstrap/3.3.6/js/bootstrap.js"></script>
В данном месте происходит подключение самой библиотеки Twitter
Bootstrap, которая представляет из себя набор инструментов для создания
сайтов и веб-приложений, включающая в себя HTML и CSS шаблоны
оформления для веб-форм, кнопок, блоков навигации и прочих компонентов
веб-интерфейса, такие как например различные расширения JavaScript. Так же
стоит отметить, что Twitter Bootstrap является свободным и бесплатным
программным обеспечением.
Все необходимые JavaScript библиотеки подключаются к проекту при
помощи WebJars - набора библиотек в архивах jar (сокращение от англ. Java
ARchive), каждая из которых содержит в себе JavaScript библиотеку или
модулей CSS. Удобство WebJars заключается в том, что все библиотеки можно
быстро подключать из Maven репозиториев (при работе с системами сборки
Maven и gradle), и сразу же их использовать в проекте, не обращая на настройку
каталогов и путей проекта.
3.3. Организация тестирования информационной системы управления
сайтом
В данном приложении для организации модульного тестирования
используются библиотека spring-boot-starter-test. Все тестовые классы
расположены каталоге /src/test в пакете com.porollo.platform. В данной главе
будет описан процесс тестирования базы данных и веб-части приложения.
Рассмотрим исходный код класса тестирования работоспособности базы
данных и JPA репозитория пользовательской части (Приложение 6). Классы
тестирования мало чем отличаются от обычных Java классов, но имеют новые
аннотации:
74
@RunWith – позволяет Spring Testing использовать библиотеку
тестирования JUnit.
@SpringBootTest(classes = PlatformApplication.class) сообщает
приложению, что класс является классом тестирования Spring Test,
а параметр указывает класс приложения с методом main (класс с
точкой входа в приложение).
@DataJpaTest – указывает, что в данном классе проводятся тесты с
использованием Java Persistence API.
@AutoConfigureTestDatabase – применяется к тестовому классу для
настройки тестовой базы данных для использования вместо любого
установленного или автоматизированного источника данных. При
использовании параметра Replace.NONE данные для подключения
берутся из общего файла конфигурации application.properties.
В самих тестовых классах до аннотации @Test (определяющей начало
теста) создается новый обьект репозитория UserRepository, затем проводится
проверка на существующего пользователя в базе данных, что при удачном
прохождении теста говорит, как минимум о ее работоспособности и наличия
пользователя с правами администратора.
Тестовый класс IndexControllerTest (Приложение 7) предназначен для
проверки доступности главной страницы (index.ftl) приложения через
контроллер.
public void indexNotNull() throws Exception {
assertThat(indexController).isNotNull();
}
Несмотря на то, что данный тест не совсем корректен (например, он не
проверяет, что к данному контроллеру привязано именно нужное отображение),
на данный момент он выполняет свою основную задачу (наличие связанности
контроллера с отображением). В целом стоит обратить внимание на то, что

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)