Разработка веб-сервиса для работы юридической клиники

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 28.08.2018
Размер файла 3,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

О студенте/преподавателе.

Id.

ФИО.

Фотография.

Логин.

Пароль.

Телефон.

Группа (у студента).

Электронная почта.

Права администратора.

О заявке.

Номер.

Классификация заявки.

Дата начала работы над заявкой.

Дата окончания работы над заявкой.

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

Оценка за работу студента над заявкой.

Студент, выполняющий заявку.

Преподаватель, курирующий выполнение заявки.

Клиент.

Статус выполнения.

Комментарий.

Об отзывах.

Id.

Имя автора отзыва.

Дата.

Оценка.

Преимущества.

Недостатки.

Отзыв.

О документе.

Id.

Название.

Документ.

Тип.

Номер заявки.

О клиенте.

Id.

ФИО.

Телефон.

Электронная почта.

О часто задаваемых вопросах.

Id.

Вопрос.

Ответ.

Классификация вопроса.

О графике работы.

Id.

Дата.

Время начала работы.

Время окончания работы.

Место.

О месте проведения консультаций.

Id.

Организация.

Город.

Улица.

Дом.

О посещениях.

Id.

Дата/время.

Клиент.

Место.

О классификации.

Id.

Наименование.

Классификация (используется для создания иерархии классов).

О статусе выполнения заявки.

Id.

Наименование.

О типе документа.

Id.

Наименование.

На основе собранных данных была построена концептуальная модель базы данных, которая является полной совокупностью всех требований к данным и инвариантна к структуре базы данных. Концептуальная модель представлена в виде модели "сущность-связь" (см. рис 3.2).

Рисунок 3.2. Концептуальная модель базы данных

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

Проектирование пользовательского интерфейса веб-сервиса

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

Рисунок 3.3. Главная страница веб-сервиса

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

Экранные формы должны проектироваться с учетом требований унификации. Все экранные формы пользовательского интерфейса должны быть выполнены в едином графическом дизайне, с одинаковым расположением основных элементов управления и навигации. Цветовая палитра должна соответствовать основным фирменным цветам НИУ ВШЭ - Пермь. В «шапке» веб-сервиса должен использоваться логотип НИУ ВШЭ - Пермь. Для обозначения сходных операций должны использоваться сходные графические значки, кнопки и другие управляющие элементы. Термины, используемые для обозначения типовых операций, а также последовательности действий пользователя при их выполнении, должны быть унифицированы. Внешнее поведение сходных элементов пользовательского интерфейса (реакция на наведение указателя «мыши», переключение фокуса, нажатие кнопки) должны реализовываться одинаково для однотипных элементов.

В результате проектирования пользовательского интерфейса были спроектированы представления для ввода информации пользователем в веб-сервисе и вывода информации пользователю. Далее рассмотрим основные представления пользовательского интерфейса для реализации функциональности веб-сервиса.

Навигация по веб-сервису будет происходить при помощи всплывающего бокового меню, в котором указаны все функции веб-сервиса доступные клиенту (см. рис. 3.4). При помощи данного меню можно перемещаться между веб-страницами веб-сервиса: главная страница, оставить online заявку, записаться на консультацию, проверить статус выполнения заявки, часто задаваемые вопросы, отзывы, контакты.

Рисунок 3.4. Меню

Для формирования online заявки пользователь заполняет данные о себе (ФИО, телефон, электронная почта) для дальнейшего контакта сотрудников юридической клиники НИУ ВШЭ - Пермь с ним при необходимости. Далее выбирает тип проблемы из списка предложенных в выпадающем списке, с которой он обращается в юридическую клинику. Если клиент затрудняется в правильности выбора типа проблемы, он может пропустить данный пункт, в дальнейшем его заполнят сотрудники юридической клиники. Следующим действием является подробное описание проблемы клиента и заполнение соответствующего поля. Далее клиент может прикрепить документы к заявке (копия паспорта, заявление и другие документы). Чтобы не нарушать федеральный закон N 152-ФЗ от 27.07.2006, регламентирующий обращение с персональными данными клиента, клиент юридической клиники должен подтвердить согласие на обработку персональных данных. Нажимая кнопку отправить, веб-сервисом формируется заявка и отправляется на согласование сотрудникам юридической клиники НИУ ВШЭ - Пермь (см. рис. 3.5).

Рисунок 3.5. Форма для формирования online заявки

Чтобы записаться на личную консультацию пользователь должен выбрать удобную для него дату, время и место проведения консультаций из списка предложенных (график рабочего времени). Далее пользователь заполняет данные о себе (ФИО, телефон, электронная почта) для дальнейшего контакта сотрудников юридической клиники НИУ ВШЭ - Пермь с ним при необходимости. Для окончания записи необходимо нажать кнопку «Записаться» (см. рис. 3.6).

Рисунок 3.6. Форма для записи на личную консультацию

После того как клиент оформил online заявку или обратился в юридическую клинику НИУ ВШЭ - Пермь с личной консультацией, он получает десятизначный номер заявки.

Рисунок 3.7. Форма для просмотра статуса выполнения заявки

Для просмотра статуса выполнения заявки клиент юридической клиники должен ввести номер заявки в соответствующее поле на форме и нажать на кнопку «Поиск». Если номер введен верно, то клиент увидит всю необходимую информацию о своей заявке, в которой указаны: номер заявки, классификация, информация о клиенте, дата подачи заявки, статус выполнения заявки. Если статус выполнения заявки «Выполнено», то на экране также отобразится дата окончания работы над заявкой, а также клиент сможет скачать результат работы над его заявкой, нажав на соответствующую ссылку (см. рис. 3.7).

Если у клиента остались какие-то вопросы о работе юридической клиники, ответа на которые он не нашел на страницах веб-сервиса, то клиент имеет возможность задать вопрос напрямую сотрудникам юридической клиники НИУ ВШЭ - Пермь (см. рис. 3.8.). Клиент заполняет форму со своими контактными данными, чтобы сотрудники юридической клиники могли связаться с ним, и задает вопрос, который отправляется на электронную почту юридической клиники. Администратор может настраивать адрес электронной почты на который будут поступать вопросы.

Рисунок 3.8. Форма для отправки вопроса

Во вкладке «Отзывы» клиент юридической клиники может оставить свой отзыв о работе юридической клиники (см. рис. 3.9). Для этого клиент должен заполнить форму, в которой требуется указать свое имя (или nickname), по возможности сформировать и указать преимущества и недостатки юридической клиники НИУ ВШЭ - Пермь или в работе веб-сервиса над другими юридическими клиниками. Написать отзыв и поставить оценку работе юридической клиники по пятибалльной шкале. Нажать на кнопку «Отправить».

Рисунок 3.9. Форма для отправки отзыва

Отзывы сортируются по дате, поэтому последний отзыв будет самым первым в списке. На странице выводится по десять отзывов, можно переключаться между страницами с отзывами. Формируется рейтинг работы юридической клиники НИУ ВШЭ - Пермь, составленный на основе оценок, проставленных клиентами (см. рис. 3.10).

Рисунок 3.10. Представление для отображения отзывов

Для входа сотрудника в личный кабинет ему требуется авторизоваться в системе (см. рис. 3.11), заполнив поля логин и пароль и нажав на кнопку «Login». Логин и пароль выдается сотруднику юридической клиники администратором.

Рисунок 3.11. Форма для авторизации сотрудников юридической клиники в системе

После авторизации сотрудника в системе, открывается веб-страница с личным кабинетом для сотрудников юридической клиники НИУ ВШЭ - Пермь (см. рис. 3.12).

Рисунок 3.12. Представление личного кабинета администратора

Должно быть реализовано четыре личных кабинета для каждой из ролей (студент, студент-администратор, преподаватель, преподаватель-администратор). Интерфейс личного кабинета реализован при помощи плитки. Чтобы открыть одну из веб-страниц нужна нажать на необходимую «плитку». Сотрудник может перемещаться между веб-страницами, в которых реализована необходимая функциональность веб_сервиса для работы юридической клиники НИУ ВШЭ - Пермь.

На странице «Студенты» преподаватель-администратор может вести учет студентов, принимающих участие в работе юридической клиники НИУ ВШЭ - Пермь. Список студентов представлен в таблице, в которой отображается основная информация о студентах (ФИО, группа, телефон, электронная почта). Если студентов много, преподаватель-администратор имеет возможность настраивать количество студентов, отображаемых на одной странице, и переключаться между страницами. Организован поиск студентов, достаточно ввести несколько символов, чтобы был сформирован список найденных студентов. Преподаватель-администратор может добавлять, редактировать или удалять информацию о студентах (см. рис. 3.13). Учет преподавателей ведется аналогичным образом.

Рисунок 3.13. Представление таблицы учета студентов

Чтобы добавить информацию о новом студенте в БД или редактировать информацию об уже существующем студенте, необходимо нажать на соответствующую кнопку. В всплывающем окне требуется заполнить все обязательные поля (ФИО, логин, пароль, подтверждение пароля), а также для уточнения информации о студенте заполнить остальные поля (телефон, электронная почта, группа). Если студент обладает правами администратора это следует отметить галочкой в поле «Права администратора». Также можно загрузить фотографию студента. Для добавления информации в БД требуется нажать кнопку «Сохранить» (см. рис. 3.14).

Рисунок 3.14. Форма для добавления/редактирования студентов

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

Рисунок 3.15. Сообщения-уведомления

Во вкладке «Часто задаваемые вопросы» пользователь может ознакомиться с типичными вопросами, с которыми чаще всего сталкиваются клиенты юридической клиники НИУ ВШЭ - Пермь. Вопросы разделены на классификации. На странице «Классификация», пользователь может видеть подклассы и вопросы, относящиеся к данным классификациям. Перемещаясь между вкладками, пользователь веб-сервиса может просматривать ответы на интересующие его вопросы (см. рис. 3.16).

Рисунок 3.16. Форма для просмотра часто задаваемых вопросов

Во вкладке «Статистика» преподаватель-администратор может просматривать статистическую информацию о работе юридической клиники НИУ ВШЭ - Пермь. Статистика доступна к просмотру как по месяцам (см. рис. 3.17), так и за все время работы юридической клиники НИУ ВШЭ - Пермь. Доступная информация: количество принятых заявок, количество выполненных заявок, максимальное, среднее, минимально время ответа на заявку, количество проведённых консультаций, максимальная, средняя, минимальная оценка студента за работу над заявкой, количество положительных отзывов.

Рисунок 3.17. Форма для просмотра статистики за месяц

Во вкладке статистики за все время представлена информация в виде гистограмм (см. рис. 3.18).

Рисунок 3.18. Форма для просмотра статистики за все время

Глава 4. Реализация веб-сервиса

Глава посвящена разработке основных алгоритмов, функций и принципов реализации веб-сервиса для работы юридической клиники НИУ ВШЭ - Пермь. Для полноценной работы веб-сервиса необходимо реализовать функциональность, определенную техническим заданием (см. прил. D) на этапе анализа. Веб-сервис состоит из следующих модулей: веб-сервер и база данных.

Бизнес-логика веб-сервиса юридической клиники НИУ ВШЭ - Пермь была реализована на языке C# в среде разработки Microsoft Visual Studio 2015. В качестве платформы для разработки веб-сервиса была использована технология ASP.NET. Структура веб-сервиса определена фреймворком ASP.NET MVC, основанном на взаимодействии трех компонентов: модель, представление и контроллер.

Интерфейс пользователя реализован при помощи представлений. Для реализации интерфейса пользователя использовались: движок представлений Razor, а также языки HTML, CSS, JavaScript. Для реализации дружелюбного, насыщенного пользовательского интерфейса пред началом работы при помощи диспетчера пакетов NuGet были установлены следующие библиотеки:

Библиотека со свободным набором инструментов для разработки веб_приложений Bootstrap (см. рис. 4.1). Данная библиотека включает в себя HTML и CSS шаблоны оформления для элементов веб-интерфейса.

Рисунок 4.1. Подключение библиотеки Bootstrap

Библиотека JavaScript с открытым исходным кодом для разработки пользовательского веб-интерфейса jQuery.UI (см. рис. 4.2).

Рисунок 4.2. Подключение библиотеки jQuery.UI

Основные классы предметной области, реализованные для работы веб-сервиса, представлены на диаграмме классов (см. рис. 4.3). Полноразмерная диаграмма классов приведена в прил. F.

Рисунок 4.3. Диаграмма классов

4.1 Реализация базы данных

Для хранения информации и обеспечения пользователя веб-сервиса актуальной информацией при помощи СУБД Microsoft SQL Server 2014 реализована база данных. Взаимодействие между разработчиком и базой данных происходит через приложение Microsoft SQL Server Management Studio. Взаимодействие между пользователем и базой данных происходит через удобный пользовательский интерфейс веб-браузера.

На основе построенной на этапе проектирования концептуальной модели базы данных (см. рис. 3.2) при реализации веб-сервиса были простроены логическая (см. рис. 4.4) и физическая модели базы данных (см. прил. H).

Рисунок 4.4. Логическая модель базы данных

Фрагмент физической модели базы данных, в котором представлена таблица «Студент», приведен ниже. Полная физическая модель, которая отражает физические свойства разработанной базы данных, приведена в прил. H.

CREATE TABLE [dbo].[Student] (

[Id] INT IDENTITY (1, 1) NOT NULL,

[Name] NVARCHAR (64) NOT NULL,

[Photo] NVARCHAR (MAX) NULL,

[Login] NVARCHAR (64) NOT NULL,

[Password] NVARCHAR (64) NOT NULL,

[Phone] NVARCHAR (64) NULL,

[Email] NVARCHAR (64) NULL,

[Group] NVARCHAR (64) NULL,

[Admin] BIT NOT NULL,

PRIMARY KEY CLUSTERED ([Id] ASC)

);

4.2 Функциональность веб-сервиса

анный раздел содержит описание особенностей реализации основной функциональности веб-сервиса юридической клиники НИУ ВШЭ - Пермь. Особое внимание уделено разработке CRUD-операций для работы с базой данных. Взаимодействие с базой данных происходит при помощи LINQ запросов.

4.2.1 Меню

Чтобы облегчить доступ пользователя к функциям веб-сервиса, было реализовано меню (см. рис. 3.4). Данное меню содержит список разделов сайта и ссылки для перехода к их функциональности:

<div class="navbar-collapse collapse">

<span class="menu" onclick="OpenNav()"><i class="fa fa-bars"></i></span>

<img class="logo" src="~/App_Files/Images/logoHse.jpg" />

</div>

<div id="side-nav" class="side-nav">

<span href="javascript:void(0)" class="btn-close" onclick="CloseNav()">&times;</span>

@Html.ActionLink("Главная", "Main", "Home")

@Html.ActionLink("Оставить Online заявку", "AddRequest", "Request")

@Html.ActionLink("Записаться на консультацию", "AddAttend", "Attend")

@Html.ActionLink("Проверить статус выполнения заявки", "RequestSearch", "Request")

@Html.ActionLink("Часто задаваемые вопросы", "ClassificationList", "FAQ")

@Html.ActionLink("Отзывы", "ReviewList", "Review")

@Html.ActionLink("Контакты", "Contact", "Home")

</div>

<script>

function OpenNav() {

document.getElementById("side-nav").style.width = "350px";

}

function CloseNav() {

document.getElementById("side-nav").style.width = "0";

}

</script>

4.2.2 Оформление online заявки

Для оформления online заявки пользователю предложено заполнить форму (см. рис. 3.5). Пользователь должен заполнить данные о себе, описать возникшую проблему, загрузить документы. Все обязательные поля должны быть заполнены. Также пользователь должен дать согласие на обработку персональных данных при помощи радио-кнопок, только тогда появится кнопка «Отправить»:

<div class="btn-radio">

<input id="toggle-off" class="toggle toggle-left" name="toggle" value="false" type="radio" onchange="UpdateButtonSubmit()" checked>

<label for="toggle-off" class="btn-toggle">Нет</label>

<input id="toggle-on" class="toggle toggle-right" name="toggle" value="true" type="radio" onchange="UpdateButtonSubmit()">

<label for="toggle-on" class="btn-toggle">Да</label>

</div>

<span class="btn-submit" id="btn-submit"><button class="btn btn-primary" type="submit"> Отправить</button></span>

function updateButtonSubmit() {

var btnSubmit = document.getElementById("btn-submit");

var selectedRadioButton = document.querySelector('input[name="toggle"]:checked');

if (selectedRadioButton.value == 'true') {

btnSubmit.style.display = 'block';

}

else {

btnSubmit.style.display = 'none';

}

}

Полученные данные с формы последовательно обрабатываются в контроллере. В БД создается новый клиент, затем создаётся новая заявка, которой присваивается раннее созданный клиент, далее создаются документы, которым присваивается номер заявки (см. рис. 4.5).

Рисунок 4.5 Оформление online заявки

public ActionResult AddRequest(RequestViewModel newRequest, System.Web.HttpPostedFileBase[] files)

{

Client client = new Client(); // Создаем нового клиента

client.Name = newRequest.ClientName; // Присваеваем имя клиента из формы

client.Phone = newRequest.ClientPhone; // Присваеваем телефон клиента из формы

if (newRequest.ClientEmail != null) // Проверка электронной почты на пустоту

client.Email = newRequest.ClientEmail; // Присваеваем электронную почту клиента из формы

db.Client.Add(client); // Добавляем информацию о клиенте в БД

db.SaveChanges(); // Сохраняем БД

Request request = new Request(); // Создаем новую заявку

request.Number = GetNumberRequest(); // Присваеваем уникальный номер заявки

if (newRequest.RequestClassification != 0) // Проверка на пустоту

request.Classification = db.Classification.First(c => c.Id == newRequest.RequestClassification).Id; // Присваиваем классификацию заявки из формы

request.Status = 1; // Присваиваем статус выполнения заявки

request.DateStart = DateTime.Now; // Присваиваем дату оформления заявки

request.Client = client.Id; // Присваиваем клиента

request.Comment = newRequest.RequestComment; // Присваиваем описание проблемы

db.Request.Add(request); // Добавляем информацию о заявке в БД

db.SaveChanges(); // Сохраняем БД

if(files != null) // Если массив не пустой

{

foreach (var file in files) // Сохраняем все документы из массива в цикле

{

Document document = new Document(); // Создаем новый документ

document.RequestNumber = request.Number; // Присваеваем номер заявки

document.Type = 6; // Пользовательский документ

string fileIdentifier = Guid.NewGuid() + Path.GetExtension(file.FileName); // Присваеваем идентификатор + формат файла

string filePath = Path.Combine(Server.MapPath("~/App_Files/Documents"), fileIdentifier); // Формируем путь сохранения файла

file.SaveAs(filePath); // Сохраняем файл на сервер

document.Name = file.FileName;

document.File = fileIdentifier;

db.Document.Add(document);

db.SaveChanges();

}

}

ViewBag.Number = request.Number;

return View(); // Обновляем страницу

}

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

public string GetNumberRequest()

{

string dic = ""; // Словарь

string tmp = "";

char nchar;

for (int i = 65; i < 91; i++)

{

nchar = (char)i; // Значение из ASCII-таблицы

tmp += Convert.ToString(nchar);

}

dic += tmp;

dic += "0123456789";

string numberRequest = ""; // Номер заявки

Random rnd = new Random(); // Генератор случайных чисел

for (int i = 0; i < 10; i++)

{

int index = Convert.ToUInt16(rnd.NextDouble() * dic.Length) % dic.Length;

nchar = dic[index];

numberRequest += Convert.ToString(nchar);

}

return numberRequest;

}

4.2.3 Записаться на консультацию

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

[HttpGet]

public ActionResult AddAttend()

{

int selectedItem = 1;

SelectList location = new SelectList(db.Location, "Id", "Organization", selectedItem);

ViewBag.Location = location;

SelectList date = new SelectList(db.WorkSchedule.Where(w => w.Location == selectedItem && w.Date >= DateTime.Now), "Id", "Date");

ViewBag.Date = date;

int id = (from workSchedule in db.WorkSchedule

where workSchedule.Date >= DateTime.Now

select workSchedule.Id).FirstOrDefault();

SelectList time = new SelectList(GetTimeList(id), "Id", "AttendTime");

ViewBag.Time = time;

return View();

}

public ActionResult GetDate(int id)

{

var workScheduleList = db.WorkSchedule.Where(w => w.Location == id && w.Date >= DateTime.Now).ToList();

return PartialView(workScheduleList);

}

List<Time> timeList = new List<Time>();

private IEnumerable GetTimeList(int id)

{

timeList.Clear();

var workSchedule = (from w in db.WorkSchedule

where w.Id == id

select w).FirstOrDefault();

int item = 0;

for (TimeSpan i = workSchedule.TimeStart; i < workSchedule.TimeEnd; i = i + new TimeSpan(1, 0, 0))

{

item += 1;

timeList.Add(new Time() { Id = item, AttendTime = i });

}

return timeList;

}

public ActionResult GetTime(int id)

{

timeList.Clear();

var workSchedule = (from w in db.WorkSchedule

where w.Id == id

select w).FirstOrDefault();

int item = 0;

for (TimeSpan i = workSchedule.TimeStart; i < workSchedule.TimeEnd; i = i + new TimeSpan(1, 0, 0))

{

item += 1;

timeList.Add(new Time() { Id = item, AttendTime = i });

}

return PartialView(timeList);

}

[HttpPost]

public ActionResult AddAttend(AttendViewModel newAttend)

{

Client client = new Client(); // Создаем нового клиента

client.Name = newAttend.ClientName; // Присваеваем имя клиента из формы

client.Phone = newAttend.ClientPhone; // Присваеваем телефон клиента из формы

if (newAttend.ClientEmail != null) // Проверка электронной почты на пустоту

client.Email = newAttend.ClientEmail; // Присваеваем электронную почту клиента из формы

db.Client.Add(client); // Добавляем информацию о клиенте в БД

db.SaveChanges(); // Сохраняем БД

Attend attend = new Attend(); // Создаем новое посещение

attend.Date = newAttend.AttendDate.Add(newAttend.AttendTime); // Присваиваем дату и время

attend.Location = newAttend.AttendLocation; // Присваиваем месторасположение

attend.Client = client.Id; // Присваиваем клиента

db.Attend.Add(attend); // Добавляем информацию о посещении в БД

db.SaveChanges(); // Сохраняем БД

return View();

}

Также пользователь вносит свою контактную информацию на форму, нажимает кнопку «Записаться» Все обязательные поля должны быть заполнены (см. рис. 4.6).

Рисунок 4.6. Запись на консультацию

4.2.4 Просмотр статуса выполнения заявки

Для просмотра статуса выполнения заявки пользователь должен ввести номер заявки в соответствующее поле (см. рис. 3.7). Чтобы посмотреть статус выполнения заявки реализован поиск заявки по её номеру. Затем из базы данных получаем информацию о клиенте, о статусе выполнения заявки, о классификации заявки, документы (см. рис. 4.7):

Рисунок 4.7. Просмотр статуса выполнения заявки

[HttpGet]

public ActionResult RequestSearch()

{

return View();

}

[HttpPost]

public ActionResult RequestSearch(string searchString)

{

var request = from r in db.Request

select r;

if (!string.IsNullOrEmpty(searchString))

{

request = request.Where(r => r.Number == searchString);

return View(request);

}

else

{

ViewBag.Error = "Введите номер заявки";

return View();

}

}

4.2.5 Написание отзывов

Во вкладке отзывы пользователь может оставить отзыв о работе юридической клиники НИУ ВШЭ - Пермь, а также просмотреть отзывы других клиентов (см. рис. 3.10). Так как отзывов может быть неограниченное количество, реализован постраничный вывод. Пагинация позволяет разбить набор отзывов на несколько страниц и установить ссылки упрощенного доступа к конкретным страницам. Пагинация реализована при помощи уже существующего плагина PagedList.Mvc (см. рис. 4.8). На одной странице представлено до десяти отзывов:

Рисунок 4.8. Подключение плагина PagedList.Mvc

DBWebServiceLegalClinicHSEEntities db = new DBWebServiceLegalClinicHSEEntities();

List<Review> reviewList = new List<Review>();

[HttpGet]

public ActionResult ReviewList(int? page)

{

reviewList = db.Review.ToList(); // Список отзывов

var reviewSort = from review in reviewList // Сортируем список, чтобы новые отзывы были всегда в начале списка

orderby review.Id descending

select review;

int pageSize = 10; // Выводим по 10 отзывов на странице

int pageNumber = (page ?? 1);

return View(reviewSort.ToPagedList(pageNumber, pageSize));

}

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

[HttpPost]

public ActionResult AddReview(Review review)

{

review.Date = DateTime.Now; // Записываем время, когда был оставлен отзыв

db.Review.Add(review); // Добавляем отзыв в БД

db.SaveChanges(); // Сохраняем БД

return RedirectToAction("ReviewList"); // Обновляем страницу

}

4.2.6 Часто задаваемые вопросы

Пользователь может просматривать часто задаваемые вопросы (см. рис. 3.16). Вопросы разделены на классификации. Пользователь видит только те классификации, которые содержат в себе часто задаваемые вопросы:

@foreach (var classification in Model)

{

<div class="jumbotron classification" style="padding-top: 100px; padding-bottom: 100px">

<a class="title" href="/Classification/QuestionList/@classification.Id" style="color:#333;text-decoration:none;list-style:none;"><h2>@classification.Name</h2></a>

@{

var subClassList= (from subClass in db.Classification

where subClass.MainClass == classification.Id

select subClass).Take(5).ToList();

var questionList = (from question in db.FAQ

where question.Classification == classification.Id

select question).Take(5).ToList();

if (subClassList.Count != 0)

{

foreach (var subClass in subClassList)

{

<p><a href="/Classification/QuestionList/@classification.Id" style="color:#333;text-decoration:none;list-style:none;"><i class="fa fa-clone fa-flip-horizontal" aria-hidden="true"></i> @subClass.Name</a></p>

}

}

else

{

foreach (var question in questionList)

{

<p><a href="/FAQ/QuestionInfo/@question.Id" style="color:#333;text-decoration:none;list-style:none;"><i class="fa fa-question" aria-hidden="true"></i> @question.Question</a></p>

}

}

<a href="/Classification/QuestionList/@classification.Id"><i>Подробнее...</i></a>

}

<p></p>

</div>

}

Что бы проще было ориентироваться в большом количестве вопросов, классификации разделены на подклассы (см. рис. 4.9):

Рисунок 4.9. Часто задаваемые вопросы

@foreach (var question in questionList)

{

<p><a href="/FAQ/QuestionInfo/@question.Id" style="color:#333;text-decoration:none;list-style:none;"><i class="fa fa-question" aria-hidden="true"></i> @question.Question</a></p>

}

<div class="faq_list">

@foreach (var subClass in subClassList)

{

var newQuestionList = (from question in db.FAQ

where question.Classification == subClass.Id

select question).ToList();

<div class="faq_item">

<div class="faq_item_title">

<div class="faq_item_title_inner">

@subClass.Name

</div>

</div>

<div class="faq_item_body">

@foreach (var question in newQuestionList)

{

<p><a href="/FAQ/QuestionInfo/@question.Id" style="color:#333;text-decoration:none;list-style:none;"><i class="fa fa-question" aria-hidden="true"></i> @question.Question</a></p>

}

</div>

</div>

}

@if (subClassList.Count > 0)

{

<div class="faq_show_all">

<div class="faq_item_title">

<div class="faq_item_title_inner show_all">

Смотреть все

</div>

</div>

</div>

}

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

4.2.7 Авторизация сотрудника в системе

Для того чтобы предоставить пользователю (сотруднику юридической клиники) работу с актуальными данными, а именно с данными конкретного пользователя, заявками и документами, необходимо разграничить права доступа к системе. Для входа в систему пользователю необходимо ввести логин и пароль (см. рис. 3.11б, 4.10).

Рисунок4.10. Авторизация пользователя в системе

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

4.2.8 Учет пользователей веб-сервиса

Для учета пользователей веб-сервиса, а также для учета других наборов данных был использован плагин DataTables (см. рис. 3.13, 3.14). DataTables является простым в использовании jQuery плагином с широким диапазоном настраиваемых параметров. DataTables легко настроить, передавая объект с параметрами. При помощи DataTables реализованы добавление (см. рис. 4.11), редактирование, удаление, поиск пользователя.

Рисунок 4.11. Добавление студента в БД

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

public ActionResult GetData() // Получаем данные

{

List<Student> studentList = db.Student.ToList<Student>(); // Список студентов

return Json(new { data = studentList }, JsonRequestBehavior.AllowGet); // Возврашаем результат

}

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

<a class="btn btn-primary" onclick="PopupForm('@Url.Action("AddEditStudent", "Student")')"><i class="fa fa-plus" aria-hidden="true"></i> Добавить нового студента</a>

<table id="studentTable" class="table table-striped table-bordered" style="width: 100%">

<thead>

<tr>

<th>ФИО</th>

<th>Группа</th>

<th>Телефон</th>

<th>Электронная почта</th>

<th></th>

</tr>

</thead>

</table>

<link href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css" rel="stylesheet" />

<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />

<link href="~/Content/css/list.css" rel="stylesheet" />

@section scripts{

<script src="//cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>

<script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/notify/0.4.2/notify.js"></script>

<script src="~/Scripts/add.js"></script>

<script>

var popup, dataTable; // Всплывающее окно // Таблица с данными

$(document).ready(function () { // Объявляем функцию

dataTable = $(studentTable).DataTable({ // Преобразовываем таблицу

"ajax": {

"url": "/Student/GetData", // URL

"type": "GET", // Получаем данные для заполнения таблицы

"datatype": "json" // Тип данных JSON

},

"columns": [ // Свойство столбцов

{ "data": "Name" }, // ФИО

{ "data": "Group" }, // Группа

{ "data": "Phone" }, // Телефон

{ "data": "Email" }, // Электронная почта

{ "data": "Id", "render": function (id) { // Столбец с кнопками // Идентификатором является Id студента // Объявляем функцию, в которой реализованы кнопки

return "<a class='btn btn-default btn-sm' style='margin:0' onclick=PopupForm('@Url.Action("AddEditStudent", "Student")/" + id + "')><i class='fa fa-pencil'></i> Редактировать</a>\

<a class='btn btn-danger btn-sm' style='margin:0' onclick=Delete(" + id + ")><i class='fa fa-trash'></i> Удалить</a>" // Редактировать // Удалить

},

"orderable": false, // Отмена сортировки в столбце

"searchable": false, // Отмена поиска в столбце

"width": "220px" // Ширина столбца

}

],

"language": {

"emptyTable": "Данные отсутствуют, «пожалуйста» нажмите кнопку <b>Добавить нового студента</b>", // Выводим сообщение, если таблица пустая

"lengthMenu": "Количество студентов _MENU_",

"info": "Отображены с _START_ по _END_ из _TOTAL_ студентов",

"infoEmpty": "",

"search": "Поиск:",

"paginate": {

"first": "Первая",

"last": "Последняя",

"next": "Следующая",

"previous": "Предыдущая"

}

}

});

});

</script>

4.2.9 Хранение файлов

При добавлении в базу данных студентов и преподавателей сохраняются их фотографии, а при работе с заявками сохраняются документы. Хранение всех этих файлов в базе данных является ошибочным. При реализации веб-сервиса юридической клиники было принято решение сохранять все файлы на жестком диске веб-сервера. В базе данных хранится следующая информация о документе: Id, номер заявки, имя документа для удобства использования. Для идентификации файла на сервере, при сохранении документа ему присваивается статистически уникальный 128-битный идентификатор GUID. Также требуется хранить тип документа, так как требуется разделить права доступа к некоторым документам. Если требуется скачать файл, то он загружается с жёсткого диска сервера.

Загрузка документов:

Document document = new Document(); // Создаем новый документ

document.RequestNumber = request.Number; // Присваеваем номер заявки

document.Type = 6; // Пользовательский документ

string fileIdentifier = Guid.NewGuid() + Path.GetExtension(file.FileName); // Присваеваем идентификатор + формат файла

string filePath = Path.Combine(Server.MapPath("~/App_Files/Documents"), fileIdentifier); // Формируем путь сохранения файла

file.SaveAs(filePath); // Сохраняем файл на сервер

document.Name = file.FileName;

document.File = fileIdentifier;

db.Document.Add(document);

db.SaveChanges();

Просмотр документов:

var document = db.Document.First(d => (d.RequestNumber == request.Number) && (d.Type == 5));

<tr>

<td><p class="lead" style="padding-right: 20px;">Скачать результат</p></td>

<td><p class="lead"><i class="fa fa-file-word-o" aria-hidden="true"></i><a href="http://localhost:1875/App_Files/Documents/@document.File" target="_blank" title="Нажмите здесь, чтобы сказать документ Word"><em> @document.Name</em></a></p></td>

</tr>

Удаление документов:

Document document = db.Document.Where(d => d.Id == id).FirstOrDefault<Document>(); // Выбираем документ

System.IO.File.Delete(Path.Combine(Server.MapPath("~/App_Files/Documents"), document.File));

db.Document.Remove(document); // Удаляем документ из БД

db.SaveChanges(); // Сохранение БД

return Json(new { success = true, message = "Документ удален" }, JsonRequestBehavior.AllowGet); // Сообщение уведомление

4.2.10 Электронная рассылка писем

Если пользователь хочет задать дополнительный вопрос о работе юридической клиники, он может сделать это напрямую при помощи почтовой функциональности веб_сервиса (см. рис. 3.8). Для веб-сервиса была зарегистрирована отдельная электронная почта. После того как пользователь заполнил все обязательные поля, при помощи сетевого протокола SMTP, предназначенного для передачи электронной почты в сети, письмо отправляется с электронной почты веб-сервиса на электронную почту юридической клиники НИУ ВШЭ - Пермь. Так сотрудники юридической клиники могут отслеживать какие письма поступили на прямую с веб-сервиса. Электронные адреса почт веб-сервиса и юридической клиники можно изменять в настройка веб_сервиса (см. рис. 4.12):

Рисунок 4.12 Настройка электронной почты

public ActionResult Contact (QuestionViewModel question)

{

try

{

if (ModelState.IsValid)

{

var senderEmail = new MailAddress(mail.EmailSend, mail.EmailSendName); // Отправитель

var password = mail.EmailSendPassword; // Пароль

var receiverEmail = new MailAddress(mail.EmailGet, mail.EmailGetName); // Получатель

var sub = question.Subject; // Тема

var body = question.Message; // Сообщение

var smtp = new SmtpClient

{

Host = "smtp.gmail.com",

Port = 587,

EnableSsl = true, // Используем протокол SSL

DeliveryMethod = SmtpDeliveryMethod.Network, // Электронная пота отправляется по сети на сервер SMTP

UseDefaultCredentials = false,

Credentials = new NetworkCredential(senderEmail.Address, password)

};

using (var m = new MailMessage(senderEmail, receiverEmail)

{

Subject = question.Subject,

Body = body + "\n_________________________\n"+ question.Name + "\n" + question.Phone + "\n" + question.Email

})

{

smtp.Send(m);

}

return View();

}

}

catch (Exception)

{

ViewBag.Error = "Возникли проблемы при отправке вопроса!";

}

return View();

}

Подробный программный код реализации веб-сервиса для работы юридической клиники НИУ ВШЭ - Пермь представлен в прил. K.

4.3 Тестирование реализации веб-сервиса

Проверка выполнения заданных функций веб-сервиса, определение и проверка соответствия требованиям технического задания (см. прил. D) количественных и качественных характеристик веб-сервиса, выявление и устранение недостатков в работе веб-сервиса описаны в программе и методике испытаний (см. прил. H).

Программа и методика испытаний разработана в соответствии со стандартами ГОСТ 34.603-92, РД 50-34.698-90.

Для тестирования веб-сервиса юридической клиники НИУ ВШЭ - Пермь были использованы тестовые сценарии. Тестовые сценарии были использованы для проверки компонентов веб-сервиса, в которых наиболее высока вероятность появления отказов. К тестовым сценариям предъявляются следующие требования. Сценарий должен содержать всевозможный набор действий, которые можно применять к данному веб_сервису. Сценарий должен быть легко читаемым, понятным, избегать повторяющихся действий, обладать хорошим покрытием.

Во время тестирования веб-сервиса было обращено внимание на следующие этапы тестирования:

Тестирование удобства использования.

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

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

Тестирование базы данных.

Тестирование безопасности.

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

4.3.1 Тестирование удобства использования

Тестирование удобства использования веб-сервиса - тестирование дружелюбности пользовательского интерфейса. На этапе тестирования удобства использования проверяется насколько легко новому пользователю веб-сервиса разобраться в нем. При тестировании удобства использования веб-сервиса проверяется его системная навигация. Пристальное внимание уделено простоте и эффективности использования веб-сервиса.

Сценарии тестирования удобства использования веб-сервиса юридической клиники НИУ ВШЭ - Пермь:

Содержание страницы веб-сервиса верное, без грамматических и орфографических ошибок.

Шрифты соответствуют требованиям.

Текстовые поля правильно выровнены.

Сообщения об ошибках верны, без орфографических и грамматических ошибок, и соответствуют заголовку страницы веб-сервиса.

Подсказки существуют для всех полей.

Знак звездочки отображается напротив всех обязательных полей.

Кнопки имеют стандартный формат и размер.

Ссылка на домашнюю страницу должна быть на каждой странице веб_сервиса.

Ccылки на несуществующие объекты отсутствуют.

Подтверждающие сообщения отображаются для всех операций добавления, редактирования и удаления.

Отображение страниц веб-сервиса при разных разрешениях экрана.

Панель скроллинга должна появляться только тогда, когда она требуется.

Заголовок должен отображаться на каждой странице.

Данные в выпадающих списках не обрезаются из-за размеров поля.

Данные в выпадающих списках должны быть расположены в хронологическом порядке.

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

На этапе функционального тестирования проверяется функциональность и операционное поведение веб-сервиса с целью убедиться, что они соответствуют функциональным спецификациям определённым техническим заданием (см. прил. D). Функциональное тестирование игнорирует внутренние механизмы веб-сервиса, проверяет только выходных данные, полученные в ответ на пользовательский ввод и условия исполнения сценариев.

Сценарии функционального тестирования веб-сервиса юридической клиники НИУ ВШЭ - Пермь:

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

Веб-сервис не отображает сообщение об ошибке при незаполненных необязательных полях.

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

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

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

Подтверждающие сообщения отображается для операций добавления, редактирования и удаления.

Проверка функциональности сортировки.

Проверка функциональности доступных кнопок.

Проверка функциональности поиска.

При отказе функциональности пользователь перенаправляется на специальную страницу ошибки.

Загруженные документы открываются правильно.

Пользователь может скачать загруженные файлы.

Проверка почтовой функциональности веб-сервиса.

Проверка CRUD-операций для всех сущностей.

Проверка изменения статуса заявки.

Проверка назначения студента и преподавателя.

4.3.3 Тестирование совместимости

Тестирование совместимости проводится для того, чтобы убедиться, что веб_сервис юридической клиники НИУ ВШЭ - Пермь совместим с различными браузерами.

Сценарии тестирования совместимости веб-сервиса юридической клиники НИУ ВШЭ - Пермь:

Работа веб-сервиса в различных браузерах (IE, Firefox, Google Chrome, Safari, Opera, Yandex), веб-сервис должен правильно отображаться.

Используемая версия HTML совместима с соответствующими ей версиями веб-браузеров.

Картинки корректно отображаются в различных браузерах.

Шрифты верно отображаются в различных браузерах.

Код JavaScript верно работает в разных браузерах (IE, Firefox, Google Chrome, Safari, Opera, Yandex).

4.3.4 Тестирование базы данных

На этапе тестирования базы данных проверяются данные, введенные при помощи веб-сервиса. Данные, которые отображаются на страницах веб-сервиса, должны совпадать с данными, хранящимися в базе данных.

Сценарии тестирования базы данных веб-сервиса юридической клиники НИУ ВШЭ - Пермь:

Проверка таблиц, колонок, типов колонок и значений по умолчанию.

Проверка значении null для колонок.

Проверка первичного и внешний ключ каждой таблицы.

Проверка названия параметров, их типов и количества.

Проверка обязателен параметр или нет.

Данные правильно сохраняются в базе данных после каждого ввода.

Проверка данных при каждой операции добавления, редактирования, удаления.

Проверка длины каждого поля. Длина на backend и frontend должны совпадать.

Проверка зашифрованных данных в базе данных.

Проверка размера базы и времени отклика на запрос.

Проверка данных, отображающихся на frontend, и проверить, что они совпадают с backend.

Проверка целостности данных при вводе не валидных значений в базу данных.

4.3.5 Тестирование безопасности

На этапе тестирования безопасности осуществляется поиск недостатков и уязвимых мест с точки зрения безопасности веб-сервиса.

Сценарии тестирования безопасности веб-сервиса юридической клиники НИУ ВШЭ - Пермь.

Пароли от личных кабинетов сотрудников хранятся и отображаются в зашифрованном виде.

Правила создания паролей внедрены на всех страницах авторизации, регистрации.

Если пароль изменен, пользователь не может зайти под старым паролем.

Сообщения об ошибках не содержат никакой секретной информации.

Если пользователь (сотрудник юридической клиники) вышел из системы или сессия завершена, он не может пользоваться веб-сервисом.

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

Опция «Просмотр исходного кода» отключена и не видна пользователю.

Учетная запись пользователя блокируется, если он несколько раз ввел пароль неверно.

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

Проверка прав доступа пользователей и их роли.

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

На этапе тестирования производительности проводится оценка соответствия веб_сервиса специфичным требованиям к производительности.

Сценарии тестирования производительности веб-сервиса юридической клиники НИУ ВШЭ - Пермь.

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

Определение, может ли актуальная архитектура поддерживать приложение при пиковых нагрузках.

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

Определение узкого места веб-сервиса и инфраструктуры.

Определение, не изменилось ли время отклика у новой версии приложения.

Заключение

В рамках преддипломной практики реализован веб-сервис для работы юридической клиники НИУ ВШЭ - Пермь.

На этапе анализа была изучена деятельность юридической клиники НИУ ВШЭ - Пермь. Также был проведен сравнительный анализ существующих веб-сервисов юридических клиник. На основе анализа были сформированы требования к веб-сервису. Выявлены основные прецеденты работы веб-сервиса и их акторы. Для учета трудозатрат разработки веб-сервиса была выбрана методика оценки трудозатрат CETIN.

На этапе проектирования веб-сервиса были спроектированы архитектура веб_сервиса, база данных, пользовательский интерфейс.

На этапе реализации веб-сервиса была разработана модель базы данных, реализована бизнес-логика веб-сервиса, проведено тестирование веб-сервиса согласно сценариям тестирования.

Сформирована документация к веб-сервису: техническое задание, технико-экономическое обоснование.

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

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

Список сокращений и условных обозначений

БД - база данных.

ВКР - выпускная квалификационная работа.

ВУЗ - высшее учебное заведение.

ГОСТ - государственный стандарт.

ИТ - информационные технологии.

ОС - операционная система.

ПО - программное обеспечение.

СУБД - система управления базами данных.

ТЗ - техническое задание.

ТЭО - технико-экономическое обоснование.

ЮК - юридическая клиника.

ЮК РГ - юридическая консультация российской газеты.

CETIN - Case, Entity, Tool, Interaction, Node.

CMS - Content Management System.

CRUD - Create Read Update Delete.

GUID - Globally Unique Identifier.

LINQ - Language Integrated Query.

MVC - Model-View-Controller.

SMTP - Simple Mail transfer Protocol.

Библиографический список

1. ГОСТ Р 7.0.5-2008 Система стандартов по информации, библиотечному и издательскому делу. Библиографическая ссылка. Общие требования и правила составления.

2. ГОСТ 19.301-79 Программа и методика испытаний. Требования к содержанию и оформлению.

3. ГОСТ 34.602-89 Информационная технология. Комплекс стандартов на автоматизированные системы. Техническое задание на создание автоматизированной системы.

4. Дергачев А.М. Проблемы эффективного использования сетевых сервисов // Научно-технический вестник СПбГУ ИТМО, 2011. № 1 (71). С. 83-87.

5. Мартынов Н.Н. Алгоритмизация и основы объектно-ориентированного программирования на JavaScript. М.: БИНОМ, 2010.

6. Методика CETIN: оценка стоимости разработки информационных систем // Государство. Бизнес. IT. 2005. URL: http://www.tadviser.ru/index.php/Статья: Методика _ CETIN:_оценка_стоимости_разработки_информационных_систем/ (дата обращения 16.03.2018).

7. Нильсен Я., Лоранжер Х. Веб-дизайн. Удобство использования Веб-сайтов. М.: Вильямс, 2009.

8. О бесплатной юридической помощи в Пермском крае: закон Пермского края от 07 ноября 2012 г. № 111-ПК: принят Закон. Собр. Пермского края 25 октября 2012 г.

9. О бесплатной юридической помощи в Российской Федерации: федер. закон Рос. Федерации от 21 нояб. 2011 г. № 324-ФЗ: принят Гос. Думой 2 нояб. 2011 г.: одобрен Сов. Федерации 9 нояб. 2011 г.

10. Плаксин М.А. Тестирование и отладка программ для профессионалов будущих и настоящих. М.: БИНОМ. Лаборатория знаний, 2015.

11. Получите бесплатную юридическую помощь. // Юридическая клиника РГАИС. 2018. URL: http://www.clinic.rgiis.ru/#about (дата обращения: 03.12.2017).

12. Роббинс Д.Н. HTML5, CSS3 и JavaScript. Исчерпывающее руководство. 4-е изд. М.: Эксмо, 2014.

13. Сайт юридической клиники «Российской Академии Правосудия» // Юридическая клиника РАП. 2018. URL: http://lawclinic.ucoz.ru/ (дата обращения 03.04.2018).

14. Студенческая бесплатная юридическая консультация (юридическая клиника) юридического факультета МГУ имени М.В. Ломоносова // Юридический факультет Московского государственного университета имени М.В. Ломоносова. URL: http://www.law.msu.ru/clinic (дата обращения: 03.12.2017).

15. Юридическая клиника // Бакалаврская программа «Юриспруденция». 2018. URL: https://perm.hse.ru/ba/law/yurklinika (дата обращения 24.11.2017).

16. Юридическая клиника // Владивостокский государственный университет экономики и сервиса. 2018. URL: http://lawclinic.vvsu.ru/about (дата обращения: 03.12.2017).

17. Юридическая клиника // Всероссийский государственный университет юстиции. 2018. URL: https://rpa-mu.ru/akademicheskaya-zhizn/yuridicheskaya-klinika (дата обращения 24.11.2017).

18. Юридическая клиника МГИМО. 2017. URL: http://lcmgimo.weebly.com/ (дата обращения 03.04.2018).

19. Юридическая клиника // Пермский государственный национальный исследовательский университет. 2012. URL: http://old.psu.ru/faculties/law/clinic/ (дата обращения: 03.12.2017).

20. Юридическая клиника // Российская академия народного хозяйства и государственной службы при президенте Российской Федерации. 2018. URL: http://www.ui.ranepa.ru/about/fakultety/law/clinic/ (дата обращения 03.04.2018).

21. Юридическая клиника // Российский государственный университет правосудия. 2016. URL: https://rgup.ru/?id=204&mod=pages (дата обращения 03.04.2018).

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.