Browse Source

Complete changes of store owner

pull/81/head
gdlcf88 6 years ago
parent
commit
9efc63fa24
  1. 7
      EShop.sln
  2. 1
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs
  3. 2
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs
  4. 3
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/OrdersApplicationAutoMapperProfile.cs
  5. 3
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Web/OrdersWebAutoMapperProfile.cs
  6. 2
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Categories/CategoryAppService.cs
  7. 1
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/EShopProductsApplicationModule.cs
  8. 30
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductInventories/ProductInventoryAppService.cs
  9. 23
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs
  10. 15
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/Dtos/CreateUpdateStoreOwnerDto.cs
  11. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/Dtos/StoreOwnerDto.cs
  12. 4
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/IStoreOwnerAppService.cs
  13. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/Stores/Dtos/CreateUpdateStoreDto.cs
  14. 8
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/BasicStorePermissionAuthorizationHandler.cs
  15. 9
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StoreInfo.cs
  16. 28
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StoreOwnerAuthorizationExtensions.cs
  17. 7
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StorePermissionAuthorizationRequirement.cs
  18. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/EShopStoresApplicationSharedModule.cs
  19. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Stores/MultiStoreAbstractKeyCrudAppService.cs
  20. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Stores/MultiStoreAbstractKeyReadOnlyAppService.cs
  21. 1
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/EShopStoresApplicationModule.cs
  22. 4
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/StoreOwners/StoreOwnerAppService.cs
  23. 13
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/StoresApplicationAutoMapperProfile.cs
  24. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/cs.json
  25. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/en.json
  26. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/pl.json
  27. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/pt-BR.json
  28. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/sl.json
  29. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/tr.json
  30. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/vi.json
  31. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/zh-Hans.json
  32. 3
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/zh-Hant.json
  33. 4
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.HttpApi/EasyAbp/EShop/Stores/StoreOwners/StoreOwnerController.cs
  34. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/CreateModal.cshtml.cs
  35. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/EditModal.cshtml.cs
  36. 4
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/ViewModels/CreateStoreOwnerViewModel.cs
  37. 2
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/Stores/Store/ViewModels/CreateEditStoreViewModel.cs
  38. 14
      modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/StoresWebAutoMapperProfile.cs
  39. 4295
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200901080859_AddedStoreOwnerEntity.Designer.cs
  40. 46
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200901080859_AddedStoreOwnerEntity.cs
  41. 64
      samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/EShopSampleMigrationsDbContextModelSnapshot.cs

7
EShop.sln

@ -305,6 +305,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{D261
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EShopSample", "EShopSample", "{FE0A5FD6-AEE7-4738-9A6D-261BF086704D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyAbp.EShop.Stores.Application.Shared", "modules\EasyAbp.EShop.Stores\src\EasyAbp.EShop.Stores.Application.Shared\EasyAbp.EShop.Stores.Application.Shared.csproj", "{06700175-4E04-4993-A1FB-24E7A8835E19}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -795,6 +797,10 @@ Global
{5929D955-4E2C-4E84-B9D7-F32A3375A1AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5929D955-4E2C-4E84-B9D7-F32A3375A1AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5929D955-4E2C-4E84-B9D7-F32A3375A1AA}.Release|Any CPU.Build.0 = Release|Any CPU
{06700175-4E04-4993-A1FB-24E7A8835E19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06700175-4E04-4993-A1FB-24E7A8835E19}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06700175-4E04-4993-A1FB-24E7A8835E19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{06700175-4E04-4993-A1FB-24E7A8835E19}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -947,6 +953,7 @@ Global
{F5CD8112-382D-42AC-9D91-46B91D64FACB} = {9333EF8D-0A21-4586-81EB-9C39ECA2873C}
{5929D955-4E2C-4E84-B9D7-F32A3375A1AA} = {9333EF8D-0A21-4586-81EB-9C39ECA2873C}
{FE0A5FD6-AEE7-4738-9A6D-261BF086704D} = {D261DC47-83D7-4B7C-941E-E27291C78A52}
{06700175-4E04-4993-A1FB-24E7A8835E19} = {8CB54A0E-BAAE-4D10-81B5-6F902A7950EB}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}

1
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/EShopOrdersApplicationModule.cs

@ -12,6 +12,7 @@ namespace EasyAbp.EShop.Orders
typeof(EShopOrdersApplicationContractsModule),
typeof(EShopProductsApplicationContractsModule),
typeof(EShopStoresDomainSharedModule),
typeof(EShopStoresApplicationSharedModule),
typeof(AbpDddApplicationModule),
typeof(AbpAutoMapperModule)
)]

2
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/OrderAppService.cs

@ -6,7 +6,7 @@ using EasyAbp.EShop.Orders.Authorization;
using EasyAbp.EShop.Orders.Orders.Dtos;
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.Products.Dtos;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using EasyAbp.EShop.Stores.Stores;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;

3
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/OrdersApplicationAutoMapperProfile.cs

@ -12,8 +12,7 @@ namespace EasyAbp.EShop.Orders
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<Order, OrderDto>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<Order, OrderDto>();
CreateMap<OrderLine, OrderLineDto>();
}
}

3
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Web/OrdersWebAutoMapperProfile.cs

@ -11,9 +11,6 @@ namespace EasyAbp.EShop.Orders.Web
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<OrderDto, CreateOrderDto>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<OrderLineDto, CreateOrderLineDto>();
}
}
}

2
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Categories/CategoryAppService.cs

@ -3,7 +3,7 @@ using System.Linq;
using System.Threading.Tasks;
using EasyAbp.EShop.Products.Categories.Dtos;
using EasyAbp.EShop.Products.Permissions;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;

1
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/EShopProductsApplicationModule.cs

@ -11,6 +11,7 @@ namespace EasyAbp.EShop.Products
typeof(EShopProductsDomainModule),
typeof(EShopProductsApplicationContractsModule),
typeof(EShopStoresDomainSharedModule),
typeof(EShopStoresApplicationSharedModule),
typeof(AbpDddApplicationModule),
typeof(AbpAutoMapperModule),
typeof(AbpTreesApplicationModule)

30
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductInventories/ProductInventoryAppService.cs

@ -2,7 +2,7 @@ using EasyAbp.EShop.Products.Permissions;
using EasyAbp.EShop.Products.ProductInventories.Dtos;
using EasyAbp.EShop.Products.Products;
using EasyAbp.EShop.Products.ProductStores;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using Microsoft.AspNetCore.Authorization;
using System;
using System.Threading.Tasks;
@ -42,22 +42,16 @@ namespace EasyAbp.EShop.Products.ProductInventories
return ObjectMapper.Map<ProductInventory, ProductInventoryDto>(productInventory);
}
[Authorize(ProductsPermissions.ProductInventory.Update)]
public virtual async Task<ProductInventoryDto> UpdateAsync(UpdateProductInventoryDto input)
{
if (!await AuthorizationService.IsGrantedAsync(ProductsPermissions.ProductInventory.CrossStore))
{
if (!input.StoreId.HasValue)
{
throw new AbpValidationException("StoreId should not be null.");
}
await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId,
ProductsPermissions.ProductInventory.Update, ProductsPermissions.ProductInventory.CrossStore);
await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId.Value,
ProductsPermissions.ProductInventory.Update);
await _productStoreRepository.GetAsync(input.ProductId, input.StoreId.Value);
if (input.StoreId.HasValue)
{
await CheckStoreIsProductOwnerAsync(input.ProductId, input.StoreId.Value);
}
var productInventory = await _repository.FindAsync(x => x.ProductSkuId == input.ProductSkuId);
if (productInventory == null)
@ -72,6 +66,16 @@ namespace EasyAbp.EShop.Products.ProductInventories
return ObjectMapper.Map<ProductInventory, ProductInventoryDto>(productInventory);
}
protected virtual async Task CheckStoreIsProductOwnerAsync(Guid productId, Guid storeId)
{
var productStore = await _productStoreRepository.GetAsync(productId, storeId);
if (!productStore.IsOwner)
{
throw new StoreIsNotProductOwnerException(productId, storeId);
}
}
protected virtual async Task ChangeInventoryAsync(ProductInventory productInventory, int changedInventory)
{

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

@ -2,7 +2,7 @@ using EasyAbp.EShop.Products.Permissions;
using EasyAbp.EShop.Products.Products.Dtos;
using EasyAbp.EShop.Products.ProductStores;
using EasyAbp.EShop.Products.ProductTypes;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using System;
using System.Collections.Generic;
using System.Linq;
@ -25,7 +25,6 @@ namespace EasyAbp.EShop.Products.Products
protected override string GetListPolicyName { get; set; } = null;
private readonly IProductManager _productManager;
private readonly IProductPriceProvider _productPriceProvider;
private readonly IProductInventoryProvider _productInventoryProvider;
private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer;
private readonly IProductStoreRepository _productStoreRepository;
@ -34,7 +33,6 @@ namespace EasyAbp.EShop.Products.Products
public ProductAppService(
IProductManager productManager,
IProductPriceProvider productPriceProvider,
IProductInventoryProvider productInventoryProvider,
IAttributeOptionIdsSerializer attributeOptionIdsSerializer,
IProductStoreRepository productStoreRepository,
@ -42,7 +40,6 @@ namespace EasyAbp.EShop.Products.Products
IProductRepository repository) : base(repository)
{
_productManager = productManager;
_productPriceProvider = productPriceProvider;
_productInventoryProvider = productInventoryProvider;
_attributeOptionIdsSerializer = attributeOptionIdsSerializer;
_productStoreRepository = productStoreRepository;
@ -66,7 +63,8 @@ namespace EasyAbp.EShop.Products.Products
public override async Task<ProductDto> CreateAsync(CreateUpdateProductDto input)
{
await CheckCreatePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId, CreatePolicyName,
ProductsPermissions.Products.CrossStore);
var product = MapToEntity(input);
@ -86,7 +84,8 @@ namespace EasyAbp.EShop.Products.Products
public override async Task<ProductDto> UpdateAsync(Guid id, CreateUpdateProductDto input)
{
await CheckUpdatePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(input.StoreId, UpdatePolicyName,
ProductsPermissions.Products.CrossStore);
await CheckStoreIsProductOwnerAsync(id, input.StoreId);
@ -347,7 +346,8 @@ namespace EasyAbp.EShop.Products.Products
public async Task DeleteAsync(Guid id, Guid storeId)
{
await CheckDeletePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(storeId, DeletePolicyName,
ProductsPermissions.Products.CrossStore);
var product = await GetEntityByIdAsync(id);
@ -368,7 +368,8 @@ namespace EasyAbp.EShop.Products.Products
public async Task<ProductDto> CreateSkuAsync(Guid productId, Guid storeId, CreateProductSkuDto input)
{
await CheckUpdatePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(storeId, UpdatePolicyName,
ProductsPermissions.Products.CrossStore);
await CheckStoreIsProductOwnerAsync(productId, storeId);
@ -393,7 +394,8 @@ namespace EasyAbp.EShop.Products.Products
public async Task<ProductDto> UpdateSkuAsync(Guid productId, Guid productSkuId, Guid storeId,
UpdateProductSkuDto input)
{
await CheckUpdatePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(storeId, UpdatePolicyName,
ProductsPermissions.Products.CrossStore);
await CheckStoreIsProductOwnerAsync(productId, storeId);
@ -417,7 +419,8 @@ namespace EasyAbp.EShop.Products.Products
public async Task<ProductDto> DeleteSkuAsync(Guid productId, Guid productSkuId, Guid storeId)
{
await CheckUpdatePolicyAsync();
await AuthorizationService.CheckMultiStorePolicyAsync(storeId, UpdatePolicyName,
ProductsPermissions.Products.CrossStore);
await CheckStoreIsProductOwnerAsync(productId, storeId);

15
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/Dtos/CreateUpdateStoreOwnerDto.cs

@ -0,0 +1,15 @@
using System;
using System.ComponentModel.DataAnnotations;
using EasyAbp.EShop.Stores.Stores;
namespace EasyAbp.EShop.Stores.StoreOwners.Dtos
{
public class CreateUpdateStoreOwnerDto : IMultiStore
{
[Required]
public Guid StoreId { get; set; }
[Required]
public Guid OwnerUserId { get; set; }
}
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/Dtos/StoreOwnerDto.cs

@ -7,10 +7,8 @@ namespace EasyAbp.EShop.Stores.StoreOwners.Dtos
{
public class StoreOwnerDto : ExtensibleFullAuditedEntityDto<Guid>, IMultiStore
{
[Required]
public Guid StoreId { get; set; }
[Required]
public Guid OwnerUserId { get; set; }
}
}

4
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/StoreOwners/IStoreOwnerAppService.cs

@ -9,7 +9,9 @@ namespace EasyAbp.EShop.Stores.StoreOwners
ICrudAppService<
StoreOwnerDto,
Guid,
GetStoreOwnerListDto>
GetStoreOwnerListDto,
CreateUpdateStoreOwnerDto,
CreateUpdateStoreOwnerDto>
{
}
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Contracts/EasyAbp/EShop/Stores/Stores/Dtos/CreateUpdateStoreDto.cs

@ -6,7 +6,7 @@ using Volo.Abp.Application.Dtos;
namespace EasyAbp.EShop.Stores.Stores.Dtos
{
public class CreateUpdateStoreDto : ExtensibleEntityDto
public class CreateUpdateStoreDto
{
[Required]
[DisplayName("StoreName")]

8
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Permissions/BasicStorePermissionAuthorizationHandler.cs → modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/BasicStorePermissionAuthorizationHandler.cs

@ -5,9 +5,9 @@ using System.Security.Principal;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
namespace EasyAbp.EShop.Stores.Permissions
namespace EasyAbp.EShop.Stores.Authorization
{
public class BasicStorePermissionAuthorizationHandler : AuthorizationHandler<StorePermissionAuthorizationRequirement>
public class BasicStorePermissionAuthorizationHandler : AuthorizationHandler<StorePermissionAuthorizationRequirement, StoreInfo>
{
private readonly IStoreOwnerStore _storeOwnerStore;
private readonly IPermissionChecker _permissionChecker;
@ -19,12 +19,12 @@ namespace EasyAbp.EShop.Stores.Permissions
_permissionChecker = permissionChecker;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, StorePermissionAuthorizationRequirement requirement)
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, StorePermissionAuthorizationRequirement requirement, StoreInfo storeInfo)
{
var userId = context.User?.FindUserId();
if (userId.HasValue)
{
var isStoreOwner = await _storeOwnerStore.IsStoreOwnerAsync(requirement.StoreId, userId.Value);
var isStoreOwner = await _storeOwnerStore.IsStoreOwnerAsync(storeInfo.StoreId, userId.Value);
if (isStoreOwner)
{

9
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StoreInfo.cs

@ -0,0 +1,9 @@
using System;
namespace EasyAbp.EShop.Stores.Authorization
{
public class StoreInfo
{
public Guid StoreId { get; set; }
}
}

28
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Permissions/StoreOwnerAuthorizationExtensions.cs → modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StoreOwnerAuthorizationExtensions.cs

@ -2,46 +2,46 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace EasyAbp.EShop.Stores.Permissions
namespace EasyAbp.EShop.Stores.Authorization
{
public static class StoreOwnerAuthorizationExtensions
{
public static Task<bool> IsCurrentUserGrantedAsync(this IAuthorizationService authorizationService,
Guid storeId, string policyName = null, object resource = null)
Guid storeId, string policyName = null)
{
return authorizationService.IsGrantedAsync(resource,
new StorePermissionAuthorizationRequirement(storeId, policyName));
return authorizationService.IsGrantedAsync(new StoreInfo {StoreId = storeId},
new StorePermissionAuthorizationRequirement(policyName));
}
public static async Task<bool> IsMultiStoreGrantedAsync(this IAuthorizationService authorizationService,
Guid? storeId, string policyName, string crossStorePolicyName, object resource = null)
Guid? storeId, string policyName, string crossStorePolicyName)
{
if (storeId.HasValue && await authorizationService.IsCurrentUserGrantedAsync(storeId.Value, policyName))
{
return true;
}
return await authorizationService.IsGrantedAsync(resource, crossStorePolicyName)
&& await authorizationService.IsGrantedAsync(resource, policyName);
return await authorizationService.IsGrantedAsync(crossStorePolicyName)
&& await authorizationService.IsGrantedAsync(policyName);
}
public static Task CheckMultiStorePolicyAsync(this IAuthorizationService authorizationService,
Guid storeId, string policyName, object resource = null)
Guid storeId, string policyName)
{
return authorizationService.CheckAsync(resource,
new StorePermissionAuthorizationRequirement(storeId, policyName));
return authorizationService.CheckAsync(new StoreInfo {StoreId = storeId},
new StorePermissionAuthorizationRequirement(policyName));
}
public static async Task CheckMultiStorePolicyAsync(this IAuthorizationService authorizationService,
Guid? storeId, string policyName, string crossStorePolicyName, object resource = null)
Guid? storeId, string policyName, string crossStorePolicyName)
{
if (storeId.HasValue && await authorizationService.IsCurrentUserGrantedAsync(storeId.Value, policyName, resource))
if (storeId.HasValue && await authorizationService.IsCurrentUserGrantedAsync(storeId.Value, policyName))
{
return;
}
await authorizationService.CheckAsync(resource, crossStorePolicyName);
await authorizationService.CheckAsync(resource, policyName);
await authorizationService.CheckAsync(crossStorePolicyName);
await authorizationService.CheckAsync(policyName);
}
}
}

7
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Permissions/StorePermissionAuthorizationRequirement.cs → modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Authorization/StorePermissionAuthorizationRequirement.cs

@ -1,18 +1,15 @@
using System;
using Microsoft.AspNetCore.Authorization;
namespace EasyAbp.EShop.Stores.Permissions
namespace EasyAbp.EShop.Stores.Authorization
{
public class StorePermissionAuthorizationRequirement : IAuthorizationRequirement
{
public StorePermissionAuthorizationRequirement(Guid storeId, string policyName = null)
public StorePermissionAuthorizationRequirement(string policyName = null)
{
StoreId = storeId;
PolicyName = policyName;
}
public Guid StoreId { get; }
public string PolicyName { get; }
}
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/EShopStoresApplicationSharedModule.cs

@ -1,4 +1,4 @@
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Application;

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Stores/MultiStoreAbstractKeyCrudAppService.cs

@ -1,6 +1,6 @@
using System;
using System.Threading.Tasks;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application.Shared/EasyAbp/EShop/Stores/Stores/MultiStoreAbstractKeyReadOnlyAppService.cs

@ -1,6 +1,6 @@
using System;
using System.Threading.Tasks;
using EasyAbp.EShop.Stores.Permissions;
using EasyAbp.EShop.Stores.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;

1
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/EShopStoresApplicationModule.cs

@ -7,6 +7,7 @@ namespace EasyAbp.EShop.Stores
{
[DependsOn(
typeof(EShopStoresDomainModule),
typeof(EShopStoresApplicationSharedModule),
typeof(EShopStoresApplicationContractsModule),
typeof(AbpDddApplicationModule),
typeof(AbpAutoMapperModule)

4
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/StoreOwners/StoreOwnerAppService.cs

@ -7,7 +7,7 @@ using EasyAbp.EShop.Stores.Stores;
namespace EasyAbp.EShop.Stores.StoreOwners
{
public class StoreOwnerAppService : MultiStoreCrudAppService<StoreOwner, StoreOwnerDto, Guid, GetStoreOwnerListDto>,
public class StoreOwnerAppService : MultiStoreCrudAppService<StoreOwner, StoreOwnerDto, Guid, GetStoreOwnerListDto, CreateUpdateStoreOwnerDto, CreateUpdateStoreOwnerDto>,
IStoreOwnerAppService
{
protected override string CreatePolicyName { get; set; } = StoresPermissions.Stores.Manage;
@ -24,7 +24,7 @@ namespace EasyAbp.EShop.Stores.StoreOwners
_repository = repository;
}
public override async Task<StoreOwnerDto> CreateAsync(StoreOwnerDto input)
public override async Task<StoreOwnerDto> CreateAsync(CreateUpdateStoreOwnerDto input)
{
if (await _repository.IsExistAsync(input.StoreId, input.OwnerUserId))
{

13
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Application/EasyAbp/EShop/Stores/StoresApplicationAutoMapperProfile.cs

@ -16,15 +16,12 @@ namespace EasyAbp.EShop.Stores
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<Store, StoreDto>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<CreateUpdateStoreDto, Store>(MemberList.Source)
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<Store, StoreDto>();
CreateMap<CreateUpdateStoreDto, Store>(MemberList.Source);
CreateMap<StoreOwner, StoreOwnerDto>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<StoreOwnerDto, StoreOwner>(MemberList.Source)
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<StoreOwner, StoreOwnerDto>();
CreateMap<CreateUpdateStoreOwnerDto, StoreOwner>(MemberList.Source);
CreateMap<Transaction, TransactionDto>();
CreateMap<CreateUpdateTransactionDto, Transaction>(MemberList.Source);
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/cs.json

@ -12,7 +12,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

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

@ -13,7 +13,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/pl.json

@ -12,7 +12,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/pt-BR.json

@ -12,7 +12,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/sl.json

@ -13,7 +13,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/tr.json

@ -13,7 +13,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/vi.json

@ -12,7 +12,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

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

@ -13,7 +13,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

3
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Domain.Shared/EasyAbp/EShop/Stores/Localization/Stores/zh-Hant.json

@ -13,8 +13,7 @@
"Menu:StoreOwner": "MenuStoreOwner",
"CreateStoreOwner": "CreateStoreOwner",
"EditStoreOwner": "EditStoreOwner",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?"
"SuccessfullyDeleted": "Successfully deleted",
"StoreOwnerDeletionConfirmationMessage": "Are you sure to delete the store owner {0}?",
"Permission:Transaction": "Transaction",
"Permission:Create": "Create",
"Permission:Update": "Update",

4
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.HttpApi/EasyAbp/EShop/Stores/StoreOwners/StoreOwnerController.cs

@ -32,14 +32,14 @@ namespace EasyAbp.EShop.Stores.StoreOwners
}
[HttpPost]
public Task<StoreOwnerDto> CreateAsync(StoreOwnerDto input)
public Task<StoreOwnerDto> CreateAsync(CreateUpdateStoreOwnerDto input)
{
return _service.CreateAsync(input);
}
[HttpPut]
[Route("{id}")]
public Task<StoreOwnerDto> UpdateAsync(Guid id, StoreOwnerDto input)
public Task<StoreOwnerDto> UpdateAsync(Guid id, CreateUpdateStoreOwnerDto input)
{
return _service.UpdateAsync(id, input);
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/CreateModal.cshtml.cs

@ -25,7 +25,7 @@ namespace EasyAbp.EShop.Stores.Web.Pages.EShop.Stores.StoreOwners.StoreOwner
public async Task<IActionResult> OnPostAsync()
{
var createDto = ObjectMapper.Map<CreateEditStoreOwnerViewModel, StoreOwnerDto>(StoreOwner);
var createDto = ObjectMapper.Map<CreateEditStoreOwnerViewModel, CreateUpdateStoreOwnerDto>(StoreOwner);
var storeOwner = await _storeOwnerAppService.CreateAsync(createDto);
return NoContent();

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/EditModal.cshtml.cs

@ -31,7 +31,7 @@ namespace EasyAbp.EShop.Stores.Web.Pages.EShop.Stores.StoreOwners.StoreOwner
public async Task<IActionResult> OnPostAsync()
{
await _storeOwnerAppService.UpdateAsync(Id,
ObjectMapper.Map<CreateEditStoreOwnerViewModel, StoreOwnerDto>(StoreOwner));
ObjectMapper.Map<CreateEditStoreOwnerViewModel, CreateUpdateStoreOwnerDto>(StoreOwner));
return NoContent();
}
}

4
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/StoreOwners/StoreOwner/ViewModels/CreateStoreOwnerViewModel.cs

@ -5,13 +5,13 @@ using Volo.Abp.ObjectExtending;
namespace EasyAbp.EShop.Stores.Web.Pages.EShop.Stores.StoreOwners.StoreOwner.ViewModels
{
public class CreateEditStoreOwnerViewModel : ExtensibleObject
public class CreateEditStoreOwnerViewModel
{
[Required]
public Guid StoreId { get; set; }
[Required]
public Guid MultiStoreCrudAppService { get; set; }
public Guid OwnerUserId { get; set; }
}
}

2
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/Pages/EShop/Stores/Stores/Store/ViewModels/CreateEditStoreViewModel.cs

@ -6,7 +6,7 @@ using Volo.Abp.ObjectExtending;
namespace EasyAbp.EShop.Stores.Web.Pages.EShop.Stores.Stores.Store.ViewModels
{
public class CreateEditStoreViewModel : ExtensibleObject
public class CreateEditStoreViewModel
{
[Required]
[Display(Name = "StoreName")]

14
modules/EasyAbp.EShop.Stores/src/EasyAbp.EShop.Stores.Web/StoresWebAutoMapperProfile.cs

@ -17,16 +17,12 @@ namespace EasyAbp.EShop.Stores.Web
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<StoreDto, CreateEditStoreViewModel>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<CreateEditStoreViewModel, CreateUpdateStoreDto>(MemberList.Source)
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<StoreDto, CreateEditStoreViewModel>();
CreateMap<CreateEditStoreViewModel, CreateUpdateStoreDto>(MemberList.Source);
CreateMap<StoreOwnerDto, CreateEditStoreOwnerViewModel>();
CreateMap<CreateEditStoreOwnerViewModel, CreateUpdateStoreOwnerDto>(MemberList.Source);
CreateMap<StoreOwnerDto, CreateEditStoreOwnerViewModel>()
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<CreateEditStoreOwnerViewModel, StoreOwnerDto>(MemberList.Source)
.MapExtraProperties(MappingPropertyDefinitionChecks.Both);
CreateMap<TransactionDto, CreateUpdateTransactionDto>();
CreateMap<TransactionDto, CreateEditTransactionViewModel>();
CreateMap<CreateEditTransactionViewModel, CreateUpdateTransactionDto>();
}

4295
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200901080859_AddedStoreOwnerEntity.Designer.cs

File diff suppressed because it is too large

46
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/20200901080859_AddedStoreOwnerEntity.cs

@ -0,0 +1,46 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace EShopSample.Migrations
{
public partial class AddedStoreOwnerEntity : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "EasyAbpEShopStoresStoreOwners",
columns: table => new
{
Id = table.Column<Guid>(nullable: false),
ExtraProperties = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(nullable: false),
CreatorId = table.Column<Guid>(nullable: true),
LastModificationTime = table.Column<DateTime>(nullable: true),
LastModifierId = table.Column<Guid>(nullable: true),
IsDeleted = table.Column<bool>(nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(nullable: true),
DeletionTime = table.Column<DateTime>(nullable: true),
TenantId = table.Column<Guid>(nullable: true),
StoreId = table.Column<Guid>(nullable: false),
OwnerUserId = table.Column<Guid>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_EasyAbpEShopStoresStoreOwners", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_EasyAbpEShopStoresStoreOwners_OwnerUserId_StoreId",
table: "EasyAbpEShopStoresStoreOwners",
columns: new[] { "OwnerUserId", "StoreId" },
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "EasyAbpEShopStoresStoreOwners");
}
}
}

64
samples/EShopSample/aspnet-core/src/EShopSample.EntityFrameworkCore.DbMigrations/Migrations/EShopSampleMigrationsDbContextModelSnapshot.cs

@ -1446,6 +1446,70 @@ namespace EShopSample.Migrations
b.ToTable("EasyAbpEShopProductsProductSkus");
});
modelBuilder.Entity("EasyAbp.EShop.Stores.StoreOwners.StoreOwner", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnName("ConcurrencyStamp")
.HasColumnType("nvarchar(40)")
.HasMaxLength(40);
b.Property<DateTime>("CreationTime")
.HasColumnName("CreationTime")
.HasColumnType("datetime2");
b.Property<Guid?>("CreatorId")
.HasColumnName("CreatorId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("DeleterId")
.HasColumnName("DeleterId")
.HasColumnType("uniqueidentifier");
b.Property<DateTime?>("DeletionTime")
.HasColumnName("DeletionTime")
.HasColumnType("datetime2");
b.Property<string>("ExtraProperties")
.HasColumnName("ExtraProperties")
.HasColumnType("nvarchar(max)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnName("IsDeleted")
.HasColumnType("bit")
.HasDefaultValue(false);
b.Property<DateTime?>("LastModificationTime")
.HasColumnName("LastModificationTime")
.HasColumnType("datetime2");
b.Property<Guid?>("LastModifierId")
.HasColumnName("LastModifierId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("OwnerUserId")
.HasColumnType("uniqueidentifier");
b.Property<Guid>("StoreId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("TenantId")
.HasColumnName("TenantId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("OwnerUserId", "StoreId")
.IsUnique();
b.ToTable("EasyAbpEShopStoresStoreOwners");
});
modelBuilder.Entity("EasyAbp.EShop.Stores.Stores.Store", b =>
{
b.Property<Guid>("Id")

Loading…
Cancel
Save