Commit bcd2e5ee authored by gdlcf88's avatar gdlcf88

Basic CRUD features implement for product module

parent 6083b227
using EasyAbp.EShop.Products.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
namespace EasyAbp.EShop.Products.Authorization
{
public class ProductsPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
//var moduleGroup = context.AddGroup(ProductsPermissions.GroupName, L("Permission:Products"));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<ProductsResource>(name);
}
}
}
\ No newline at end of file
using Volo.Abp.Reflection;
namespace EasyAbp.EShop.Products.Authorization
{
public class ProductsPermissions
{
public const string GroupName = "Products";
public static string[] GetAll()
{
return ReflectionHelper.GetPublicConstantsRecursively(typeof(ProductsPermissions));
}
}
}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
using EasyAbp.EShop.Products.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
namespace EasyAbp.EShop.Products.Authorization
{
public class ProductsPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var moduleGroup = context.AddGroup(ProductsPermissions.GroupName, L("Permission:Products"));
var productTypes = moduleGroup.AddPermission(ProductsPermissions.ProductTypes.Default, L("Permission:ProductType"), MultiTenancySides.Host);
productTypes.AddChild(ProductsPermissions.ProductTypes.Create, L("Permission:Create"), MultiTenancySides.Host);
productTypes.AddChild(ProductsPermissions.ProductTypes.Update, L("Permission:Update"), MultiTenancySides.Host);
productTypes.AddChild(ProductsPermissions.ProductTypes.Delete, L("Permission:Delete"), MultiTenancySides.Host);
var categories = moduleGroup.AddPermission(ProductsPermissions.Categories.Default, L("Permission:Category"));
categories.AddChild(ProductsPermissions.Categories.CrossStore, L("Permission:CrossStore"));
categories.AddChild(ProductsPermissions.Categories.Create, L("Permission:Create"));
categories.AddChild(ProductsPermissions.Categories.Update, L("Permission:Update"));
categories.AddChild(ProductsPermissions.Categories.Delete, L("Permission:Delete"));
var product = moduleGroup.AddPermission(ProductsPermissions.Products.Default, L("Permission:Product"));
product.AddChild(ProductsPermissions.Products.CrossStore, L("Permission:CrossStore"));
product.AddChild(ProductsPermissions.Products.Create, L("Permission:Create"));
product.AddChild(ProductsPermissions.Products.Update, L("Permission:Update"));
product.AddChild(ProductsPermissions.Products.Delete, L("Permission:Delete"));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<ProductsResource>(name);
}
}
}
\ No newline at end of file
using Volo.Abp.Reflection;
namespace EasyAbp.EShop.Products.Authorization
{
public class ProductsPermissions
{
public const string GroupName = "Products";
public class ProductTypes
{
public const string Default = GroupName + ".ProductType";
public const string Delete = Default + ".Delete";
public const string Update = Default + ".Update";
public const string Create = Default + ".Create";
}
public class Categories
{
public const string Default = GroupName + ".Category";
public const string CrossStore = Default + ".CrossStore";
public const string Delete = Default + ".Delete";
public const string Update = Default + ".Update";
public const string Create = Default + ".Create";
}
public class Products
{
public const string Default = GroupName + ".Product";
public const string CrossStore = Default + ".CrossStore";
public const string Delete = Default + ".Delete";
public const string Update = Default + ".Update";
public const string Create = Default + ".Create";
}
public static string[] GetAll()
{
return ReflectionHelper.GetPublicConstantsRecursively(typeof(ProductsPermissions));
}
}
}
\ No newline at end of file
using System;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Categories.Dtos
{
public class CategoryDto : FullAuditedEntityDto<Guid>
{
public Guid? ParentCategoryId { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public string MediaResources { get; set; }
}
}
\ No newline at end of file
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace EasyAbp.EShop.Products.Categories.Dtos
{
public class CreateUpdateCategoryDto
{
[DisplayName("CategoryParentCategoryId")]
public Guid? ParentCategoryId { get; set; }
[Required]
[DisplayName("CategoryDisplayName")]
public string DisplayName { get; set; }
[DisplayName("CategoryDescription")]
public string Description { get; set; }
[DisplayName("CategoryMediaResources")]
public string MediaResources { get; set; }
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.Categories.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.Categories
{
public interface ICategoryAppService :
ICrudAppService<
CategoryDto,
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateCategoryDto,
CreateUpdateCategoryDto>
{
}
}
\ No newline at end of file
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace EasyAbp.EShop.Products.ProductCategories.Dtos
{
public class CreateUpdateProductCategoryDto
{
[DisplayName("ProductCategoryStoreId")]
public Guid? StoreId { get; set; }
[Required]
[DisplayName("ProductCategoryCategoryId")]
public Guid CategoryId { get; set; }
[Required]
[DisplayName("ProductCategoryProductId")]
public Guid ProductId { get; set; }
[DisplayName("ProductCategoryDisplayOrder")]
public int DisplayOrder { get; set; }
}
}
\ No newline at end of file
using System;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.ProductCategories.Dtos
{
public class ProductCategoryDto : AuditedEntityDto<Guid>
{
public Guid? StoreId { get; set; }
public Guid CategoryId { get; set; }
public Guid ProductId { get; set; }
public int DisplayOrder { get; set; }
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.ProductCategories.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.ProductCategories
{
public interface IProductCategoryAppService :
ICrudAppService<
ProductCategoryDto,
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateProductCategoryDto,
CreateUpdateProductCategoryDto>
{
}
}
\ No newline at end of file
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.MultiTenancy;
namespace EasyAbp.EShop.Products.ProductTypes.Dtos
{
public class CreateUpdateProductTypeDto
{
[Required]
[DisplayName("ProductTypeName")]
public string Name { get; set; }
[Required]
[DisplayName("ProductTypeDisplayName")]
public string DisplayName { get; set; }
[DisplayName("ProductTypeDescription")]
public string Description { get; set; }
[DisplayName("ProductTypeMultiTenancySide")]
public MultiTenancySides MultiTenancySide { get; set; }
}
}
\ No newline at end of file
using System;
using Volo.Abp.Application.Dtos;
using Volo.Abp.MultiTenancy;
namespace EasyAbp.EShop.Products.ProductTypes.Dtos
{
public class ProductTypeDto : FullAuditedEntityDto<Guid>
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public MultiTenancySides MultiTenancySide { get; set; }
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.ProductTypes.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.ProductTypes
{
public interface IProductTypeAppService :
ICrudAppService<
ProductTypeDto,
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateProductTypeDto,
CreateUpdateProductTypeDto>
{
}
}
\ No newline at end of file
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class CreateUpdateProductDetailDto
{
[DisplayName("ProductDetailDescription")]
public string Description { get; set; }
}
}
\ No newline at end of file
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class CreateUpdateProductDto
{
[DisplayName("ProductStoreId")]
public Guid? StoreId { get; set; }
[Required]
[DisplayName("ProductProductTypeId")]
public Guid ProductTypeId { get; set; }
[Required]
[DisplayName("ProductDisplayName")]
public string DisplayName { get; set; }
public CreateUpdateProductDetailDto ProductDetail { get; set; }
[DisplayName("ProductInventoryStrategy")]
public InventoryStrategy InventoryStrategy { get; set; }
[DisplayName("ProductMediaResources")]
public string MediaResources { get; set; }
[DisplayName("ProductIsPublished")]
public bool IsPublished { get; set; }
}
}
\ No newline at end of file
using System;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class GetProductListDto : PagedAndSortedResultRequestDto
{
public Guid? StoreId { get; set; }
public Guid? CategoryId { get; set; }
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class ProductAttributeDto : FullAuditedEntityDto<Guid>
{
[Required]
public string DisplayName { get; set; }
public string Description { get; set; }
public IEnumerable<ProductAttributeOptionDto> ProductAttributeOptions { get; set; }
}
}
\ No newline at end of file
using System;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class ProductAttributeOptionDto : FullAuditedEntityDto<Guid>
{
[Required]
public string DisplayName { get; set; }
public string Description { get; set; }
}
}
\ No newline at end of file
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class ProductDetailDto : EntityDto
{
public string Description { get; set; }
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class ProductDto : FullAuditedEntityDto<Guid>
{
public Guid? StoreId { get; set; }
public Guid ProductTypeId { get; set; }
public string DisplayName { get; set; }
public InventoryStrategy InventoryStrategy { get; set; }
public string MediaResources { get; set; }
public bool IsPublished { get; set; }
public ProductDetailDto ProductDetail { get; set; }
public IEnumerable<ProductAttributeDto> ProductAttributes { get; set; }
public IEnumerable<ProductSkuDto> ProductSkus { get; set; }
}
}
\ No newline at end of file
using System;
using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Products.Products.Dtos
{
public class ProductSkuDto : FullAuditedEntityDto<Guid>
{
public string SerializedAttributeOptionIds { get; set; }
public decimal OriginalPrice { get; set; }
public decimal Price { get; set; }
public int Inventory { get; set; }
public int Sold { get; set; }
public int OrderMinQuantity { get; set; }
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.Products.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductAppService :
ICrudAppService<
ProductDto,
Guid,
GetProductListDto,
CreateUpdateProductDto,
CreateUpdateProductDto>
{
}
}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
using System;
using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.Categories.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.Categories
{
public class CategoryAppService : CrudAppService<Category, CategoryDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateCategoryDto, CreateUpdateCategoryDto>,
ICategoryAppService
{
protected override string CreatePolicyName { get; set; } = ProductsPermissions.Categories.Create;
protected override string DeletePolicyName { get; set; } = ProductsPermissions.Categories.Delete;
protected override string UpdatePolicyName { get; set; } = ProductsPermissions.Categories.Update;
protected override string GetPolicyName { get; set; } = ProductsPermissions.Categories.Default;
protected override string GetListPolicyName { get; set; } = ProductsPermissions.Categories.Default;
private readonly ICategoryRepository _repository;
public CategoryAppService(ICategoryRepository repository) : base(repository)
{
_repository = repository;
}
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.ProductCategories.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.ProductCategories
{
public class ProductCategoryAppService : CrudAppService<ProductCategory, ProductCategoryDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateProductCategoryDto, CreateUpdateProductCategoryDto>,
IProductCategoryAppService
{
protected override string CreatePolicyName { get; set; } = ProductsPermissions.Products.Create;
protected override string DeletePolicyName { get; set; } = ProductsPermissions.Products.Delete;
protected override string UpdatePolicyName { get; set; } = ProductsPermissions.Products.Update;
protected override string GetPolicyName { get; set; } = ProductsPermissions.Products.Default;
protected override string GetListPolicyName { get; set; } = ProductsPermissions.Products.Default;
private readonly IProductCategoryRepository _repository;
public ProductCategoryAppService(IProductCategoryRepository repository) : base(repository)
{
_repository = repository;
}
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.ProductTypes.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace EasyAbp.EShop.Products.ProductTypes
{
public class ProductTypeAppService : CrudAppService<ProductType, ProductTypeDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateProductTypeDto, CreateUpdateProductTypeDto>,
IProductTypeAppService
{
protected override string CreatePolicyName { get; set; } = ProductsPermissions.ProductTypes.Create;
protected override string DeletePolicyName { get; set; } = ProductsPermissions.ProductTypes.Delete;
protected override string UpdatePolicyName { get; set; } = ProductsPermissions.ProductTypes.Update;
protected override string GetPolicyName { get; set; } = ProductsPermissions.ProductTypes.Default;
protected override string GetListPolicyName { get; set; } = ProductsPermissions.ProductTypes.Default;
private readonly IProductTypeRepository _repository;
public ProductTypeAppService(IProductTypeRepository repository) : base(repository)
{
_repository = repository;
}
}
}
\ No newline at end of file
using System;
using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.Authorization;
using EasyAbp.EShop.Products.ProductCategories;
using EasyAbp.EShop.Products.Products.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Threading;
namespace EasyAbp.EShop.Products.Products
{
public class ProductAppService : CrudAppService<Product, ProductDto, Guid, GetProductListDto, CreateUpdateProductDto, CreateUpdateProductDto>,
IProductAppService
{
protected override string CreatePolicyName { get; set; } = ProductsPermissions.Products.Create;
protected override string DeletePolicyName { get; set; } = ProductsPermissions.Products.Delete;
protected override string UpdatePolicyName { get; set; } = ProductsPermissions.Products.Update;
protected override string GetPolicyName { get; set; } = ProductsPermissions.Products.Default;
protected override string GetListPolicyName { get; set; } = ProductsPermissions.Products.Default;
private readonly IProductCategoryRepository _productCategoryRepository;
private readonly IProductRepository _repository;
public ProductAppService(
IProductCategoryRepository productCategoryRepository,
IProductRepository repository) : base(repository)
{
_productCategoryRepository = productCategoryRepository;
_repository = repository;
}
protected override IQueryable<Product> CreateFilteredQuery(GetProductListDto input)
{
var query = base.CreateFilteredQuery(input);
if (input.CategoryId.HasValue)
{
var productIds = AsyncHelper
.RunSync(() => _productCategoryRepository.GetListByCategoryId(input.CategoryId.Value, input.StoreId))
.Select(pc => pc.ProductId).ToList();
query = query.Where(p => productIds.Contains(p.Id));
}
else if (input.StoreId.HasValue)
{
query = query.Where(p => p.StoreId == input.StoreId);
}
return query;
}
public override async Task<ProductDto> CreateAsync(CreateUpdateProductDto input)
{
await CheckCreatePolicyAsync();
var entity = MapToEntity(input);
TryToSetTenantId(entity);
await Repository.InsertAsync(entity, autoSave: true);
return MapToGetOutputDto(entity);
}
}
}
\ No newline at end of file
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.Products.Dtos;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.Categories.Dtos;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Products.ProductTypes.Dtos;
using EasyAbp.EShop.Products.ProductCategories;
using EasyAbp.EShop.Products.ProductCategories.Dtos;
using AutoMapper;
using Volo.Abp.AutoMapper;
namespace EasyAbp.EShop.Products
{
public class ProductsApplicationAutoMapperProfile : Profile
{
public ProductsApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<Product, ProductDto>();
CreateMap<ProductDetail, ProductDetailDto>();
CreateMap<ProductAttribute, ProductAttributeDto>();
CreateMap<ProductAttributeOption, ProductAttributeOptionDto>();
CreateMap<ProductSku, ProductSkuDto>();
CreateMap<CreateUpdateProductDto, Product>(MemberList.Source)
.Ignore(p => p.ProductDetail)
.Ignore(p => p.ProductAttributes)
.Ignore(p => p.ProductSkus);
CreateMap<CreateUpdateProductDetailDto, ProductDetail>(MemberList.Source);
CreateMap<Category, CategoryDto>();
CreateMap<CreateUpdateCategoryDto, Category>(MemberList.Source);
CreateMap<ProductType, ProductTypeDto>();
CreateMap<CreateUpdateProductTypeDto, ProductType>(MemberList.Source);
CreateMap<ProductCategory, ProductCategoryDto>();
CreateMap<CreateUpdateProductCategoryDto, ProductCategory>(MemberList.Source);
}
}
}
using AutoMapper;
namespace EasyAbp.EShop.Products
{
public class ProductsApplicationAutoMapperProfile : Profile
{
public ProductsApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
}
}
}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Localization\Products\*.json" /> <EmbeddedResource Include="EasyAbp\EShop\Products\Localization\Products\*.json" />
<Content Remove="Localization\Products\*.json" /> <Content Remove="EasyAbp\EShop\Products\Localization\Products\*.json" />
</ItemGroup> </ItemGroup>
</Project> </Project>
...@@ -17,7 +17,7 @@ namespace EasyAbp.EShop.Products ...@@ -17,7 +17,7 @@ namespace EasyAbp.EShop.Products
{ {
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<EShopProductsDomainSharedModule>("EasyAbp.EShop.Products"); options.FileSets.AddEmbedded<EShopProductsDomainSharedModule>();
}); });
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
...@@ -25,12 +25,12 @@ namespace EasyAbp.EShop.Products ...@@ -25,12 +25,12 @@ namespace EasyAbp.EShop.Products
options.Resources options.Resources
.Add<ProductsResource>("en") .Add<ProductsResource>("en")
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/Products"); .AddVirtualJson("/EasyAbp/EShop/Products/Localization/Products");
}); });
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>
{ {
options.MapCodeNamespace("Products", typeof(ProductsResource)); options.MapCodeNamespace("EasyAbp.EShop.Products", typeof(ProductsResource));
}); });
} }
} }
......
{
"culture": "cs",
"texts": {
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "en",
"texts": {
"ManageYourProfile": "Manage your profile",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "pl",
"texts": {
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "pt-BR",
"texts": {
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "sl",
"texts": {
"ManageYourProfile": "Upravljajte svojim profilom",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "tr",
"texts": {
"ManageYourProfile": "Profil y�netimi",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "vi",
"texts": {
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "zh-Hans",
"texts": {
"ManageYourProfile": "管理个人资料",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "zh-Hant",
"texts": {
"ManageYourProfile": "管理個人資料",
"Menu:Product": "MenuProduct",
"Product": "Product",
"ProductTenantId": "ProductTenantId",
"ProductStoreId": "ProductStoreId",
"ProductProductTypeId": "ProductProductTypeId",
"ProductDisplayName": "ProductDisplayName",
"ProductDetailDescription": "ProductDetailDescription",
"ProductInventoryStrategy": "ProductInventoryStrategy",
"ProductIsPublished": "ProductIsPublished",
"ProductMediaResources": "ProductMediaResources",
"CreateProduct": "CreateProduct",
"EditProduct": "EditProduct",
"ProductDeletionConfirmationMessage": "Are you sure to delete the product {0}?",
"SuccessfullyDeleted": "Successfully deleted",
"Menu:Category": "MenuCategory",
"Category": "Category",
"CategoryTenantId": "CategoryTenantId",
"CategoryParentCategoryId": "CategoryParentCategoryId",
"CategoryDisplayName": "CategoryDisplayName",
"CategoryDescription": "CategoryDescription",
"CategoryMediaResources": "CategoryMediaResources",
"CreateCategory": "CreateCategory",
"EditCategory": "EditCategory",
"CategoryDeletionConfirmationMessage": "Are you sure to delete the category {0}?",
"Menu:ProductType": "MenuProductType",
"ProductType": "ProductType",
"ProductTypeName": "ProductTypeName",
"ProductTypeDisplayName": "ProductTypeDisplayName",
"ProductTypeDescription": "ProductTypeDescription",
"ProductTypeMultiTenancySide": "ProductTypeMultiTenancySide",
"CreateProductType": "CreateProductType",
"EditProductType": "EditProductType",
"ProductTypeDeletionConfirmationMessage": "Are you sure to delete the producttype {0}?",
"Menu:ProductCategory": "MenuProductCategory",
"ProductCategory": "ProductCategory",
"ProductCategoryTenantId": "ProductCategoryTenantId",
"ProductCategoryStoreId": "ProductCategoryStoreId",
"ProductCategoryCategoryId": "ProductCategoryCategoryId",
"ProductCategoryProductId": "ProductCategoryProductId",
"ProductCategoryDisplayOrder": "ProductCategoryDisplayOrder",
"CreateProductCategory": "CreateProductCategory",
"EditProductCategory": "EditProductCategory",
"ProductCategoryDeletionConfirmationMessage": "Are you sure to delete the productcategory {0}?"
}
}
\ No newline at end of file
{
"culture": "en",
"texts": {
"ManageYourProfile": "Manage your profile"
}
}
\ No newline at end of file
{
"culture": "sl",
"texts": {
"ManageYourProfile": "Upravljajte svojim profilom"
}
}
\ No newline at end of file
{
"culture": "tr",
"texts": {
"ManageYourProfile": "Profil ynetimi"
}
}
\ No newline at end of file
{
"culture": "zh-Hans",
"texts": {
"ManageYourProfile": "管理个人资料"
}
}
\ No newline at end of file
{
"culture": "zh-Hant",
"texts": {
"ManageYourProfile": "管理個人資料"
}
}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
using System; using System;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
...@@ -19,5 +19,25 @@ namespace EasyAbp.EShop.Products.Categories ...@@ -19,5 +19,25 @@ namespace EasyAbp.EShop.Products.Categories
[CanBeNull] [CanBeNull]
public virtual string MediaResources { get; protected set; } public virtual string MediaResources { get; protected set; }
protected Category()
{
}
public Category(
Guid id,
Guid? tenantId,
Guid? parentCategoryId,
string displayName,
string description,
string mediaResources
) :base(id)
{
TenantId = tenantId;
ParentCategoryId = parentCategoryId;
DisplayName = displayName;
Description = description;
MediaResources = mediaResources;
}
} }
} }
\ No newline at end of file
using System;
using Volo.Abp.Domain.Repositories;
namespace EasyAbp.EShop.Products.Categories
{
public interface ICategoryRepository : IRepository<Category, Guid>
{
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace EasyAbp.EShop.Products.ProductCategories
{
public interface IProductCategoryRepository : IRepository<ProductCategory, Guid>
{
Task<IEnumerable<ProductCategory>> GetListByCategoryId(Guid categoryId, Guid? storeId, CancellationToken cancellationToken = default);
Task<IEnumerable<ProductCategory>> GetListByProductId(Guid productId, Guid? storeId, CancellationToken cancellationToken = default);
}
}
\ No newline at end of file
using System; using System;
using EasyAbp.EShop.Stores.Stores; using EasyAbp.EShop.Stores.Stores;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
...@@ -16,5 +16,25 @@ namespace EasyAbp.EShop.Products.ProductCategories ...@@ -16,5 +16,25 @@ namespace EasyAbp.EShop.Products.ProductCategories
public virtual Guid ProductId { get; protected set; } public virtual Guid ProductId { get; protected set; }
public virtual int DisplayOrder { get; protected set; } public virtual int DisplayOrder { get; protected set; }
protected ProductCategory()
{
}
public ProductCategory(
Guid id,
Guid? tenantId,
Guid? storeId,
Guid categoryId,
Guid productId,
int displayOrder
) :base(id)
{
TenantId = tenantId;
StoreId = storeId;
CategoryId = categoryId;
ProductId = productId;
DisplayOrder = displayOrder;
}
} }
} }
\ No newline at end of file
using System;
using Volo.Abp.Domain.Repositories;
namespace EasyAbp.EShop.Products.ProductTypes
{
public interface IProductTypeRepository : IRepository<ProductType, Guid>
{
}
}
\ No newline at end of file
using System; using System;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
...@@ -16,5 +16,23 @@ namespace EasyAbp.EShop.Products.ProductTypes ...@@ -16,5 +16,23 @@ namespace EasyAbp.EShop.Products.ProductTypes
public virtual string Description { get; protected set; } public virtual string Description { get; protected set; }
public virtual MultiTenancySides MultiTenancySide { get; protected set; } public virtual MultiTenancySides MultiTenancySide { get; protected set; }
protected ProductType()
{
}
public ProductType(
Guid id,
string name,
string displayName,
string description,
MultiTenancySides multiTenancySide
) :base(id)
{
Name = name;
DisplayName = displayName;
Description = description;
MultiTenancySide = multiTenancySide;
}
} }
} }
\ No newline at end of file
using System;
using Volo.Abp.Domain.Repositories;
namespace EasyAbp.EShop.Products.Products
{
public interface IProductRepository : IRepository<Product, Guid>
{
}
}
\ No newline at end of file
using System; using System;
using System.Collections.Generic;
using EasyAbp.EShop.Stores.Stores; using EasyAbp.EShop.Stores.Stores;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
...@@ -18,10 +19,40 @@ namespace EasyAbp.EShop.Products.Products ...@@ -18,10 +19,40 @@ namespace EasyAbp.EShop.Products.Products
public virtual string DisplayName { get; protected set; } public virtual string DisplayName { get; protected set; }
public virtual InventoryStrategy InventoryStrategy { get; protected set; } public virtual InventoryStrategy InventoryStrategy { get; protected set; }
public virtual bool IsPublished { get; protected set; }
[CanBeNull] [CanBeNull]
public virtual string MediaResources { get; protected set; } public virtual string MediaResources { get; protected set; }
public virtual bool IsPublished { get; protected set; }
public virtual ProductDetail ProductDetail { get; protected set; }
public virtual IEnumerable<ProductAttribute> ProductAttributes { get; protected set; }
public virtual IEnumerable<ProductSku> ProductSkus { get; protected set; }
protected Product()
{
}
public Product(
Guid id,
Guid? tenantId,
Guid? storeId,
Guid productTypeId,
string displayName,
InventoryStrategy inventoryStrategy,
bool isPublished,
string mediaResources
) :base(id)
{
TenantId = tenantId;
StoreId = storeId;
ProductTypeId = productTypeId;
DisplayName = displayName;
InventoryStrategy = inventoryStrategy;
IsPublished = isPublished;
MediaResources = mediaResources;
}
} }
} }
\ No newline at end of file
using System; using System;
using System.Collections.Generic;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
...@@ -11,5 +12,7 @@ namespace EasyAbp.EShop.Products.Products ...@@ -11,5 +12,7 @@ namespace EasyAbp.EShop.Products.Products
[CanBeNull] [CanBeNull]
public virtual string Description { get; protected set; } public virtual string Description { get; protected set; }
public virtual IEnumerable<ProductAttributeOption> ProductAttributeOptions { get; protected set; }
} }
} }
\ No newline at end of file
...@@ -10,6 +10,16 @@ namespace EasyAbp.EShop.Products.Products ...@@ -10,6 +10,16 @@ namespace EasyAbp.EShop.Products.Products
[CanBeNull] [CanBeNull]
public virtual string Description { get; protected set; } public virtual string Description { get; protected set; }
protected ProductDetail() {}
public ProductDetail(
Guid productId,
[CanBeNull] string description)
{
ProductId = productId;
Description = description;
}
public override object[] GetKeys() public override object[] GetKeys()
{ {
......
...@@ -13,6 +13,8 @@ namespace EasyAbp.EShop.Products.Products ...@@ -13,6 +13,8 @@ namespace EasyAbp.EShop.Products.Products
public virtual int Inventory { get; protected set; } public virtual int Inventory { get; protected set; }
public virtual int Sold { get; protected set; }
public virtual int OrderMinQuantity { get; protected set; } public virtual int OrderMinQuantity { get; protected set; }
} }
} }
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
...@@ -12,4 +12,8 @@ ...@@ -12,4 +12,8 @@
<ProjectReference Include="..\EasyAbp.EShop.Products.Domain\EasyAbp.EShop.Products.Domain.csproj" /> <ProjectReference Include="..\EasyAbp.EShop.Products.Domain\EasyAbp.EShop.Products.Domain.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="EasyAbp\EShop\Products" />
</ItemGroup>
</Project> </Project>
using System;
using EasyAbp.EShop.Products.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace EasyAbp.EShop.Products.Categories
{
public class CategoryRepository : EfCoreRepository<ProductsDbContext, Category, Guid>, ICategoryRepository
{
public CategoryRepository(IDbContextProvider<ProductsDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
}
\ No newline at end of file
using Microsoft.Extensions.DependencyInjection; using EasyAbp.EShop.Products.ProductCategories;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.Products;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
...@@ -17,7 +21,11 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore ...@@ -17,7 +21,11 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
/* Add custom repositories here. Example: /* Add custom repositories here. Example:
* options.AddRepository<Question, EfCoreQuestionRepository>(); * options.AddRepository<Question, EfCoreQuestionRepository>();
*/ */
options.AddRepository<Product, ProductRepository>();
options.AddRepository<Category, CategoryRepository>();
options.AddRepository<ProductType, ProductTypeRepository>();
options.AddRepository<ProductCategory, ProductCategoryRepository>();
}); });
} }
} }
} }
\ No newline at end of file
using Volo.Abp.Data; using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Products.ProductCategories;
namespace EasyAbp.EShop.Products.EntityFrameworkCore namespace EasyAbp.EShop.Products.EntityFrameworkCore
{ {
...@@ -9,5 +14,13 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore ...@@ -9,5 +14,13 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
/* Add DbSet for each Aggregate Root here. Example: /* Add DbSet for each Aggregate Root here. Example:
* DbSet<Question> Questions { get; } * DbSet<Question> Questions { get; }
*/ */
DbSet<Product> Products { get; set; }
DbSet<ProductDetail> ProductDetails { get; set; }
DbSet<ProductAttribute> ProductAttributes { get; set; }
DbSet<ProductAttributeOption> ProductAttributeOptions { get; set; }
DbSet<ProductSku> ProductSkus { get; set; }
DbSet<Category> Categories { get; set; }
DbSet<ProductType> ProductTypes { get; set; }
DbSet<ProductCategory> ProductCategories { get; set; }
} }
} }
\ No newline at end of file
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Products.ProductCategories;
namespace EasyAbp.EShop.Products.EntityFrameworkCore namespace EasyAbp.EShop.Products.EntityFrameworkCore
{ {
...@@ -10,6 +14,14 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore ...@@ -10,6 +14,14 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
/* Add DbSet for each Aggregate Root here. Example: /* Add DbSet for each Aggregate Root here. Example:
* public DbSet<Question> Questions { get; set; } * public DbSet<Question> Questions { get; set; }
*/ */
public DbSet<Product> Products { get; set; }
public DbSet<ProductDetail> ProductDetails { get; set; }
public DbSet<ProductAttribute> ProductAttributes { get; set; }
public DbSet<ProductAttributeOption> ProductAttributeOptions { get; set; }
public DbSet<ProductSku> ProductSkus { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<ProductType> ProductTypes { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
public ProductsDbContext(DbContextOptions<ProductsDbContext> options) public ProductsDbContext(DbContextOptions<ProductsDbContext> options)
: base(options) : base(options)
...@@ -24,4 +36,4 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore ...@@ -24,4 +36,4 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
builder.ConfigureProducts(); builder.ConfigureProducts();
} }
} }
} }
\ No newline at end of file
using System; using EasyAbp.EShop.Products.ProductCategories;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Products.Categories;
using EasyAbp.EShop.Products.Products;
using System;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace EasyAbp.EShop.Products.EntityFrameworkCore namespace EasyAbp.EShop.Products.EntityFrameworkCore
{ {
...@@ -38,6 +43,63 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore ...@@ -38,6 +43,63 @@ namespace EasyAbp.EShop.Products.EntityFrameworkCore
b.HasIndex(q => q.CreationTime); b.HasIndex(q => q.CreationTime);
}); });
*/ */
builder.Entity<Product>(b =>
{
b.ToTable(options.TablePrefix + "Products", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<ProductDetail>(b =>
{
b.ToTable(options.TablePrefix + "ProductDetails", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
b.HasKey(x => new { x.ProductId });
});
builder.Entity<ProductAttribute>(b =>
{
b.ToTable(options.TablePrefix + "ProductAttributes", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<ProductAttributeOption>(b =>
{
b.ToTable(options.TablePrefix + "ProductAttributeOptions", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<ProductSku>(b =>
{
b.ToTable(options.TablePrefix + "ProductSkus", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<Category>(b =>
{
b.ToTable(options.TablePrefix + "Categories", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<ProductType>(b =>
{
b.ToTable(options.TablePrefix + "ProductTypes", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
builder.Entity<ProductCategory>(b =>
{
b.ToTable(options.TablePrefix + "ProductCategories", options.Schema);
b.ConfigureByConvention();
/* Configure more properties here */
});
} }
} }
} }
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace EasyAbp.EShop.Products.ProductCategories
{
public class ProductCategoryRepository : EfCoreRepository<ProductsDbContext, ProductCategory, Guid>, IProductCategoryRepository
{
public ProductCategoryRepository(IDbContextProvider<ProductsDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public async Task<IEnumerable<ProductCategory>> GetListByCategoryId(Guid categoryId, Guid? storeId,
CancellationToken cancellationToken = default)
{
return await GetQueryable().Where(pc => pc.CategoryId == categoryId && pc.StoreId == storeId)
.ToListAsync(cancellationToken);
}
public async Task<IEnumerable<ProductCategory>> GetListByProductId(Guid productId, Guid? storeId,
CancellationToken cancellationToken = default)
{
return await GetQueryable().Where(pc => pc.ProductId == productId && pc.StoreId == storeId)
.ToListAsync(cancellationToken);
}
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace EasyAbp.EShop.Products.ProductTypes
{
public class ProductTypeRepository : EfCoreRepository<ProductsDbContext, ProductType, Guid>, IProductTypeRepository
{
public ProductTypeRepository(IDbContextProvider<ProductsDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
}
\ No newline at end of file
using System;
using EasyAbp.EShop.Products.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace EasyAbp.EShop.Products.Products
{
public class ProductRepository : EfCoreRepository<ProductsDbContext, Product, Guid>, IProductRepository
{
public ProductRepository(IDbContextProvider<ProductsDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
}
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>EasyAbp.EShop.Products</RootNamespace> <RootNamespace />
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
...@@ -12,4 +12,8 @@ ...@@ -12,4 +12,8 @@
<ProjectReference Include="..\EasyAbp.EShop.Products.Domain\EasyAbp.EShop.Products.Domain.csproj" /> <ProjectReference Include="..\EasyAbp.EShop.Products.Domain\EasyAbp.EShop.Products.Domain.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="EasyAbp\EShop\Products" />
</ItemGroup>
</Project> </Project>
...@@ -36,7 +36,20 @@ ...@@ -36,7 +36,20 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Pages\EShop\Products\Products" />
<Folder Include="wwwroot\" /> <Folder Include="wwwroot\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="Pages\Products\Products\Product\CreateModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\Products\Products\Product\EditModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\Products\Products\Product\Index.cshtml" />
<_ContentIncludedByDefault Remove="Pages\EShop\ProductTypes\ProductType\CreateModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\EShop\ProductTypes\ProductType\EditModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\EShop\ProductTypes\ProductType\Index.cshtml" />
<_ContentIncludedByDefault Remove="Pages\Categories\Category\CreateModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\Categories\Category\EditModal.cshtml" />
<_ContentIncludedByDefault Remove="Pages\Categories\Category\Index.cshtml" />
</ItemGroup>
</Project> </Project>
@page
@inherits EasyAbp.EShop.Products.Web.Pages.ProductsPage
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@model EasyAbp.EShop.Products.Web.Pages.EShop.Products.Categories.Category.CreateModalModel
@{
Layout = null;
}
<abp-dynamic-form abp-model="Category" data-ajaxForm="true" asp-page="CreateModal">
<abp-modal>
<abp-modal-header title="@L["CreateCategory"].Value"></abp-modal-header>
<abp-modal-body>
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment