mirror of
				https://github.com/nsnail/NetAdmin.git
				synced 2025-11-01 03:35:28 +08:00 
			
		
		
		
	refactor: ♻️ 国家代码表重构
[skip ci]
This commit is contained in:
		| @@ -7,7 +7,7 @@ namespace NetAdmin.Infrastructure.Attributes; | ||||
| ///     https://github.com/countries/countries | ||||
| /// </remarks> | ||||
| [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)] | ||||
| public sealed class CountryAttribute : Attribute | ||||
| public sealed class CountryInfoAttribute : Attribute | ||||
| { | ||||
|     /// <summary> | ||||
|     ///     三个字母的国家代码 | ||||
| @@ -22,7 +22,7 @@ public sealed class CountryAttribute : Attribute | ||||
|     /// <summary> | ||||
|     ///     国际电话子呼号(区分同一呼号不同国家) | ||||
|     /// </summary> | ||||
|     public string CallingSubCode { get; set; } | ||||
|     public string[] CallingSubCode { get; set; } | ||||
| 
 | ||||
|     /// <summary> | ||||
|     ///     货币代码 | ||||
| @@ -37,7 +37,7 @@ public sealed class CountryAttribute : Attribute | ||||
|     /// <summary> | ||||
|     ///     官方语言代码 | ||||
|     /// </summary> | ||||
|     public string Languages { get; set; } | ||||
|     public string[] Languages { get; set; } | ||||
| 
 | ||||
|     /// <summary> | ||||
|     ///     国家全称 | ||||
| @@ -49,8 +49,13 @@ public sealed class CountryAttribute : Attribute | ||||
|     /// </summary> | ||||
|     public string ShortName { get; set; } | ||||
| 
 | ||||
|     /// <summary> | ||||
|     ///     时区 | ||||
|     /// </summary> | ||||
|     public string[] Timezones { get; set; } | ||||
| 
 | ||||
|     /// <summary> | ||||
|     ///     非正式名称 | ||||
|     /// </summary> | ||||
|     public string UnofficialNames { get; set; } | ||||
|     public string[] UnofficialNames { get; set; } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2851
									
								
								src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/CountryCodes.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2851
									
								
								src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/CountryCodes.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,17 @@ | ||||
| using Microsoft.OpenApi.Extensions; | ||||
|  | ||||
| namespace NetAdmin.Infrastructure.Extensions; | ||||
|  | ||||
| /// <summary> | ||||
| ///     CountryCodes 扩展方法 | ||||
| /// </summary> | ||||
| public static class CountryCodesExtensions | ||||
| { | ||||
|     /// <summary> | ||||
|     ///     获取国际电话呼号 | ||||
|     /// </summary> | ||||
|     public static int GetCallingCode(this CountryCodes me) | ||||
|     { | ||||
|         return me.GetAttributeOfType<CountryInfoAttribute>().CallingCode; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,36 @@ | ||||
| using Microsoft.OpenApi.Extensions; | ||||
|  | ||||
| namespace NetAdmin.Infrastructure.Utils; | ||||
|  | ||||
| /// <summary> | ||||
| ///     电话号相关工具类 | ||||
| /// </summary> | ||||
| public static class PhoneNumberHelper | ||||
| { | ||||
|     private static readonly IEnumerable<(string CallingCode, CountryCodes CountryCode)> _countryList; | ||||
|  | ||||
|     #pragma warning disable S3963 | ||||
|     static PhoneNumberHelper() | ||||
|         #pragma warning restore S3963 | ||||
|     { | ||||
|         _countryList = Enum.GetValues<CountryCodes>() | ||||
|                            .SelectMany(x => { | ||||
|                                var attribute = x.GetAttributeOfType<CountryInfoAttribute>(); | ||||
|  | ||||
|                                // ReSharper disable once UseCollectionExpression | ||||
|                                return (attribute.CallingSubCode ?? new[] { string.Empty }).Select(y => (attribute.CallingCode + y, x)); | ||||
|                            }) | ||||
|                            .OrderBy(x => x.Item1) | ||||
|                            .ThenByDescending(x => x.x.GetAttributeOfType<CountryInfoAttribute>().IsPreferred) | ||||
|                            .DistinctBy(x => x.Item1) | ||||
|                            .OrderByDescending(x => x.Item1.Length); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     ///     电话号码转国家代码 | ||||
|     /// </summary> | ||||
|     public static CountryCodes PhoneNumberToCountryCode(string phoneNumber) | ||||
|     { | ||||
|         return _countryList.First(x => phoneNumber.Replace("+", string.Empty).Trim().StartsWith(x.CallingCode, StringComparison.Ordinal)).CountryCode; | ||||
|     } | ||||
| } | ||||
| @@ -48,7 +48,7 @@ public sealed class ConfigService(BasicRepository<Sys_Config, long> rpo) // | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         #if DBTYPE_SQLSERVER | ||||
|         return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryConfigRsp>(); | ||||
|         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryConfigRsp>(); | ||||
|         #else | ||||
|         return await UpdateAsync(req, null).ConfigureAwait(false) > 0 | ||||
|             ? await GetAsync(new QueryConfigReq { Id = req.Id }).ConfigureAwait(false) | ||||
|   | ||||
| @@ -31,7 +31,11 @@ public sealed class ConstantService : ServiceBase<IConstantService>, IConstantSe | ||||
|  | ||||
|         static string[] GetDicValue(Enum y) | ||||
|         { | ||||
|             var ret      = new[] { Convert.ToInt64(y, CultureInfo.InvariantCulture).ToString(CultureInfo.InvariantCulture), y.ResDesc<Ln>() }; | ||||
|             var ret = new[] { Convert.ToInt64(y, CultureInfo.InvariantCulture).ToString(CultureInfo.InvariantCulture), y.ResDesc<Ln>() }; | ||||
|             if (y is CountryCodes) { | ||||
|                 return [..ret, y.GetAttributeOfType<CountryInfoAttribute>().CallingCode.ToInvString()]; | ||||
|             } | ||||
|  | ||||
|             var indicate = y.GetAttributeOfType<IndicatorAttribute>()?.Indicate.ToLowerInvariant(); | ||||
|             return indicate.NullOrEmpty() ? ret : [..ret, indicate]; | ||||
|         } | ||||
|   | ||||
| @@ -66,7 +66,7 @@ public sealed class DeptService(BasicRepository<Sys_Dept, long> rpo) // | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         #if DBTYPE_SQLSERVER | ||||
|         return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDeptRsp>(); | ||||
|         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDeptRsp>(); | ||||
|         #else | ||||
|         return await UpdateAsync(req, null).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDeptReq { Id = req.Id }).ConfigureAwait(false) : null; | ||||
|         #endif | ||||
|   | ||||
| @@ -55,7 +55,7 @@ public sealed class DicCatalogService(BasicRepository<Sys_DicCatalog, long> rpo) | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         return req.ParentId == 0 || await Rpo.Where(a => a.Id == req.ParentId).WithNoLockNoWait().AnyAsync().ConfigureAwait(false) | ||||
|             ? await UpdateAsync(req, null).ConfigureAwait(false) | ||||
|             ? await UpdateAsync(req).ConfigureAwait(false) | ||||
|             : throw new NetAdminInvalidOperationException(Ln.父节点不存在); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -58,7 +58,7 @@ public sealed class DicContentService(BasicRepository<Sys_DicContent, long> rpo) | ||||
|         } | ||||
|  | ||||
|         #if DBTYPE_SQLSERVER | ||||
|         return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDicContentRsp>(); | ||||
|         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDicContentRsp>(); | ||||
|         #else | ||||
|         return await UpdateAsync(req, null).ConfigureAwait(false) > 0 | ||||
|             ? await GetAsync(new QueryDicContentReq { Id = req.Id }).ConfigureAwait(false) | ||||
|   | ||||
| @@ -55,7 +55,7 @@ public sealed class DocCatalogService(BasicRepository<Sys_DocCatalog, long> rpo) | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         return req.ParentId == 0 || await Rpo.Where(a => a.Id == req.ParentId).WithNoLockNoWait().AnyAsync().ConfigureAwait(false) | ||||
|             ? await UpdateAsync(req, null).ConfigureAwait(false) | ||||
|             ? await UpdateAsync(req).ConfigureAwait(false) | ||||
|             : throw new NetAdminInvalidOperationException(Ln.父节点不存在); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -62,7 +62,7 @@ public sealed class DocContentService(BasicRepository<Sys_DocContent, long> rpo) | ||||
|         } | ||||
|  | ||||
|         #if DBTYPE_SQLSERVER | ||||
|         return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDocContentRsp>(); | ||||
|         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDocContentRsp>(); | ||||
|         #else | ||||
|         return await UpdateAsync(req, null, [nameof(IFieldOwner.OwnerId), nameof(IFieldOwner.OwnerDeptId)]).ConfigureAwait(false) > 0 | ||||
|             ? await GetAsync(new QueryDocContentReq { Id = req.Id }).ConfigureAwait(false) | ||||
|   | ||||
| @@ -50,7 +50,7 @@ public sealed class MenuService(BasicRepository<Sys_Menu, long> rpo, IUserServic | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         #if DBTYPE_SQLSERVER | ||||
|         return (await UpdateReturnListAsync(req, null).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryMenuRsp>(); | ||||
|         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryMenuRsp>(); | ||||
|         #else | ||||
|         return await UpdateAsync(req, null).ConfigureAwait(false) > 0 ? await GetAsync(new QueryMenuReq { Id = req.Id }).ConfigureAwait(false) : null; | ||||
|         #endif | ||||
|   | ||||
| @@ -72,7 +72,7 @@ public sealed class SiteMsgService(BasicRepository<Sys_SiteMsg, long> rpo, Conte | ||||
|  | ||||
|         // 主表 | ||||
|         var entity = req.Adapt<Sys_SiteMsg>(); | ||||
|         _ = await UpdateAsync(entity, null).ConfigureAwait(false); | ||||
|         _ = await UpdateAsync(entity).ConfigureAwait(false); | ||||
|  | ||||
|         // 分表 | ||||
|         await Rpo.SaveManyAsync(entity, nameof(entity.Roles)).ConfigureAwait(false); | ||||
|   | ||||
| @@ -67,7 +67,7 @@ public sealed class UserProfileService(BasicRepository<Sys_UserProfile, long> rp | ||||
|     public Task<int> EditAsync(EditUserProfileReq req) | ||||
|     { | ||||
|         req.ThrowIfInvalid(); | ||||
|         return UpdateAsync(req.Adapt<Sys_UserProfile>(), null); | ||||
|         return UpdateAsync(req.Adapt<Sys_UserProfile>()); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc /> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user