
Безопасность сетей / demo_ekzamen_podgotovka_gayd_3_final
.docxСоздание базы данных
Для создания БД нужно зайти в Microsoft SQL Server. Перед входом появится окошко:
Из этого окошка нам понабиться “Имя сервера”. На каждом компьютере оно свое поэтому перед входом лучше его куда ни будь записать. В примере имя сервера “PRITON”.
После запоминания имени сервера можно нажать кнопку “Соединить” и приступить к созданию самой базы данных. Для этого в левой части окна ищем папку с названием “Базы данных” и щелкаем правой кнопкой мыши, после чего левой кнопкой мыши по “Создать базу данных”:
Далее в новом окне нужно указать название базы данных. Особо не важно как база будет называться главное что бы в названии не было пробелов и само название нужно записать как и имя сервера.
В качестве примера назовем базу данных “Драгоценный_Мир”, затем нажмем кнопку “ОК”.
База данных должна появиться в папке. Если она отсутствует то можно попробовать обновить список объектов, нажав на эту кнопку:
Далее нажимаем на “+” левее от нашей базы данных и ищем папку “Таблицы”. По тому же принципу как создавалась база данных нажимаем правой кнопкой мыши по папке и создаем первую таблицу:
После этих действий в рабочем пространстве откроется интерфейс для создания таблицы:
Создадим таблицу товаров.
Имена столбцам будем давать менее техничные, потому что в дальнейшем наша программа будет использовать их. Желательно писать на Русском и через пробел, нежели через “_” или что-то еще. В случае использования пробела Sql Manager сам добавит квадратные скобки в название, их не будет видно, SQL так помечает что это одно название. Для типа данных лучше выбирать text, потому что с ним будет легче работать в будущем.
После того, как вы заполнили список столбцов, как на скриншоте, необходимо настроить первичный ключ. (дальше по тексту у поля «Размер скидки» может быть другой тип данных, мне просто лень кучу скринов переделывать)
Далее спускаемся ниже в свойства столбца и ищем там пункт “Спецификация идентификатора”:
Раскрываем его и меняем пункт “(Идентификатор)” с “Нет” на “Да”:
Остальные параметры можно не трогать.
После того как мы закончили с настройкой ключа можно сохранять таблицу нажатием на эту кнопку:
Появится новое окно, в котором нужно дать имя уже самой таблице. Таблицу будем называть по такому же принципу, как и её столбцы.
После этого вкладку можно закрыть.
Далее таблицу нужно заполнить данными. Разворачиваем папку “Таблицы” и ищем там только что созданную нами таблицу. Если таблицы там не оказалось, то обновляем список и смотрим еще раз:
Нажимаем правой кнопкой мыши и выбираем “Изменить первые 200 строк”:
В рабочем пространстве появится наша пустая таблица:
В этом редакторе значения можно вписывать вместо NULL во всех столбцах кроме Первичного ключа. Его мы ранее настроили так что бы он автоматически определялся при добавлении новой строки.
Добавив достаточное количество строк можно закрывать окно. Строки сохраняются автоматически после добавления новой.
По такому же принципу создайте и заполните таблицы «Сотрудники», «Аккаунты», «Заказы», «Корзины» и «Клиенты».
Таблица «Сотрудники»
Таблица «Аккаунты»
Столбец «Уровень доступа» в таблице «Аккаунты» будет иметь 3 возможных значения: «администрация», «менеджмент» или NULL. Именно он будет использован для разграничения прав внутри приложения.
Таблица «Клиенты»
Таблица «Заказы»
Можно заметить, что таблица «Заказы» не содержит в себе внешних ключей к таблице «Товары». Это не ошибка, так как сами товары будут указаны в таблице «Корзины» из-за того, что подразумевается возможность заказать несколько товаров в одном заказе.
Таблица «Корзины»
В таблице «Корзины» каждая строка – отдельный товар из заказа. То есть, если кто-то заказал 5 разных товаров, то сначала создастся новый заказ в таблице «Заказы», а потом в таблицу «Корзины» добавятся 5 новых строк, каждая из которых будет ссылаться к свежесозданному заказу и к одному из заказанных товаров.
Далее нам необходимо создать связи между таблицами. Для этого нужно создать новый запрос, нажав на кнопку «Создать запрос»
После чего в окно ввода необходимо ввести следующий запрос:
И после ввода запроса его необходимо выполнить, нажав на кнопку «Выполнить»
Этот код нужен для связи таблиц между собой. Это называется внешние ключи
Например, у нас есть запись в таблице "Клиенты". Последний столбец этой таблицы содержит внешние ключи, которые ссылаются на таблицу "Аккаунты", но база данных сама по себе этого знать не может, ей сначала нужно рассказать что куда ссылается. Пример связи таблиц через внешние ключи:
Суть внешних ключей в том, что мы теперь не можем использовать случайные айдишники – они должны уже существовать в таблицах, к которым отсылаются внешние ключи. Например, Sql Server не позволит нам вставить строку в таблицу «Клиенты», если мы до этого не создадим запись в таблице «Аккаунты».
В принципе, можно и не указывать базе где какие внешние ключи и всё будет работать. Hо, если этого не делать, то в столбец для внешнего ключа можно будет вставить любое число, из-за чего программа может просто сломаться.
Если вы правильно переписали код со скрина, но SQL Manager жалуется на что-то, то убедитесь, что:
В столбцах с внешними ключами написаны не случайные числа, а реально существующие ключи
Вы не пытаетесь создать один и тот же внешний ключ дважды. Такое может произойти, если вы, например, проверяли часть кода на корректность исполняя его.
Создание программы
3.1 – Создание проекта
Для создания программы нужно создать новый проект в Visual Studio.
В
поиске выбираем язык C#
и ищем “Приложение Windows
Forms
(.NET
Framework)”.
Очень важно выбрать именно версию
приложения с .NET Framework.
Называем проект и нажимаем «Создать»:
После этого перед вами должна появится пустая форма:
3.2 – Создание интерфейса авторизации
В правой части окна Visual Studio должна была появится менюшка «Свойства»:
Если же этого не произошло, то ёё можно вызвать через меню сверху окна:
Окно свойств отражает свойства выделенного объета в конструкторе интерфейса. Например, можно тыкнуть левой кнопкой мыши по нашему пустому окну и в окне свойств будут отражены параметры этого окна.
К примеру, можно сменить название окна используя поле “Text” в свойствах нашего окна авторизации:
После изменения поля “Text” в окне свойств можно наблюдать, что и имя окна внутри конструктора тоже изменилось:
Теперь необходимо разместить элементы интерфейса на наше окно. Для этого нам необходима «Панель элементов». В случае, если она не появилась у вас с левой стороны окна Visual Studio, её можно вызвать через верхнее меню:
В результате у вас должно появится вот такое вот окно:
В панели элементов сами элементы распределены на группы и первая группа, которую мы видим это «Все формы Windows Forms». В ней неудобно что либо искать, так как элементов там слишком много, поэтому её можно скрыть нажатием на название этой группировки.
А вот следующая группа «Стандартные элементы …» нам как раз и пригодится. Элементы из панели можно просто перетаскивать мышкой в конструктор окна. Попробуйте повторить данную конфигурацию:
Теперь необходимо изменить текст элементов Label и Button используя окно свойств. Ещё было бы неплохо немного уменьшить окно до подходящего вам размера. Размер окна можно менять используя правую и нижнюю стороны, а так же правый нижний угол:
Если выбрать какой-то из элементов интерфейса мышкой, то его параметры можно менять в окне свойств. Используя всё изученное попробуйте привести окно авторизации к подобному виду:
(Элементы можно перетаскивать внутри окна и менять их размер).
3.3 – Написание кода авторизации
Основной концепт, использующийся при создании интерфейса приложений на C# и Windows Forms – события. Событие – функция, которая вызывается при взаимодействии с элементом интерфейса.
Событие можно привязать к моменту, когда:
курсор мышки наводится на элемент интерфейса,
когда пользователь уводит мышку с элемента,
когда пользователь нажимает мышкой на элемент,
когда пользователь вводит какой либо текст в элемент,
и т.д.
Visual Studio позволяет легко создать и привязать к элементу интерфейса событие нажатия мышкой на этот самый элемент. Для этого необходимо сделать дабл-клик по какому либо элементу (быстрое двойное нажатие левой кнопкой мыши). После этого перед вами откроется файл с исходным кодом для текущего окна, где уже будет создано ваще событие.
Например, можно попробовать создать событие нажатия для кнопки «Войти»:
“button1_Click” – наше новосозданное событие.
Далее пойдут скриншоты кода с комментариями.
Кстати, в зависимости от того, как вы создавали элементы интерфейса, у вас нужные поля для ввода текста могут не соотвествовать моим. Название переменной с объектом интерфейса можно посмотреть в окне свойств:
На строчке 43 вы можете наблюдать строку подключения. В ней записана информация о том, как ваша программа может подключится к SQL серверу.
“Data Source” – название сервера. Но как вы видите на скриншоте, вместо названия я указал символ точки. Это говорит программе о том, что она должна сама найти сервер. Это так же позволяет запускать программу на разных компьютерах без нужды смены конфигурации.
Но такой подход работает не во всех конфигурациях и в тех случаях необходимо самому указать. Название сервера можно взять из окошка подключения в SQL Manager, которое появляется при его запуске:
То есть, если бы я в строке подключения использовал имя моего сервера сервера, то она бы выглядела так:
“Data Source=DESKTOP-RTUIMDM;Initial Catalog=Драгоценный_Мир;Integrated Security=True”
“Initial Catalog” – название базы данных, к которой необходимо подключится.
“Integrated Security=True” – говорит программе использовать Проверку подленности Windows при подключении к серверу. Этот механизм позволяет подключатся к серверу без нужды указывать пользователя базы данных и его пароль.
В случае, если вы ввели весь код правильно, но у вас возникают ошибки компиляции, проверьте, что данная строка присутствует сверху файла:
А вообще Visual Studio обычно сама понятно объясняет чем она недовольна и даже может предложить решение проблемы.
Сейчас самое время проверить работоспособность и убедиться, что всё работает как должно. Попробуйте ввести различные логины и пароли аккаунтов, которые вы добавили ранее и посмотрите, какое временное сообщение выводится.
3.4 – Написание кода формы заказов для пользователей
Теперь можно начать делать интерфейс для авторизованных и анонимных пользователей. Но для начала нужно немного изменить наш код.
Добавляем в наш запрос ID аккаунта – его мы будем передавать форме для оформления заказов. А для хранения айдишника мы создали переменную id.
И вместе с уровнем доступа получаем айди аккаунта.
Ну и осталось только вставить вызов функции “logIn” вместо вывода сообщения. Саму функцию мы определим немного позднее, а пока не волнуйтесь, что её Visual Studio подсвечевает красным.
Но перед этим давайте сначала добавим функционал кнопке «Войти анонимно».
По ней так же точно необходимо сделать дабл-клик и у вас в коде появится фукнция под эту кнопку.
И наша функция для анонимного входа будет состоять из одного вызова к функции “logIn”с параметром null.
Перед тем, как реализовывать эту функцию, давайте создадим новую форму, которую мы будем использовать для просмотра и формирования заказов.
В правой части окна Visual Studio должна находиться менюшка «Обозреватель решений»
Если такой менюшки не видно, то открыть её можно через «Вид» - «Обозревателю решений»
Далее нажимаем правой кнопкой мыши на «Драгоценный Мир» - «Добавить» - «Форма»
После чего откроется окно добавления нового элемента, в нижней части которого можно будет задать название нашей будущей форме. Назовём её “OrderForm.cs”
Нажимаем «Добавить» и видим перед собой новую форму.
Далее нам необходимо немного подредактировать файл кода с формой заказов. Для того, чтобы открыть его необходимо обратиться к меню «Обозреватель решений», нажать правой кнопкой по файлику «OrderForm.cs» - «Перейти к коду»
Перед собой вы должны увидеть подобный код:
Изменить нужно всего пару строчек
Значение “null” означает пустоту.
Теперь, когда у нас есть форма для создания заказов мы можем наконец-то закончить с формой авторизации.
Теперь при входе от обычного пользователя или анонима программа будет показывать пустую форму, которую мы недавно создали.
Теперь нам необходимо подключить базу данных к нашей программе через Visual Studio. Это позволит нам легко просматривать и редактировать данные в таблицах.
«Проект» - «Добавить новый источник данных»
В окне выбора типа источника укажите «База данных» и нажмите «Далее».
В окне выбора модели базы данных выберите «Набор данных» и нажмите «Далее».
Откроется окно выбора подключения к базе данных, нажмите «Создать подключение»
У вас откроется следующее окно:
Советую сначала нажать на кнопку «Проверить подключение», чтобы удостовериться, что всё работает. А после этого можно нажимать «Ок».
После этого вас вернёт обратно к окну выбора подключения, где ваще новосозданное подключение уже будет выбрано
Здесь просто жмём «Далее»
В окне выбора объектов базы данных ставим галочку на таблицы, что позволит нам легко вставить любую из таблиц нашей базы в интерфейс программы. И жмём «Готово».
После этого в левой части окна Visual Studio должно открыться меню «Источники данны»
В случае, если оно не появилось, открыть его можно через «Вид» - «Другие окна» - «Источник данных»
Теперь можно просто мышколй перетащить таблицу «Товары» из меню «Источники данных» в нашу форму для формирования заказов. В результате должно получится что-то такое:
Такие таблицы удобны тем, что сами подключаются к серверу и автоматически показывают содержимое базы данных.
Как вы можете видеть, кроме самой таблицы, сверху в форме ещё появились кнопки. Они помогают взаимодействовать с таблицей, а именно – добавлять, удалять строки и сохранять изменения в базу данных.
Мы нужный нам функционал будем реализовывать через свои собственные кнопки и поэтому эту панельку с кнопками можно удалить, нажав на неё правым кликом и выбрав «Удалить».
Используя накопленные навыки попробуйте сделать интерфейс формы похожим на такой
После работы с формой перейдём обратно к коду. Создаём приватные переменные currentOrder и sql. currentOrder является словарём, где ключи и значения типа int.Словари нужны, если нам нужно ассоциировать группу одних значений и группой других значений. Например, можно вставить значение 420 под ключем 69 в словарь, или значение 1337 под ключем 228. В нашем случае мы будем использовать словарь как корзину: ключ – айдишник товара из базы данных, а значение – кол-во этого товара.
Переменные totalCost и totalDisc нужны будут для генерации чека при оформлении заказа и будут заполняться внутри функции updateCostDisplay.
Исходный код функции updateCostDisplay.
На форме нажимаем два раза на кнопку «Добавить к заказу»
И перед нами открывается тело функции для этой кнопки, которое необходимо заполнить
Теперь нажимаем два раза на кнопку «Просмотр заказа».
После чего перед нами откроется новосозданная функция, тело которой необходимо заполнить.
Форма OrderView ещё не создана, мы рассмотрим её после того, как закончим с кнопкой «Сформировать заказ».
C формой OrderForm мы закончили.
Приступим к форме OrderView:
Вы можете заметить, что на скриншоте в элементе таблицы не отображается никаких столбцов, которые обычно появляются, если вставить таблицу из источника данных, как мы делали до этого.
Это потому, что эта таблица – просто элемент DataGridView из панели элементов
Мы не используем таблицу из источника данных из-за того, что поТЗ нам необходимо отображать ещё и количество каждого товара в корзине. Из-за этого таблицу DataGridView мы будем заполнять сами.
Функцию updateCostDisplay я даже показывать тут не буду, она буквально 1в1 с фукнцией из формы OrderForm.
Нажимаем два раза на кнопку «Закрыть» и заполняем тело появившейся перед нами фукнции
Нажимаем кнопку «Убрать из корзины» и заполняем тело функции для этой кнопки
Собственно, с формой OrderView мы закончили.
С интерфейсом для обычных пользователей мы закончили, время сделать интерфейс для менеджмента и администрации.
Возвращаемся в нашу форму авторизации и обновляем там код вызова форм, в зависимости от прав пользователя: