Информационная система реализации билетов в кинотеатрах

Используемые средства реализации информационной системы реализации билетов в кинотеатрах. Создание автоматизированного программного комплекса на платформе NET Framework при помощи объектно-ориентированного подхода в среде разработки Visual Studio 2019.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 19.04.2020
Размер файла 1019,9 K

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

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ВВЕДЕНИЕ

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

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

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

1. ОПИСАНИЯ СРЕДСТВ РАЗРАБОТКИ ИНФОРМАЦИОННЫХ СИСТЕМ

1.1 Используемые средства реализации информационной системы

Любая информационная система предназначена для своевременного обеспечения данными о системе. Она имеет системы сбора, накопления, поиска и передачи информации.

Существуют различные методы реализации информационных систем классифицируемые по степени автоматизации: ручные, автоматические и автоматизированные.

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

Для реализации информационной системы будет создан автоматизированный программный комплекс на платформе.NET Framework написанный на языке программирования C# при помощи объектно-ориентированного подхода в среде разработки Visual Studio 2019, с использованием шаблонов проектирования и слоя доступа к данным, который будет взаимодействовать с СУБД (система управления базами данных) MySQL. Для реализации пользовательского интерфейса будет использована технология WPF (Windows Presentation Foundation).

.NET Framework - программная платформа, выпущенная компанией Microsoft в 2002 году. Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR), которая подходит для разных языков программирования. Функциональные возможности CLR доступны в любых языках программирования, использующих эту среду. Платформа.NET Framework поддерживает множество языков программирования, таких как C#, Visual Basic, Iron Python, C, C++ и пр. Благодаря тому-что программа сначала переводится компилятором в единый для.NET байт-код Common Intermediate Language (CIL). Затем код либо исполняется виртуальной машиной Common Language Runtime (CLR), либо транслируется утилитой NGen.exe в исполняемый код для конкретного целевого процессора. Благодаря CLR встроенный в неё JIT (Just-in-time) компилятор преобразует промежуточный байт-код в машинные коды нужного процессора [4, с. 126].

1.2 Основы объектно-ориентированного представления

Для создания приложения использовались принципы и постулаты объектно-ориентированного программирования. Рассмотрение любой сложной задачи требует техники декомпозиции - разбиение на составляющие элементы. Известны две схемы декомпозиции: алгоритмическая декомпозиция и объектно-ориентированная декомпозиция. В основе алгоритмической декомпозиции лежит разбиение по действиям - алгоритмам. Эта схема обычно применяется в процедурных языках программирования.

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

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

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

абстрагирование;

инкапсуляция;

модульность;

иерархическая организация [2, с. 25].

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

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

Абстракция отражает суть объекта, опуская второстепенные детали. Выбор и правильное описание набора абстракция является главной задачей объектно-ориентированной разработки.

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

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

При разработке программы на объектно-ориентированном языке проблемой является наличие большого числа абстракций (классов и интерфейсов). И так как все абстракции взаимодействуют между собой, то ситуация усугубляется сложностью построения зависимостей между ними. Он позволяет разбивать программу на части, что облегчает процесс объектной декомпозиции системы. Изменение реализации модуля должно происходить без изменения реализации других модулей и без влияния на их поведение. Модули выполняют роль контейнеров, которые группируют классы и интерфейсы, а также глобальные объекты и данные

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

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

Наследование делится на одиночное и множественное.

Одиночное - подкласс имеет только один суперкласс.

Множественное - класс может иметь любое количество предков.

1.3 Доступ к данным с помощью LINQ to SQL

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

На сегодняшний день существует множество технологий доступа к данным, таких как BDE, OLE, ODBC, АDО, и до сих пор разрабатываются новые, более надежные, удобные в работе и более быстродействующие технологии.

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

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

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

- компоненты, обеспечивающие связь приложения с механизмом доступа к базе данных;

- механизм доступа к базе данных;

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

Одним из инструментов для доступа к данных является LINQ to SQL работающая с технологией ADO.NET даёт возможность напрямую использовать модель программирования LINQ с существующей схемой базы данных. LINQ to SQL позволяет разработчикам создавать.NET Framework классы, представляющие данные. Вместо сопоставления с концептуальной моделью эти созданные классы указывают напрямую на таблицы базы данных, представления, хранимые процедуры и определяемые пользователем функции.

1.4 Слой для доступа к данным Data Access Object

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

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

Data Access Object (DAO) управляет соединением с источником данных для получения и записи данных. DAO реализует необходимый для работы с источником данных механизм доступа. Источником данных может быть персистентное хранилище (например, MySQL), внешняя служба, репозиторий, или бизнес-служба. Использующие DAO бизнес-компоненты работают с более простым интерфейсом, предоставляемым объектом DAO своим клиентам. DAO полностью скрывает детали реализации источника данных от клиентов. Поскольку при изменениях реализации источника данных представляемый DAO интерфейс не изменяется, этот паттерн дает возможность DAO принимать различные схемы хранилищ без влияния на клиентов или бизнес-компоненты. По существу, DAO выполняет функцию адаптера между компонентом и источником данных.

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

BusinessObject представляет клиента данных. Это объект, который нуждается в доступе к источнику данных для получения и сохранения данных.

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

TransferObject представляет собой объект, используемый для передачи данных. DataAccessObject может использовать TransferObject для возврата данных клиенту. DataAccessObject может также принимать данные от клиента в объекте Transfer Object для их обновления в источнике данных.

Рисунок 1.1 - Диаграмма последовательности действий паттерна Data Access Object

DataSource представляет реализацию источника данных. Источником данных может быть база данных, например, MySQL, XML-репозиторий, система плоских файлов и др.

1.5 Технологии для решения задачи

Для создания графических интерфейсов с помощью платформы.NET применяются технологии Window Forms и WPF [5].

1.5.1 Windows Forms - это набор управляемых библиотек в.NET Framework, предназначенный для разработки многофункциональных клиентских приложений. Это графический программный интерфейс приложения для отображения данных и управления пользовательскими взаимодействиями с более простым развертыванием и повышенной безопасностью в клиентских приложениях. Каждый элемент управления в приложении Windows Forms является конкретным экземпляром класса. Компоновка элемента управления в графическом интерфейсе и его поведение управляются с помощью методов и методов доступа.

1.5.2 Windows Presentation Foundation (WPF) - это среда разработки, используемая для создания настольного приложения. Это часть.NET Framework. WPF имеет независимый от разрешения и рендеринг на основе векторов, который помогает работать с современным графическим оборудованием. В этих рамках пользовательский интерфейс приложения разработан на языке XAML, а логика приложения написана на языке программирования C#.

2. ОПИСАНИЕ РЕАЛИЗАЦИИ ИНФОРМАЦИОННОЙ СИСТЕМЫ

2.1 Проектирование базы данных

Для создания приложения спроектирована база данных и определены реляционные отношения между таблицами. Смоделированные связи таблиц базы данных представлены в виде диаграммы на рисунке 2.1.

Рисунок 2.1 - Диаграмма базы данных

На этапе создания таблиц произведена нормализация. База данных содержит таблицы: Users(пользователи), Film (фильм), Time_category(категория времени), Ticket(Билет), Cinema (кинотеатр), Sale(покупка), length_category (категория длительности), place_category (категория ряда).

Таблица «Users» имеет атрибуты: «user_id», «login», «password», «fullname», «birth_year». Отношение находится впервой нормальной форме.

Таблица «Film» имеет атрибуты: «film_id», «name», «length», «description», «coef». Отношение находится в первой нормальной форме.

Таблица «Cinema» имеет атрибуты: «cinema_id», «name», «place_category1», «place_category2», «place_category3», «description» Отношение находится в первой нормальной форме.

Таблица «ticket» имеет атрибуты: «ticket_id», «time_session», «cinema_id», «film_id». Отношение находится в первой нормальной форме. Связана отношением «Один ко многим» к таблицам «film», «sale» и «cinema».

Таблица «sale» имеет атрибты: «sale_id», «data_sale», «ticket_id», «user_id», «price», «line», «place».

Таблица «length_category» имеет атрибуты: «length_id», «length_from», «length_to», «description», «coef».

Таблица «place_category» имеет атрибуты: «place_id», «place_from», «place_to», «description», «coef».

Таблица «time_category» имеет атрибуты: «time_id», «time_from», «time_to», «description», «coef».

2.2 Описание классов приложения

Для проектирования пользовательского интерфейса использована технология WPF. Интерфейс обеспечивает взаимодействие пользователя с программной системой и служит переводчиком в диалоге пользователя и программы.

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

Сущностями будут являться:

- пользователи;

- кинотеатры;

- фильмы;

- сеансы;

- категории;

- заказы.

Каждую сущность нужно представить в виде класса или иерархии классов, так как используется объектно-ориентированный подход.

В программе к системе имеют доступ пользователи трёх категорий, который имеют разные права доступа. Пользователи с разными правами доступа выполняют разные действия.

Незарегистрированный пользователем является гостем. У гостя самые низкие права доступа. Гость способен просматривать афиши каждого кинотеатра и регистрироваться в системе.

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

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

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

- изменение информации об администраторах;

- создание кинотеатров, фильмов, киносеансов;

- просмотр всех заказанных билетов;

- просмотр самых популярных фильмов;

- просмотр статистики о проданных билетах.

- по каждому времени вывести среднее количество зрителей

Администратор может добавлять фильмы.

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

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

- user_id отвечает за уникальность записи пользователя;

- login отвечает за логин пользователя;

- password отвечает за пароль, при авторизации в системе;

- fullname отвечает за полное имя пользователя;

- birth_year отвечает за год рождения пользователя.

Структура класса User приведена в таблице 2.1.

Таблица 2.1 - Структура класса «User»

Название свойства

Тип свойства

user_id

int

login

string

password

string

fullname

string

birth_year

int

Для определения кинотеатров, категорий мест и цен в определенной категории в программе реализован класс Cinema. Класс содержит следующие свойства:

-cinema_id отвечает за уникальность записи кинотеатра;

-name отвечает за наименование кинотеатра;

-description описание кинотеатра;

-сountPlaceCategory1 отвечают за формирование билетов 1 категории;

- сountPlaceCategory2 отвечают за формирование билетов 2 категории;

- сountPlaceCategory3 отвечают за формирование билетов 3 категории;

Структура класса Cinema приведена в таблице 2.2

Таблица 2.2 - Структура класса «Cinema»

Название свойства

Тип свойства

cinema_id

int

name

string

description

string

сountPlaceCategory1

int

сountPlaceCategory2

int

сountPlaceCategorу3

int

Для моделирования киносеанса в программе реализован класс Sale. Класс содержит соответствующие свойства:

- sale_id отвечает за уникальность записи покупки;

- data_sale отвечает за дату сеанса;

- user_id отвечает за покупателя;

- price отвечает за цену.

- line отвечает за длительность сеанса.

- place отвечает за ряд.

Структура класса Sales приведена в таблице 2.3.

Таблица 2.3 - Структура класса «Sales»

Название свойства

Тип свойства

sale_id

int

data_sale

DateTime

user_id

int

price

int

line

int

place

int

Для моделирования фильмов в программе реализован класс Film. Класс содержит соответствующие свойства:

- film_id отвечает за уникальность записи фильма;

- name отвечает за наименование фильма;

- description отвечает за описание фильма;

- cost отвечает за цену фильма;

- length отвечает за длительность фильма.

Структура класса Film приведена в таблице 2.4.

Таблица 2.4 - Структура класса «Film»

Название свойства

Типсво йства

film_id

int

name

string

description

string

cost

int

length

int

Для моделирования билетов в программе реализован класс ticket. Класс содержит соответствующие свойства:

- ticket_id отвечает за уникальность записи билета;

- time_seans отвечает за дату сеанса;

-name название фильма;

Структура класса Ticket приведена в таблице 2.5

Таблица 2.5 - Структура класса «Ticket»

Название свойства

Тип свойства

ticket_id

int

time_seans

DataTime

name

string

Для моделирования категорий длинны фильма в программе реализован класс LengthCategory. Класс содержит соответствующие свойства:

- lengthFrom отвечает за длину от времени;

- lengthTo отвечает за длину до времени;

-coef отвечает за коэффиценты для определенных длинн сеансов;

Структура класса LengthCategory приведена в таблице 2.6

Таблица 2.6 - Структура класса «LengthCategory t»

Название свойства

Тип свойства

lengthFrom

int

lengthTo

int

coef

double

Для моделирования категорий ряда в программе реализован класс PlaceCategory. Класс содержит соответствующие свойства:

- PlaceFrom отвечает за ряд;

- PlaceTo отвечает за ряд;

-coef отвечает за коэффиценты для определенных рядов;

Структура класса PlaceCategory приведена в таблице 2.7

Таблица 2.7 - Структура класса «LengthCategory t»

Название свойства

Тип свойства

PlaceFrom

int

PlaceTo

int

coef

double

Для моделирования категорий времени сеанса в программе реализован класс TimeCategory. Класс содержит соответствующие свойства:

- TimeFrom отвечает за ряд;

- TimeTo отвечает за ряд;

-coef отвечает за коэффиценты для определенных рядов;

Структура класса TimeCategory приведена в таблице 2.8

Таблица 2.8 - Структура класса «TimeCategory»

Название свойства

Тип свойства

TimeFrom

int

TimeTo

int

coef

double

Схемы описанных классов в приложении Б.

Описанные классы получают данные благодаря слою доступа к данным использующих в качестве источника базу данных SQL и технологии доступа ADO.NET, которые в данной задаче реализуют язык интеграрованных запросовLINQ, выполняют работу над данными, группируют и передают данные в представления для последующего вывода.

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

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

3. ОПИСАНИЕ ЭТАПОВ ПРОВЕДЕНИЯ ВЕРИФИКАЦИИ И ТЕСТИРОВАНИЯ ИНФОРМАЦИОННОЙ СИСТЕМЫ

3.1 Результаты проведения интегрированного тестирования

Для работы с программой необходимо открыть файл «bilet.exe». После появления оконного приложения, нужно нажать на «вход» в приложении в левом нижнеем углу, как показано на рисунке 3.1.

Рисунок 3.1 - Главное окно приложения

После чего откроется раздел авторизации, как представлено на рисунке 3.2, зарегистрированному пользователю нужно ввести логин, пароль и авторизироваться в приложении. Логин и пароль проверяются на наличие в Базе данных.

Рисунок 3.2 - Главное окно авторизации

После заполнения полей персональными данными, необходимо нажать на кнопку «Вход». Произойдёт проверка введённых полей. Если поля будут пустым или логин с паролем будут являться неверно введенными, откроется всплывающее окно, которое сообщит об ошибке (рисунок 3.3).

Рисунок 3.3 - Оповещение об ошибке поле ввода

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

Рисунок 3.4 - Ошибка при покупке билетов без выбора фильма

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

Рисунок 3.5 - Ошибка при покупке билетов без выбора фильма

Для регистрации пользователю необходимо перейти в раздел «Регистрация» и ввести свои персональные данные в поля ввода. Переход в раздел «Регистрация» осуществляется по нажатию на кнопку «Регистрация» на главном окне приложения (рисунок 3.1). К персональным данным относятся: «ФИО», «Логин», «Пароль», «Возраст».

Рисунок 3.4 - Поля ввода на вкладке «Регистрация»

После заполнения полей персональными данными, необходимо нажать на кнопку «Зарегистрировать». Произойдёт проверка введённых полей. Если поля будут пустыми, откроется всплывающее окно, которое оповестит об ошибке. Пример ошибки показан на рисунке 3.5.

Рисунок 3.5 - Оповещение об ошибке поле ввода

При введённых корректных данных выведет соответствующее оповещение о том, что аккаунты был создан как это видно на рисунке 3.6.

Рисунок 3.6 - Оповещение о подтверждении создания аккаунта

При нажатии на «ОК» откроется окно главной стран в котором необходимо перейти в раздел авторизации и заполнить поля «Логин» и «Пароль». Введённые данные подтверждаем, нажатием на кнопку «Вход». Система проверяет на наличие сведений о данном пользователе. Если введены ошибочные данные или не найдены сведения о пользователе, произойдёт оповещение об этом (рисунок 3.7).

Рисунок 3.7 - Оповещение об ошибке ведённых данных

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

Рисунок 3.8 - Раздел «афиши» в личном кабинете пользователя

Кроме возможности просмотра афиш и заказа билетов, открывается раздел «Мои билеты» в котором содержатся все заказанные пользователем билеты как показано на рисунке 3.9.

Рисунок 3.9 - Раздел «мои билеты» в личном кабинете пользователя

Заказать билеты на выбранный киносеанс можно войдя в раздел афиши, в котором выводится полная информация о сеансах, после чего выбрать требуется кинотеатр, после чего нажав на нужный соответствующий сеанс 2 раза откроется раздел «оформление заказа», в котором имеется схема расположения зала и выбор категории ряда (1,2 или 3) и сумма к оплате (рисунок 3.10).

Рисунок 3.10 - Окно заказа билетов

Пользователю предоставляется возможность отменять заказ. Для отмены заказанных билетов необходимо выбрать отменяемый заказ в поле «Мои билеты» и нажать кнопку «Удалить».

Рисунок 3.11 - Окно заказанных билетов

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

Рисунок 3.12 - главное окно гостя

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

Администратор выполняет следующие функции:

- создание и изменение информации о фильмах, кинотеатрах, сеансах;

- добавление билетов;

- просматривать отчеты о популярности фильмов;

- просматривать отчеты о кассовых сборах;

- просматривать отчеты о и среднем числе посетителей кинотеатров;

- выводить отчеты в xml.

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

Рисунок 3.13 - Доступные разделы в кабинете администратора.

В разделе «добавление фильма» администратор может добавлять фильм, для этого требуется заполнить формы «названия фильма», «стоимость», «описание», «длительность» в соответствии с требуемым фильмом(рисунок 3.14).

Рисунок 3.14 - Раздел «добавление фильма»

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

Администратору также доступны просмотры отчетов с последующим сохранением их в XML-файлы по «популярности фильмов», по «кассовым сборам» «по фильмам», по «среднему числу посетителей», как показано на рисунках 3.12, 3.13 и 3.14.

Рисунок 3.15 - Просмотр отчетов по «Популярным фильмам»

Рисунок 3.16 - Просмотр отчетов по «кассовым сборам»

Рисунок 3.17 - Просмотр отчетов по «среднему числу посетителей кинотеатров»

Рисунок 3.15 - Сохранение в XML отчета по «среднему числу посетителей»

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

Рисунок 3.17 - Главное окно гостя с выбором просмотра афиши по кинотеатрам

3.2 Результаты проведения модульного тестирования

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

Рисунок 3.1 - Результат выполнения модульного тестирования

Модульное тестирование выполнено с помощью пакета NUnit, листинг классов с модульными тестами находится в приложении В.

На рисунке 3.2 приведена иерархия созданных классов для модульного тестирования.

Рисунок 3.2 - Иерархия классов Unit тестов

информационная система билет кинотеатр

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

ЗАКЛЮЧЕНИЕ

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

Для создания приложения использовался язык программирования C# и платформа.NET Framework, который взаимодействует с СУБД MySQL.

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

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

1. Практическое руководство к курсовому проектированию по курсу «Информатика» для студентов технических специальностей дневной и заочной форм обучения - Гомель: ГГТУ им. П.О. Сухого, 2019. - 32 с.

2. Мухортов В.В., Рылов В.Ю. Объектно-ориентированное программирование, анализ и дизайн: Методическое пособие. - Новосибирск, издательство «ИМ СО РАН», 2002. - 108 с.

3. Шилдт Герберт. C# 4.0: полное руководство: учебное пособие - ООО «И.Д. Вильямс», 2011. - 1056 с.

4. Рихтер Джеффри. CLR via C#. Программирование на платформе Microsoft.NETFramework 4.5 на языке C# - ООО Издательство «Питер», 2013. - 896 с.

5. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж., Приемы объектно-ориентированного программирования. Паттерны проектирования. - Спб.: Питер, 2015. - 368 с.

6. Албахари, Д. C# 7.0. Карманный справочник /Д. Албахари, Б. Албахари. - СПб.: ООО «Альфа-книга», 2017. - 224 c.

ПРИЛОЖЕНИЕ Б

(обязательное)

Код программы

User.xaml.cs

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using CourseWorkProject_OOP.Models.Entity;

using MySql.Data.MySqlClient;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для MainWindowUser.xaml

/// </summary>

public partial class User: Window

{

private int userId;

public User(int userId)

{

InitializeComponent();

this.userId = userId;

command = new MySqlCommand("SELECT * FROM tikets.cinema", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

cinema.Add(new Cinema(Convert.ToInt32(item.ItemArray[0]), item.ItemArray[1].ToString(), Convert.ToInt32(item.ItemArray[2]),

Convert.ToInt32(item.ItemArray[3]), Convert.ToInt32(item.ItemArray[4]), item.ItemArray[5].ToString()));

}

foreach (var item in cinema)

{

cinemaBox.Items.Add(item.Name);

cinemaBox.SelectedItem = item.Name;

}

getTickets();

}

DB db = new DB();

DataTable table;

MySqlDataAdapter adapter = new MySqlDataAdapter();

List<Cinema> cinema = new List<Cinema>();

List<Ticket> tickets = new List<Ticket>();

List<Sale> sales = new List<Sale>();

MySqlCommand command;

private void getTickets()

{

string selectedCinema = cinemaBox.SelectedItem!= null ? cinemaBox.SelectedItem.ToString(): "";

int selectedId = 1;

foreach (var item in cinema)

{

if (selectedCinema.Equals(item.Name))

selectedId = item.CinemaId;

}

tickets = new List<Ticket>();

command = new MySqlCommand("Select tik.ticket_id, tik.cinema_id, tik.time_seans, fil.film_id, fil.name, fil.description, " +

"fil.cost, fil.length " +

"From tikets.ticket as tik INNER JOIN tikets.film as fil ON tik.film_id = fil.film_id " +

"Where tik.cinema_id = " + selectedId

, db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

tickets.Add(new Ticket(

Convert.ToInt32(item.ItemArray[0]),

Convert.ToInt32(item.ItemArray[1]),

selectedCinema,

Convert.ToDateTime(item.ItemArray[2]),

Convert.ToInt32(item.ItemArray[3]),

item.ItemArray[4].ToString(),

item.ItemArray[5].ToString(),

"от " + item.ItemArray[6].ToString() + "р.",

Convert.ToInt32(item.ItemArray[7])));

}

filmsGrid.ItemsSource = tickets;

}

private void cinemaBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

getTickets();

}

private void myTickets_Click(object sender, RoutedEventArgs e)

{

cinemaBox.Visibility = Visibility.Hidden;

filmsGrid.ItemsSource = null;

sales = new List<Sale>();

command = new MySqlCommand("Select sal.price, sal.date_sale, cin.name, tik.time_seans, fil.name, fil.description " +

"From tikets.sale as sal " +

"INNER JOIN tikets.ticket as tik ON sal.ticket_id = tik.ticket_id " +

"INNER JOIN tikets.film as fil ON tik.film_id = fil.film_id " +

"INNER JOIN tikets.cinema as cin ON cin.cinema_id = tik.cinema_id " +

"Where sal.user_id = " + userId

, db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

sales.Add(new Sale(

Convert.ToDouble(item.ItemArray[0]),

Convert.ToDateTime(item.ItemArray[1]),

item.ItemArray[2].ToString(),

Convert.ToDateTime(item.ItemArray[3]),

item.ItemArray[4].ToString(),

item.ItemArray[5].ToString()));

}

filmsGrid.ItemsSource = sales;

}

private void Button_Click_2(object sender, RoutedEventArgs e)

{

cinemaBox.Visibility = Visibility.Visible;

filmsGrid.ItemsSource = tickets;

}

private void exit_Click(object sender, RoutedEventArgs e)

{

MainWindow mainWindow = new MainWindow();

mainWindow.Show();

Close();

}

private void filmsGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)

{

BronTickets bronTickets = new BronTickets(tickets.ElementAt(filmsGrid.SelectedIndex).TiketId, userId);

bronTickets.Show();

}

}

}

RegisterForm.xaml.cs

using MySql.Data.MySqlClient;

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для RegisterForm.xaml

/// </summary>

public partial class RegisterForm: Window

{

public RegisterForm()

{

InitializeComponent();

}

/// <summary>

///Регистрация нового пользователя

/// </summary>

public bool isLogin = true;

private void regUser_Click(object sender, RoutedEventArgs e)

{

if (loginField.Text == "" || passwordField.Text == "" || fullNameField.Text == "" || birthYearField.Text == "")

{

MessageBox.Show("Вы ввели не все данные!");

return;

}

if (IsUserExists())

return;

DB db = new DB();

MySqlCommand command = new MySqlCommand("INSERT INTO users (login, password, fullname, birth_year, role) VALUES (@login, @password, @fullname, @birth_year, @role)", db.GetConnection());

command.Parameters.Add("@login", MySqlDbType.VarChar).Value = loginField.Text;

command.Parameters.Add("@password", MySqlDbType.VarChar).Value = passwordField.Text;

command.Parameters.Add("@fullname", MySqlDbType.VarChar).Value = fullNameField.Text;

command.Parameters.Add("@birth_year", MySqlDbType.VarChar).Value = birthYearField.Text;

command.Parameters.Add("@role", MySqlDbType.VarChar).Value = "user";

db.openConnection();

if (command.ExecuteNonQuery() == 1)

{

MessageBox.Show("Аккаунт был создан");

loginField.Text = "";

passwordField.Text = "";

fullNameField.Text = "";

birthYearField.Text = "";

}

else

MessageBox.Show("Аккаунт не был создан");

db.closedConnection();

}

/// <summary>

/// Авторизация по логину и паролю

/// </summary>

/// <returns></returns>

public Boolean IsUserExists()

{

DB db = new DB();

DataTable table = new DataTable();

MySqlDataAdapter adapter = new MySqlDataAdapter();

MySqlCommand command = new MySqlCommand("SELECT * FROM users WHERE login = @uL", db.GetConnection());

command.Parameters.Add(new MySqlParameter("@ul", loginField.Text));

adapter.SelectCommand = command;

adapter.Fill(table);

//проверка колличества найденных записей

if (table.Rows.Count > 0)

{

MessageBox.Show("Такой логин уже есть в системе, введите другой!");

return true;

}

else

return false;

}

/// <summary>

/// нажатие на кнопку8

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void RegisterLabel_Click(object sender, RoutedEventArgs e)

{

LoginForm loginForm = new LoginForm();

loginForm.Show();

isLogin = false;

Close();

}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

if (isLogin)

new MainWindow().Show();

}

}

}

MainWindow.xaml.cs

using CourseWorkProject_OOP.Models.Entity;

using MySql.Data.MySqlClient;

using System;

using System.Collections.Generic;

using System.Data;

using System.Windows;

using System.Windows.Controls;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для MainWindow.xaml

/// </summary>

public partial class MainWindow: Window

{

DB db = new DB();

DataTable table;

MySqlDataAdapter adapter = new MySqlDataAdapter();

List<Cinema> cinema = new List<Cinema>();

List<Ticket> tickets = new List<Ticket>();

MySqlCommand command;

/// <summary>

/// Метод вывода таблицы афиш для каждого кинотеаатра

/// </summary>

public MainWindow()

{

InitializeComponent();

command = new MySqlCommand("SELECT * FROM tikets.cinema", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

cinema.Add(new Cinema(Convert.ToInt32(item.ItemArray[0]), item.ItemArray[1].ToString(), Convert.ToInt32(item.ItemArray[2]),

Convert.ToInt32(item.ItemArray[3]), Convert.ToInt32(item.ItemArray[4]), item.ItemArray[5].ToString()));

}

foreach (var item in cinema)

{

cinemaComboBox.Items.Add(item.Name);

}

}

//обработчик события (нажатие на кнопку РЕГИСТРАЦИЯ на главной странице)

private void RegButton_Click(object sender, RoutedEventArgs e)

{

RegisterForm regForm = new RegisterForm();

regForm.Owner = this;

regForm.ShowDialog();

Close();

}

//обработчик события (нажатие на кнопку ВХОД на главной странице)

private void SignInButton_Click(object sender, RoutedEventArgs e)

{

new LoginForm().Show();

Close();

}

/// <summary>

/// выбор кинотеатра афиши

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void CinemaComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

string selectedCinema = cinemaComboBox.SelectedItem.ToString();

int selectedId = 1;

foreach (var item in cinema)

{

if (selectedCinema.Equals(item.Name))

selectedId = item.CinemaId;

}

tickets = new List<Ticket>();

command = new MySqlCommand("Select tik.ticket_id, tik.cinema_id, tik.time_seans, fil.film_id, fil.name, fil.description, " +

"fil.cost, fil.length " +

"From tikets.ticket as tik INNER JOIN tikets.film as fil ON tik.film_id = fil.film_id " +

"Where tik.cinema_id = " + selectedId

, db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

tickets.Add(new Ticket(

Convert.ToInt32(item.ItemArray[0]),

Convert.ToInt32(item.ItemArray[1]),

selectedCinema,

Convert.ToDateTime(item.ItemArray[2]),

Convert.ToInt32(item.ItemArray[3]),

item.ItemArray[4].ToString(),

item.ItemArray[5].ToString(),

"от " + item.ItemArray[6].ToString() + "р.",

Convert.ToInt32(item.ItemArray[7])));

}

filsGrid.ItemsSource = tickets;

}

}

}

LoginForm.xaml.cs

using MySql.Data.MySqlClient;

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для LoginForm.xaml

/// </summary>

public partial class LoginForm: Window

{

public int userId;

public LoginForm()

{

InitializeComponent();

}

public bool isLogin = true;

private void Button_Click_2(object sender, RoutedEventArgs e)

{

isLogin = true;

//получение данных от пользоывателя

String loginUser = loginField.Text;

String passUser = passField.Password;

DB db = new DB();

DataTable table = new DataTable();

MySqlDataAdapter adapter = new MySqlDataAdapter();

MySqlCommand command = new MySqlCommand("SELECT * FROM users WHERE login = @uL AND password = @uP", db.GetConnection());

command.Parameters.Add(new MySqlParameter("@ul", loginUser));

command.Parameters.Add(new MySqlParameter("@uP", passUser));

adapter.SelectCommand = command;

adapter.Fill(table);

//проверка колличества найденных записей

if (table.Rows.Count > 0)

{

userId = Convert.ToInt32(table.Select()[0].ItemArray[0]);

User mainWindowUser = null;

Admin mainWindowAdmin = null;

if (table.Select()[0].ItemArray[5].ToString().Equals("user"))

{

mainWindowUser = new User(userId);

mainWindowUser.Show();

isLogin = false;

Close();

}

else

{

mainWindowAdmin = new Admin();

mainWindowAdmin.Show();

isLogin = false;

Close();

}

}

else

MessageBox.Show("Неверные данные");

}

private void Window_Closed(object sender, EventArgs e)

{

}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

if (isLogin)

new MainWindow().Show();

}

}

}

BronTickets.xaml.cs

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using CourseWorkProject_OOP.Models.Entity;

using MySql.Data.MySqlClient;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для BronTickets.xaml

/// </summary>

public partial class BronTickets: Window

{

int ticketId;

int userId;

double tickPrice;

public BronTickets(int ticketId, int userId)

{

DB db = new DB();

db.openConnection();

InitializeComponent();

this.ticketId = ticketId;

this.userId = userId;

}

private void Button_Click(object sender, RoutedEventArgs e)

{

int selectedLine = comboRow.SelectedIndex;

DB db = new DB();

db.openConnection();

MySqlDataAdapter adapter = new MySqlDataAdapter();

command = new MySqlCommand("INSERT INTO tikets.sale(date_sale, ticket_id, user_id, price, line) VALUES (" +

"@date_sale,@ticket_id,@user_id,@price,@line);"

, db.GetConnection());

adapter.InsertCommand = command;

adapter.InsertCommand.Parameters.Add("@date_sale", MySqlDbType.DateTime, 4).Value = DateTime.Now;

adapter.InsertCommand.Parameters.Add("@ticket_id", MySqlDbType.Int32, 4).Value = ticketId;

adapter.InsertCommand.Parameters.Add("@user_id", MySqlDbType.Int32, 4).Value = userId;

adapter.InsertCommand.Parameters.Add("@price", MySqlDbType.Double, 4).Value = tickPrice;

adapter.InsertCommand.Parameters.Add("@line", MySqlDbType.Int32, 4).Value = selectedLine;

adapter.InsertCommand.ExecuteNonQuery();

Close();

}

DB db = new DB();

DataTable table;

MySqlDataAdapter adapter = new MySqlDataAdapter();

MySqlCommand command;

/// <summary>

/// расчет цены билета исходя из сеанса и ряда

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

int selectedLine = comboRow.SelectedIndex;

command = new MySqlCommand("Select count(tikets.sale.sale_id) " +

"From tikets.sale " +

"Where tikets.sale.line = "+ selectedLine + " AND tikets.sale.ticket_id = " + ticketId

, db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

if (Convert.ToInt32(table.Select()[0].ItemArray[0]) == 10)

{

MessageBox.Show("Извините, места в этом ряду закончились, выберите другой ряд");

}

else

{

tickPrice = getPrice(selectedLine);

if (biletPrice!= null)

biletPrice.Content = "Цена билета: " + tickPrice + "р.";

}

}

/// <summary>

/// Метод расчета цены исходя из ряда, длинны сеанса и времени сеанса.

/// </summary>

/// <param name="line"></param>

/// <returns></returns>

private double getPrice(int line)

{

double price = 0;

List<LengthCategory> lengthCategory = new List<LengthCategory>();

command = new MySqlCommand("SELECT * FROM tikets.length_category", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

lengthCategory.Add(new LengthCategory(Convert.ToInt32(item.ItemArray[1]), Convert.ToInt32(item.ItemArray[2]), Convert.ToDouble(item.ItemArray[4])));

}

List<PlaceCategory> placeCategory = new List<PlaceCategory>();

command = new MySqlCommand("SELECT * FROM tikets.place_category", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

placeCategory.Add(new PlaceCategory(Convert.ToInt32(item.ItemArray[1]), Convert.ToInt32(item.ItemArray[2]), Convert.ToDouble(item.ItemArray[4])));

}

List<TimeCategory> timeCategory = new List<TimeCategory>();

command = new MySqlCommand("SELECT * FROM tikets.time_category", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())

{

timeCategory.Add(new TimeCategory(Convert.ToInt32(item.ItemArray[1]), Convert.ToInt32(item.ItemArray[2]), Convert.ToDouble(item.ItemArray[4])));

}

command = new MySqlCommand("Select tik.time_seans, fil.length, fil.cost " +

"From tikets.ticket as tik INNER JOIN tikets.film as fil ON tik.film_id = fil.film_id " +

"Where tik.ticket_id = " + ticketId, db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

if (table.Rows.Count == 0)

{

return price;

}

price = Convert.ToDouble(table.Select()[0].ItemArray[2]);

foreach (var item in lengthCategory)

{

price = item.calcPrice(price, Convert.ToInt32(table.Select()[0].ItemArray[1]));

}

foreach (var item in placeCategory)

{

price = item.calcPrice(price, line);

}

foreach (var item in timeCategory)

{

price = item.calcPrice(price, Convert.ToDateTime(table.Select()[0].ItemArray[0]));

}

return Math.Round(price, 2);

}

}

}

Admin.xaml.cs

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Shapes;

using System.Xml.Linq;

using CourseWorkProject_OOP.Models.Entity;

using Microsoft.Win32;

using MySql.Data.MySqlClient;

namespace CourseWorkProject_OOP

{

/// <summary>

/// Логика взаимодействия для Admin.xaml

/// </summary>

public partial class Admin: Window

{

public Admin()

{

InitializeComponent();

}

/// <summary>

/// добавление фильмов

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void AddFilm_Click(object sender, RoutedEventArgs e)

{

addFilmGrid.Visibility = Visibility.Visible;

addTiketGrid.Visibility = Visibility.Hidden;

otchetGrid.Visibility = Visibility.Hidden;

}

/// <summary>

/// отчеты

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void ShonOtchet_Click(object sender, RoutedEventArgs e)

{

addFilmGrid.Visibility = Visibility.Hidden;

addTiketGrid.Visibility = Visibility.Hidden;

otchetGrid.Visibility = Visibility.Visible;

}

/// <summary>

/// метод добавления фильма при нажатии на кнопку

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void addFilmBtn_Click(object sender, RoutedEventArgs e)

{

if (filmName.Text == "" || filmLength.Text == "" || filmDescription.Text == "" || filmCost.Text == "")

{

MessageBox.Show("Заполните все поля!");

return;

}

DB db = new DB();

db.openConnection();

MySqlDataAdapter adapter = new MySqlDataAdapter();

MySqlCommand command = new MySqlCommand("INSERT INTO tikets.film(name, length, description, cost) VALUES (" +

"@name,@length,@description,@cost);"

, db.GetConnection());

adapter.InsertCommand = command;

adapter.InsertCommand.Parameters.Add("@name", MySqlDbType.String, 4).Value = filmName.Text.ToString();

adapter.InsertCommand.Parameters.Add("@length", MySqlDbType.Int32, 4).Value = Convert.ToInt32(filmLength.Text);

adapter.InsertCommand.Parameters.Add("@description", MySqlDbType.String, 4).Value = filmDescription.Text.ToString();

adapter.InsertCommand.Parameters.Add("@cost", MySqlDbType.Double, 4).Value = Convert.ToDouble(filmCost.Text);

adapter.InsertCommand.ExecuteNonQuery();

filmName.Text = "";

filmLength.Text = "";

filmDescription.Text = "";

filmCost.Text = "";

MessageBox.Show("Фильм успешно добавлен!");

}

List<Cinema> cinema = new List<Cinema>();

List<Film> films = new List<Film>();

/// <summary>

/// добавление билетов по кнопке

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void AddTikect_Click(object sender, RoutedEventArgs e)

{

addTiketGrid.Visibility = Visibility.Visible;

addFilmGrid.Visibility = Visibility.Hidden;

otchetGrid.Visibility = Visibility.Hidden;

ticketFilm.Items.Clear();

ticketCinema.Items.Clear();

DB db = new DB();

db.openConnection();

DataTable table;

MySqlDataAdapter adapter = new MySqlDataAdapter();

MySqlCommand command;

cinema = new List<Cinema>();

films = new List<Film>();

command = new MySqlCommand("SELECT * FROM tikets.cinema", db.GetConnection());

table = new DataTable();

adapter.SelectCommand = command;

adapter.Fill(table);

foreach (var item in table.Select())


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

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