Евгений Колесников před 2 roky
rodič
revize
52164b1fc2
6 změnil soubory, kde provedl 537 přidání a 12 odebrání
  1. 2 2
      api.http
  2. 9 5
      articles/api_asp_net_core.md
  3. 279 0
      articles/api_auth.md
  4. binární
      img/asp007.png
  5. binární
      img/asp008.png
  6. 247 5
      readme.md

+ 2 - 2
api.http

@@ -11,8 +11,8 @@ GET https://api.openweathermap.org/data/2.5/forecast?q=Йошкар-Ола&appid
 GET https://api.openweathermap.org/data/2.5/forecast?lat={{lat}}&lon={{lon}}&appid={{token}}&lang=ru&units=metric&mode=xml
 
 ### 
-GET http://localhost:8080/product?pageNum=15
-Authorization: Basic admin:passwor
+GET http://localhost:8080/
+Authorization: Basic admin:password
 
 ### 
 GET http://localhost:8080/product/150

+ 9 - 5
articles/api_asp_net_core.md

@@ -1,3 +1,7 @@
+Предыдущая лекция |  | Следующая лекция
+:----------------:|:----------:|:----------------:
+[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)
+
 # API. REST API. Создание сервера ASP.NET Core.
 
 * [API. REST API.](#api-rest-api)
@@ -696,9 +700,9 @@ param1 = 1, param2 = 2, pageNum = 10, pageLen =
     .Produces(StatusCodes.Status401Unauthorized)
     .Produces(StatusCodes.Status404NotFound);
     ```
-<!-- 
-авторизация
-https://andrewlock.net/exploring-the-dotnet-8-preview-introducing-the-identity-api-endpoints/#:~:text=In.NET%208%2C%20helpers%20have%20been%20added%20to%20ASP.NET,in%20your%20SPA%20app%20that%20uses%20the%20APIs
 
-https://metanit.com/sharp/aspnet6/13.1.php
--->
+---
+
+Предыдущая лекция |  | Следующая лекция
+:----------------:|:----------:|:----------------:
+[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)

+ 279 - 0
articles/api_auth.md

@@ -0,0 +1,279 @@
+Предыдущая лекция |  | Следующая лекция
+:----------------:|:----------:|:----------------:
+[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)
+
+# Аутентификация и авторизация
+
+* [Введение в аутентификацию и авторизацию](#введение-в-аутентификацию-и-авторизацию)
+    - [Аутентификация](#аутентификация)
+    - [Авторизация](#авторизация)
+
+* [Реализация "Basic" авторизации](#реализация-basic-авторизации)
+
+## Введение в аутентификацию и авторизацию
+
+>Теория взята [отсюда](https://metanit.com/sharp/aspnet6/13.1.php)
+
+Важное место в приложении занимает *аутентификация* и *авторизация*. **Аутентификация** представляет процесс определения пользователя. **Авторизация** представляет процесс определения, имеет ли пользователь право доступа к некоторому ресурсу. То есть, если _аутентификация_ отвечает на вопрос "Кем является пользователь?", то _авторизация_ отвечает на вопрос "Какие права пользователь имеет в системе?" **ASP.NET Core** имеет встроенную поддержку аутентификации и авторизации.
+
+### Аутентификация
+
+Для выполнения аутентификации в конвейере обработки запроса отвечает специальный компонент middleware - AuthenticationMiddleware. Для встраивания этого middleware в конвейер применяется метод расширения **UseAuthentication()**
+
+Следует отметить, что метод **UseAuthentication()** должен встраиваться в конвейер до любых компонентов middleware, которые используют аутентификацию пользователей (но после **Swagger**).
+
+Для выполнения аутентификации этот компонент использует сервисы аутентификации, в частности, сервис IAuthenticationService, которые регистрируются в приложении с помощью метода **AddAuthentication()**:
+
+В качестве параметров метод AddAuthentication() может принимать схему аутентификации в виде строки и делегат, который устанавливает опции аутентификации - объект AuthenticationOptions.
+
+Наиболее расcпространенные схемы аутентификации:
+
+* **Basic**: аутентификация на основе имени и пароля, мы в дальнейшем будем использовть его, т.к. он используется на соревнованиях. Но в реальной разработке он уже не используется и в **ASP.NET Core** не имеет реализации. Есть сторонние пакеты, но мы напишем свою реализацию.
+* **Cookies**: аутентификация на основе куки. Хранится в константе `CookieAuthenticationDefaults.AuthenticationScheme`
+* **Bearer**: аутентификация на основе jwt-токенов. Хранится в константе `JwtBearerDefaults.AuthenticationScheme` (вообще токены могут быть любые, а не только JWT)
+
+**Схема аутентификации** позволяет выбирать определенный обработчик аутентификации. **Обработчик аутентификации** собственно и выполняет непосредственную аутентификацию пользователей на основе данных запроса и исходя из схемы аутентификации.
+
+Например, для аутентификации с помощью куки передается схема "Cookies". Соответственно для аутентификации пользователя будет выбираться встроенный обработчик аутентификации - класс `Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler`, который на основе полученных в запросе cookie выполняет аутентификацию.
+
+А если используется схема "Bearer", то это значит, что для аутентификации будет использоваться jwt-токен, а в качестве обработчика аутентификации будет применяться класс `Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler`. Стоит отметить, что для аутентификации с помощью jwt-токенов необходимо добавить в проект через **Nuget** пакет `Microsoft.AspNetCore.Authentication.JwtBearer`
+``
+При чем в ASP.NET Core мы не ограничены встроенными схемами аутентификации и можем создавать свои кастомные схемы и под них своих обработчиков аутентификации.
+
+Кроме применения схемы аутентификации необходимо подключить аутентификацию определенного типа. Для этого можно использовать следуюшие методы:
+
+* AddCookie(): подключает и конфигурирует аутентификацию с помощью куки.
+
+* AddJwtBearer(): подключает и конфигурирует аутентификацию с помощью jwt-токенов (для этого метода необходим Nuget-пакет `Microsoft.AspNetCore.Authentication.JwtBearer`)
+
+Оба метода реализованы как методы расширения для типа *AuthenticationBuilder*, который возвращается методом AddAuthentication():
+
+```cs
+var builder = WebApplication.CreateBuilder();
+
+// добавление сервисов аутентификации
+// схема аутентификации - с помощью jwt-токенов
+builder.Services.AddAuthentication("Bearer")
+    .AddJwtBearer();
+ 
+var app = builder.Build();
+ 
+// добавление middleware аутентификации 
+app.UseAuthentication();
+```
+
+### Авторизация
+
+Авторизация представляет процесс определения прав пользователя в системе, к каким ресурсам приложения он имеет право доступа и при каких условиях.
+
+Хотя авторизация представляет отдельный независимый процесс, тем не менее для нее также необходимо, чтобы приложение также применяло аутентификацию.
+
+Для подключения авторизации необходимо встроить компонент `Microsoft.AspNetCore.Authorization.AuthorizationMiddleware`. Для этого применяется встроенный метод расширения **UseAuthorization()**
+
+Кроме того, для применения авторизации необходимо зарегистрировать сервисы авторизации с помощью метода **AddAuthorization()**
+
+Одна из версий метода принимает делегат, который с помощью параметра *AuthorizationOptions* позволяет сконфигурировать авторизацию.
+
+Ключевыми элементами механизма авторизации в ASP.NET Core являются методы **AllowAnonymous** и **RequireAuthorization** которые позволяет ограничить доступ к ресурсам приложения. Например:
+
+```cs
+var builder = WebApplication.CreateBuilder();
+ 
+builder.Services.AddAuthentication("Bearer")
+    .AddJwtBearer();
+builder.Services.AddAuthorization();
+ 
+var app = builder.Build();
+ 
+app.UseAuthentication();
+app.UseAuthorization();
+ 
+
+app.MapGet("/private", () => "Ресурс только для авторизованных пользователей!")
+    .RequireAuthorization();
+
+app.MapGet("/", () => "Общедоступный ресурс")
+    .AllowAnonymous();
+ 
+app.Run();
+```
+
+Здесь в приложении определены две конечных точки: `/` и `/private`. Конечная точка `/` должна быть доступна всем пользователям, поэтому к ней применяется метод *AllowAnonymous* (разрешить не авторизованным), а к конечной точке `/private` применяется метод *RequireAuthorization* (только авторизованным).
+
+Если мы обратимся к конечной точке `/`, то у нас не возникнет никаких проблем.
+
+Однако если мы обратимся к ресурсу `/private`, то мы получим ошибку `401`, которая говорит о том, что пользователь не авторизован для доступа к этому ресурсу.
+
+Дальше всю теорию я расписывать не буду, но вы можете почитать подробнее [тут](https://metanit.com/sharp/aspnet6/13.1.php)
+
+## Реализация "Basic" авторизации
+
+Данные об авторизации, если она нужна, передаются в заголовке запроса:
+
+```
+Authorization: <тип авторизации> <данные для авторизации>
+```
+
+При базовой аторизации 
+
+* тип авторизации: **Basic**
+* данные для авторизации: строка в формате `логин:пароль` закодированная base64
+
+```
+Authorization: Basic base64encodedloginandpassword
+```
+
+>Код для реализации нарыл у GPT, в инете вменяемых не нашёл
+
+1. Создайте класс **BasicAuthenticationHandler**, который должен наследоваться от класса **AuthenticationHandler<TOptions>**
+
+    Класс привожу с комментариями, можно использовать как есть
+
+    ```cs
+    public class BasicAuthenticationHandler:
+        AuthenticationHandler<AuthenticationSchemeOptions>
+    {
+        // конструктор, реализация не нужна
+        public BasicAuthenticationHandler(
+            IOptionsMonitor<AuthenticationSchemeOptions> options, 
+            ILoggerFactory logger, 
+            UrlEncoder encoder, 
+            ISystemClock clock) : base(options, logger, encoder, clock)
+        {
+        }
+
+        // вся "движуха" происходит в этом методе
+        protected override Task<AuthenticateResult> HandleAuthenticateAsync()
+        {
+            // если в заголовках нет аттрибута Authorization 
+            // то результат авторизации Fail (не успешный)
+            if (!Request.Headers.ContainsKey("Authorization"))
+                return Task.FromResult(
+                    AuthenticateResult.Fail(
+                        "Missing Authorization header"));
+
+            try
+            {
+                // получаем строку авторизации
+                var authorizationHeader = Request
+                    .Headers["Authorization"].ToString();
+                
+                // я сделал логгирование всех этапов
+                // в релизе можно вырезать
+                Console.WriteLine(
+                    $"authorizationHeader = {authorizationHeader}");
+                
+                // достаем из строки "Basic base64data" вторую подстроку
+                var base64EncodedUsernamePassword = authorizationHeader
+                    .Split(' ')[1];
+                
+                Console.WriteLine(
+                    $"base64EncodedUsernamePassword = {base64EncodedUsernamePassword}");
+                
+                // декодируем параметры
+                var usernamePasswordString = Encoding.UTF8.GetString(
+                    Convert.FromBase64String(base64EncodedUsernamePassword));
+
+                Console.WriteLine(
+                    $"usernamePasswordString = {usernamePasswordString}");
+                
+                // разбиваем строку на логин и пароль
+                var usernamePasswordArr = usernamePasswordString.Split(':');
+
+                // Тут логин/пароль прибиты гвоздями, 
+                // но в реальном приложении надо 
+                // считывать из таблицы пользователей
+                if (
+                    usernamePasswordArr[0] == "admin" && 
+                    usernamePasswordArr[1] == "password")
+                {
+                    // тут какая-то химия от мелкософта
+                    var claims = new[] {
+                        new Claim(
+                            ClaimTypes.NameIdentifier, 
+                            usernamePasswordArr[0]),
+                        new Claim(
+                            ClaimTypes.Name, 
+                            usernamePasswordArr[0])
+                    };
+
+                    var identity = new ClaimsIdentity(
+                        claims, Scheme.Name);
+
+                    var principal = new ClaimsPrincipal(identity);
+
+                    var ticket = new AuthenticationTicket(
+                        principal, Scheme.Name);
+
+                    // успешная авторизация
+                    return Task.FromResult(
+                        AuthenticateResult.Success(ticket));
+                }
+
+                // логин/пароль не совпали
+                return Task.FromResult(
+                    AuthenticateResult.Fail("Invalid username or password"));
+            }
+            catch
+            {
+                // при любых ошибках разбора тоже ошибка
+                return Task.FromResult(
+                    AuthenticateResult.Fail("Invalid Authorization header"));
+            }
+        }
+    }
+    ```    
+
+1. В основном файле (`Program.cs`) добавьте сервисы аутентификации и авторизации и подключите авторизацию к *конечным точкам*:
+
+    ```cs
+    var builder = WebApplication.CreateBuilder(args);
+
+    // добавляем метод аутентификации "Basic"
+    // и задаём обработчиком созданный ранее класс
+    builder.Services.AddAuthentication("Basic")
+        .AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("Basic", options => { });
+
+    // это скопировано как есть из интернета
+    builder.Services.AddAuthorization(options =>
+    {
+        options.FallbackPolicy = new AuthorizationPolicyBuilder()
+            .RequireAuthenticatedUser().Build();
+    });
+
+    var app = builder.Build();
+
+    // включаем авторизацию и аутентификацию
+    app.UseAuthentication();
+    app.UseAuthorization();
+
+    // к конечным точкам дописываем RequireAuthorization 
+    // или AllowAnonimous
+    app.MapGet("/", () => "Hello World!")
+        .RequireAuthorization();
+    ```    
+
+**Swagger** в этот проект я не прикручивал, вы можете сделать запрос из **Postman**-а или из плагина к VSCode (_REST Client_)
+
+В _REST Client_ запрос выглядит так:
+
+```
+GET http://localhost:8080/
+Authorization: Basic admin:password
+```
+
+В логах сервера видно как выковыриваются данные для авторизации:
+
+```
+authorizationHeader = Basic YWRtaW46cGFzc3dvcmQ=
+base64EncodedUsernamePassword = YWRtaW46cGFzc3dvcmQ=
+usernamePasswordString = admin:password
+```
+
+Всё работает, можете использовать в своих проектах.
+
+---
+
+Предыдущая лекция |  | Следующая лекция
+:----------------:|:----------:|:----------------:
+[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)

binární
img/asp007.png


binární
img/asp008.png


+ 247 - 5
readme.md

@@ -33,7 +33,7 @@
 QR код | Описание
 :-----:|---------- 
 ![ссылка на гитхаб](http://qrcoder.ru/code/?https%3A%2F%2Fgithub.com%2Fkolei%2FPiRIS&4&0) | https://github.com/kolei/PiRIS
-![группа в телеге](http://qrcoder.ru/code/?https%3A%2F%2Ft.me%2F%2B5CXDecWYma8yODBi&4&0) | группа в `телеграм`
+![группа в телеге](http://qrcoder.ru/code/?https%3A%2F%2Ft.me%2F%2B5CXDecWYma8yODBi&4&0) | [группа в `телеграм`](https://t.me/+5CXDecWYma8yODBi)
 
 # Содержание
 
@@ -92,7 +92,7 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
     + [Вывод списка материалов продукта. CRUD материалов продукта](./articles/cs_product_material.md)
   - [Разработка API](#тема-515-разработка-своего-api)
     + [API. REST API. Создание сервера ASP.NET Core. Swagger.](./articles/api_asp_net_core.md)
-    + API. Авторизация и аутентификация. Методы авторизации. Basic-авторизация.
+    + [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./articles/api_auth.md)
     + [HTTP запросы в C#. Получение списка материалов выбранного продукта](./articles/cs_http.md)
 
 * [МДК. 05.02 Разработка кода ИС](#мдк-0502-разработка-кода-информационных-систем)
@@ -345,7 +345,7 @@ https://office-menu.ru/uroki-sql Уроки SQL
 
 1. [API. REST API. Создание сервера ASP.NET Core. Swagger.](./articles/api_asp_net_core.md)
 
-API. Авторизация и аутентификация. Методы авторизации. Basic-авторизация.
+1. [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./articles/api_auth.md)
 
 1. [HTTP запросы в C#. Получение списка материалов выбранного продукта](./articles/cs_http.md)
 
@@ -356,7 +356,7 @@ API. Авторизация и аутентификация. Методы авт
 
 
 
-## Тема 6. Разбор заданий предыдущих лет.
+<!-- ## Тема 6. Разбор заданий предыдущих лет.
 
 ### Задание регионального чемпионата 2021 года
 
@@ -364,7 +364,7 @@ API. Авторизация и аутентификация. Методы авт
 
 1. [Сессия 1. Создание БД. Импорт данных. Окно авторизации](./articles/wsr_21_1.md)
 
-## [Code Review](./articles/code_review.md)
+## [Code Review](./articles/code_review.md) -->
 
 <!-- ## Введение в WEB-разработку -->
 
@@ -530,4 +530,246 @@ tablayout
 -- разрешение пользователю создавать базы 
 GRANT ALL PRIVILEGES ON `isergeev%`.* TO 'isergeev'@'%';
 FLUSH PRIVILEGES;
+-->
+
+<!-- 
+
+Задание на ДЭ24
+
+
+
+Задание модуля 1:
+
+Перед вами поставили задачу разработать информационную систему
+для автоматизации работы кафе. Внимательно ознакомьтесь с описанием
+предметной области и выполните поставленные задачи.
+
+Описание предметной области
+
+Проектируемая ИС предназначена для управления заведениями
+общественного питания типа – кафе. Пользователями системы являются
+сотрудники кафе. Основная задача системы состоит в учёте заказов клиентов.
+
+Пользователи системы
+
+Все пользователи системы подразделяются на три группы:
+
+Администраторы
+Официанты
+Повара
+
+Пользователи получают доступ к функциям ИС только после успешной
+авторизации.
+
+Требования к функционалу администратора:
+
+Регистрация новых пользователей в системе.
+Перевод пользователей в статус «уволен».
+Назначение официантов и поваров на смены.
+Просмотр всех заказов.
+
+Требования к функционалу повара:
+
+Просмотр заказов, принятых от клиентов.
+Изменение статуса заказа (готовится, готов).
+
+Требования к функционалу официанта:
+
+Создание нового заказа.
+Изменение статуса заказа (принят, оплачен).
+
+Требования к интерфейсам системы
+
+Окно администратора:
+
+После перехода в окно администратора, пользователь имеет возможность
+перейти к списку всех сотрудников, заказов, смен.
+
+В интерфейсе сотрудников должна быть возможность изменения статуса на
+«уволен» и добавление нового сотрудника. Добавление сотрудников должно
+осуществляться в отдельном окне.
+
+В интерфейсе смен должна отображаться вся необходимая информация о смене,
+работающей в кафе. Администратор должен иметь возможность формировать новые
+смены.
+
+Окно повара:
+
+В интерфейсе пользователь должен видеть перечень всех принятых от клиентов
+заказов, с возможностью изменения их статуса.
+
+Окно официанта:
+
+Пользователь должен иметь возможность просмотреть перечень всех заказов,
+принятых от клиентов за период активной смены.
+
+В интерфейсе официанта должна быть реализована возможность создание
+нового заказа. В заказе обязательно должны учитываться места (столик), количество
+клиентов, заказанные блюда и напитки.
+
+Задание 1. Разработка пользовательских историй и сценариев использования
+
+На основе описания предметной области разработайте алгоритм поведения
+пользователей в системе. Поведения пользователей должны быть представлены в
+виде текстовых нотаций.
+
+Заполните Таблицу 1, описав взаимодействие пользователей системы
+(по ролям) с функциональными модулями системы. Описание должно отражать
+действия пользователя в зависимости от его роли и реакцию системы на это действие.
+
+Описание строится на основе предметной области.
+
+Таблица 1
+
+Пользователь Система
+Что делает пользователь? Как реагирует система?
+
+Заполните Таблицу 2, описав пользовательские истории в зависимости от роли
+пользователя. Описание должно включать роль пользователя системы, производимые
+им действия и цели этих действий. У одного действия, не может быть более одной
+цели.
+
+Таблица 2
+
+Роль Действие Цель
+Роль пользователя в
+системе
+Какое действие
+производит?
+Какая цель действия?
+
+Задание 2. Постановка задач по разработке информационной системы
+
+На основании описания предметной области, пользовательских историй и
+сценариев. Заполните Таблицу 3, описав задачи по обработке данных функциями
+информационной системой.
+
+Таблица 3
+Название функции Входные
+параметры
+Выходные
+параметры
+Описание функции
+Как функция
+называется?
+Какие параметры
+функция
+принимает?
+Какие параметры
+функция
+возвращает?
+Что делает
+функция?
+
+Задание 3. Разработка прототипов пользовательских интерфейсов системы
+На основании описания предметной области, пользовательских историй, сценариев и
+задач по обработке данных функциями информационной системы, разработайте
+прототипы основных пользовательских интерфейсов системы.
+
+Модуль 1: Проектирование и разработка информационных систем
+
+Задание модуля 1:
+
+Для информационной системы, для управления заведениями общественного
+питания типа – кафе, реализуйте следующий функционал.
+
+Задание 1. Реализация интерфейсов
+
+На основании разработанных прототипов, реализуйте графический интерфейс
+приложения для каждой из ролей. Для реализации интерфейсов, используйте
+доступные вам интерактивные среды разработки (IDE).
+
+Задание 2. Реализация функционала
+
+На основании описания предметной области, пользовательских историй, сценариев,
+задач по обработке данных функциями информационной системы и разработанных
+интерфейсов, реализуйте основной функционал для каждой из ролей. В процессе
+разработки следуйте принятым стандартам разработки выбранного языка
+программирования. Для реализации функционала системы, используйте
+предоставленный дамп базы данных в соответствии с выбранной вами СУБД.
+
+Модуль 2: Осуществление интеграции программных модулей
+Задание модуля 2:
+Для информационной системы, описание предметной области которой
+представлено в модуле 1, разработайте тестовые сценарии
+Задание 1. Разработка тестовых сценариев
+Разработайте минимум 2 тестовых сценария (Таблица 1) для проверки функционала
+каждой из ролей.
+Таблица 1
+Поле Описание
+Дата(ы) теста Дата(ы) проведения тестов – это один или несколько дней.
+Если тесты проводились в более протяженный период
+времени, нужно отметить отдельную дату для каждого теста
+ГИА/ДЭ
+БУ,
+ГИА/ДЭ
+ПУ
+24
+Приоритет
+тестирования
+(Низкий/Средний/
+Высокий)
+Насколько важен каждый тест. Приоритет тестирования для
+бизнес-правил и функциональных тестовых случаев может
+быть средним или высоким, в то время как незначительные
+случаи пользовательского интерфейса могут иметь низкий
+приоритет.
+Заголовок/названи
+е теста
+Название тестового случая. Например, Подтвердите страницу
+авторизации с действительным именем пользователя и
+паролем.
+Этапы теста Перечислите все этапы теста подробно. Запишите этапы теста
+в том порядке, в котором они должны быть реализованы.
+Предоставьте как можно больше подробностей и разъяснений.
+Пронумерованный список – хорошая идея.
+Тестовые данные Перечислите/опишите все тестовые данные, используемые для
+данного тестового случая. Так, фактические используемые
+входные данные можно отслеживать по результатам
+тестирования. Например, Имя пользователя и пароль для
+подтверждения входа.
+Ожидаемый
+результат
+Каким должен быть вывод системы после выполнения теста?
+Подробно опишите ожидаемый результат, включая все
+сообщения/ошибки, которые должны отображаться на экране.
+Фактический
+результат
+Каким должен быть фактический результат после выполнения
+теста? Опишите любое релевантное поведение системы после
+выполнения теста.
+Задание 2. Инспектирование программного кода
+Проверьте программный код, разработанный при выполнении модуля 1 на
+предмет соответствия стандартам кодирования.
+Модуль 3: Сопровождение информационных систем
+Задание модуля 3:
+Для информационной системы, для управления заведениями общественного
+питания типа – кафе, разработайте руководство пользователя
+Напишите руководство пользователя для разработанной вами информационной
+системы. В руководстве пользователя должен быть описан функционал для каждой
+роли. Руководство пользователя должно включать в себя текстовое описание работы с
+системой и скриншоты пользовательских интерфейсов. Разработанное руководство
+сохраните в формате PDF.
+ГИА/ДЭ
+ПУ
+Модуль 4: Соадминистрирование баз данных и серверов
+Задание модуля 4:
+Для информационной системы, для управления заведениями общественного
+питания типа – кафе, спроектируйте и разработайте БД
+Задание 1. Проектирование базы данных
+Спроектируйте базу данных в соответствии с описанием предметной области.
+Проектирование базы данных выполните в виде графической нотации (ERD). Файл
+ERD сохраните в формате PDF.
+ГИА/ДЭ
+ПУ
+25
+Задание 2. Разработка базы данных
+На основании разработанной ERD, реализуйте физическую модель базы данных, в
+выбранной вами СУБД.
+Задание 3. Импорт данных
+Импортируйте предоставленные данные в разработанную базу данных.
+Задание 4. Резервное копирование
+Выполните резервное копирование разработанной базы данных, используя
+механизмы выбранной вами СУБД. Сохраните копию базы данных в архиве в
+формате ZIP.
 -->