From 53b6ceaa69dbbf3264c913afae37a5f247c6bb79 Mon Sep 17 00:00:00 2001 From: Seany <17074267@qq.com> Date: Thu, 25 Dec 2025 00:59:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=BD=E5=AE=B6=E3=80=81?= =?UTF-8?q?=E5=B7=9E=E7=9C=81=E5=9C=B0=E5=8C=BA=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Atomx.Admin.Client/Models/AreaModel.cs | 8 + .../Atomx.Admin.Client/Models/AreaSearch.cs | 9 + .../Atomx.Admin.Client/Models/CountryModel.cs | 8 + .../Models/CountrySearch.cs | 7 + .../Models/StateProvinceModel.cs | 8 + .../Models/StateProvinceSearch.cs | 8 + .../PredefinedSpecificationList.razor | 2 - .../Validators/AddressModelValidator.cs | 3 +- .../Validators/AdminModelValidator.cs | 3 +- .../Validators/AreaModelValidator.cs | 14 ++ .../Validators/CategoryModelValidator.cs | 4 +- .../Validators/CorporationModelValidator.cs | 3 +- .../CorporationStaffModelValidator.cs | 3 +- .../Validators/CountryModelValidator.cs | 14 ++ .../Validators/CurrencyModelValidator.cs | 3 +- .../Validators/GeneralConfigValidator.cs | 3 +- .../Validators/LanguageModelValidator.cs | 3 +- .../LocaleResourceModelValidator.cs | 3 +- .../Validators/ManufacturerModelValidator.cs | 3 +- .../Validators/MenuModelValidator.cs | 3 +- .../ProductAddStockModelValidator.cs | 3 +- .../ProductAttributeModelValidator.cs | 3 +- .../ProductAttributeOptionModelValidator.cs | 3 +- .../Validators/ProductModelValidator.cs | 3 +- .../Validators/RoleModelValidator.cs | 3 +- .../Validators/RoleValidator.cs | 3 +- .../Validators/SiteAppModelValidator.cs | 3 +- .../SpecificationAttributeModelValidator.cs | 3 +- ...cificationAttributeOptionModelValidator.cs | 3 +- .../Validators/StateProvinceValidator.cs | 14 ++ .../Validators/UploadFileModelValidator.cs | 3 +- .../Validators/UserValidator.cs | 3 +- .../Validators/WarehouseModelValidator.cs | 3 +- .../Controllers/AddressController.cs | 12 +- .../Controllers/AdminController.cs | 18 +- .../Atomx.Admin/Controllers/AreaController.cs | 136 ++++++++++++++- .../Controllers/CategoryController.cs | 14 +- .../Controllers/CountryController.cs | 161 +++++++++++++++++ .../Controllers/LanguageController.cs | 15 +- .../Controllers/LocaleResourceController.cs | 12 +- .../Atomx.Admin/Controllers/MenuController.cs | 14 +- .../Controllers/ProductAttributeController.cs | 16 +- .../Atomx.Admin/Controllers/RoleController.cs | 16 +- .../Controllers/StateProvinceController.cs | 165 ++++++++++++++++++ Atomx.Common/Models/LocalizationFileFile.cs | 15 -- 45 files changed, 669 insertions(+), 87 deletions(-) create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/AreaModel.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/CountrySearch.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceSearch.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Validators/AreaModelValidator.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Validators/CountryModelValidator.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Validators/StateProvinceValidator.cs create mode 100644 Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs create mode 100644 Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs delete mode 100644 Atomx.Common/Models/LocalizationFileFile.cs diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/AreaModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/AreaModel.cs new file mode 100644 index 0000000..0befc1f --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/AreaModel.cs @@ -0,0 +1,8 @@ +using Atomx.Common.Entities; + +namespace Atomx.Admin.Client.Models +{ + public class AreaModel:Area + { + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs b/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs new file mode 100644 index 0000000..dd5d875 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs @@ -0,0 +1,9 @@ +namespace Atomx.Admin.Client.Models +{ + public class AreaSearch : BaseSearch + { + public long CountryId { get; set; } + public long StateProvinceId { get; set; } + public string Name { get; set; } = string.Empty; + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs new file mode 100644 index 0000000..d90b0c6 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs @@ -0,0 +1,8 @@ +using Atomx.Common.Entities; + +namespace Atomx.Admin.Client.Models +{ + public class CountryModel:Country + { + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/CountrySearch.cs b/Atomx.Admin/Atomx.Admin.Client/Models/CountrySearch.cs new file mode 100644 index 0000000..c2d8e7b --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/CountrySearch.cs @@ -0,0 +1,7 @@ +namespace Atomx.Admin.Client.Models +{ + public class CountrySearch + { + public string Name { get; set; } = string.Empty; + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs new file mode 100644 index 0000000..c5ddeed --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs @@ -0,0 +1,8 @@ +using Atomx.Common.Entities; + +namespace Atomx.Admin.Client.Models +{ + public class StateProvinceModel: StateProvince + { + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceSearch.cs b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceSearch.cs new file mode 100644 index 0000000..de32af2 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceSearch.cs @@ -0,0 +1,8 @@ +namespace Atomx.Admin.Client.Models +{ + public class StateProvinceSearch + { + public long CountryId { get; set; } + public string Name { get; set; } = string.Empty; + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Products/PredefinedSpecificationList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Products/PredefinedSpecificationList.razor index 5c2c0f1..9da7231 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Products/PredefinedSpecificationList.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Products/PredefinedSpecificationList.razor @@ -120,8 +120,6 @@ bool searchExpand { get; set; } = false; private bool drawerVisible; - SpecificationAttributeOptionModelValidator validator = new(); - protected override void OnInitialized() { base.OnInitialized(); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/AddressModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/AddressModelValidator.cs index e79a37c..71ddadb 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/AddressModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/AddressModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class AddressModelValidator : AbstractValidator { - public AddressModelValidator() + public AddressModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("请填写收件人信息"); RuleFor(p => p.Email).EmailAddress().When(p => !string.IsNullOrEmpty(p.Email)).WithMessage("请填写你常用的邮箱地址"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/AdminModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/AdminModelValidator.cs index 589e78a..5735926 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/AdminModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/AdminModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class AdminModelValidator : AbstractValidator { - public AdminModelValidator() + public AdminModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Username).NotEmpty().WithMessage("用户名不能为空"); RuleFor(p => p.Username).Length(2, 64).When(p => !string.IsNullOrEmpty(p.Username)).WithMessage("用户名长度必须再2-64个字符之间"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/AreaModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/AreaModelValidator.cs new file mode 100644 index 0000000..8c41000 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/AreaModelValidator.cs @@ -0,0 +1,14 @@ +using Atomx.Admin.Client.Models; +using FluentValidation; +using Microsoft.Extensions.Localization; + +namespace Atomx.Admin.Client.Validators +{ + public class AreaModelValidator : AbstractValidator + { + public AreaModelValidator(IStringLocalizer localizer) + { + RuleFor(p => p.Name).NotEmpty().WithMessage("请填名称信息"); + } + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/CategoryModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/CategoryModelValidator.cs index 8efbb22..dea7a14 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/CategoryModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/CategoryModelValidator.cs @@ -1,12 +1,12 @@ using Atomx.Admin.Client.Models; -using Atomx.Common.Enums; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class CategoryModelValidator : AbstractValidator { - public CategoryModelValidator() + public CategoryModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); RuleFor(p => p.ParentId).Must((p,id)=> ValidateParent(id,p)).WithMessage("不能选择自己做上级分类"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationModelValidator.cs index aa5b7a7..788f249 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class CorporationModelValidator : AbstractValidator { - public CorporationModelValidator() + public CorporationModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("公司名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationStaffModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationStaffModelValidator.cs index 92cbd96..7f7f179 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationStaffModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/CorporationStaffModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class CorporationStaffModelValidator : AbstractValidator { - public CorporationStaffModelValidator() + public CorporationStaffModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Username).NotEmpty().WithMessage("用户名不能为空"); RuleFor(p => p.Username).Length(2, 64).When(p => !string.IsNullOrEmpty(p.Username)).WithMessage("用户名长度必须再2-64个字符之间"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/CountryModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/CountryModelValidator.cs new file mode 100644 index 0000000..3f8276c --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/CountryModelValidator.cs @@ -0,0 +1,14 @@ +using Atomx.Admin.Client.Models; +using FluentValidation; +using Microsoft.Extensions.Localization; + +namespace Atomx.Admin.Client.Validators +{ + public class CountryModelValidator : AbstractValidator + { + public CountryModelValidator(IStringLocalizer localizer) + { + RuleFor(p => p.Name).NotEmpty().WithMessage("请填名称信息"); + } + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/CurrencyModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/CurrencyModelValidator.cs index 06d1d8a..cf9f5f8 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/CurrencyModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/CurrencyModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class CurrencyModelValidator : AbstractValidator { - public CurrencyModelValidator() + public CurrencyModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("请填写货币名称"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/GeneralConfigValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/GeneralConfigValidator.cs index 349262f..81215f1 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/GeneralConfigValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/GeneralConfigValidator.cs @@ -1,11 +1,12 @@ using Atomx.Common.Configuration; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class GeneralConfigValidator : AbstractValidator { - public GeneralConfigValidator() + public GeneralConfigValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("网站名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/LanguageModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/LanguageModelValidator.cs index 8e20969..855092f 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/LanguageModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/LanguageModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class LanguageModelValidator : AbstractValidator { - public LanguageModelValidator() + public LanguageModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Title).NotEmpty().WithMessage("请填写语言标题"); RuleFor(p => p.Name).NotEmpty().WithMessage("请填写语言名称"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/LocaleResourceModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/LocaleResourceModelValidator.cs index 0824a37..44c941c 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/LocaleResourceModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/LocaleResourceModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class LocaleResourceModelValidator : AbstractValidator { - public LocaleResourceModelValidator() + public LocaleResourceModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("本地化多语言信息不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/ManufacturerModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/ManufacturerModelValidator.cs index b142f4e..dfbd42d 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/ManufacturerModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/ManufacturerModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class ManufacturerModelValidator : AbstractValidator { - public ManufacturerModelValidator() + public ManufacturerModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/MenuModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/MenuModelValidator.cs index 4d7a44c..3b6277b 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/MenuModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/MenuModelValidator.cs @@ -1,12 +1,13 @@ using Atomx.Admin.Client.Models; using Atomx.Common.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class MenuModelValidator : AbstractValidator { - public MenuModelValidator() + public MenuModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAddStockModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAddStockModelValidator.cs index 3bef7da..74cfd1b 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAddStockModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAddStockModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class ProductAddStockModelValidator : AbstractValidator { - public ProductAddStockModelValidator() + public ProductAddStockModelValidator(IStringLocalizer localizer) { //RuleFor(p => p.Username).NotEmpty().WithMessage("用户名不能为空"); //RuleFor(p => p.Username).Length(2, 64).When(p => !string.IsNullOrEmpty(p.Username)).WithMessage("用户名长度必须再2-64个字符之间"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeModelValidator.cs index f854fcf..d034165 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class ProductAttributeModelValidator : AbstractValidator { - public ProductAttributeModelValidator() + public ProductAttributeModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); RuleFor(p => p.Status).GreaterThan(0).WithMessage("请设置正确的状态"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeOptionModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeOptionModelValidator.cs index 7274552..756ec74 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeOptionModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductAttributeOptionModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class ProductAttributeOptionModelValidator : AbstractValidator { - public ProductAttributeOptionModelValidator() + public ProductAttributeOptionModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Value).NotEmpty().WithMessage("数值不能为空"); RuleFor(p => p.Status).GreaterThan(0).WithMessage("请设置正确的状态"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductModelValidator.cs index b015199..c5c473f 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/ProductModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/ProductModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class ProductModelValidator : AbstractValidator { - public ProductModelValidator() + public ProductModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Title).NotEmpty().WithMessage("商品标题不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/RoleModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/RoleModelValidator.cs index 67d1c77..7eb4038 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/RoleModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/RoleModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class RoleModelValidator : AbstractValidator { - public RoleModelValidator() + public RoleModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("角色名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/RoleValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/RoleValidator.cs index eed44ba..6388d16 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/RoleValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/RoleValidator.cs @@ -1,11 +1,12 @@ using Atomx.Common.Entities; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class RoleValidator : AbstractValidator { - public RoleValidator() + public RoleValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("角色名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/SiteAppModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/SiteAppModelValidator.cs index ef5a5a3..ba4c490 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/SiteAppModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/SiteAppModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class SiteAppModelValidator : AbstractValidator { - public SiteAppModelValidator() + public SiteAppModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("请填写网站应用名称"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeModelValidator.cs index 6c2c9e0..862fd29 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class SpecificationAttributeModelValidator : AbstractValidator { - public SpecificationAttributeModelValidator() + public SpecificationAttributeModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); RuleFor(p => p.Status).GreaterThan(0).WithMessage("请设置正确的状态"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeOptionModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeOptionModelValidator.cs index 12d35a8..58cbf51 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeOptionModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/SpecificationAttributeOptionModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class SpecificationAttributeOptionModelValidator : AbstractValidator { - public SpecificationAttributeOptionModelValidator() + public SpecificationAttributeOptionModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Value).NotEmpty().WithMessage("数值不能为空"); RuleFor(p => p.Status).GreaterThan(0).WithMessage("请设置正确的状态"); diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/StateProvinceValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/StateProvinceValidator.cs new file mode 100644 index 0000000..e66c74a --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/StateProvinceValidator.cs @@ -0,0 +1,14 @@ +using Atomx.Admin.Client.Models; +using FluentValidation; +using Microsoft.Extensions.Localization; + +namespace Atomx.Admin.Client.Validators +{ + public class StateProvinceValidator : AbstractValidator + { + public StateProvinceValidator(IStringLocalizer localizer) + { + RuleFor(p => p.Name).NotEmpty().WithMessage("请填名称信息"); + } + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/UploadFileModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/UploadFileModelValidator.cs index 32ba4e9..0a38385 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/UploadFileModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/UploadFileModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class UploadFileModelValidator : AbstractValidator { - public UploadFileModelValidator() + public UploadFileModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("文件名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/UserValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/UserValidator.cs index 74d3f85..6dba08e 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/UserValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/UserValidator.cs @@ -1,11 +1,12 @@ using Atomx.Common.Entities; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class UserValidator : AbstractValidator { - public UserValidator() + public UserValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("名称不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin.Client/Validators/WarehouseModelValidator.cs b/Atomx.Admin/Atomx.Admin.Client/Validators/WarehouseModelValidator.cs index e672c4c..7f8969c 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Validators/WarehouseModelValidator.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Validators/WarehouseModelValidator.cs @@ -1,11 +1,12 @@ using Atomx.Admin.Client.Models; using FluentValidation; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Client.Validators { public class WarehouseModelValidator : AbstractValidator { - public WarehouseModelValidator() + public WarehouseModelValidator(IStringLocalizer localizer) { RuleFor(p => p.Name).NotEmpty().WithMessage("用户名不能为空"); } diff --git a/Atomx.Admin/Atomx.Admin/Controllers/AddressController.cs b/Atomx.Admin/Atomx.Admin/Controllers/AddressController.cs index e89cf24..bdd80a4 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/AddressController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/AddressController.cs @@ -7,10 +7,12 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -25,7 +27,8 @@ namespace Atomx.Admin.Controllers private readonly IIdentityService _identityService; private readonly IMapper _mapper; private readonly ICacheService _cacheService; - + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -37,7 +40,7 @@ namespace Atomx.Admin.Controllers /// /// /// - public AddressController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService) + public AddressController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _idCreator = idCreator; @@ -45,6 +48,8 @@ namespace Atomx.Admin.Controllers _dbContext = dbContext; _mapper = mapper; _cacheService = cacheService; + _validator = validator; + _localizer = localizer; } /// @@ -106,8 +111,7 @@ namespace Atomx.Admin.Controllers public IActionResult AddressEdit(AddressModel model) { var result = new ApiResult(); - var validator = new AddressModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { result.Message = ModelState.Values.First().Errors[0].ErrorMessage; diff --git a/Atomx.Admin/Atomx.Admin/Controllers/AdminController.cs b/Atomx.Admin/Atomx.Admin/Controllers/AdminController.cs index 114e53c..bdae966 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/AdminController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/AdminController.cs @@ -6,10 +6,12 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.Services; using Atomx.Utils.Extension; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -23,6 +25,8 @@ namespace Atomx.Admin.Controllers readonly IIdCreatorService _idCreator; readonly IMapper _mapper; readonly DataContext _dbContext; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -32,13 +36,15 @@ namespace Atomx.Admin.Controllers /// /// /// - public AdminController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext) + public AdminController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; _idCreator = idCreator; _mapper = mapper; _dbContext = dataContext; + _validator = validator; + _localizer = localizer; } /// @@ -49,7 +55,7 @@ namespace Atomx.Admin.Controllers /// /// [HttpPost("search")] - [Authorize(Policy =Permissions.Admin.View)] + [Authorize(Policy = Permissions.Admin.View)] public IActionResult Search(AdminSearch search, int page, int size = 20) { var startTime = search.RangeTime[0]; @@ -158,8 +164,7 @@ namespace Atomx.Admin.Controllers public IActionResult Add(AdminModel model) { var result = new ApiResult(); - var validator = new AdminModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage ?? string.Empty; @@ -186,7 +191,7 @@ namespace Atomx.Admin.Controllers { model.Id = _idCreator.CreateId(); model.Password = model.Password.ToMd5Password(); - + var admin = _mapper.Map(model); admin.CreateTime = DateTime.UtcNow; @@ -211,8 +216,7 @@ namespace Atomx.Admin.Controllers public IActionResult Edit(AdminModel model) { var result = new ApiResult(); - var validator = new AdminModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; diff --git a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs index f05c279..ad1efb4 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs @@ -1,10 +1,17 @@ -using Atomx.Admin.Services; +using Atomx.Admin.Client.Models; +using Atomx.Admin.Services; +using Atomx.Common.Constants; +using Atomx.Common.Entities; +using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using MapsterMapper; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -13,6 +20,7 @@ namespace Atomx.Admin.Controllers /// [Route("api/[controller]")] [ApiController] + [Authorize] public class AreaController : ControllerBase { private readonly ILogger _logger; @@ -21,7 +29,8 @@ namespace Atomx.Admin.Controllers private readonly IIdentityService _identityService; private readonly IMapper _mapper; private readonly ICacheService _cacheService; - + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -33,7 +42,7 @@ namespace Atomx.Admin.Controllers /// /// /// - public AreaController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService) + public AreaController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _idCreator = idCreator; @@ -41,6 +50,125 @@ namespace Atomx.Admin.Controllers _dbContext = dbContext; _mapper = mapper; _cacheService = cacheService; + _validator = validator; + _localizer = localizer; + } + + /// + /// 数据查询 + /// + /// + /// + /// + /// + [HttpPost("searh")] + [Authorize(Policy = Permissions.User.View)] + public IActionResult AddressList(AreaSearch search, int page, int size = 20) + { + if (page < 1) + { + page = 1; + } + var result = new ApiResult>(); + var list = new PagingList() { Index = page, Size = size }; + var query = from p in _dbContext.Areas + select p; + + if (!string.IsNullOrEmpty(search.Name)) + { + query = from p in query + where p.Name.Contains(search.Name) + select p; + } + + if (search.CountryId > 0) + { + query = from p in query + where p.CountryId == search.CountryId + select p; + } + if (search.StateProvinceId > 0) + { + query = from p in query + where p.StateProvinceId == search.StateProvinceId + select p; + } + list.Count = query.Count(); + list.Items = query.OrderByDescending(p => p.DisplayOrder).Skip((page - 1) * size).Take(size).ToList(); + + result = result.IsSuccess(list); + + return new JsonResult(result); + } + + + /// + /// 新增编辑数据 + /// + /// + /// + [HttpPost("save")] + public IActionResult AddressEdit(AreaModel model) + { + var result = new ApiResult(); + var validation = _validator.Validate(model); + if (!validation.IsValid) + { + var message = validation.Errors.FirstOrDefault()?.ErrorMessage ?? string.Empty; + return new JsonResult(new ApiResult().IsFail(message, null)); + } + var data = _dbContext.Areas.SingleOrDefault(p => p.CountryId == model.CountryId && p.StateProvinceId == model.StateProvinceId && p.Name == model.Name && p.Id != model.Id); + if (data != null) + { + return new JsonResult(new ApiResult().IsFail("当前站点语言下已经存在这个配置,请认真检查", null)); + } + if (model.Id > 0) + { + data = _dbContext.Areas.SingleOrDefault(p => p.Id == model.Id); + if (data == null) + { + return new JsonResult(new ApiResult().IsFail("数据不存在", null)); + } + + data = _mapper.Map(model, data); + + _dbContext.SaveChanges(); + + } + else + { + data = _mapper.Map(model); + data.Id = _idCreator.CreateId(); + + _dbContext.Areas.Add(data); + _dbContext.SaveChanges(); + } + + return new JsonResult(new ApiResult().IsSuccess("操作成功")); + } + + /// + /// 删除数据 + /// + /// + /// + + [HttpPost("delete")] + public async Task DeleteAsync(long id) + { + var result = new ApiResult(); + try + { + Console.WriteLine($"{id} deleted"); + var count = _dbContext.Areas.Where(p => p.Id == id).ExecuteDelete(); + result = result.IsSuccess(count.ToString()); + } + catch (Exception ex) + { + result = result.IsFail(ex.Message); + _logger.LogError(ex.Message); + } + return new JsonResult(result); } } diff --git a/Atomx.Admin/Atomx.Admin/Controllers/CategoryController.cs b/Atomx.Admin/Atomx.Admin/Controllers/CategoryController.cs index 5b5b332..097ff51 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/CategoryController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/CategoryController.cs @@ -6,8 +6,10 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -22,8 +24,10 @@ namespace Atomx.Admin.Controllers readonly DataContext _dbContext; readonly JwtSetting _jwtSetting; readonly ICacheService _cacheService; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; - public CategoryController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dbContext, JwtSetting jwtSetting, ICacheService cacheService) + public CategoryController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dbContext, JwtSetting jwtSetting, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; @@ -32,6 +36,8 @@ namespace Atomx.Admin.Controllers _dbContext = dbContext; _jwtSetting = jwtSetting; _cacheService = cacheService; + _validator = validator; + _localizer = localizer; } /// @@ -148,8 +154,7 @@ namespace Atomx.Admin.Controllers public IActionResult Add(CategoryModel model) { var result = new ApiResult(); - var validator = new CategoryModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; @@ -197,8 +202,7 @@ namespace Atomx.Admin.Controllers public IActionResult Edit(CategoryModel model) { var result = new ApiResult(); - var validator = new CategoryModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; diff --git a/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs b/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs new file mode 100644 index 0000000..4d6fd71 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs @@ -0,0 +1,161 @@ +using Atomx.Admin.Client.Models; +using Atomx.Admin.Services; +using Atomx.Common.Constants; +using Atomx.Common.Entities; +using Atomx.Common.Models; +using Atomx.Data; +using Atomx.Data.CacheServices; +using Atomx.Data.Services; +using FluentValidation; +using MapsterMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; + +namespace Atomx.Admin.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class CountryController : ControllerBase + { + private readonly ILogger _logger; + private readonly DataContext _dbContext; + private readonly IIdCreatorService _idCreator; + private readonly IIdentityService _identityService; + private readonly IMapper _mapper; + private readonly ICacheService _cacheService; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; + + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public CountryController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) + { + _logger = logger; + _idCreator = idCreator; + _identityService = identityService; + _dbContext = dbContext; + _mapper = mapper; + _cacheService = cacheService; + _validator = validator; + _localizer = localizer; + } + + /// + /// 数据查询 + /// + /// + /// + /// + /// + [HttpPost("searh")] + [Authorize(Policy = Permissions.User.View)] + public IActionResult AddressList(CountrySearch search, int page, int size = 20) + { + if (page < 1) + { + page = 1; + } + var result = new ApiResult>(); + var list = new PagingList() { Index = page, Size = size }; + var query = from p in _dbContext.Countries + select p; + + if (!string.IsNullOrEmpty(search.Name)) + { + query = from p in query + where p.Name.Contains(search.Name) + select p; + } + + list.Count = query.Count(); + list.Items = query.OrderByDescending(p => p.DisplayOrder).Skip((page - 1) * size).Take(size).ToList(); + + result = result.IsSuccess(list); + + return new JsonResult(result); + } + + + /// + /// 新增编辑数据 + /// + /// + /// + [HttpPost("save")] + public IActionResult AddressEdit(CountryModel model) + { + var result = new ApiResult(); + var validation = _validator.Validate(model); + if (!validation.IsValid) + { + var message = validation.Errors.FirstOrDefault()?.ErrorMessage ?? string.Empty; + return new JsonResult(new ApiResult().IsFail(message, null)); + } + var data = _dbContext.Countries.SingleOrDefault(p => p.Name == model.Name && p.Id != model.Id); + if (data != null) + { + return new JsonResult(new ApiResult().IsFail("当前数据名称,请认真检查", null)); + } + if (model.Id > 0) + { + data = _dbContext.Countries.SingleOrDefault(p => p.Id == model.Id); + if (data == null) + { + return new JsonResult(new ApiResult().IsFail("数据不存在", null)); + } + + data = _mapper.Map(model, data); + + _dbContext.SaveChanges(); + + } + else + { + data = _mapper.Map(model); + data.Id = _idCreator.CreateId(); + + _dbContext.Countries.Add(data); + _dbContext.SaveChanges(); + } + + return new JsonResult(new ApiResult().IsSuccess("操作成功")); + } + + /// + /// 删除数据 + /// + /// + /// + + [HttpPost("delete")] + public async Task DeleteAsync(long id) + { + var result = new ApiResult(); + try + { + Console.WriteLine($"{id} deleted"); + var count = _dbContext.Countries.Where(p => p.Id == id).ExecuteDelete(); + result = result.IsSuccess(count.ToString()); + } + catch (Exception ex) + { + result = result.IsFail(ex.Message); + _logger.LogError(ex.Message); + } + return new JsonResult(result); + } + + } +} \ No newline at end of file diff --git a/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs b/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs index 61f6f60..e79ae3a 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs @@ -6,10 +6,12 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -25,8 +27,8 @@ namespace Atomx.Admin.Controllers private readonly IMapper _mapper; private readonly JwtSetting _jwtSettings; private readonly ICacheService _cacheService; - private readonly LocalizationFile _localizationFile; - + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -38,7 +40,8 @@ namespace Atomx.Admin.Controllers /// /// /// - public LanguageController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, JwtSetting jwtSettings, ICacheService cacheService, LocalizationFile localizationFile) + public LanguageController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, + JwtSetting jwtSettings, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _idCreator = idCreator; @@ -47,7 +50,8 @@ namespace Atomx.Admin.Controllers _mapper = mapper; _jwtSettings = jwtSettings; _cacheService = cacheService; - _localizationFile = localizationFile; + _validator = validator; + _localizer = localizer; } /// @@ -127,8 +131,7 @@ namespace Atomx.Admin.Controllers public async Task LanguageEdit(LanguageModel model) { var result = new ApiResult(); - var validator = new LanguageModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { result = result.IsFail(ModelState.Values.First().Errors[0].ErrorMessage); diff --git a/Atomx.Admin/Atomx.Admin/Controllers/LocaleResourceController.cs b/Atomx.Admin/Atomx.Admin/Controllers/LocaleResourceController.cs index f4b985e..aad726f 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/LocaleResourceController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/LocaleResourceController.cs @@ -9,9 +9,11 @@ using Atomx.Data.CacheServices; using Atomx.Data.Services; using Atomx.Utils.Json; using Atomx.Utils.Models; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -28,6 +30,8 @@ namespace Atomx.Admin.Controllers private readonly ICacheService _cacheService; private readonly IBackgroundJobService _backgroundService; private readonly IWebHostEnvironment _environment; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// @@ -40,7 +44,8 @@ namespace Atomx.Admin.Controllers /// /// /// - public LocaleResourceController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, JwtSetting jwtSettings, ICacheService cacheService, IBackgroundJobService backgroundJobService, IWebHostEnvironment environment) + public LocaleResourceController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, JwtSetting jwtSettings, + ICacheService cacheService, IBackgroundJobService backgroundJobService, IWebHostEnvironment environment, IValidator validator, IStringLocalizer localizer) { _logger = logger; _idCreator = idCreator; @@ -51,6 +56,8 @@ namespace Atomx.Admin.Controllers _cacheService = cacheService; _backgroundService = backgroundJobService; _environment = environment; + _validator = validator; + _localizer = localizer; } /// @@ -165,8 +172,7 @@ namespace Atomx.Admin.Controllers public async Task SaveAsync(LocaleResourceModel model) { var result = new ApiResult(); - var validator = new LocaleResourceModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { result = result.IsFail(ModelState.Values.First().Errors[0].ErrorMessage); diff --git a/Atomx.Admin/Atomx.Admin/Controllers/MenuController.cs b/Atomx.Admin/Atomx.Admin/Controllers/MenuController.cs index c90a733..d88d117 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/MenuController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/MenuController.cs @@ -7,9 +7,11 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using Mapster; using MapsterMapper; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -24,8 +26,10 @@ namespace Atomx.Admin.Controllers readonly DataContext _dbContext; readonly JwtSetting _jwtSetting; readonly ICacheService _cacheService; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; - public MenuController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dbContext, JwtSetting jwtSetting, ICacheService cacheService) + public MenuController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dbContext, JwtSetting jwtSetting, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; @@ -34,6 +38,8 @@ namespace Atomx.Admin.Controllers _dbContext = dbContext; _jwtSetting = jwtSetting; _cacheService = cacheService; + _validator = validator; + _localizer = localizer; } /// @@ -137,8 +143,7 @@ namespace Atomx.Admin.Controllers public IActionResult Add(MenuModel model) { var result = new ApiResult(); - var validator = new MenuModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { @@ -186,8 +191,7 @@ namespace Atomx.Admin.Controllers public IActionResult Edit(MenuModel model) { var result = new ApiResult(); - var validator = new MenuModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; diff --git a/Atomx.Admin/Atomx.Admin/Controllers/ProductAttributeController.cs b/Atomx.Admin/Atomx.Admin/Controllers/ProductAttributeController.cs index 311a449..403eca3 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/ProductAttributeController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/ProductAttributeController.cs @@ -1,14 +1,15 @@ using Atomx.Admin.Client.Models; -using Atomx.Admin.Client.Validators; using Atomx.Admin.Services; using Atomx.Common.Entities; using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.Services; +using FluentValidation; using Mapster; using MapsterMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -21,6 +22,8 @@ namespace Atomx.Admin.Controllers readonly IIdCreatorService _idCreator; readonly IMapper _mapper; readonly DataContext _dbContext; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -30,13 +33,16 @@ namespace Atomx.Admin.Controllers /// /// /// - public ProductAttributeController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext) + public ProductAttributeController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, + IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; _idCreator = idCreator; _mapper = mapper; _dbContext = dataContext; + _validator = validator; + _localizer = localizer; } /// @@ -126,8 +132,7 @@ namespace Atomx.Admin.Controllers public IActionResult Add(ProductAttributeModel model) { var result = new ApiResult(); - var validator = new ProductAttributeModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage ?? string.Empty; @@ -170,8 +175,7 @@ namespace Atomx.Admin.Controllers public IActionResult Edit(ProductAttributeModel model) { var result = new ApiResult(); - var validator = new ProductAttributeModelValidator(); - var validation = validator.Validate(model); + var validation = _validator.Validate(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; diff --git a/Atomx.Admin/Atomx.Admin/Controllers/RoleController.cs b/Atomx.Admin/Atomx.Admin/Controllers/RoleController.cs index 1599422..39fe92a 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/RoleController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/RoleController.cs @@ -7,10 +7,12 @@ using Atomx.Common.Models; using Atomx.Data; using Atomx.Data.CacheServices; using Atomx.Data.Services; +using FluentValidation; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; namespace Atomx.Admin.Controllers { @@ -25,6 +27,8 @@ namespace Atomx.Admin.Controllers readonly IMapper _mapper; readonly DataContext _dbContext; readonly ICacheService _cacheService; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; /// /// @@ -34,7 +38,7 @@ namespace Atomx.Admin.Controllers /// /// /// - public RoleController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, ICacheService cacheService) + public RoleController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; @@ -42,6 +46,8 @@ namespace Atomx.Admin.Controllers _mapper = mapper; _dbContext = dataContext; _cacheService = cacheService; + _validator = validator; + _localizer = localizer; } /// @@ -111,8 +117,7 @@ namespace Atomx.Admin.Controllers public async Task Add(RoleModel model) { var result = new ApiResult(); - var validator = new RoleModelValidator(); - var validation = validator.Validate(model); + var validation = await _validator.ValidateAsync(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; @@ -153,8 +158,7 @@ namespace Atomx.Admin.Controllers public async Task EditAsync(RoleModel model) { var result = new ApiResult(); - var validator = new RoleModelValidator(); - var validation = validator.Validate(model); + var validation = await _validator.ValidateAsync(model); if (!validation.IsValid) { var message = validation.Errors.FirstOrDefault()?.ErrorMessage; @@ -183,7 +187,7 @@ namespace Atomx.Admin.Controllers { int count = _dbContext.SaveChanges(); //刷新缓存 - await _cacheService.GetRoleById(data.Id,true); + await _cacheService.GetRoleById(data.Id, true); result = result.IsSuccess(count.ToString()); } catch (Exception ex) diff --git a/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs b/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs new file mode 100644 index 0000000..6664ef8 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs @@ -0,0 +1,165 @@ +using Atomx.Admin.Client.Models; +using Atomx.Admin.Services; +using Atomx.Common.Constants; +using Atomx.Common.Entities; +using Atomx.Common.Models; +using Atomx.Data; +using Atomx.Data.CacheServices; +using Atomx.Data.Services; +using FluentValidation; +using MapsterMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Localization; + +namespace Atomx.Admin.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class StateProvinceController : ControllerBase + { + private readonly ILogger _logger; + private readonly DataContext _dbContext; + private readonly IIdCreatorService _idCreator; + private readonly IIdentityService _identityService; + private readonly IMapper _mapper; + private readonly ICacheService _cacheService; + readonly IValidator _validator; + readonly IStringLocalizer _localizer; + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public StateProvinceController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, ICacheService cacheService, IValidator validator, IStringLocalizer localizer) + { + _logger = logger; + _idCreator = idCreator; + _identityService = identityService; + _dbContext = dbContext; + _mapper = mapper; + _cacheService = cacheService; + _validator = validator; + _localizer = localizer; + } + + /// + /// 数据查询 + /// + /// + /// + /// + /// + [HttpPost("searh")] + [Authorize(Policy = Permissions.User.View)] + public IActionResult AddressList(StateProvinceSearch search, int page, int size = 20) + { + if (page < 1) + { + page = 1; + } + var result = new ApiResult>(); + var list = new PagingList() { Index = page, Size = size }; + var query = from p in _dbContext.StateProvinces + select p; + + if (!string.IsNullOrEmpty(search.Name)) + { + query = from p in query + where p.Name.Contains(search.Name) + select p; + } + + if (search.CountryId > 0) + { + query = from p in query + where p.CountryId == search.CountryId + select p; + } + list.Count = query.Count(); + list.Items = query.OrderByDescending(p => p.DisplayOrder).Skip((page - 1) * size).Take(size).ToList(); + + result = result.IsSuccess(list); + + return new JsonResult(result); + } + + + /// + /// 新增编辑数据 + /// + /// + /// + [HttpPost("save")] + public IActionResult AddressEdit(StateProvinceModel model) + { + var result = new ApiResult(); + var validation = _validator.Validate(model); + if (!validation.IsValid) + { + var message = validation.Errors.FirstOrDefault()?.ErrorMessage ?? string.Empty; + return new JsonResult(new ApiResult().IsFail(message, null)); + } + var data = _dbContext.StateProvinces.SingleOrDefault(p => p.CountryId == model.CountryId && p.Name == model.Name && p.Id != model.Id); + if (data != null) + { + return new JsonResult(new ApiResult().IsFail("当前数据已经存在,请认真检查", null)); + } + if (model.Id > 0) + { + data = _dbContext.StateProvinces.SingleOrDefault(p => p.Id == model.Id); + if (data == null) + { + return new JsonResult(new ApiResult().IsFail("数据不存在", null)); + } + + data = _mapper.Map(model, data); + + _dbContext.SaveChanges(); + + } + else + { + data = _mapper.Map(model); + data.Id = _idCreator.CreateId(); + + _dbContext.StateProvinces.Add(data); + _dbContext.SaveChanges(); + } + + return new JsonResult(new ApiResult().IsSuccess("操作成功")); + } + + /// + /// 删除数据 + /// + /// + /// + + [HttpPost("delete")] + public async Task DeleteAsync(long id) + { + var result = new ApiResult(); + try + { + Console.WriteLine($"{id} deleted"); + var count = _dbContext.StateProvinces.Where(p => p.Id == id).ExecuteDelete(); + result = result.IsSuccess(count.ToString()); + } + catch (Exception ex) + { + result = result.IsFail(ex.Message); + _logger.LogError(ex.Message); + } + return new JsonResult(result); + } + + } +} \ No newline at end of file diff --git a/Atomx.Common/Models/LocalizationFileFile.cs b/Atomx.Common/Models/LocalizationFileFile.cs deleted file mode 100644 index eaf76da..0000000 --- a/Atomx.Common/Models/LocalizationFileFile.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Atomx.Common.Models -{ - public class LocalizationFile - { - /// - /// 本地化文件版本 - /// - public string ResourceVersion { get; set; } = string.Empty; - - /// - /// 本地化译文 - /// - public Dictionary Translations { get; set; } = new(); - } -}