From f7bb6bb2dc88e26128396bb2b919ab7b5c0d1b1d Mon Sep 17 00:00:00 2001 From: Seany <17074267@qq.com> Date: Thu, 25 Dec 2025 12:41:37 +0800 Subject: [PATCH] chore --- .../Atomx.Admin.Client/Models/CountryModel.cs | 5 + .../Pages/Settings/AreaEdit.razor | 5 + .../Pages/Settings/AreaList.razor | 207 ++++++++++++++++++ .../Pages/Settings/CountryEdit.razor | 96 ++++++-- .../Pages/Settings/CountryList.razor | 98 ++------- .../Controllers/CountryController.cs | 29 ++- .../Controllers/LanguageController.cs | 11 +- .../Controllers/UploadFileController.cs | 4 +- Atomx.Common/Models/CountryLocalizedModel.cs | 9 + Atomx.Common/Models/KeyValue.cs | 8 + 10 files changed, 363 insertions(+), 109 deletions(-) create mode 100644 Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor create mode 100644 Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor create mode 100644 Atomx.Common/Models/CountryLocalizedModel.cs create mode 100644 Atomx.Common/Models/KeyValue.cs diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs index d90b0c6..a443440 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Models/CountryModel.cs @@ -4,5 +4,10 @@ namespace Atomx.Admin.Client.Models { public class CountryModel:Country { + /// + /// 语言 + /// + public string LanguageId { get; set; } = string.Empty; + public List Localized { get; set; } = new List(); } } diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor new file mode 100644 index 0000000..1182801 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor @@ -0,0 +1,5 @@ +

AreaEdit

+ +@code { + +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor new file mode 100644 index 0000000..2a47eb9 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor @@ -0,0 +1,207 @@ +@page "/area/list/{countryId:long}" +@page "/{locale}/area/list/{countryId:long}" +@inject ILogger Logger +@attribute [Authorize] + + + + + + + Home + 系统配置 + 国家管理 + + + + + +
+ + + + + +
+ + +
+ +
+
+
+ + +
+ +
+
+ + + + + + + + @if (context.Enabled) + { + 已激活 + } + else + { + 未激活 + } + + + + + + 编辑 + + @* + + 删除 + + *@ + + +
+
+ + @if (PagingList.Count > 0) + { + + } + +
+
+
+
+
+ +@code { + [Parameter] + public string Locale { get; set; } = string.Empty; + [Parameter] + public long CountryId { get; set; } + + [SupplyParameterFromQuery] + int? Page { get; set; } + + [SupplyParameterFromQuery(Name = "size")] + int? PageSize { get; set; } + + bool pageLoading = false; + + Form searchForm = new(); + CountrySearch search = new(); + + PagingList PagingList = new() { Size = 20 }; + + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + } + + protected override async Task OnParametersSetAsync() + { + loadQueryString(); + await LoadListAsync(); + await base.OnParametersSetAsync(); + } + + void loadQueryString() + { + var uri = new Uri(Navigation.Uri); + var query = uri.Query; + search.Name = query.GetQueryString("Name"); + } + + async Task LoadListAsync() + { + try + { + pageLoading = true; + var url = "/api/country/search"; + var apiResult = await HttpService.GetPagingList(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20)); + if (apiResult.Success) + { + if (apiResult.Data != null) + { + PagingList = apiResult.Data; + } + } + else if (apiResult.Code == 403) + { + ModalService.Error(new ConfirmOptions() { Title = "权限不足", Content = apiResult.Message }); + } + + StateHasChanged(); + } + finally + { + pageLoading = false; + } + } + + void OnSearchReset() + { + search = new CountrySearch(); + searchForm?.Reset(); + } + + private void OnSearch(int page) + { + var queryString = search.BuildQueryString(); + if (string.IsNullOrEmpty(queryString)) + { + if (page > 1) + { + Navigation.NavigateTo($"/country/list?page={page}"); + } + else + { + Navigation.NavigateTo($"/country/list"); + } + } + else + { + if (page > 1) + { + Navigation.NavigateTo($"/country/list?page={page}&{queryString}"); + } + else + { + Navigation.NavigateTo($"/country/list?{queryString}"); + } + } + } + + void OnSearchFinish() + { + Page = Page.GetValueOrDefault(1) - 1; + + OnSearch(Page.Value); + } + + private void OnPageChanged(PaginationEventArgs args) + { + OnSearch(args.Page); + } + + void HandleAddNew() + { + Navigation.NavigateTo($"/country/create"); + } + + + void HandleEdit(Country model) + { + Navigation.NavigateTo($"/country/edit/{model.Id}"); + } + +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryEdit.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryEdit.razor index 0582bd9..7e0e1ae 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryEdit.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryEdit.razor @@ -17,29 +17,43 @@ - +
+ @if (Id > 0 && languageList.Any()) + { + + + + 标准 + + + @foreach (var item in languageList) + { + + + @item.Value + + + } + + } - + - - + + - - + + - - - - @foreach (var item in LanguageCultures) - { - - } - - + + - - + + + + + 允许发货 @@ -65,9 +79,13 @@ public long Id { get; set; } [SupplyParameterFromForm] - CurrencyModel model { get; set; } = new(); - Form editform = null!; - Dictionary LanguageCultures = LanguageCulture.Descriptions.ToDictionary(); + CountryModel model { get; set; } = new(); + Form editform = null!; + + Country Country = new(); + + List languageList = new(); + bool pageLoading = false; bool saving = false; @@ -85,6 +103,16 @@ base.OnParametersSet(); } + async Task LoadLanguage() + { + var url = $"/api/language/enabled"; + var apiResult = await HttpService.Get>>(url); + if (apiResult.Success) + { + languageList = apiResult.Data ?? new List(); + } + } + async void LoadData() { pageLoading = true; @@ -98,7 +126,7 @@ } else { - model = apiResult.Data.Adapt(); + model = apiResult.Data.Adapt(); } } else @@ -134,4 +162,30 @@ } } + void OnLanguageTabChange(string key) + { + if (key != "0") + { + model.LanguageId = key; + var data = model.Localized.Where(p => p.LanguageId == key.ToInt()).ToList(); + if (data.Any()) + { + var name = nameof(model.Name); + + model.Name = data.SingleOrDefault(p => p.Key == name)?.Value ?? ""; + } + else + { + model.Name = string.Empty; + } + } + else + { + // model = Mapper.Map(model); + + // model.LanguageId = key; + // model.IsEdit = true; + } + } + } diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryList.razor index 0fca3ce..9d77268 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryList.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/CountryList.razor @@ -5,12 +5,12 @@ - + Home 系统配置 - 货币管理 + 国家管理 @@ -22,41 +22,9 @@ - - @if (searchExpand) - { - - - - - - - - - - - - - - - - - - } - @@ -65,25 +33,15 @@
- +
- - - - @if (context.PrimaryCurrency) - { - - } - else - { - - } - + + @if (context.Enabled) { @@ -135,12 +93,11 @@ int? PageSize { get; set; } bool pageLoading = false; - bool searchExpand = false; - Form searchForm = new(); - CurrencySearchModel search = new(); + Form searchForm = new(); + CountrySearch search = new(); - PagingList PagingList = new() { Size = 20 }; + PagingList PagingList = new() { Size = 20 }; protected override async Task OnInitializedAsync() @@ -160,21 +117,6 @@ var uri = new Uri(Navigation.Uri); var query = uri.Query; search.Name = query.GetQueryString("Name"); - search.Status = query.GetQueryString("Status"); - - var data = query.GetQueryString("RangeTime"); - if (!string.IsNullOrEmpty(data)) - { - var rangetime = data.Split("-"); - if (rangetime != null && rangetime.Length > 0) - { - searchExpand = true; - search.RangeTime[0] = rangetime[0].NumberToDateTime(); - search.RangeTime[1] = rangetime[1].NumberToDateTime(); - StateHasChanged(); - } - } - } async Task LoadListAsync() @@ -182,8 +124,8 @@ try { pageLoading = true; - var url = "/api/currency/search"; - var apiResult = await HttpService.GetPagingList(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20)); + var url = "/api/country/search"; + var apiResult = await HttpService.GetPagingList(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20)); if (apiResult.Success) { if (apiResult.Data != null) @@ -206,7 +148,7 @@ void OnSearchReset() { - search = new CurrencySearchModel(); + search = new CountrySearch(); searchForm?.Reset(); } @@ -217,22 +159,22 @@ { if (page > 1) { - Navigation.NavigateTo($"/currency/list?page={page}"); + Navigation.NavigateTo($"/country/list?page={page}"); } else { - Navigation.NavigateTo($"/currency/list"); + Navigation.NavigateTo($"/country/list"); } } else { if (page > 1) { - Navigation.NavigateTo($"/currency/list?page={page}&{queryString}"); + Navigation.NavigateTo($"/country/list?page={page}&{queryString}"); } else { - Navigation.NavigateTo($"/currency/list?{queryString}"); + Navigation.NavigateTo($"/country/list?{queryString}"); } } } @@ -251,17 +193,13 @@ void HandleAddNew() { - Navigation.NavigateTo($"/currency/create"); + Navigation.NavigateTo($"/country/create"); } - void HandleEdit(CurrencyModel model) + void HandleEdit(Country model) { - Navigation.NavigateTo($"/currency/edit/{model.Id}"); + Navigation.NavigateTo($"/country/edit/{model.Id}"); } } - -@code { - -} diff --git a/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs b/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs index 4d6fd71..4856fa1 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/CountryController.cs @@ -61,7 +61,7 @@ namespace Atomx.Admin.Controllers /// [HttpPost("searh")] [Authorize(Policy = Permissions.User.View)] - public IActionResult AddressList(CountrySearch search, int page, int size = 20) + public IActionResult Search(CountrySearch search, int page, int size = 20) { if (page < 1) { @@ -87,6 +87,29 @@ namespace Atomx.Admin.Controllers return new JsonResult(result); } + /// + /// 详情,含多语言 + /// + /// + /// + [HttpPost("detail")] + public IActionResult Detail(long id) + { + var result = new ApiResult(); + var data = _dbContext.Countries.SingleOrDefault(p => p.Id == id); + if(data == null) + { + return new JsonResult(new ApiResult().IsFail("数据不存在", null)); + } + var localizedList = _dbContext.LocalizedProperties.Where(p => p.EntityId == id).ToList(); + var model = _mapper.Map(data); + model.Locales = localizedList; + + result = result.IsSuccess(model); + + return new JsonResult(result); + } + /// /// 新增编辑数据 @@ -94,7 +117,7 @@ namespace Atomx.Admin.Controllers /// /// [HttpPost("save")] - public IActionResult AddressEdit(CountryModel model) + public IActionResult Save(CountryModel model) { var result = new ApiResult(); var validation = _validator.Validate(model); @@ -140,7 +163,7 @@ namespace Atomx.Admin.Controllers /// [HttpPost("delete")] - public async Task DeleteAsync(long id) + public async Task Delete(long id) { var result = new ApiResult(); try diff --git a/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs b/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs index e79ae3a..7d3b009 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/LanguageController.cs @@ -1,5 +1,4 @@ using Atomx.Admin.Client.Models; -using Atomx.Admin.Client.Validators; using Atomx.Admin.Services; using Atomx.Common.Entities; using Atomx.Common.Models; @@ -12,6 +11,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Localization; +using System.Threading.Tasks; namespace Atomx.Admin.Controllers { @@ -61,9 +61,11 @@ namespace Atomx.Admin.Controllers [HttpGet("enabled")] public async Task CacheLanguage() { - var result = new ApiResult>(); + var result = new ApiResult>(); - var list = await _cacheService.GetLanguages(true); + var data = await _cacheService.GetLanguages(); + + var list = data.Where(p => p.Enabled).Select(p => new KeyValue() { Key = p.Id.ToString(), Value = p.Name }).ToList(); result = result.IsSuccess(list); @@ -184,13 +186,14 @@ namespace Atomx.Admin.Controllers /// /// [HttpPost("delete/{id:long}")] - public IActionResult Delete(long id) + public async Task Delete(long id) { var result = new ApiResult(); try { Console.WriteLine($"{id} deleted"); var count = _dbContext.Languages.Where(p => p.Id == id).ExecuteDelete(); + await _cacheService.GetLanguages(true); result = result.IsSuccess(count.ToString()); } catch (Exception ex) diff --git a/Atomx.Admin/Atomx.Admin/Controllers/UploadFileController.cs b/Atomx.Admin/Atomx.Admin/Controllers/UploadFileController.cs index 75aa16e..9016f44 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/UploadFileController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/UploadFileController.cs @@ -34,13 +34,15 @@ namespace Atomx.Admin.Controllers /// /// public UploadFileController(ILogger logger, IIdentityService identityService, IIdCreatorService idCreator, IMapper mapper, DataContext dataContext, - IValidator validator, IStringLocalizer localizer) + IValidator validator, IStringLocalizer localizer) { _logger = logger; _identityService = identityService; _idCreator = idCreator; _mapper = mapper; _dbContext = dataContext; + _validator = validator; + _localizer = localizer; } /// diff --git a/Atomx.Common/Models/CountryLocalizedModel.cs b/Atomx.Common/Models/CountryLocalizedModel.cs new file mode 100644 index 0000000..e56f03d --- /dev/null +++ b/Atomx.Common/Models/CountryLocalizedModel.cs @@ -0,0 +1,9 @@ +using Atomx.Common.Entities; + +namespace Atomx.Common.Models +{ + public class CountryLocalizedModel : Country + { + public List Locales { get; set; } = new List(); + } +} diff --git a/Atomx.Common/Models/KeyValue.cs b/Atomx.Common/Models/KeyValue.cs new file mode 100644 index 0000000..63391ec --- /dev/null +++ b/Atomx.Common/Models/KeyValue.cs @@ -0,0 +1,8 @@ +namespace Atomx.Common.Models +{ + public class KeyValue + { + public string Key { get; set; } = string.Empty; + public string Value { get; set; } = string.Empty; + } +}