Browse Source

Merge pull request #237 from EasyAbp/add-product-overview

Add the `Overview` property to the `Product` entity
pull/239/head
Super 3 years ago
committed by GitHub
parent
commit
cb2e4661de
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductDto.cs
  2. 28
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductDto.cs
  3. 6
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductViewDto.cs
  4. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs
  5. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json
  6. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json
  7. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json
  8. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProduct.cs
  9. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductEto.cs
  10. 10
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/Product.cs
  11. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductView.cs
  12. 18
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs
  13. 10
      modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Domain.Tests/Products/ProductDomainTests.cs
  14. 11
      modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.TestBase/ProductsTestDataBuilder.cs
  15. 1
      samples/EShopSample/aspnet-core/src/EShopSample.Domain/Data/SampleDataSeedContributor.cs
  16. 6361
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230327075140_AddedProductOverview.Designer.cs
  17. 38
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230327075140_AddedProductOverview.cs
  18. 6
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/EShopSampleDbContextModelSnapshot.cs

3
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/CreateUpdateProductDto.cs

@ -30,6 +30,9 @@ namespace EasyAbp.EShop.Products.Products.Dtos
[DisplayName("ProductDisplayName")]
public string DisplayName { get; set; }
[DisplayName("ProductOverview")]
public string Overview { get; set; }
public ICollection<CreateUpdateProductAttributeDto> ProductAttributes { get; set; }
[DisplayName("ProductInventoryStrategy")]

28
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductDto.cs

@ -9,48 +9,50 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public class ProductDto : ExtensibleFullAuditedEntityDto<Guid>
{
public Guid StoreId { get; set; }
public string ProductGroupName { get; set; }
public string ProductGroupDisplayName { get; set; }
public Guid? ProductDetailId { get; set; }
public string UniqueName { get; set; }
public string DisplayName { get; set; }
public string Overview { get; set; }
public InventoryStrategy InventoryStrategy { get; set; }
public string InventoryProviderName { get; set; }
public string MediaResources { get; set; }
public int DisplayOrder { get; set; }
public bool IsPublished { get; set; }
public bool IsStatic { get; set; }
public bool IsHidden { get; set; }
public TimeSpan? PaymentExpireIn { get; set; }
public long Sold { get; set; }
public decimal? MinimumPrice { get; set; }
public decimal? MaximumPrice { get; set; }
public List<ProductAttributeDto> ProductAttributes { get; set; }
public List<ProductSkuDto> ProductSkus { get; set; }
public ProductSkuDto GetSkuById(Guid skuId)
{
return ProductSkus.Single(x => x.Id == skuId);
}
public ProductSkuDto FindSkuById(Guid skuId)
{
return ProductSkus.FirstOrDefault(x => x.Id == skuId);

6
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application.Contracts/EasyAbp/EShop/Products/Products/Dtos/ProductViewDto.cs

@ -17,6 +17,8 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public string DisplayName { get; set; }
public string Overview { get; set; }
public InventoryStrategy InventoryStrategy { get; set; }
public string InventoryProviderName { get; set; }
@ -32,9 +34,9 @@ namespace EasyAbp.EShop.Products.Products.Dtos
public bool IsHidden { get; set; }
public decimal? MinimumPrice { get; set; }
public decimal? MaximumPrice { get; set; }
public long Sold { get; set; }
public string ProductGroupDisplayName { get; set; }

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs

@ -490,6 +490,7 @@ namespace EasyAbp.EShop.Products.Products
createInput.ProductDetailId,
createInput.UniqueName,
createInput.DisplayName,
createInput.Overview,
createInput.InventoryStrategy,
createInput.InventoryProviderName,
createInput.IsPublished,
@ -512,6 +513,7 @@ namespace EasyAbp.EShop.Products.Products
updateInput.ProductDetailId,
updateInput.UniqueName,
updateInput.DisplayName,
updateInput.Overview,
updateInput.InventoryStrategy,
updateInput.InventoryProviderName,
updateInput.IsPublished,

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/en.json

@ -12,6 +12,8 @@
"ProductDetailId": "Product detail ID",
"ProductUniqueName": "Unique name",
"ProductDisplayName": "Display name",
"ProductOverview": "Overview text",
"ProductOverviewPlaceholder": "A one-sentence description of this product, usually displayed in the product list.",
"ProductDisplayOrder": "Display order",
"ProductSold": "Sold",
"ProductDetailDescription": "Description",

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hans.json

@ -12,6 +12,8 @@
"ProductDetailId": "商品详情 ID",
"ProductUniqueName": "商品编号",
"ProductDisplayName": "商品名称",
"ProductOverview": "商品文本概述",
"ProductOverviewPlaceholder": "用一句话描述此商品,通常显示于商品列表",
"ProductDisplayOrder": "展示顺序",
"ProductSold": "已售",
"ProductDetailDescription": "详情介绍",

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Localization/Products/zh-Hant.json

@ -12,6 +12,8 @@
"ProductDetailId": "商品詳情 ID",
"ProductUniqueName": "商品編號",
"ProductDisplayName": "商品名稱",
"ProductOverview": "商品文本概述",
"ProductOverviewPlaceholder": "用一句话描述此商品,通常显示于商品列表",
"ProductDisplayOrder": "展示順序",
"ProductSold": "已售",
"ProductDetailDescription": "詳情介紹",

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/IProduct.cs

@ -15,6 +15,8 @@ namespace EasyAbp.EShop.Products.Products
string DisplayName { get; }
string Overview { get; }
InventoryStrategy InventoryStrategy { get; }
[CanBeNull] string InventoryProviderName { get; }

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/ProductEto.cs

@ -21,6 +21,8 @@ namespace EasyAbp.EShop.Products.Products
public string DisplayName { get; set; }
public string Overview { get; set; }
public InventoryStrategy InventoryStrategy { get; set; }
public string InventoryProviderName { get; set; }

10
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/Product.cs

@ -25,6 +25,12 @@ namespace EasyAbp.EShop.Products.Products
[NotNull]
public virtual string DisplayName { get; protected set; }
/// <summary>
/// Tell your customer what the product is. It is usually shown in the product list.
/// </summary>
[CanBeNull]
public virtual string Overview { get; protected set; }
public virtual InventoryStrategy InventoryStrategy { get; protected set; }
/// <summary>
@ -62,6 +68,7 @@ namespace EasyAbp.EShop.Products.Products
Guid? productDetailId,
[CanBeNull] string uniqueName,
[NotNull] string displayName,
[CanBeNull] string overview,
InventoryStrategy inventoryStrategy,
[CanBeNull] string inventoryProviderName,
bool isPublished,
@ -76,6 +83,7 @@ namespace EasyAbp.EShop.Products.Products
StoreId = storeId;
ProductGroupName = Check.NotNullOrWhiteSpace(productGroupName, nameof(productGroupName));
ProductDetailId = productDetailId;
Overview = overview;
UniqueName = uniqueName?.Trim();
DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName));
InventoryStrategy = inventoryStrategy;
@ -97,6 +105,7 @@ namespace EasyAbp.EShop.Products.Products
Guid? productDetailId,
[CanBeNull] string uniqueName,
[NotNull] string displayName,
[CanBeNull] string overview,
InventoryStrategy inventoryStrategy,
[CanBeNull] string inventoryProviderName,
bool isPublished,
@ -111,6 +120,7 @@ namespace EasyAbp.EShop.Products.Products
ProductDetailId = productDetailId;
UniqueName = uniqueName?.Trim();
DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName));
Overview = overview;
InventoryStrategy = inventoryStrategy;
InventoryProviderName = inventoryProviderName;
IsPublished = isPublished;

4
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductView.cs

@ -20,6 +20,8 @@ namespace EasyAbp.EShop.Products.Products
public virtual string DisplayName { get; protected set; }
public virtual string Overview { get; protected set; }
public virtual InventoryStrategy InventoryStrategy { get; protected set; }
public string InventoryProviderName { get; protected set; }
@ -56,6 +58,7 @@ namespace EasyAbp.EShop.Products.Products
Guid? productDetailId,
string uniqueName,
string displayName,
string overview,
InventoryStrategy inventoryStrategy,
string inventoryProviderName,
bool isPublished,
@ -75,6 +78,7 @@ namespace EasyAbp.EShop.Products.Products
ProductDetailId = productDetailId;
UniqueName = uniqueName?.Trim();
DisplayName = displayName;
Overview = overview;
InventoryStrategy = inventoryStrategy;
InventoryProviderName = inventoryProviderName;
IsPublished = isPublished;

18
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Web/Pages/EShop/Products/Products/Product/ViewModels/CreateEditProductViewModel.cs

@ -13,7 +13,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
[HiddenInput]
[Display(Name = "ProductStoreId")]
public Guid StoreId { get; set; }
[Required]
[SelectItems("ProductGroups")]
[Display(Name = "ProductProductGroupName")]
@ -30,18 +30,22 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
[Display(Name = "ProductUniqueName")]
public string UniqueName { get; set; }
[Required]
[Display(Name = "ProductDisplayName")]
public string DisplayName { get; set; }
[Placeholder("ProductOverviewPlaceholder")]
[Display(Name = "ProductOverview")]
public string Overview { get; set; }
public CreateEditProductDetailViewModel ProductDetail { get; set; } = new();
[Required]
[Placeholder("ProductAttributeNamesPlaceholder")]
[Display(Name = "ProductAttributeNames")]
public string ProductAttributeNames { get; set; }
[Required]
[TextArea(Rows = 4)]
[Placeholder("ProductAttributeOptionNamesPlaceholder")]
@ -60,13 +64,13 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
[Display(Name = "ProductMediaResources")]
public string MediaResources { get; set; }
[Display(Name = "ProductIsPublished")]
public bool IsPublished { get; set; }
[Display(Name = "ProductIsHidden")]
public bool IsHidden { get; set; }
[Display(Name = "ProductPaymentExpireIn")]
public TimeSpan? PaymentExpireIn { get; set; }
@ -76,7 +80,7 @@ namespace EasyAbp.EShop.Products.Web.Pages.EShop.Products.Products.Product.ViewM
{
yield return new ValidationResult(
"The StoreId should be same as the ProductDetail.StoreId.",
new[] {"StoreId"}
new[] { "StoreId" }
);
}
}

10
modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Domain.Tests/Products/ProductDomainTests.cs

@ -25,8 +25,8 @@ namespace EasyAbp.EShop.Products.Products
public async Task Should_Set_ProductDetailId()
{
var product2 = new Product(ProductsTestData.Product2Id, null, ProductsTestData.Store1Id, "Default",
ProductsTestData.ProductDetails2Id, "Ball", "Ball", InventoryStrategy.NoNeed, null, true, false, false,
null, null, 0);
ProductsTestData.ProductDetails2Id, "Ball", "Ball", null, InventoryStrategy.NoNeed, null, true, false,
false, null, null, 0);
await ProductManager.CreateAsync(product2);
product2 = await ProductRepository.GetAsync(product2.Id);
@ -64,8 +64,8 @@ namespace EasyAbp.EShop.Products.Products
product1.ProductDetailId.ShouldBe(ProductsTestData.ProductDetails1Id);
var product2 = new Product(ProductsTestData.Product2Id, null, ProductsTestData.Store1Id, "Default",
ProductsTestData.ProductDetails2Id, "Ball", "Ball", InventoryStrategy.NoNeed, null, true, false, false,
null, null, 0);
ProductsTestData.ProductDetails2Id, "Ball", "Ball", null, InventoryStrategy.NoNeed, null, true, false,
false, null, null, 0);
await ProductManager.CreateAsync(product2);
@ -181,7 +181,7 @@ namespace EasyAbp.EShop.Products.Products
public async Task Should_Use_Fake_Inventory_Provider()
{
var product2 = new Product(ProductsTestData.Product2Id, null, ProductsTestData.Store1Id, "Default",
ProductsTestData.ProductDetails2Id, "Ball", "Ball", InventoryStrategy.NoNeed, "Fake", true, false,
ProductsTestData.ProductDetails2Id, "Ball", "Ball", null, InventoryStrategy.NoNeed, "Fake", true, false,
false, null, null, 0);
await ProductManager.CreateAsync(product2);

11
modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.TestBase/ProductsTestDataBuilder.cs

@ -35,17 +35,18 @@ namespace EasyAbp.EShop.Products
public async Task BuildAsync()
{
using var uow = _unitOfWorkManager.Begin();
var productDetail1 = await _productDetailRepository.InsertAsync(
new ProductDetail(ProductsTestData.ProductDetails1Id, null, ProductsTestData.Store1Id,
"Product details for store 1"), true);
var productDetail2 = await _productDetailRepository.InsertAsync(
new ProductDetail(ProductsTestData.ProductDetails2Id, null, ProductsTestData.Store1Id,
"Product details for store 1"), true);
var product = new Product(ProductsTestData.Product1Id, null, ProductsTestData.Store1Id, "Default",
productDetail1.Id, "Cake", "Cake", InventoryStrategy.NoNeed, null, true, false, false, null, null, 0);
productDetail1.Id, "Cake", "Cake", "Delicious cakes", InventoryStrategy.NoNeed, null, true, false,
false, null, null, 0);
var attribute1 = new ProductAttribute(ProductsTestData.Product1Attribute1Id, "Size", null, 1);
var attribute2 = new ProductAttribute(ProductsTestData.Product1Attribute2Id, "Color", null, 2);
@ -57,7 +58,7 @@ namespace EasyAbp.EShop.Products
new ProductAttributeOption(ProductsTestData.Product1Attribute1Option1Id, "S", null, 1),
new ProductAttributeOption(ProductsTestData.Product1Attribute1Option3Id, "L", null, 3),
});
attribute2.ProductAttributeOptions.AddRange(new[]
{
new ProductAttributeOption(ProductsTestData.Product1Attribute2Option2Id, "Green", null, 2),
@ -83,7 +84,7 @@ namespace EasyAbp.EShop.Products
await _attributeOptionIdsSerializer.SerializeAsync(new[]
{ ProductsTestData.Product1Attribute1Option3Id, ProductsTestData.Product1Attribute2Option2Id }),
null, "USD", null, 3m, 1, 10, null, null, null);
await _productManager.CreateSkuAsync(product, productSku1);
await _productManager.CreateSkuAsync(product, productSku2);
await _productManager.CreateSkuAsync(product, productSku3);

1
samples/EShopSample/aspnet-core/src/EShopSample.Domain/Data/SampleDataSeedContributor.cs

@ -123,6 +123,7 @@ public class SampleDataSeedContributor : IDataSeedContributor, ITransientDepende
null,
SampleDataConsts.CakeProductUniqueName,
"Cake",
"Delicious cakes",
InventoryStrategy.NoNeed,
null,
true,

6361
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230327075140_AddedProductOverview.Designer.cs

File diff suppressed because it is too large

38
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/20230327075140_AddedProductOverview.cs

@ -0,0 +1,38 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace EShopSample.Migrations
{
/// <inheritdoc />
public partial class AddedProductOverview : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Overview",
table: "EasyAbpEShopProductsProductViews",
type: "nvarchar(max)",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "Overview",
table: "EasyAbpEShopProductsProducts",
type: "nvarchar(max)",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Overview",
table: "EasyAbpEShopProductsProductViews");
migrationBuilder.DropColumn(
name: "Overview",
table: "EasyAbpEShopProductsProducts");
}
}
}

6
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore/Migrations/EShopSampleDbContextModelSnapshot.cs

@ -2284,6 +2284,9 @@ namespace EShopSample.Migrations
b.Property<string>("MediaResources")
.HasColumnType("nvarchar(max)");
b.Property<string>("Overview")
.HasColumnType("nvarchar(max)");
b.Property<TimeSpan?>("PaymentExpireIn")
.HasColumnType("time");
@ -2562,6 +2565,9 @@ namespace EShopSample.Migrations
b.Property<decimal?>("MinimumPrice")
.HasColumnType("decimal(20,8)");
b.Property<string>("Overview")
.HasColumnType("nvarchar(max)");
b.Property<Guid?>("ProductDetailId")
.HasColumnType("uniqueidentifier");

Loading…
Cancel
Save