- Платформа: 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)
-
GetAll(Guid productId)
-
- Один продукт должен иметь одну и более меток (до 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.
Создание приложение подробно запечатлено на видео. Проект создается самого начала. Используется шаблон, который описан в видео. В процессе разработки показывается как программировать, как создавать правильный функциональный код. Как использовать паттерны. Описываются принципы и правила.
Описание проекта, а также возможность связаться с автором есть в блоге. Статья описывающая данный репозиторий доступна в блоге.