Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

ВВЕДЕНИЕ

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

Под программным обеспечением подразумеваются:

  • Мобильные приложения — программное обеспечение, работающее на смартфонах и планшетах. Сюда относятся все скачиваемые через App Store и Google Play приложения, облегчающие доступ к конкретному сервису или бизнес-продукту.
  • Сайты — web-приложения с определённым функционалом, помогающие решать бизнес-задачи онлайн.
  • Декстопные приложения — программы, устанавливаемые пользователем непосредственно на компьютер или на ноутбук. Сегодня под декстоп разрабатывается не так много продуктов, поскольку это не самый удобный вариант взаимодействия бизнеса с клиентом.

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

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

Данная работа посвящена разработке приложения «Справочная служба аэропорта», как пример создания небольшого сервиса для предоставления услуг справочной службы пользователям о наличии рейсов по выбранным маршрутам. На примере производства данного продукта будут показаны популярные на данный момент инструменты и способы разработки web приложения.

Для достижения поставленной цели будет:

  1. Разработано web приложение в среде Visual Studio с использованием ASP.NET Core. Данные средства выбраны ввиду их актуальности, доступности для бесплатного использования, а также из-за простоты и изящности решений, предоставленных инженерами компании Microsoft, для создания web приложений.
  2. Поэтапно описаны компоненты такой схемы разделения данных приложения как MVC («Модель-Представление-Контроллер»). Данный паттерн выбран ввиду его популярности на рынке разработки программного обеспечения, а также по причине весьма четкого описания структуры приложения и независимости частей продукта друг от друга, что в свою очередь позволяет безболезненно масштабировать и тестировать приложение в будущем.
  3. Затронуты некоторые возможности языка программирования C# и языка разметки HTML/CSS.

Глава 1. Описание алгоритма работы приложения и среды создания

1.1. Алгоритм работы приложения

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

Для взаимодействия с приложением «Справочная служба аэропорта» клиент будет обращаться по web адресу, на котором размещено приложение в сети, через систему интернет по средствам доступного браузера (на пример «Google Chrome»). Данное приложение не требует от пользователя авторизации, так как при желании клиента приобрести билет на указанный им рейс, приложение автоматически переадресовывает запрос в сервисы по подбору выгодных предложений на рынке продажи авиабилетов. Далее клиенту необходимо ввести несколько параметров необходимых для поиска желаемого рейса, затем нажать кнопку ввод для подтверждения указанных данных. (Изображение 1. Форма ввода данных).

Изображение 1. Форма ввода данных

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

Изображение 2. Список выбранных рейсов

В случае если введенный маршрут отсутствует в базе данных аэропорта, пользователь будет переведен на страницу с отображением ошибки. (Изображение 3. Ошибка).

Изображение 3. Ошибка

Также пользователь может выбрать «Все рейсы», чтобы отобразить все возможные рейсы на данный момент.

1.2. Среда разработки приложения Visual Studio 2019

Для создания приложения «Справочная служба аэропорта» будет использована среда разработки Visual Studio.

Microsoft Visual Studio — линейка продуктов компании Microsoft, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Данные продукты позволяют разрабатывать как консольные приложения, так и приложения с графическим интерфейсом, в том числе с поддержкой технологии Windows Forms, а также веб-сайты, веб-приложения, веб-службы как в родном, так и в управляемом кодах для всех платформ, поддерживаемых Windows, Windows Mobile, Windows CE, .NET Framework, Xbox, Windows Phone .NET Compact Framework и Silverlight.

Так как приложение будет написано на языке C#, то выбор данной среды разработке вполне очевиден. Visual Studio делает процесс создания кода легким и непринужденным. Вся линейка технологий Microsoft может производится в данной среде разработки. Весомым плюсом является, что версия Community данной программы, распространяется абсолютно бесплатно.

Visual Studio включает в себя редактор исходного кода с поддержкой технологии IntelliSense и возможностью простейшего рефакторинга кода. Встроенный отладчик может работать как отладчик уровня исходного кода, так и отладчик машинного уровня. Остальные встраиваемые инструменты включают в себя редактор форм для упрощения создания графического интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы базы данных. Visual Studio позволяет создавать и подключать сторонние дополнения (плагины) для расширения функциональности практически на каждом уровне, включая добавление поддержки систем контроля версий исходного кода (как, например, Subversion и Visual SourceSafe), добавление новых наборов инструментов (например, для редактирования и визуального проектирования кода на предметно-ориентированных языках программирования) или инструментов для прочих аспектов процесса разработки программного обеспечения (например, клиент Team Explorer для работы с Team Foundation Server).

Хотелось бы отметить, что прямыми конкурентами Visual Studio в данном сегменте являются продукты компании JetBrains, основателями которой являются российские инженеры-программисты. Для Visual Studio данная компания разработал весьма полезное расширение ReSharper, но в рамках курсовой работы данный инструмент использоваться не будет.

1.3. Фреймворк разработки приложения

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

В качестве структуры(фреймворка) приложения «Справочная служба аэропорта» будет использован ASP.NET Core. Фреймворк необходим как каркас и набор библиотек для создания программного кода, что позволяет оптимально использовать ресурсы ЭВМ(т.к. алгоритмы библиотек, входящих в фреймворк, уже протестированы и работают безотказно и эффективно), а так же ускорить производство кода, так как нет необходимости в реализации простейших функций(сортировка, выборка данных, фильтрации и т.д.).

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

С одной стороны, ASP.NET Core является продолжением развития платформы ASP.NET. Но с другой стороны, это не просто очередной релиз. Выход ASP.NET Core фактически означает революцию всей платформы, ее качественное изменение.

Разработка над платформой началась еще в 2014 году. Тогда платформа условно называлась ASP.NET vNext. В июне 2016 года вышел первый релиз платформы. А в декабре 2019 года вышла версия ASP.NET Core 3.1, которая будт использоваться в данной курсовой работе.

ASP.NET Core теперь полностью является opensource-фреймворком. Все исходные файлы фреймворка доступны на GitHub.

ASP.NET Core может работать поверх кросс-платформенной среды .NET Core, которая может быть развернута на основных популярных операционных системах: Windows, Mac OS, Linux. И таким образом, с помощью ASP.NET Core мы можем создавать кросс-платформенные приложения. И хотя Windows в качестве среды для разработки и развертывания приложения до сих пор превалирует, но теперь уже мы не ограничены только этой операционной системой. То есть мы можем запускать веб-приложения не только на ОС Windows, но и на Linux и Mac OS. А для развертывания веб-приложения можно использовать традиционный IIS, либо кросс-платформенный веб-сервер Kestrel.

Благодаря модульности фреймворка все необходимые компоненты веб-приложения могут загружаться как отдельные модули через пакетный менеджер Nuget. Кроме того, в отличие от предыдущих версий платформы нет необходимости использовать библиотеку System.Web.dll.

ASP.NET Core включает в себя фреймворк MVC, который объединяет функциональность MVC, Web API и Web Pages. В предыдущих версии платформы данные технологии реализовались отдельно и поэтому содержали много дублирующей функциональности. Сейчас же они объединены в одну программную модель ASP.NET Core MVC. А Web Forms полностью ушли в прошлое.

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

Одной из таких функций являются тэг-хелперы (tag helper), которые позволяют более органично соединять синтаксис html с кодом С#.

ASP.NET Core характеризуется расширяемостью. Фреймворк построен из набора относительно независимых компонентов. И мы можем либо использовать встроенную реализацию этих компонентов, либо расширить их с помощью механизма наследования, или же вовсе создать и применять свои компоненты со своим функционалом.

Эти особенности и возможности стали основой для выбора ASP.NET Core в качестве основы для приложения в данной курсовой работе.

Глава 2. Описание компонентов программы и написание кода

2.1. Схема разделения данных приложения MVC

Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.

Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние.

Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.

Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений.

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

Данный метод будет использован для написания приложения «Справочная служба аэропорта». В дальнейших параграфах будет описан каждый элемент паттерна.

2.2. Описание модели

Как уже упоминалось раннее, в разработке данного ПО будет использоваться VS. На изображении 4. показано главное меню. На данном

Изображение 4. Главное меню VS

этапе, для создания нового проекта, необходимо выбрать пункт «Create a new project», затем выбрать тип проекта (Изображение 5. Выбор проекта). В данном случае был выбран «ASP.NET Core Web Application» так как этот тип подразумевает создание web-ориентированного приложения.

Изображение 5. Выбор проекта

Следующий шаг – определение имени проекта и пути к папке сохранения. (Изображение 6. Имя и путь).

Изображение 6. Имя и путь

Далее нужно определиться с изначальным функционалом, предоставляемым фреймворком (Изображение 7. Выбор функционала). На данном шаге есть возможность выбора весьма богатых возможностей для приложения, таких как применение аутентификации и авторизации, применение дополнительных, сторонних frontend библиотек. Так как нет необходимости в загрузке системы с неиспользуемым функционалом, был выбран проект Empty, что означает, что нам будет предоставлен лишь скелет будущей программы.

Изображение 7. Выбор функционала

Затем в уже подготовленной системе, можно начинать описывать модель данных. Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние. На данном этапе производства приложения была описана модель данных в соответствии с шаблоном MVC. (Изображение 8. Модель данных – Flight).

Изображение 8. Модель данных – Flight

В частности, был описан класс Flight, который и представляет модель данных. Данный класс включает открытые свойства, необходимые для идентификации рейса, а также несут важную для пользователя информацию. На изображении 8 виден класс FlightViewModel, который используется в качестве контейнера данных, вводимых клиентом в форму, и последующем использовании при выборки нужных полей из базы данных. В качестве СУБД была выбрана SQL Lite, ввиду простоты использования в рамках создания приложения. Данная СУБД не предназначена для производственного использования.

Далее был написан класс контекста необходимый для взаимодействия с базой данных и Entity Framework Core (Изображение 9. Класс контекста данных). Entity Framework Core (EF Core) представляет собой объектно-ориентированную, легковесную и расширяемую технологию от компании Microsoft для доступа к данным. EF Core является ORM-инструментом (object-relational mapping - отображения данных на реальные объекты). То есть EF Core позволяет работать базами данных, но представляет собой более высокий уровень абстракции: EF Core позволяет абстрагироваться от самой базы данных и ее таблиц и работать с данными независимо от типа хранилища. Если на физическом уровне мы оперируем таблицами, индексами, первичными и внешними ключами, но на концептуальном уровне, который нам предлагает Entity Framework, мы уже работаем с объектами.

Изображение 9. Класс контекста данных

После миграции и обновления базы данных, EF сгенерировал необходимую таблицу для хранения данных о рейсах. Как видно на изображении 10, был сгенерирован SQL код описания таблицы в базе данных. Данный подход к работе с Entity Framework называется Code First, когда сначала на языке C# описывается класс, и на основании этого кода генерируется SQL скрипт, создаются таблицы, а не на оборот, как при подходе Database First. Стоит упомянуть еще один подход, такой как Model First. Суть данного подхода состоит в том, что сначала делается модель с помощью графического описания, а потом по ней создается база данных.

Изображение 10. Схема таблицы «Flights»

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

Изображение 11. Случайные данные

2.3. Описание представлений

Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.

На данном этапе было необходимо написать код для визуальной части приложение (интерфейс, формы, и т.д.). При написании был использован язык разметки HTML и вспомогательные средства Razor, а также последняя версия frontend фреймворка Bootstrap.

Для ухода от повторяемости кода, в ASP.NET Core предусмотрены разделяемые ресурсы такие как Layouts. Так как дизайн приложений устроен таким образом, что большинство графических элементов на страницах идентичны, и только лишь основной функционал выбранной страницы подвержен изменениям, ASP.NET Core предлагает помещать повторяющийся код в Layouts, тогда как основной функциональный код остается на уникальных страницах. Таким образом был описан _Layout.cshtml (Изображение 12. HTML код Layout). На данной странице описаны основные части

Изображение 12. HTML код Layout

приложения. В частности, описаны верхнее навигационное меню, а также нижнее с указанием названия и даты производства приложения (Изображение 13. Главный вид).

Изображение 13. Главный вид

Далее была описана основная страница Index, на которой написана форма для ввода данных желаемого рейса клиентом (Изображение 13. Главный вид). Также была описана страница List для отображения выборки данных по запросу пользователя (Изображение 14. HTML код таблица информации по выбранным рейсам (Изображение 2. Список выбранных рейсов).

Изображение 14. HTML код таблица информации по выбранным рейсам

Затем была описана страница NotFound, с указанием на ошибку в случае, если в базе не нашлось совпадений с введенными данными пользователя. Также описана ссылка на повторный поиск (Изображение 15. HTML код страницы ошибки, Изображение 3. Ошибка).

Изображение 15. HTML код страницы ошибки

Для корректного отображения разметки приложения были активно использованы средства фреймворка Bootstrap 4, что значительно сократило процесс создания не сложного, но читаемого интерфейса. Для того чтобы Bootstrap работал в проекте, нам необходимо загрузить пакеты прямо в приложение. В ASP.NET Core для хранения таких пакетов предусмотрена папка wwwroot (Изображение 16. папка wwwroot).

Изображение 16. папка wwwroot

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

2.4. Описание контроллеров

Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений. Центральным звеном в архитектуре ASP.NET Core MVC является контроллер. При получении запроса, система маршрутизации выбирает для обработки запроса нужный контроллер и передает ему данные запроса. Контроллер обрабатывает эти данные и посылает обратно результат обработки.

На данном этапе были написаны методы контроллера HomeController, необходимые для взаимодействия представлений с базой данных. Весь код написан на языке программирования C#, с использованием LINQ для фильтрации данных в одну строку, что значительно снижает общее количество кода, без вреда функциональности и производительности приложения. В данном приложении был использован лишь один контроллер – HomeController. Данный класс наследуется от базового класса Controller, который является частью ASP.NET Core. Он предоставляет производному классу обширный функционал, который позволяет ему взаимодействовать с представлениями и базой данных. На изображении 17 показано, как осуществляется создание экземпляра контекста в конструкторе класса HomeController, а также метод Index, который отображает основную страницу приложения.

Изображение 17.1. HomeController

На изображении 17.2 показан метод Index с атрибутом [POST], что означает, что запрос возможно изменит данные в базе. Данный метод использует в качестве параметра класс FlightViewModel, который представляет собой капсулу для данных, поступающих из формы в представлении Index. Метод проверяет модель на валидность, далее в условном операторе параметр проверяется на null. Если все проверки вернули true, создается экземпляр класса List<Flight> с именем flights, в который по средствам языка LINQ происходит выборка из базы данных.

Изображение 17.2. HomeController

Затем, в условном операторе проверяется количество элементов, добавленных на пред идущем этапе. Если оператор возвращает true, то вызывается метод List, с указанным в качестве параметра коллекции flights, который в свою очередь рендерит таблицу с выбранными данными (Изображение 17.3 HomeController). Если же на этапе первых проверок коллекция flights оказалась пустой, то метод Index вернет представление NotFound (Изображение 3. Ошибка).

Изображение 17.3. HomeController

Также было необходимо написать класс Startup.cs. Класс Startup является входной точкой в приложение ASP.NET Core. Этот класс производит конфигурацию приложения, настраивает сервисы, которые приложение будет использовать, устанавливает компоненты для обработки запроса или middleware. Был написан метод ConfigureServices, который регистрирует сервисы, используемые приложением. В качестве параметра он принимает объект IServiceCollection, который и представляет коллекцию сервисов в приложении. С помощью методов расширений этого объекта, производится конфигурация приложения для использования сервисов. Все методы имеют форму Add[название_сервиса] (Изображение 18.1. Startup.cs).

Изображение 18.1. Startup.cs

Далее был реализован метод Configure. Метод Configure устанавливает, как приложение будет обрабатывать запрос. Этот метод является обязательным. Для установки компонентов, которые обрабатывают запрос, используются методы объекта IApplicationBuilder. Объект IApplicationBuilder является обязательным параметром для метода Configure (Изображение 18.2. Startup.cs). Кроме того, метод нередко принимает еще один необязательный параметр - объект IWebHostEnvironment, который позволяет получить информацию о среде, в которой запускается приложение, и взаимодействовать с ней. Но в принципе, в метод Configure в качестве параметра может передаваться любой сервис, который зарегистрирован в методе ConfigureServices или который регистрируется для приложения по умолчанию (например, IWebHostEnvironment).

Изображение 18.2. Startup.cs

Также был реализован основной класс приложения Program (Изображение 19. Program). Чтобы запустить приложение ASP.NET Core, необходим объект IHost, в рамках которого развертывается веб-приложение. Для создания IHost применяется объект IHostBuilder.

В программе по умолчанию в статическом методе CreateHostBuilder, как раз создается и настраивается IHostBuilder. Непосредственно создание IHostBuilder производится с помощью метода Host.CreateDefaultBuilder(args).

Данный метод выполняет ряд задач.

  1. Устанавливает корневой каталог (для этого используется свойство Directory.GetCurrentDirectory). Корневой каталог представляет папку, где будет производиться поиск различного содержимого, например, представлений;
  2. Устанавливает конфигурацию хоста. Для этого загружаются переменные среды с префиксом "DOTNET_" и аргументы командной строки;
  3. Устанавливает конфигурацию приложения. Для этого загружается содержимое из файлов appsettings.json и appsettings.{Environment}.json, а также переменные среды и аргументы командной строки. Если приложение в статусе разработки, то также используются данные Secret Manager (менеджера секретов), который позволяет сохранить конфиденциальные данные, используемые при разработке;
  4. Добавляет провайдеры логгирования;
  5. Если проект в статусе разработки, то также обеспечивает валидацию сервисов;

Далее вызывается метод ConfigureWebHostDefaults(). Этот метод призван выполнять конфигурацию параметров хоста, а именно;

  1. Загружает конфигурацию из переменных среды с префиксом "ASPNETCORE_";
  2. Запускает и настраивает веб-сервер Kestrel, в рамках которого будет разворачиваться приложение;
  3. Добавляет компонент Host Filtering, который позволяет настраивать адреса для веб-сервера Kestrel;
  4. Если переменная окружения ASPNETCORE_FORWARDEDHEADERS_ENABLED равна true, добавляет компонент Forwarded Headers, который позволяет считывать из запроса заголовки "X-Forwarded-";
  5. Если для работы приложения требуется IIS, то данный метод также обеспечивает интеграцию с IIS;

Метод ConfigureWebHostDefaults в качестве параметра принимает делегат Action<IWebHostBuilder>, а помощью последовательного вызова цепочки методов у объекта IWebHostBuilder производится инициализация веб-сервера, для развертывания веб-приложения.

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

В методе Main вызывается метод у созданного объекта IHostBuilder, на котором вызывается метод Build, собственно который создает хост - объект IHost, в рамках которого развертывается веб-приложение. А затем для непосредственного запуска у IHost вызывается метод Run:

После этого приложение запущено, и веб-сервер начинает прослушивать все входящие HTTP-запросы.

Изображение 19. Program.cs

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

ЗАКЛЮЧЕНИЕ

Целью данной работы была разработка программного обеспечения «Справочная служба аэропорта», как пример создания небольшого сервиса, для предоставления услуг справочной службы пользователям о наличии рейсов по выбранным маршрутам. Также на примере производства данного продукта, была цель показать популярные на данный момент инструменты и способы разработки web приложения.

В процессе создания данного приложения были изучены:

  1. Актуальные средства и методики производства программного обеспечения. Проведен анализ рынка производства ПО и было выявлено, что .Net технологии в производстве web приложений стабильно входят в топ технологий данного сегмента;
  2. Ряд фреймворков, без помощи которых современный программист вряд ли обойдется в процессе трудовой деятельности, так как данные средства значительно повышают производительность труда и снижают порог вхождения в продакшн производство программных продуктов;
  3. Паттерн MVC. Также был эффективно внедрен при разработке приложения. Была дана высшая оценка такому подходу, так как при его использовании можно добиться высокого процента покрытия кода тестами, ввиду независимости частей программы друг от друга. Преимуществом также является возможность масштабирования и беспрепятственного написания кода, большой командой разработчиков;
  4. Спецификация языка С# и LINQ;
  5. Спецификация языка разметки HTML5;

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

Было разработано и приложение «Справочная служба аэропорта», в котором было реализована доступ клиента к базе данных рейсов данного аэропорта. Изображение 20 отображает результат ввода клиентом запроса на рейс Москва-Лондон.

Изображение 20. Результат работы приложения

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

Изображение 21. Таблица всех рейсов

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

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

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

  1. Непейвода Н.Н., Скопин И.Н. Основания программирования–Институт компьютерных исследований, 2003.
  2. Журавлева Т.Ю. Системное и прикладное программное обеспечение: Учебное пособие – Издательство Московского государственного открытого университета, 2010.
  3. Зинкевич В.П. Вычислительная техника и программирование: учебное пособие – Издательство Московского государственного открытого университета, 2011.
  4. Стив Макконелл, Совершенный код, 2005.
  5. Роберт Мартин. Идеальный программист. Как стать профессионалом разработки ПО, 2017.
  6. Эндрю Стиллмен - Изучаем C#, 3-е издание, 2014.
  7. Документация по C#, https://docs.microsoft.com/ru-ru/dotnet/csharp/.
  8. Джеффри Рихтер. CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C#, 2015.
  9. Шевчук А., Охрименко Д., Косьянов А. Design Patterns via C#. Приемы объектно-ориентированного проектирования 2015.
  10. Брайан П. Хоган. HTML5 и CSS3. Веб-разработка по стандартам нового поколения, 2014.
  11. Дженнифер Роббинс: HTML5. Карманный справочник, 2019.
  12. Entity Framework Core 2 для ASP.NET Core MVC для профессионалов | Фримен Адам, 2019.
  13. Pro ASP.NET MVC 5 Адам Фримен, 2013.
  14. Джеймс Чамберс, Дэвид Пэккетт, Сфймон Тиммс. ASP.NET Core Разработка приложений, 2018.
  15. Фримен А. - ASP.NET Core MVC с примерами на C# для профессионалов, 2017.
  16. Документация по ASP.NET Core, https://docs.microsoft.com/en-us/aspnet/core/?view=aspnetcore-3.1.
  17. Википедия. https://ru.wikipedia.org.
  18. Документация по Visual Studio. https://visualstudio.microsoft.com/ru/.
  19. Документация по Bootstrap 4 на русском языке. https://bootstrap-4.ru/.
  20. Документация по EF Core. https://docs.microsoft.com/ru-ru/ef/core/.
  21. Карл И. Вигерс Разработка требований к программному обеспечению – Русская Редакция, 2004.

ПРИЛОЖЕНИЯ

Приложение 1. Модель данных.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

namespace Airport_Info_Service.Models

{

public class Flight

{

public int Id { get; set; }

public string Number { get; set; }

public string From { get; set; }

public string To { get; set; }

public string DepartureDateTime { get; set; }

public string Status { get; set; }

}

public class FlightViewModel

{

public string From { get; set; }

public string To { get; set; }

}

}

Приложение 2. Контекст Данных.

using Microsoft.EntityFrameworkCore;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

namespace Airport_Info_Service.Models

{

public class AppDbContext : DbContext

{

public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)

{

Database.EnsureCreated();

}

public DbSet<Flight> Flights { get; set; }

}

}

Приложение 3. Миграция данных.

using Microsoft.EntityFrameworkCore.Migrations;

namespace Airport_Info_Service.Migrations

{

public partial class first : Migration

{

protected override void Up(MigrationBuilder migrationBuilder)

{

migrationBuilder.CreateTable(

name: "Flights",

columns: table => new

{

Id = table.Column<int>(nullable: false)

.Annotation("SqlServer:Identity", "1, 1"),

Number = table.Column<string>(nullable: true),

From = table.Column<string>(nullable: true),

To = table.Column<string>(nullable: true),

DepartureDateTime = table.Column<string>(nullable: true),

Status = table.Column<string>(nullable: true)

},

constraints: table =>

{

table.PrimaryKey("PK_Flights", x => x.Id);

});

}

protected override void Down(MigrationBuilder migrationBuilder)

{

migrationBuilder.DropTable(

name: "Flights");

}

}

}

Приложение 4. Снимок модели данных.

using Airport_Info_Service.Models;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Infrastructure;

using Microsoft.EntityFrameworkCore.Metadata;

using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

namespace Airport_Info_Service.Migrations

{

[DbContext(typeof(AppDbContext))]

partial class AppDbContextModelSnapshot : ModelSnapshot

{

protected override void BuildModel(ModelBuilder modelBuilder)

{

#pragma warning disable 612, 618

modelBuilder

.HasAnnotation("ProductVersion", "3.1.0")

.HasAnnotation("Relational:MaxIdentifierLength", 128)

.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

modelBuilder.Entity("Airport_Info_Service.Models.Flight", b =>

{

b.Property<int>("Id")

.ValueGeneratedOnAdd()

.HasColumnType("int")

.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

b.Property<string>("DepartureDateTime")

.HasColumnType("nvarchar(max)");

b.Property<string>("From")

.HasColumnType("nvarchar(max)");

b.Property<string>("Number")

.HasColumnType("nvarchar(max)");

b.Property<string>("Status")

.HasColumnType("nvarchar(max)");

b.Property<string>("To")

.HasColumnType("nvarchar(max)");

b.HasKey("Id");

b.ToTable("Flights");

});

#pragma warning restore 612, 618

}

}

}

Приложение 5. Layout.

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title>@ViewData["Title"] - Airport Info Service</title>

<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />

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

</head>

<body>

<header>

<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">

<div class="container">

<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Справочная служба аэропорта</a>

<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"

aria-expanded="false" aria-label="Toggle navigation">

<span class="navbar-toggler-icon"></span>

</button>

<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">

<ul class="navbar-nav flex-grow-1">

<li class="nav-item">

<a class="nav-link" asp-action="List" asp-controller="Home">Все рейсы</a>

</li>

<li class="nav-item">

<a class="nav-link text-danger">@DateTime.Now</a>

</li>

</ul>

</div>

</div>

</nav>

</header>

<div class="container">

<main role="main" class="pb-3">

@RenderBody()

</main>

</div>

<footer class="border-top footer text-muted">

<div class="container">

&copy; 2020 - Airport Info Service

</div>

</footer>

<script src="~/lib/jquery/dist/jquery.min.js"></script>

<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>

<script src="~/js/site.js" asp-append-version="true"></script>

@RenderSection("Scripts", required: false)

</body>

</html>

Приложение 6. Index.

@model FlightViewModel

@{

ViewData["Title"] = "Home Page";

}

<div class="row">

<div class="col-md-6">

<form id="profile-form" method="post">

<div asp-validation-summary="All" class="text-danger"></div>

<div class="form-group">

<label asp-for="From">Откуда</label>

<input asp-for="From" class="form-control" />

</div>

<div class="form-group">

<label asp-for="To">Куда</label>

<input asp-for="To" class="form-control" />

</div>

<button type="submit"

class="btn btn-primary">

Ввод

</button>

</form>

</div>

</div>

Приложение 7. NotFound.

@model FlightViewModel

@{

ViewData["Title"] = "Error";

}

<div class="container">

<h3>К сожалению, по данному маршруту рейсов не найдено!</h3>

<br />

<a class="btn btn-dark btn-sm" asp-action="Index" asp-controller="Home">Проверить другой рейс</a>

</div>

Приложение 8. ViewImports.

@using Airport_Info_Service

@using Airport_Info_Service.Models

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Приложение 9. ViewStart.

@{

Layout = "_Layout";

}

Приложение 10. appsettings.

{

"Logging": {

"LogLevel": {

"Default": "Information",

"Microsoft": "Warning",

"Microsoft.Hosting.Lifetime": "Information"

}

},

"AllowedHosts": "*",

"ConnectionStrings": {

"AppDbContext": "Server=(localdb)\\mssqllocaldb;Database=InfoDB;Trusted_Connection=True;MultipleActiveResultSets=true"

}

}

Приложение 11. Контроллер.

using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Mvc;

using Microsoft.Extensions.Logging;

using Airport_Info_Service.Models;

namespace Airport_Info_Service.Controllers

{

public class HomeController : Controller

{

private AppDbContext db;

public HomeController(AppDbContext context)

{

db = context;

}

[HttpGet]

public IActionResult Index()

{

return View();

}

[HttpPost]

public IActionResult Index(FlightViewModel flightViewModel)

{

if (ModelState.IsValid)

{

if(flightViewModel != null)

{

List<Flight> flights = db.Flights.Where(x => x.To == flightViewModel.To && x.From == flightViewModel.From).ToList();

if(flights.Count != 0)

{

return View("List", flights);

}

else

{

return View("NotFound");

}

}

else

{

return View();

}

}

else

{

return View();

}

}

public IActionResult List(List<Flight> flights)

{

if (flights.Count != 0)

{

return View(flights);

}

else

{

flights = db.Flights.ToList();

return View(flights);

}

}

}

}

Приложение 12. Startup.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.AspNetCore.HttpsPolicy;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;

using Microsoft.EntityFrameworkCore;

namespace Airport_Info_Service

{

public class Startup

{

public Startup(IConfiguration configuration)

{

Configuration = configuration;

}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.

public void ConfigureServices(IServiceCollection services)

{

services.AddControllersWithViews();

services.AddMvc();

services.AddDbContext<Models.AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("AppDbContext")));

}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

{

if (env.IsDevelopment())

{

app.UseDeveloperExceptionPage();

}

else

{

app.UseExceptionHandler("/Home/Error");

// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.

app.UseHsts();

}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.UseEndpoints(endpoints =>

{

endpoints.MapControllerRoute(

name: "default",

pattern: "{controller=Home}/{action=Index}/{id?}");

});

}

}

}

Приложение 13. Program.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Hosting;

using Microsoft.Extensions.Logging;

namespace Airport_Info_Service

{

public class Program

{

public static void Main(string[] args)

{

CreateHostBuilder(args).Build().Run();

}

public static IHostBuilder CreateHostBuilder(string[] args) =>

Host.CreateDefaultBuilder(args)

.ConfigureWebHostDefaults(webBuilder =>

{

webBuilder.UseStartup<Startup>();

});

}

}