homework/README.md

126 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ТехноМир — Лабораторная работа №1
ASP.NET Core MVC проект интернет-магазина техники.
**Автор:** Борисов Иван Сергеевич, РПО 23/1, 2026
---
## Описание проекта
Интернет-магазин «ТехноМир» — многостраничный сайт для продажи компьютерной и мобильной техники: ноутбуки, смартфоны, планшеты и наушники.
### Реализованные страницы
| Страница | Описание |
|----------------|-----------------------------------------------------------------|
| **Главная** | Промо-баннер, преимущества магазина, хиты продаж (из данных), CTA |
| **Каталог** | 14 товаров из данных, фильтр по 5 категориям, поиск |
| **Корзина** | Добавление, изменение количества, удаление, очистка, оформление |
| **Вход** | Авторизация по cookie, регистрация, личный кабинет |
| **О системе** | Описание сервиса, роли пользователей, план развития |
| **Контакты** | Контактная информация, форма обратной связи с валидацией |
| **404** | Страница ошибки с кнопкой возврата на главную |
### Каталог и данные
- Модель `Product` и хранилище `Data/ProductStore` с 14 товарами по 5 категориям
- Категории: Ноутбуки, Смартфоны, Планшеты, Наушники, Аксессуары
- Фильтр по категории: `Catalog/Index?category=...`
- Поиск по названию и характеристикам: `Catalog/Index?q=...`
- Общая частичная карточка `_ProductCard.cshtml` для каталога и хитов
### Корзина
- Хранение — сессия `CartService` (`Services/CartService.cs`), данные в JSON
- Кнопка «Купить» на карточке добавляет товар; счётчик в шапке обновляется
- Страница `Cart/Index`: изменение количества, удаление позиции, очистка
- Оформление заказа очищает корзину и показывает подтверждение через `TempData`
### Вход и аккаунт
- Cookie-аутентификация (Microsoft.AspNetCore.Authentication.Cookies)
- `Account/Login` и `Account/Register` — авторизация и регистрация с валидацией
- Пользователи хранятся в памяти (`Data/UserStore`), пароли — SHA-256
- Личный кабинет `Account/Profile` (только для авторизованных)
- Шапка: показывает логин + «Выйти» для вошедших, «Войти» для гостей
### Технический стек
- **ASP.NET Core MVC** (.NET 10)
- **Bootstrap 5.3** (CDN) — сетка, меню, формы
- **Bootstrap Icons** (CDN) — иконки интерфейса
- HTML, CSS, JavaScript
- Светлая / тёмная тема (localStorage)
### Функциональность ЛР №1
- Маршрутизация: `/{controller=Home}/{action=Index}/{id?}`
- Tag Helpers: `asp-controller`, `asp-action`, `asp-for`, `asp-validation-for`, `asp-append-version`
- Клиентская и серверная валидация формы `ContactViewModel` (`[Required]`, `[Phone]`)
- PRG-паттерн + `TempData` для отображения результата POST-запроса
- Переключение темы через `data-theme` на `<html>` с ранней блокировкой от мигания
- Open Graph мета-теги, favicon
- Кастомная страница ошибки через `UseStatusCodePagesWithReExecute`
### Запуск
```bash
dotnet run --urls http://localhost:5000
```
---
## Контрольные вопросы
### 1. Чем ASP.NET Core отличается от классического ASP.NET Framework?
ASP.NET Core — это полностью переписанный, модульный кросс-платформенный фреймворк, в то время как классический ASP.NET Framework работает только на Windows и зависит от IIS.
Основные отличия:
- **Кросс-платформенность:** ASP.NET Core запускается на Windows, Linux и macOS через встроенный Kestrel-сервер, не зависящий от IIS.
- **Модульность:** каждая функция подключается как отдельный NuGet-пакет (Middleware), а не встроена в ядро. Вместо тяжёлого System.Web используется минимальный pipeline из компонентов.
- **Производительность:** Kestrel оптимизирован под асинхронные сценарии и обрабатывает запросы значительно быстрее, чем IIS + ASP.NET.
- **Среда выполнения:** приложение может быть self-contained (без установки .NET Runtime на целевой машине) или framework-dependent. Модель деплоя более гибкая: Docker-контейнеры, systemd-юниты, консоль.
- **Конфигурация:** вместо web.config используется appsettings.json + environment variables, что упрощает управление параметрами в разных средах.
### 2. Что такое middleware и в каком порядке они выполняются при обработке запроса?
Middleware — это компоненты, образующие конвейер (pipeline), через который проходит каждый HTTP-запрос. Каждый middleware может обработать запрос, передать его дальше или вернуть ответ, не передавая дальше.
Порядок важен. Типичный pipeline:
1. **ExceptionHandler** — перехватывает необработанные исключения
2. **HSTS** — принудительное HTTPS в продакшене
3. **HttpsRedirection** — перенаправление HTTP на HTTPS
4. **UseStaticFiles** — раздача статических файлов из `wwwroot`
5. **Routing** — сопоставление URL с маршрутами
6. **UseEndpoints** — вызов соответствующего контроллера/действия
Для 404 используется `UseStatusCodePagesWithReExecute`: он перехватывает ответ с кодом 404/500 и перезапускает обработку, передавая код ошибки параметром.
### 3. Зачем нужны `_ViewStart.cshtml` и `_ViewImports.cshtml`?
**`_ViewStart.cshtml`** выполняется перед каждым представлением и задаёт общие настройки. Здесь он определяет, что все страницы автоматически используют макет `_Layout.cshtml`.
**`_ViewImports.cshtml`** определяет общие `using`-директивы и подключает Tag Helpers для всех представлений в текущей папке. Здесь подключаются:
- `@using TechnoWorld` — доступ к моделям без полного namespace.
- `@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers` — включение Tag Helpers.
### 4. Откуда берутся CSS/JS/изображения и как они подключаются через Razor?
Файлы хранятся в `wwwroot/` проекта и подключаются через Razor:
```html
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<script src="~/js/site.js" asp-append-version="true"></script>
```
Тег `~` разрешается в корень `wwwroot`. Атрибут `asp-append-version` добавляет хеш для инвалидации кеша браузера. Библиотеки подключаются через CDN (Bootstrap) или локально из `wwwroot/lib/`.
### 5. Что такое Tag Helper и почему он удобнее обычного HTML?
Tag Helper — серверная замена HTML-тегов с атрибутами, начинающимися с `asp-`. Преимущества:
- **Автоматическая генерация URL:** `<a asp-controller="Home" asp-action="Index">` вместо ручного прописывания пути.
- **Валидация:** `<input asp-for="Name" />` автоматически генерирует атрибуты для клиентской валидации.
- **Безопасность:** экранирование значений, защита от XSS.
- **Инвалидация кеша:** `asp-append-version="true"` без написания хелпера.
- **Читаемость:** разметка выглядит как чистый HTML с понятными серверными атрибутами.