- Платформа: ASP.NET Core NET 7.0
- Реализация: Апрель-Май 2023 год
- Ссылки на видео материалы смотрите в самом низу данного документа
Каталог создается заново на новой версии платформы. Некоторые сущности переиспользуются. Ну, и конечно же будут переиспользованы некоторые механизмы, а некоторые будут написаны заново.
В реализации будут использоваться следующие технологии, сборки, фреймворки, подходы, паттерны (т.д. и т.п.). Другими словами, ключевые понятия, которые можно встретить в проекте:
- База данных PostgreSQL
- EntityFrameworkCore
- Unit of Work
- Mediatr
- FluentValidation
- PredicatesBuilder
- OperationResult (as RFC7807)
- Microsoft Identity
- Vertical Slice Architecture
- Minimal API
- OpenIddict Auth2.0
- Nimble Framework (Microservice Template)
- Swagger
- AppDefinitions
- Domain Events
- DDD
В проекте используется две роли, которые регламентируют доступ к функционалу.
Administrator - (главная роль) пользователь, у которого есть эта роль, может выполнять все операции с любыми сущностями).
User - пользоватеть, у которого есть эта роль может добавлять обзоры к товарам.
Незарегистрированные пользователи работают с системой в режиме "readonly".
-
Nameдолжно быть не менее 5 и не более 50 символов. -
Descriptionдолжно быть не более 1024 символов, но может быть пустым. -
Categoryможно создать без товаров. -
Categoryможно включить/выключить (скрыть/показать для всеобщего просмотра). - При выключении каталога все товары в каталоге тоже должны выключиться. (Transaction)
- При включении каталога необходимо явно указать, включать или не включать товары.
- При получение всех товаров
GetAll()администратор должен получать и скрытые категории тоже. - Просмотр всех каталогов должно использоваться разбиение на страницы (paging)
- При создании нового каталога, он должен быть невидимый по умолчанию.
- API должна содержать методы CRUD для управления сущностью
Category:-
GetPaged(int pageIndex, int pageSize) -
GetAll() -
Create(CategoryViewModel model) -
GetById(Guid id) -
Update(CategoryUpdateViewModel) -
Delete(Guid id)
-
-
Nameдолжно быть не менее 5 и не более 128 символов. -
Descriptionдолжно быть не более 2048 символов, но может быть пустым. -
Priceможет быть не задана (null). -
CategoryIdобязательно при создании нового товара. -
Productможно выключить/выключить (скрыть/показать для всеобщего просмотра). - Товар нельзя включить, если каталог товара выключен
- Просмотр всех товаров должно использоваться разбиение на страницы (paging)
- При создании товар он должен быть невидимый.
- API должна содержать методы CRUD для управления сущностью
Product:-
GetPaged(int pageIndex, int pageSize) -
GetAll()(глупый метод) -
Create(ProductCreateViewModel model)Get -
Create(ProductCreateViewModel model)Post -
GetById(Guid id) -
Update(ProductUpdateViewModel)Get -
Update(ProductUpdateViewModel)Put -
Delete(Guid id) -
GetMostReviewed(int count = 10) -
GetMostRated(int count = 10)
-
-
UserNameдолжно быть не менее 5 и не более 128 символов -
Contentдолжно быть не более 2048 символов, но может быть пустым -
Ratingдолжно быть от 1 до 5 единиц (очков, баллов, и т.д.) -
ProductIdобязательно при создании нового обзора (комментария) - Посмотреть все обзоры для товаров можно лишь только администратору.
- Просмотр всех обзоров должны использоваться разбиение на страницы (paging)
-
Reviewможно тоже выключить и включить в соответствии со статусом товара, для которого это review написано. - API должна содержать методы CRUD для управления сущностью
Review:-
Create(ReviewCreateViewModel model)Get -
Create(ReviewCreateViewModel model)Post -
GetById(Guid id) -
Delete(Guid id) -
Update(Guid id)Get -
Update(ReviewUpdateViewModel model)Post -
GetLastReviews(int count) -
GetPaged(int pageIndex, int pageSize)
-
- Один продукт должен иметь одну и более меток (до 8 шт).
- При создании и при редактировании товара к нему можно добавить несколько меток. Если метка не существует в системе, то она создается. Если метка уже существует, то к товару привязывается ссылка нее.
- Если из описания товара удаляется метка, то надо проверить что эта метка не используется других товарах. Если метка больше нигде не используется, ее требуется удалить.
- Данные о продукте должны включать в себя метки товара (
GetAll(),GetByIdиGetPaged) - Просмотр всех меток, которые используются в каталоге можно осуществить на странице "Облако меток" (см.
GetCloud()).-
GetCloud()
-
- Товар может иметь несколько отзывов или не иметь вообще.
- Отзыв может оставить только зарегистрированный пользователь ролью
User - Отзыв должен содержать следующие обязательные свойства:
Id,Content,Rating,UserName - Список последних 10 отзывов может быть также запрошен на UI (см.
GetLastReview(int count)). - При сокрытии товара от всеобщего просмотра, отзывы о товаре тоже не должны нигде отображаться.
- Администратор должен иметь возможность удалить любой отзыв
- Администратор должен иметь возможность удалять товары
- Администратор должен иметь возможность удалять пользователей
- Администратор должен иметь возможность создавать категории
- Пользователь может добавить сколько угодно отзывов на любой товар
- Пользователь может удалить свой и только свой отзыв
- Пользователь может изменить рейтинг своего отзыва и текст содержания
classDiagram
direction RL
Product "*" <-- "1" Category
Tag "1..8" <-- "*" Product
Review "*" <-- "1" Product
Auditable <|-- Identity
Category <|-- Identity
EventItem <|-- Identity
Tag <|-- Identity
Product <|-- Auditable
Review <|-- Auditable
---
title: Сущность Category
---
classDiagram
class Category {
+string Name
+string Description
+List~Product~
bool Visible
}
---
title: Сущность Product
---
classDiagram
class Product {
+string Name
+string Description
Guid CategoryId
+int Price
+List~Review~
+List~Tag~
bool Visible
}
---
title: Сущность EventItem
---
classDiagram
class EventItem {
DateTime CreatedAt
string Logger
string Level
string Message
string? ThreadId
string? ExceptionMessage
}
---
title: Сущность Tag
---
classDiagram
class Tag {
string Name
List<Product>? Products
}
---
title: Сущность Review
---
classDiagram
class Review {
string Content
string User
int Rating
Guid Product
virtual Product
bool Visible
}
---
title: Сущность Identity
---
classDiagram
class Identity{
<<Abstract>>
+Guid Id
}
---
title: Сущность Auditable
---
classDiagram
class Auditable{
<<Abstract>>
DateTime CreatedAt
string CreatedBy
DateTime? UpdatedAt
string? UpdatedBy
}
Есть две версии реализации каталога товаров: 2019 года и 2023 года.
Платформа: ASP.NET Core 7.0.
Создание новой версии можно посмотреть на видео. Все ссылки на видео есть в моем блоге - Каталог товаров 2023. Все этапы от "создания проекта" до "решения всех требований".
Платформа: ASP.NET Core 2.2.
Создание приложение подробно запечатлено на видео. Проект создается самого начала. Используется шаблон, который описан в видео. В процессе разработки показывается как программировать, как создавать правильный функциональный код. Как использовать паттерны. Описываются принципы и правила.
Описание проекта, а также возможность связаться с автором есть в блоге. Статья описывающая данный репозиторий доступна в блоге.