diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs index c5ddeed..29c2145 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Models/StateProvinceModel.cs @@ -2,7 +2,7 @@ namespace Atomx.Admin.Client.Models { - public class StateProvinceModel: StateProvince + public class StateProvinceModel: Area { } } diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor index bdfc446..e39322e 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor @@ -111,7 +111,7 @@ async Task LoadStateProvinceAndCities() { - var url = $"/api/stateprovince/tree/{CountryId}"; + var url = $"/api/area/tree/{CountryId}"; var apiResult = await HttpService.Get>>(url); if (apiResult.Success) { @@ -164,14 +164,14 @@ { area = apiResult.Data; model = apiResult.Data.Adapt(); - if (model.ParentId > 0) - { - cities = $"{model.StateProvinceId},{model.ParentId}"; - } - else if (model.StateProvinceId > 0) - { - cities = $"{model.StateProvinceId}"; - } + // if (model.ParentId > 0) + // { + // cities = $"{model.StateProvinceId},{model.ParentId}"; + // } + // else if (model.StateProvinceId > 0) + // { + // cities = $"{model.StateProvinceId}"; + // } } } else @@ -186,13 +186,7 @@ void OnCitiesChange(CascaderNode[] selectedNodes) { Console.WriteLine($"value: {cities} selected: {string.Join(",", selectedNodes.Select(x => x.Value))}"); - - model.StateProvinceId = long.Parse(selectedNodes.First().Value.ToString() ?? "0"); model.ParentId = long.Parse(selectedNodes.Last().Value.ToString() ?? "0"); - if (model.StateProvinceId == model.ParentId) - { - model.ParentId = 0; - } } async void OnFormFinishAsync() diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceEdit.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceEdit.razor index e9dc070..931cecb 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceEdit.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceEdit.razor @@ -57,11 +57,11 @@ public long Id { get; set; } [SupplyParameterFromForm] - StateProvinceModel model { get; set; } = new(); - Form editform = null!; + AreaModel model { get; set; } = new(); + Form editform = null!; List languageList = new(); Country country = new(); - StateProvinceLocalizedModel stateProvince = new(); + AreaLocalizedModel stateProvince = new(); bool pageLoading = false; bool saving = false; @@ -125,8 +125,8 @@ async void LoadData() { pageLoading = true; - var url = $"/api/stateprovince/detail?id={Id}"; - var apiResult = await HttpService.Get>(url); + var url = $"/api/area/detail?id={Id}"; + var apiResult = await HttpService.Get>(url); if (apiResult.Success) { if (apiResult.Data == null) @@ -136,7 +136,7 @@ else { stateProvince = apiResult.Data; - model = apiResult.Data.Adapt(); + model = apiResult.Data.Adapt(); } } else @@ -153,7 +153,7 @@ if (editform.Validate()) { saving = true; - var url = $"api/stateprovince/save"; + var url = $"api/area/save"; var result = new ApiResult(); result = await HttpService.Post>(url, model); diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor index e9cd4bc..24fde39 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor @@ -108,7 +108,7 @@ Form searchForm = new(); StateProvinceSearch search = new(); - PagingList PagingList = new() { Size = 20 }; + PagingList PagingList = new() { Size = 20 }; protected override async Task OnInitializedAsync() @@ -136,8 +136,8 @@ try { pageLoading = true; - var url = "/api/stateprovince/search"; - var apiResult = await HttpService.GetPagingList(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20)); + var url = "/api/area/stateprovince/search"; + var apiResult = await HttpService.GetPagingList(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20)); if (apiResult.Success) { if (apiResult.Data != null) @@ -209,12 +209,12 @@ } - void HandleEdit(StateProvince model) + void HandleEdit(Area model) { Navigation.NavigateTo($"/stateprovince/{CountryId}/edit/{model.Id}"); } - void GotoArea(StateProvince model) + void GotoArea(Area model) { Navigation.NavigateTo($"/area/list/{CountryId}/{model.Id}"); } diff --git a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs index 8eb6dd6..7a4ab3a 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Localization; +using System.Threading.Tasks; namespace Atomx.Admin.Controllers { @@ -60,6 +61,21 @@ namespace Atomx.Admin.Controllers _localizer = localizer; } + /// + /// 获取省份-城市树形数据 + /// + /// + /// + /// + /// + [HttpGet("tree/{countryId}")] + public async Task GetAreatree(long countryId) + { + var result = new ApiResult>(); + var list = await _cacheService.GetAreaTree(countryId); + return new JsonResult(result.IsSuccess(list)); + } + /// /// 数据查询 /// @@ -67,8 +83,8 @@ namespace Atomx.Admin.Controllers /// /// /// - [HttpPost("search")] - public IActionResult Search(AreaSearch search, int page, int size = 20) + [HttpPost("stateprovince/search")] + public async Task StateProvinceSearch(AreaSearch search, int page, int size = 20) { if (page < 1) { @@ -77,9 +93,83 @@ namespace Atomx.Admin.Controllers var result = new ApiResult>(); var list = new PagingList() { Index = page, Size = size }; var countries = new List(); - var stateProvices = new List(); var query = from p in _dbContext.Areas + where p.StateProvinceId == 0 + 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(); + var data = query.OrderByDescending(p => p.DisplayOrder).Skip((page - 1) * size).Take(size).ToList(); + + if (search.CountryId > 0) + { + var country = _dbContext.Countries.SingleOrDefault(p => p.Id == search.CountryId); + if (country != null) + { + countries.Add(country); + } + } + else + { + var countryIds = data.Select(p => p.CountryId).Distinct().ToList(); + countries = _dbContext.Countries.Where(p => countryIds.Contains(p.Id)).ToList(); + } + + foreach (var item in data) + { + var model = _mapper.Map(item); + var country = countries.SingleOrDefault(p => p.Id == item.CountryId); + if (country != null) + { + model.CountryName = country.Name; + } + var state = await _cacheService.GetStateProvince(item.CountryId, item.ParentId); + if (state != null) + { + model.StateProvinceName = state.Name; + } + list.Items.Add(model); + } + + result = result.IsSuccess(list); + + return new JsonResult(result); + } + + /// + /// 数据查询 + /// + /// + /// + /// + /// + [HttpPost("search")] + public async Task SearchAsync(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 countries = new List(); + + var query = from p in _dbContext.Areas + where p.StateProvinceId != 0 select p; if (!string.IsNullOrEmpty(search.Name)) @@ -98,7 +188,7 @@ namespace Atomx.Admin.Controllers if (search.StateProvinceId > 0) { query = from p in query - where p.StateProvinceId == search.StateProvinceId + where p.ParentId == search.StateProvinceId select p; } list.Count = query.Count(); @@ -118,20 +208,6 @@ namespace Atomx.Admin.Controllers countries = _dbContext.Countries.Where(p => countryIds.Contains(p.Id)).ToList(); } - if (search.StateProvinceId > 0) - { - var state = _dbContext.StateProvinces.SingleOrDefault(p => p.Id == search.StateProvinceId); - if (state != null) - { - stateProvices.Add(state); - } - } - else - { - var stateIds = data.Select(p => p.StateProvinceId).Distinct().ToList(); - stateProvices = _dbContext.StateProvinces.Where(p => stateIds.Contains(p.Id)).ToList(); - } - foreach (var item in data) { var model = _mapper.Map(item); @@ -140,7 +216,7 @@ namespace Atomx.Admin.Controllers { model.CountryName = country.Name; } - var state = stateProvices.SingleOrDefault(p => p.Id == item.StateProvinceId); + var state = await _cacheService.GetStateProvince(item.CountryId, item.ParentId); if (state != null) { model.StateProvinceName = state.Name; @@ -196,14 +272,13 @@ namespace Atomx.Admin.Controllers return new JsonResult(result); } - /// /// 新增编辑数据 /// /// /// [HttpPost("save")] - public IActionResult AddressEdit(AreaModel model) + public IActionResult Edit(AreaModel model) { var result = new ApiResult(); var validation = _validator.Validate(model); @@ -212,15 +287,13 @@ namespace Atomx.Admin.Controllers 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); + var data = _dbContext.Areas.SingleOrDefault(p => p.CountryId == model.CountryId && p.ParentId == model.ParentId && 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) { @@ -229,7 +302,7 @@ namespace Atomx.Admin.Controllers data = _mapper.Map(model, data); - var parent = _dbContext.Categories.Where(p => p.Id == model.ParentId).SingleOrDefault(); + var parent = _dbContext.Areas.Where(p => p.Id == model.ParentId).SingleOrDefault(); if (parent == null) { data.Depth = 0; @@ -237,6 +310,15 @@ namespace Atomx.Admin.Controllers } else { + if (parent.StateProvinceId == 0) + { + data.StateProvinceId = parent.Id; + } + else + { + data.StateProvinceId = parent.StateProvinceId; + } + data.Depth = parent.Depth + 1; data.Path = $"{parent.Path},{data.Id}"; } @@ -249,7 +331,7 @@ namespace Atomx.Admin.Controllers data = _mapper.Map(model); data.Id = _idCreator.CreateId(); - var parent = _dbContext.Categories.Where(p => p.Id == data.ParentId).SingleOrDefault(); + var parent = _dbContext.Areas.Where(p => p.Id == data.ParentId).SingleOrDefault(); if (parent == null) { data.Depth = 0; @@ -257,6 +339,14 @@ namespace Atomx.Admin.Controllers } else { + if (parent.StateProvinceId == 0) + { + data.StateProvinceId = parent.Id; + } + else + { + data.StateProvinceId = parent.StateProvinceId; + } data.Depth = parent.Depth + 1; data.Path = $"{parent.Path},{data.Id}"; } diff --git a/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs b/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs deleted file mode 100644 index 5bbea35..0000000 --- a/Atomx.Admin/Atomx.Admin/Controllers/StateProvinceController.cs +++ /dev/null @@ -1,246 +0,0 @@ -using Atomx.Admin.Client.Models; -using Atomx.Admin.Services; -using Atomx.Common.Constants; -using Atomx.Common.Entities; -using Atomx.Common.Models; -using Atomx.Core.Jos; -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; -using System.Threading.Tasks; - -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; - private readonly IBackgroundJobService _backgroundService; - readonly IValidator _validator; - readonly IStringLocalizer _localizer; - - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public StateProvinceController(ILogger logger, IIdCreatorService idCreator, IIdentityService identityService, DataContext dbContext, IMapper mapper, - ICacheService cacheService, IBackgroundJobService backgroundJobService, IValidator validator, IStringLocalizer localizer) - { - _logger = logger; - _idCreator = idCreator; - _identityService = identityService; - _dbContext = dbContext; - _mapper = mapper; - _cacheService = cacheService; - _backgroundService = backgroundJobService; - _validator = validator; - _localizer = localizer; - } - - /// - /// 数据查询 - /// - /// - /// - /// - /// - [HttpGet("tree/{countryId:long}")] - public async Task GetTree(long countryId, int page, int size = 20) - { - var list = await _cacheService.GetAreaTree(countryId); - - return new JsonResult(new ApiResult>().IsSuccess(list)); - } - - /// - /// 数据查询 - /// - /// - /// - /// - /// - [HttpGet("select/{countryId:long}")] - public IActionResult Select(long countryId, int page, int size = 20) - { - var list = new List(); - var query = from p in _dbContext.StateProvinces - where p.CountryId == countryId && p.Enabled - select p; - list = query.OrderByDescending(p => p.DisplayOrder).Select(p => new KeyValue() { Label = p.Id.ToString(), Value = p.Name }).ToList(); - - return new JsonResult(new ApiResult>().IsSuccess(list)); - } - - /// - /// 数据查询 - /// - /// - /// - /// - /// - [HttpPost("search")] - public IActionResult Search(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); - } - - /// - /// 通过ID获取数据 - /// - /// - /// - [HttpGet("{id:long}")] - public IActionResult Get(long id) - { - var result = new ApiResult(); - var data = _dbContext.StateProvinces.SingleOrDefault(p => p.Id == id); - if (data == null) - { - return new JsonResult(new ApiResult().IsFail("数据不存在", null)); - } - - result = result.IsSuccess(data); - return new JsonResult(result); - } - - - /// - /// 通过ID获取详情,含多语言 - /// - /// - /// - [HttpGet("detail")] - public IActionResult Detail(long id) - { - var result = new ApiResult(); - var data = _dbContext.StateProvinces.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); - } - - - /// - /// 新增编辑数据 - /// - /// - /// - [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(); - _backgroundService.ResetStateProvinceAndAreaTree(data.CountryId); - } - 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/Entities/Area.cs b/Atomx.Common/Entities/Area.cs index 1b91328..f61b3d6 100644 --- a/Atomx.Common/Entities/Area.cs +++ b/Atomx.Common/Entities/Area.cs @@ -22,7 +22,7 @@ namespace Atomx.Common.Entities public long CountryId { get; set; } /// - /// 州省ID + /// 州/省ID /// public long StateProvinceId { get; set; } @@ -44,6 +44,12 @@ namespace Atomx.Common.Entities [Column(TypeName = "varchar(1)")] public string Initial { get; set; } = string.Empty; + /// + /// 缩写,简称 + /// + [Column(TypeName = "varchar(32)")] + public string Abbreviation { get; set; } = string.Empty; + /// /// 地区深度 /// diff --git a/Atomx.Common/Entities/StateProvince.cs b/Atomx.Common/Entities/StateProvince.cs deleted file mode 100644 index ab0cb24..0000000 --- a/Atomx.Common/Entities/StateProvince.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace Atomx.Common.Entities -{ - /// - /// 州省 - /// - [Table("StateProvinces")] - public class StateProvince - { - /// - /// 数据ID - /// - [DatabaseGenerated(DatabaseGeneratedOption.None)] - [Key] - public long Id { get; set; } - - /// - /// 地区名称 - /// - - [Column(TypeName = "varchar(256)")] - public string Name { get; set; } = string.Empty; - - /// - /// 国家ID - /// - public long CountryId { get; set; } - - /// - /// 首字母 - /// - [Column(TypeName = "varchar(1)")] - public string Initial { get; set; } = string.Empty; - - /// - /// 缩写 - /// - [Column(TypeName = "varchar(32)")] - public string Abbreviation { get; set; } = string.Empty; - - /// - /// 是否启用 - /// - public bool Enabled { get; set; } - - /// - /// 显示排序 - /// - public int DisplayOrder { get; set; } - } -} diff --git a/Atomx.Common/Models/StateProvinceLocalizedModel.cs b/Atomx.Common/Models/StateProvinceLocalizedModel.cs deleted file mode 100644 index cd24598..0000000 --- a/Atomx.Common/Models/StateProvinceLocalizedModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Atomx.Common.Entities; - -namespace Atomx.Common.Models -{ - public class StateProvinceLocalizedModel : StateProvince - { - public List Locales { get; set; } = new List(); - } -} diff --git a/Atomx.Data/CacheServices/AreaCacheService.cs b/Atomx.Data/CacheServices/AreaCacheService.cs index a6a2904..2990a35 100644 --- a/Atomx.Data/CacheServices/AreaCacheService.cs +++ b/Atomx.Data/CacheServices/AreaCacheService.cs @@ -24,7 +24,7 @@ namespace Atomx.Data.CacheServices /// /// /// - Task> GetStateProvinces(long countryId, bool? reload = false); + Task> GetStateProvinces(long countryId, bool? reload = false); /// /// 获取州省数据 @@ -32,7 +32,7 @@ namespace Atomx.Data.CacheServices /// /// /// - Task GetStateProvince(long countryId, long stateProvinceId); + Task GetStateProvince(long countryId, long stateProvinceId); /// /// 获取地区数据 @@ -54,7 +54,7 @@ namespace Atomx.Data.CacheServices /// /// /// - Task UpdateStateProvince(StateProvince stateProvince); + Task UpdateStateProvince(Area area); /// /// 更新调整国家缓存数据 @@ -141,14 +141,14 @@ namespace Atomx.Data.CacheServices /// /// /// - public async Task> GetStateProvinces(long countryId, bool? reload = false) + public async Task> GetStateProvinces(long countryId, bool? reload = false) { bool reloadData = reload.HasValue ? reload.Value : false; - var cacheData = await GetCacheAsync>($"{CacheKeys.StateProvince}.{countryId}"); + var cacheData = await GetCacheAsync>($"{CacheKeys.StateProvince}.{countryId}"); if (cacheData == null || reloadData) { - var stateProvinces = (from p in _dbContext.StateProvinces - where p.CountryId == countryId && p.Enabled + var stateProvinces = (from p in _dbContext.Areas + where p.CountryId == countryId && p.Enabled && p.ParentId == 0 select p).ToList(); await SetCacheAsync($"{CacheKeys.StateProvince}.{countryId}", stateProvinces); return stateProvinces; @@ -162,7 +162,7 @@ namespace Atomx.Data.CacheServices /// /// /// - public async Task GetStateProvince(long countryId, long stateProvinceId) + public async Task GetStateProvince(long countryId, long stateProvinceId) { var cacheData = await GetStateProvinces(countryId); var data = cacheData.SingleOrDefault(p => p.Id == stateProvinceId); @@ -183,7 +183,7 @@ namespace Atomx.Data.CacheServices { List areas = new(); var query = from p in _dbContext.Areas - where p.CountryId == countryId && p.Enabled + where p.CountryId == countryId && p.Enabled && p.StateProvinceId != 0 select p; var count = query.Count(); int size = 50; @@ -193,7 +193,7 @@ namespace Atomx.Data.CacheServices var list = query.Skip((i - 1) * size).Take(size).ToList(); areas.AddRange(list); } - await SetCacheAsync(CacheKeys.Country, areas); + await SetCacheAsync($"{CacheKeys.City}.{countryId}", areas); return areas; } return cacheData; @@ -218,16 +218,16 @@ namespace Atomx.Data.CacheServices /// /// /// - public async Task UpdateStateProvince(StateProvince stateProvince) + public async Task UpdateStateProvince(Area area) { - var cacheData = await GetStateProvinces(stateProvince.CountryId); - var data = cacheData.Where(p => p.Id == stateProvince.Id).SingleOrDefault(); + var cacheData = await GetStateProvinces(area.CountryId); + var data = cacheData.Where(p => p.Id == area.Id).SingleOrDefault(); if (data != null) { cacheData.Remove(data); } - cacheData.Add(stateProvince); - await SetCacheAsync($"{CacheKeys.StateProvince}.{stateProvince.CountryId}", cacheData); + cacheData.Add(area); + await SetCacheAsync($"{CacheKeys.StateProvince}.{area.CountryId}", cacheData); } /// diff --git a/Atomx.Data/DataContext.cs b/Atomx.Data/DataContext.cs index dca7924..a4f564f 100644 --- a/Atomx.Data/DataContext.cs +++ b/Atomx.Data/DataContext.cs @@ -46,7 +46,7 @@ namespace Atomx.Data public DbSet AppVersions { get; set; } /// - /// 市区数据 + /// 州省/市区数据 /// public DbSet Areas { get; set; } @@ -141,11 +141,6 @@ namespace Atomx.Data /// public DbSet SpecificationAttributeOptions { get; set; } - /// - /// 州省份数据 - /// - public DbSet StateProvinces { get; set; } - /// /// 刷新Tokens /// diff --git a/Atomx.Data/Migrations/20260104093702_0.1.Designer.cs b/Atomx.Data/Migrations/20260104144630_0.1.Designer.cs similarity index 98% rename from Atomx.Data/Migrations/20260104093702_0.1.Designer.cs rename to Atomx.Data/Migrations/20260104144630_0.1.Designer.cs index bf15e64..aa27319 100644 --- a/Atomx.Data/Migrations/20260104093702_0.1.Designer.cs +++ b/Atomx.Data/Migrations/20260104144630_0.1.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Atomx.Data.Migrations { [DbContext(typeof(DataContext))] - [Migration("20260104093702_0.1")] + [Migration("20260104144630_0.1")] partial class _01 { /// @@ -239,6 +239,10 @@ namespace Atomx.Data.Migrations b.Property("Id") .HasColumnType("bigint"); + b.Property("Abbreviation") + .IsRequired() + .HasColumnType("varchar(32)"); + b.Property("AllowShipping") .HasColumnType("boolean"); @@ -1382,37 +1386,6 @@ namespace Atomx.Data.Migrations b.ToTable("SpecificationAttributeOptions"); }); - modelBuilder.Entity("Atomx.Common.Entities.StateProvince", b => - { - b.Property("Id") - .HasColumnType("bigint"); - - b.Property("Abbreviation") - .IsRequired() - .HasColumnType("varchar(32)"); - - b.Property("CountryId") - .HasColumnType("bigint"); - - b.Property("DisplayOrder") - .HasColumnType("integer"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("Initial") - .IsRequired() - .HasColumnType("varchar(1)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.ToTable("StateProvinces"); - }); - modelBuilder.Entity("Atomx.Common.Entities.Tag", b => { b.Property("Id") diff --git a/Atomx.Data/Migrations/20260104093702_0.1.cs b/Atomx.Data/Migrations/20260104144630_0.1.cs similarity index 98% rename from Atomx.Data/Migrations/20260104093702_0.1.cs rename to Atomx.Data/Migrations/20260104144630_0.1.cs index c96adc0..381f644 100644 --- a/Atomx.Data/Migrations/20260104093702_0.1.cs +++ b/Atomx.Data/Migrations/20260104144630_0.1.cs @@ -106,6 +106,7 @@ namespace Atomx.Data.Migrations ParentId = table.Column(type: "bigint", nullable: false), Name = table.Column(type: "varchar(256)", nullable: false), Initial = table.Column(type: "varchar(1)", nullable: false), + Abbreviation = table.Column(type: "varchar(32)", nullable: false), Depth = table.Column(type: "integer", nullable: false), Path = table.Column(type: "varchar(100)", nullable: false), AllowShipping = table.Column(type: "boolean", nullable: false), @@ -654,23 +655,6 @@ namespace Atomx.Data.Migrations table.PrimaryKey("PK_SpecificationAttributes", x => x.Id); }); - migrationBuilder.CreateTable( - name: "StateProvinces", - columns: table => new - { - Id = table.Column(type: "bigint", nullable: false), - Name = table.Column(type: "varchar(256)", nullable: false), - CountryId = table.Column(type: "bigint", nullable: false), - Initial = table.Column(type: "varchar(1)", nullable: false), - Abbreviation = table.Column(type: "varchar(32)", nullable: false), - Enabled = table.Column(type: "boolean", nullable: false), - DisplayOrder = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_StateProvinces", x => x.Id); - }); - migrationBuilder.CreateTable( name: "Tags", columns: table => new @@ -825,9 +809,6 @@ namespace Atomx.Data.Migrations migrationBuilder.DropTable( name: "SpecificationAttributes"); - migrationBuilder.DropTable( - name: "StateProvinces"); - migrationBuilder.DropTable( name: "Tags"); diff --git a/Atomx.Data/Migrations/DataContextModelSnapshot.cs b/Atomx.Data/Migrations/DataContextModelSnapshot.cs index 2fbbd1a..f665dee 100644 --- a/Atomx.Data/Migrations/DataContextModelSnapshot.cs +++ b/Atomx.Data/Migrations/DataContextModelSnapshot.cs @@ -236,6 +236,10 @@ namespace Atomx.Data.Migrations b.Property("Id") .HasColumnType("bigint"); + b.Property("Abbreviation") + .IsRequired() + .HasColumnType("varchar(32)"); + b.Property("AllowShipping") .HasColumnType("boolean"); @@ -1379,37 +1383,6 @@ namespace Atomx.Data.Migrations b.ToTable("SpecificationAttributeOptions"); }); - modelBuilder.Entity("Atomx.Common.Entities.StateProvince", b => - { - b.Property("Id") - .HasColumnType("bigint"); - - b.Property("Abbreviation") - .IsRequired() - .HasColumnType("varchar(32)"); - - b.Property("CountryId") - .HasColumnType("bigint"); - - b.Property("DisplayOrder") - .HasColumnType("integer"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("Initial") - .IsRequired() - .HasColumnType("varchar(1)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("varchar(256)"); - - b.HasKey("Id"); - - b.ToTable("StateProvinces"); - }); - modelBuilder.Entity("Atomx.Common.Entities.Tag", b => { b.Property("Id")