From b8f1e312f00318e201d9267a35a53ebac3d0c837 Mon Sep 17 00:00:00 2001 From: 移动系统liao <liaoxujun@qq.com> Date: 星期三, 25 六月 2025 16:33:57 +0800 Subject: [PATCH] 增加腾讯文字识别服务工程和项目 --- Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue | 109 + Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs | 47 Admin.NET/EzUpFile/UpFileController.cs | 196 + Admin.NET/EzUpFile/EzFileUploadService.cs | 754 +++++++ Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj | 1 Admin.NET/cylsg.utility/cylsg.utility.csproj | 14 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj | 7 Admin.NET/FZCZTB.NET.SYSService/Startup.cs | 32 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs | 3 Admin.NET/cylsg.utility/untilityModels.cs | 16 Admin.NET/cylsg.utility/Extend/StringEx.cs | 251 ++ Admin.NET/EzUpFile/EzUpFile.csproj | 30 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs | 7 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs | 177 + Admin.NET/EzTencentCloud/TencentCloudService.cs | 348 +++ Admin.NET/EzTencentCloud/EzTencentCloud.csproj | 19 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs | 41 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs | 60 Admin.NET/EzTencentCloud/TencentCloudConfig.json | 12 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs | 196 + Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs | 47 Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json | 11 Admin.NET/cylsg.utility/CommonHelper.cs | 1015 +++++++++ Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs | 191 + Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj | 2 Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs | 6 Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs | 11 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj | 2 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs | 4 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs | 2 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs | 4 Admin.NET/Admin.NET.sln | 20 Admin.NET/EzUpFile/UpFileConfig.json | 12 Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs | 88 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs | 275 +- Admin.NET/cylsg.utility/Extend/EmunEx.cs | 15 Admin.NET/cylsg.utility/StaticStringDef.cs | 24 Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs | 2 Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs | 79 Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs | 189 + Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs | 3 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs | 189 - Admin.NET/EzTencentCloud/ITencentCloudService.cs | 71 Web/src/views/Customer/fBS_EnterpriseType/index.vue | 194 + Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs | 103 Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs | 1021 ++++++++++ Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs | 69 Web/src/api/Customer/fBS_EnterpriseType.ts | 52 Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs | 17 Admin.NET/EzUpFile/IEzFileUploadService.cs | 73 50 files changed, 5,765 insertions(+), 346 deletions(-) diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj index a7ea9d5..6b158af 100644 --- a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj +++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj @@ -46,7 +46,7 @@ <PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.5" /> <PackageReference Include="System.Net.Http" Version="4.3.4" /> <PackageReference Include="System.Private.Uri" Version="4.3.2" /> - <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1252" /> + <PackageReference Include="TencentCloudSDK" Version="3.0.1268" /> <PackageReference Include="UAParser" Version="3.1.47" /> <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" /> <PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" Aliases="BouncyCastleV2" /> diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs index c807604..1f38313 100644 --- a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs @@ -63,6 +63,9 @@ /// </summary> [Required(ErrorMessage = "绉熸埛涓嶈兘涓虹┖")] public long? TenantId { get; set; } + + + } /// <summary> diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs index 1bc5c1e..efbb21d 100644 --- a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs +++ b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs @@ -63,8 +63,15 @@ public override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) { - // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬� - return await CheckAuthorizeAsync(httpContext); + + if (App.User.FindFirst(ClaimConst.UserType)?.Value == "Customer") + { + //瀹㈡埛鐧诲綍 涓嶉渶瑕佸仛璧烽獙璇� + return true; + } + else + // 宸茶嚜鍔ㄩ獙璇� Jwt Token 鏈夋晥鎬� + return await CheckAuthorizeAsync(httpContext); } /// <summary> diff --git a/Admin.NET/Admin.NET.sln b/Admin.NET/Admin.NET.sln index ac33046..9f9f027 100644 --- a/Admin.NET/Admin.NET.sln +++ b/Admin.NET/Admin.NET.sln @@ -42,6 +42,14 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FZCZTB.NET.SYSService", "FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj", "{9E19230C-7A8F-4440-B5D9-27D0038C13F6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzTencentCloud", "EzTencentCloud\EzTencentCloud.csproj", "{D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzUpFile", "EzUpFile\EzUpFile.csproj", "{5333BCDD-09C7-4021-AC43-CBFA63505D4D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "瑙e喅鏂规椤�", "瑙e喅鏂规椤�", "{251B31C8-0A9E-4948-9534-D167A56201F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cylsg.utility", "cylsg.utility\cylsg.utility.csproj", "{743B2BC9-11AE-4354-90D9-560B592F63CA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -111,6 +119,18 @@ {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E19230C-7A8F-4440-B5D9-27D0038C13F6}.Release|Any CPU.Build.0 = Release|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D56DD688-FBD2-43DA-B07F-AFC78C9F16F6}.Release|Any CPU.Build.0 = Release|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5333BCDD-09C7-4021-AC43-CBFA63505D4D}.Release|Any CPU.Build.0 = Release|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {743B2BC9-11AE-4354-90D9-560B592F63CA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Admin.NET/EzTencentCloud/EzTencentCloud.csproj b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj new file mode 100644 index 0000000..f9e143e --- /dev/null +++ b/Admin.NET/EzTencentCloud/EzTencentCloud.csproj @@ -0,0 +1,19 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + </ItemGroup> + + <ItemGroup> + <None Update="TencentCloudConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + +</Project> diff --git a/Admin.NET/EzTencentCloud/ITencentCloudService.cs b/Admin.NET/EzTencentCloud/ITencentCloudService.cs new file mode 100644 index 0000000..da37eff --- /dev/null +++ b/Admin.NET/EzTencentCloud/ITencentCloudService.cs @@ -0,0 +1,71 @@ +锘縰sing Furion.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Iai.V20200303.Models; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzTencentCloud +{ + /// <summary> + /// 鑵捐浜戞湇鍔� + /// </summary> + public interface ITencentCloudService: IScoped + { + #region orc 鍥炬枃璇嗗埆 + /// <summary> + /// 韬唤璇佽瘑鍒紝骞跺壀瑁� + /// </summary> + /// <param name="ImageBase64">鍥剧墖base64</param> + /// <param name="isFRONT"></param> + /// <returns></returns> + IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT); + /// <summary> + /// 鑾峰彇鍓鍚庣殑韬唤璇佺収鐗� + /// </summary> + /// <returns></returns> + string GetIdCordImg(); + /// <summary> + /// 钀ヤ笟鎵х収璁よ瘉 + /// </summary> + /// <param name="ImageBase64"> 鍥剧墖base64</param> + /// <returns></returns> + BizLicenseOCRResponse BizLicenseOCR(string ImageBase64); + #endregion + #region iai 浜鸿劯璇嗗埆 + /// <summary> + /// 鍒涘缓浜鸿劯搴擄紝涓�鑸竴涓簯璐﹀彿鍙渶瑕佸垱寤轰竴娆� + /// </summary> + public void IaiCreatGroup(); + /// <summary> + /// 浜鸿劯楠岃瘉 涓�鑸垎鏁拌秴杩�50 鍒嗚瘑鍒负涓�涓汉 + /// </summary> + /// <param name="img64"></param> + /// <param name="PersonNameId"></param> + /// <returns></returns> + public VerifyFaceResponse VerifyFace(string img64, string PersonNameId); + /// <summary> + /// 澧炲姞涓�涓汉鐨勪汉鑴稿浘鐗囩壒寰侊紝涓�涓渶澶氬彧鍏佽鏈変簲涓汉鑴哥壒杩� + /// </summary> + /// <param name="img64"></param> + /// <param name="PersonNameId"></param> + /// <param name="PersonName"></param> + /// <param name="PersonGender"></param> + /// <returns></returns> + public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender); + + /// <summary> + /// 澧炲姞涓�涓汉 + /// </summary> + /// <param name="img64">浜鸿劯鐓�</param> + /// <param name="PersonNameId">浜鸿劯ID 涓�涓簯璐︽埛涓敮涓�</param> + /// <param name="PersonName">濮撳悕</param> + /// <param name="PersonGender">鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + public bool IaiAddPerso(string img64, string PersonNameId, string PersonName, int PersonGender); + #endregion + + } +} diff --git a/Admin.NET/EzTencentCloud/TencentCloudConfig.json b/Admin.NET/EzTencentCloud/TencentCloudConfig.json new file mode 100644 index 0000000..0623d8f --- /dev/null +++ b/Admin.NET/EzTencentCloud/TencentCloudConfig.json @@ -0,0 +1,12 @@ +{ + "TencentCloud": { + "SecretId": "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + "SecretKey": "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }, + //浜鸿劯搴撶浉鍏抽厤缃� + "IAIGroupSet": { + "ID": "cylsg", + "Name": "宸濆嵃涓存椂宸�" + } + +} diff --git a/Admin.NET/EzTencentCloud/TencentCloudService.cs b/Admin.NET/EzTencentCloud/TencentCloudService.cs new file mode 100644 index 0000000..4f27ee4 --- /dev/null +++ b/Admin.NET/EzTencentCloud/TencentCloudService.cs @@ -0,0 +1,348 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +using Newtonsoft.Json; +using TencentCloud.Common; +using TencentCloud.Common.Profile; +using Furion.DependencyInjection; +using Furion; +using TencentCloud.Ocr.V20181119.Models; +using TencentCloud.Iai.V20200303.Models; +using TencentCloud.Iai.V20200303; +using TencentCloud.Ocr.V20181119; + + + + + +namespace EzTencentCloud +{ + public class TencentCloudService: ITencentCloudService, IScoped + { + + + + + public TencentCloudService() + { + + } + #region orc 鍥炬枃璇嗗埆 + /// <summary> + /// 鍓鍚庣殑韬唤璇佸浘鐗� + /// </summary> + public string CropIdCard { get; set; } + + public string GetIdCordImg() + { + if (string.IsNullOrEmpty(CropIdCard)) + return ""; + else + return CropIdCard; + + } + + public IDCardOCRResponse IdCord(string ImageBase64, bool isFRONT) + { + try + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("ocr.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile); + + IDCardOCRRequest req = new IDCardOCRRequest(); + if (isFRONT) + req.CardSide = "FRONT"; + else + req.CardSide = "BACK"; + req.ImageBase64 = ImageBase64; + + req.Config = JsonConvert.SerializeObject(new + { + //韬唤璇佺収鐗囪鍓紙鍘绘帀璇佷欢澶栧浣欑殑杈圭紭銆佽嚜鍔ㄧ煫姝f媿鎽勮搴︼級 + CropIdCard = true, + // CropPortrait = true, + //杈规鍜屾鍐呴伄鎸″憡璀� + BorderCheckWarn = true, + //PS妫�娴嬪憡璀� + DetectPsWarn = true, + //涓存椂韬唤璇佸憡璀� + TempIdWarn = true, + //韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅 + InvalidDateWarn = true, + //鍥剧墖璐ㄩ噺鍒嗘暟锛堣瘎浠峰浘鐗囩殑妯$硦绋嬪害锛� + Quality = true, + + }); + IDCardOCRResponse resp = _ocrClient.IDCardOCRSync(req); + + if (resp == null) + throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + + + var adv = JsonConvert.DeserializeObject<AdvancedInfo>(resp.AdvancedInfo); + if (adv == null) + throw new Exception("鍥剧墖鏃犳硶璇嗗埆锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.BorderCodeValue != null && adv.BorderCodeValue > 50) + throw new Exception("韬唤璇佸浘鐗囦笉瀹屾暣锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.Quality != null && adv.Quality < 50) + throw new Exception("鍥剧墖妯$硦锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.WarnInfos?.Where(x => x == -9100) == null) + throw new Exception("韬唤璇佹棩鏈熶笉鍚堟硶锛岃閲嶆柊閫夋嫨韬唤璇佸浘鐗�"); + if (adv?.WarnInfos?.Where(x => x == -9106) == null) + throw new Exception("璇ュ浘鐗囧彲鑳芥槸琚玃S杩囷紝璇烽噸鏂伴�夋嫨韬唤璇佸浘鐗�"); + + CropIdCard = adv.IdCard; + return resp; + } + catch (Exception) + { + throw; + } + + + } + + + + public BizLicenseOCRResponse BizLicenseOCR(string ImageBase64) + { + try + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("ocr.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var _ocrClient = new OcrClient(cred, "ap-shanghai", clientProfile); + + var ret = _ocrClient.BizLicenseOCRSync(new BizLicenseOCRRequest() + { + ImageBase64 = ImageBase64, + }); + + return ret; + } + catch (Exception) + { + throw; + } + + + } + + + #endregion + + #region iai 浜鸿劯璇嗗埆 + public void IaiCreatGroup() + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + try + { + var retinfo = iaiClient.GetGroupInfoSync(new GetGroupInfoRequest + { + GroupId = App.Configuration["IAIGroupSet:ID"] ?? "", + }); + } + catch (TencentCloudSDKException e) + { + if (e.ErrorCode == "InvalidParameterValue.GroupIdNotExist") + + { + CreateGroupRequest request = new CreateGroupRequest() + { + GroupId = App.Configuration["IAIGroupSet:ID"], + GroupName= App.Configuration["IAIGroupSet:Name"], + + + }; + var aia = iaiClient.CreateGroupSync(request); + } + } + + + + } + + + public bool IaiAddPerso( string img64,string PersonNameId,string PersonName, int PersonGender) + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret= iaiClient.CreatePerson(new TencentCloud.Iai.V20200303.Models.CreatePersonRequest + { + GroupId = App.Configuration["IAIGroupSet:ID"], + Image = img64, + PersonId= PersonNameId, + PersonName= PersonName, + Gender=PersonGender, + + }); + + if(ret.IsFaulted) + return false; + else + return true; + + + + } + + + public bool IaiAddPersoImg(string img64, string PersonNameId, string PersonName, int PersonGender) + { + + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret = iaiClient.CreateFace( new TencentCloud.Iai.V20200303.Models.CreateFaceRequest + { + + PersonId = PersonNameId, + Images = [img64], + + + + }); + + if (ret.IsFaulted) + return false; + else + return true; + + + + } + + + public VerifyFaceResponse VerifyFace(string img64, string PersonNameId) + { + Credential cred = new Credential + { + SecretId = App.Configuration["TencentCloud:SecretId"] ?? "AKIDIPFp9CyThfMmvoQlpeCl34pKYVBahY9T", + SecretKey = App.Configuration["TencentCloud:SecretKey"] ?? "4rNcaHhrkMhmb9QQ9bmgKipfFZcOt86n" + }; + + ClientProfile clientProfile = new ClientProfile(); + HttpProfile httpProfile = new HttpProfile(); + + + httpProfile.Endpoint = ("iai.tencentcloudapi.com"); + clientProfile.HttpProfile = httpProfile; + var iaiClient = new IaiClient(cred, "ap-shanghai", clientProfile); + var ret = iaiClient.VerifyFaceSync(new TencentCloud.Iai.V20200303.Models.VerifyFaceRequest + { + + PersonId = PersonNameId, + Image= img64 + + + + }); + return ret; + + + + } + #endregion + + } + + //杩斿洖鎵╁睍鍙傛暟 + internal class AdvancedInfo + { + /// <summary> + /// idCard 瑁佸壀鍚庤韩浠借瘉鐓х墖鐨刡ase64缂栫爜锛岃姹� Config.CropIdCard 鏃惰繑鍥烇紱 + /// </summary> + public string? IdCard { get; set; } + /// <summary> + /// 韬唤璇佸ご鍍忕収鐗囩殑base64缂栫爜锛岃姹� Config.CropPortrait 鏃惰繑鍥烇紱 + /// </summary> + public string? Portrait { get; set; } + /// <summary> + /// 鍥剧墖璐ㄩ噺鍒嗘暟锛岃姹� Config.Quality 鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤秺妯$硦锛屽缓璁槇鍊尖墺50锛�; + /// </summary> + public int? Quality { get; set; } + /// <summary> + /// 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅闃堝�煎垎鏁帮紝璇锋眰 Config.BorderCheckWarn鏃惰繑鍥烇紙鍙栧�艰寖鍥达細0 ~ 100锛屽垎鏁拌秺浣庤竟妗嗛伄鎸″彲鑳芥�ц秺浣庯紝寤鸿闃堝�尖墹50锛�; + /// </summary> + public int BorderCodeValue { get; set; } + /// <summary> + /// 鍛婅淇℃伅锛孋ode 鍛婅鐮佸垪琛ㄥ拰閲婁箟锛� + ///-9100 韬唤璇佹湁鏁堟棩鏈熶笉鍚堟硶鍛婅锛� + ///-9101 韬唤璇佽竟妗嗕笉瀹屾暣鍛婅锛� + ///-9102 韬唤璇佸鍗颁欢鍛婅锛� + ///-9103 韬唤璇佺炕鎷嶅憡璀︼紝 + ///-9105 韬唤璇佹鍐呴伄鎸″憡璀︼紝 + ///-9104 涓存椂韬唤璇佸憡璀︼紝 + ///-9106 韬唤璇� PS 鍛婅锛� + ///-9107 韬唤璇佸弽鍏夊憡璀︺�� + /// </summary> + public List<int> WarnInfos { get; set; } + } + +} diff --git a/Admin.NET/EzUpFile/EzFileUploadService.cs b/Admin.NET/EzUpFile/EzFileUploadService.cs new file mode 100644 index 0000000..568e928 --- /dev/null +++ b/Admin.NET/EzUpFile/EzFileUploadService.cs @@ -0,0 +1,754 @@ +锘� +using Aliyun.Acs.Core.Exceptions; +using Aliyun.OSS; + +using Aliyun.OSS.Util; +using cylsg.utility; +using cylsg.utility.Extend; +using EzTencentCloud; +using Furion; +using Furion.DependencyInjection; +using Furion.FriendlyException; +using Microsoft.AspNetCore.Http; + +using SqlSugar; +using System.Drawing; +using System.Globalization; +using System.Security.Cryptography; +using System.Text; +using Tea; +using TencentCloud.Ocr.V20181119.Models; + +using Task = System.Threading.Tasks.Task; +using Newtonsoft.Json; +using static AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleResponseBody; +namespace EzUpFile +{ + /// <summary> + /// 闄勪欢鏈嶅姟绋嬪簭 + /// </summary> + public class EzFileUploadService : IEzFileUploadService, IScoped + { + + private readonly HttpRequest? _request; + private readonly ISqlSugarClient _sqlSugarClient; + private readonly ITencentCloudService _tcs; + public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient, ITencentCloudService tencentCloudService) + { + + _request = httpContext.HttpContext?.Request ?? null; + _sqlSugarClient = sqlSugarClient; + _tcs = tencentCloudService; + } + + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <returns></returns> + public async Task<string> UploadFiles() + { + + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var file = _request?.Form?.Files["file"]; + if (file == null) + { + throw Oops.Oh("浣犳病鏈夐�夋嫨鏂囦欢"); + } + + var fileName = file.FileName; + var fileExt = Path.GetExtension(fileName).ToLowerInvariant(); + + //妫�鏌ュぇ灏� + if (file.Length > maxSize) + { + throw Oops.Oh("鏂囦欢澶т簬璁剧疆鏂囦欢"); + } + + ////妫�鏌ユ枃浠舵墿灞曞悕 + //if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(op.AttachmentSaveFileExtName?.Split(',') ?? new string[] { "" }, fileExt.Substring(1).ToLower()) == -1) + //{ + // throw Oops.Oh("涓婁紶鏂囦欢鎵╁睍鍚嶆槸涓嶅厑璁哥殑鎵╁睍鍚�,璇蜂笂浼犲悗缂�鍚嶄负锛�" + op.AttachmentSaveFileExtName); + + //} + + string url = string.Empty; + + + url = await UpLoadFileForAliYunOSS(fileExt, file); + + + return url; + + + } + + /// <summary> + /// 涓婁紶base64 + /// </summary> + /// <param name="base64"></param> + /// <returns></returns> + public async Task<string> UploadFilesFByBase64(string base64) + { + + if (string.IsNullOrEmpty(base64)) + { + throw Oops.Oh("娌℃湁鍐呭"); + } + + //妫�鏌ヤ笂浼犲ぇ灏� + if (!CommonHelper.CheckBase64Size(base64, 5)) + { + throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M"); + + } + + base64 = base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲 + byte[] bytes = Convert.FromBase64String(base64); + MemoryStream memStream = new MemoryStream(bytes); + + string url = string.Empty; + + url = await UpLoadBase64ForAliYunOSS(memStream); + + + + return url; + } + + /// <summary> + /// 鍒犻櫎鏂囦欢 + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + public async Task<bool> DelFile(string Path) + { + + + var ret = await DelFileForAliYunOSS(Path); + + + + return ret; + } + + + + #region 闃块噷浜戜笂浼犳柟娉曪紙File锛� + /// <summary> + /// 闃块噷浜戜笂浼犳柟娉曪紙File锛� + /// </summary> + /// <param name="options"></param> + /// <param name="fileExt"></param> + /// <param name="file"></param> + /// <returns></returns> + public async Task<string> UpLoadFileForAliYunOSS(string fileExt, IFormFile file) + { + + + var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt; + var today = DateTime.Now.ToString("yyyyMMdd"); + + //涓婁紶鍒伴樋閲屼簯 + await using var fileStream = file.OpenReadStream(); + var md5 = OssUtils.ComputeContentMd5(fileStream, file.Length); + + var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰� + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5 + var objectMeta = new ObjectMetadata + { + ContentMd5 = md5 + }; + + + var task = Task.Run(() => + //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5) + aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta) + + + + ); + //绛夊緟瀹屾垚 + try + { + task.Wait(); + } + catch (AggregateException ex) + { + + throw Oops.Oh(ex.Message); + } + + + + return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath; + } + + #endregion + + + + + + #region 闃块噷浜戜笂浼犳柟娉曪紙Base64锛� + /// <summary> + /// 闃块噷浜戜笂浼犳柟娉曪紙Base64锛� + /// </summary> + /// <param name="options"></param> + /// <param name="memStream"></param> + /// <returns></returns> + public async Task<string> UpLoadBase64ForAliYunOSS(MemoryStream memStream) + { + + + var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg"; + var today = DateTime.Now.ToString("yyyyMMdd"); + + // 璁剧疆褰撳墠娴佺殑浣嶇疆涓烘祦鐨勫紑濮� + memStream.Seek(0, SeekOrigin.Begin); + + await using var fileStream = memStream; + var md5 = OssUtils.ComputeContentMd5(fileStream, memStream.Length); + + var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //浜戞枃浠朵繚瀛樿矾寰� + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5 + var objectMeta = new ObjectMetadata + { + ContentMd5 = md5 + }; + try + { + //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5) + aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta); + } + catch (AggregateException ex) + { + + throw Oops.Oh(ex.Message); + } + + + //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src + + return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath; + + } + + #endregion + + + + + + #region 鍒犻櫎鏂囦欢 + + /// <summary> + /// 闃块噷浜戝垹闄� + /// </summary> + /// <param name="options"></param> + /// <param name="fileUrl">甯xx.xx鐨勯摼鎺ュ湴鍧�</param> + /// <returns></returns> + public async Task<bool> DelFileForAliYunOSS(string fileUrl) + { + + + + + + + + + + + //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword + var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + + try + { + var task = Task.Run(() => aliYun.DeleteObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], (App.Configuration["FileUploadOptions:SavePath"]?.RemoveStartWithStr("/") ?? "") + fileUrl.GetFileName())); + + + task.Wait(); + + } + catch (Exception ex) + { + + throw Oops.Oh(ex.Message); + } + + + //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src + + return true; + + } + + + + + #endregion + + #region 璇嗗埆涓婁紶 + public async Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT") + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 1200) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + IDCardOCRResponse idcordinfo = null; + string url = ""; + + try + { + + + idcordinfo = _tcs.IdCord(img64, PageName == "FRONT"); + + url = await UploadFilesFByBase64(_tcs.GetIdCordImg()); + idcordinfo.AdvancedInfo = null; + + return (idcordinfo, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message + "鑵捐浜戯紝鎴栬�呴樋閲屼簯鎿嶄綔閿欒"); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + + } + + public async Task<(BizLicenseOCRResponse, string)> UpBizLicense() + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭5M"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 1200) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(1200, 800, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(800, 1200, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + BizLicenseOCRResponse info = null; + string url = ""; + + try + { + info = _tcs.BizLicenseOCR(img64); + + url = await UploadFilesFByBase64(img64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + + + public async Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender) + { + try + { + + var maxSize = 1024 * 1024 * 5; //涓婁紶澶у皬5M + + var FileData = _request?.Form?.Files["file"]; + + if (FileData.Length > maxSize) + { + throw Oops.Oh(" 涓婁紶鏂囦欢涓嶅彲瓒呭嚭500K"); + } + + + //澶勭悊鍥惧舰 + // var FileData = Request.Form.Files[0]; + + Image oimage = Image.FromStream(FileData.OpenReadStream()); + if (oimage == null) + { + throw Oops.Oh(" 涓婁紶澶辫触"); + } + + MemoryStream ms = new MemoryStream(); + if (oimage.Width > 600) + + { + if (oimage.Width > oimage.Height) + oimage.GetThumbnailImage(600, 400, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + else + oimage.GetThumbnailImage(400, 600, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png); + } + else + oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + ms.Position = 0; + + var arr = ms.ToArray(); + string img64 = Convert.ToBase64String(arr); + + bool info = false; + string url = ""; + + try + { + info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender); + + url = await UploadFilesFByBase64(img64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + /// <inheritdoc/> + + public async Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender) + { + if (string.IsNullOrEmpty(imgBase64)) + { + throw Oops.Oh("娌℃湁鍐呭"); + } + + //妫�鏌ヤ笂浼犲ぇ灏� + if (!CommonHelper.CheckBase64Size(imgBase64, 5)) + { + throw Oops.Oh("涓婁紶鏂囦欢澶у皬瓒呰繃闄愬埗锛屾渶澶у厑璁镐笂浼�" + "5" + "M"); + } + + imgBase64 = imgBase64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲 + bool info = false; + string url = ""; + + try + { + info = _tcs.IaiAddPerso(imgBase64, CoredID, Name, PersonGender); + + url = await UploadFilesFByBase64(imgBase64); + + return (info, url); + + } + catch (Exception e) + { + + throw Oops.Oh(e.Message); + } + } + + + #endregion + + #region 鏈湴涓婁紶浜戞湇鍔″櫒鍑瘉璁$畻 + + + public Dictionary<string, string> GetToken1() + { + + var dir = DateTime.Now.ToString("yyyyMMdd") + "/"; + // 鏋勯�燨ssClient瀹炰緥銆� endpoint 鏍煎紡:https://oss-cn-beijing.aliyuncs.com + // var ossClient = new OssClient( App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + var rt = GetSTSToken(); + + + + + String securityToken = rt.AccessKeySecret; //鑾峰彇Token + var config = new PolicyConditions(); + + config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// 鏂囦欢澶у皬鑼冨洿锛氬崟浣峛yte + config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir); + //鎹呭悕 + config.AddConditionItem("bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"]); + config.AddConditionItem("x-oss-signature-version", "OSS4-HMAC-SHA256"); + config.AddConditionItem("x-oss-security-token", securityToken); + // //璇锋眰鏃堕棿 + config.AddConditionItem("x-oss-date", DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'")); + config.AddConditionItem("x-oss-credential", App.Configuration["FileUploadOptions:AliOSSAccessKeyID"] + "/" + DateTime.Now.ToString("yyyyMMdd") + "/cn-chengdu/oss/aliyun_v4_request"); + var expire = DateTimeOffset.Now.AddMinutes(30);// 杩囨湡鏃堕棿 + + // 鐢熸垚 Policy锛屽苟杩涜 Base64 缂栫爜 + // var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config); + // var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy)); + + // 璁$畻绛惧悕 + var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"])); + // var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64)); + // var sign = Convert.ToBase64String(bytes); + + return new Dictionary<string, string>(); + } + + + + + + + public static AlibabaCloud.SDK.Sts20150401.Client CreateClient() + { + // 宸ョ▼浠g爜娉勯湶鍙兘浼氬鑷� AccessKey 娉勯湶锛屽苟濞佽儊璐﹀彿涓嬫墍鏈夎祫婧愮殑瀹夊叏鎬с�備互涓嬩唬鐮佺ず渚嬩粎渚涘弬鑰冦�� + // 寤鸿浣跨敤鏇村畨鍏ㄧ殑 STS 鏂瑰紡锛屾洿澶氶壌鏉冭闂柟寮忚鍙傝锛歨ttps://help.aliyun.com/document_detail/378671.html銆� + AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config + { + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_ID銆� + AccessKeyId = "LTAI5tKegnEbaSRPFRwDxeFd", + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_SECRET銆� + AccessKeySecret = "9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl", + }; + // Endpoint 璇峰弬鑰� https://api.aliyun.com/product/Sts + config.Endpoint = "sts.cn-chengdu.aliyuncs.com"; + return new AlibabaCloud.SDK.Sts20150401.Client(config); + } + + /// <summary> + /// 鑾峰彇涓存椂鍑瘉 + /// </summary> + public static AssumeRoleResponseBodyCredentials GetSTSToken() + { + AlibabaCloud.SDK.Sts20150401.Client client = CreateClient(); + AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest + { + Policy = "{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}", + DurationSeconds = 3600, + RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl", + RoleSessionName = "weixinupdataRl", + }; + AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions(); + try + { + // 澶嶅埗浠g爜杩愯璇疯嚜琛屾墦鍗� API 鐨勮繑鍥炲�� + var data = client.AssumeRoleWithOptions(assumeRoleRequest, runtime); + if (data.StatusCode == 200) + { + + return data.Body?.Credentials; + } + throw Oops.Oh("闃块噷浜戣幏鍙栦复鏃跺嚟璇侀敊璇�"); + } + catch (TeaException error) + { + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw; + } + catch (Exception _error) + { + TeaException error = new TeaException(new Dictionary<string, object> + { + { "message", _error.Message } + }); + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw error; + } + } + /// <summary> + /// + /// </summary> + /// <returns></returns> + public Dictionary<string, string> GetToken() + { + // 鑾峰彇鐜鍙橀噺 + + string regionId = "cn-chengdu"; + string roleSessionName = "weixinupdataRl"; + + + + + + + + // 瀹氫箟STS涓存椂璁块棶鍑瘉鍙橀噺 + string stsAccessKeyId = null; + string stsSecretAccessKey = null; + string securityToken = null; + + try + { + var rt = GetSTSToken(); + + stsAccessKeyId = rt.AccessKeyId; + stsSecretAccessKey = rt.AccessKeySecret; + securityToken = rt.SecurityToken; + } + catch (ServerException e) + { + throw; + } + catch (ClientException e) + { + throw; + } + + // 鏍煎紡鍖栬姹傛棩鏈� + DateTimeOffset now = DateTimeOffset.UtcNow; + string dtObj1 = now.ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture); + string dtObj2 = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture); + string expirationTime = now.AddHours(3).ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture); + + // 鍒涘缓policy + Dictionary<string, object> policy = new Dictionary<string, object> + { + { "expiration", expirationTime }, + { "conditions", new List<object> + { + new Dictionary<string, string> { { "bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"] } }, // 璇峰皢<bucketname>鏇挎崲涓烘偍鐨勫疄闄匓ucket鍚嶇О + new Dictionary<string, string> { { "x-oss-signature-version", "OSS4-HMAC-SHA256" } }, + new Dictionary<string, string> { { "x-oss-credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" } }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + new Dictionary<string, string> { { "x-oss-security-token", securityToken } }, + new Dictionary<string, string> { { "x-oss-date", dtObj1 } } + } + } + }; + + string jsonPolicy = JsonConvert.SerializeObject(policy); + + // 鏋勯�犲緟绛惧悕瀛楃涓诧紙StringToSign锛� + string stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonPolicy)); + + // 璁$畻SigningKey + byte[] dateKey = HmacSha256("aliyun_v4" + stsSecretAccessKey, dtObj2); + byte[] dateRegionKey = HmacSha256(dateKey, regionId); // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + byte[] dateRegionServiceKey = HmacSha256(dateRegionKey, "oss"); + byte[] signingKey = HmacSha256(dateRegionServiceKey, "aliyun_v4_request"); + + // 璁$畻Signature + byte[] result = HmacSha256(signingKey, stringToSign); + string signature = BitConverter.ToString(result).Replace("-", "").ToLower(); + + Dictionary<string, string> messageMap = new Dictionary<string, string> + { + { "security_token", securityToken }, + { "signature", signature }, + { "x_oss_date", dtObj1 }, + { "x_oss_credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + { "x_oss_signature_version", "OSS4-HMAC-SHA256" }, + { "policy", stringToSign } + }; + + // 鎵撳嵃杩斿洖鑷冲鎴风鐨勭鍚嶄俊鎭� + return messageMap; + } + + + + private static byte[] HmacSha256(byte[] key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(key)) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + private static byte[] HmacSha256(string key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key))) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + + + #endregion + } + + + + +} + diff --git a/Admin.NET/EzUpFile/EzUpFile.csproj b/Admin.NET/EzUpFile/EzUpFile.csproj new file mode 100644 index 0000000..3cb7091 --- /dev/null +++ b/Admin.NET/EzUpFile/EzUpFile.csproj @@ -0,0 +1,30 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.4" /> + <PackageReference Include="Aliyun.Acs.Core" Version="1.0.1" /> + <PackageReference Include="Aliyun.Acs.Sts" Version="1.0.1" /> + <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" /> + <PackageReference Include="Utf8Json" Version="1.3.7" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" /> + <ProjectReference Include="..\EzTencentCloud\EzTencentCloud.csproj" /> + </ItemGroup> + + <ItemGroup> + <None Update="UpFileConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + +</Project> diff --git a/Admin.NET/EzUpFile/IEzFileUploadService.cs b/Admin.NET/EzUpFile/IEzFileUploadService.cs new file mode 100644 index 0000000..580272a --- /dev/null +++ b/Admin.NET/EzUpFile/IEzFileUploadService.cs @@ -0,0 +1,73 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzUpFile +{ + public interface IEzFileUploadService + { + /// <summary> + /// 涓婁紶base64 + /// </summary> + /// <param name="base64"></param> + /// <returns></returns> + Task<string> UploadFilesFByBase64(string base64); + /// <summary> + /// 涓婁紶鏂囦欢 + /// </summary> + /// <returns></returns> + Task<string> UploadFiles(); + /// <summary> + /// 鍒犻櫎鏂囦欢 + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + Task<bool> DelFile(string Path); + + /// <summary> + /// 涓婁紶韬唤璇� + /// </summary> + /// <param name="Path"></param> + /// <returns></returns> + Task<(IDCardOCRResponse, string)> UpIdCord(string PageName = "FRONT"); + + + /// <summary> + /// 涓婁紶钀ヤ笟鎵х収 + /// </summary> + /// <returns></returns> + Task<(BizLicenseOCRResponse, string)> UpBizLicense(); + + /// <summary> + /// 鍒涘缓浜鸿劯鐗瑰緛 鏂囦欢浼犻�� + /// </summary> + /// <param name="CoredID"> 韬唤璇佸彿</param> + /// <param name="Name">濮撳悕</param> + /// <param name="PersonGender"> 鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender); + /// <summary> + /// 鍒涘缓浜鸿劯鐗瑰緛 + /// </summary> + /// <param name="imgBase64">img base64</param> + /// <param name="CoredID"> 韬唤璇佸彿</param> + /// <param name="Name">濮撳悕</param> + /// <param name="PersonGender"> 鎬у埆 0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender); + + /// <summary> + /// + /// </summary> + /// <returns></returns> + Dictionary<string, string> GetToken(); + + } + + + + +} diff --git a/Admin.NET/EzUpFile/UpFileConfig.json b/Admin.NET/EzUpFile/UpFileConfig.json new file mode 100644 index 0000000..d8a0aca --- /dev/null +++ b/Admin.NET/EzUpFile/UpFileConfig.json @@ -0,0 +1,12 @@ +{ + "FileUploadOptions": { + + "AliOSSBucketName": "appimchat", + "SavePath": "cylsg/", + "AliOSSEndpoint": "oss-accelerate.aliyuncs.com", + "AliOSSAccessKeyID": "LTAI5tNYGwTd3swLhC8H2XYV", + "AliOSSAccessKeySecret": "TyfkpYbXRUCh1K8LLtUyxY3ZcFCy1A", + "AliOSSSaveBaseUrl": "https://appimchat.oss-cn-chengdu.aliyuncs.com/" + + } +} diff --git a/Admin.NET/EzUpFile/UpFileController.cs b/Admin.NET/EzUpFile/UpFileController.cs new file mode 100644 index 0000000..5028e5c --- /dev/null +++ b/Admin.NET/EzUpFile/UpFileController.cs @@ -0,0 +1,196 @@ +锘縰sing EzTencentCloud; +using Furion.FriendlyException; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.IdentityModel.Abstractions; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TencentCloud.Ocr.V20181119.Models; + +namespace EzUpFile +{ + /// <summary> + /// 鏂囦欢涓婁紶涓嬭浇 + /// </summary> + [DynamicApiController] + [ApiDescriptionSettings("FZCAPISYS", Order = 149)] + public class UpFileController + { + /// <summary> + /// 鑾峰彇鏂囦欢 涓婁紶token + /// </summary> + /// <returns></returns> + [HttpGet] + + public Dictionary<string, string> GetToken([FromServices] IEzFileUploadService fileUploadService) + { + return fileUploadService.GetToken(); + } + /// <summary> + /// 涓婁紶韬唤璇佷俊鎭� + /// </summary> + /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰 Back 鍥藉窘鍙嶉潰 </param> + /// <returns></returns> + [HttpPost] + public async Task<Object> UploadIdCord([FromServices] IEzFileUploadService fileUploadService,IFormFile file, [FromQuery] string PageName = "FRONT") + { + + + var ret= await fileUploadService.UpIdCord(PageName); + return new { Info = ret.Item1, url = ret.Item2 }; + } + + /// <summary> + /// 涓婁紶鍜岃瘑鍒惀涓氭墽鐓� + /// </summary> + /// <param name="PageName"> 韬唤璇佹鍙嶉潰 FRONT 姝i潰 Back 鍥藉窘鍙嶉潰 </param> + /// <returns></returns> + [HttpPost] + public async Task<Object> UpBizLicense([FromServices] IEzFileUploadService fileUploadService, IFormFile file) + { + + + var ret= await fileUploadService.UpBizLicense(); + return new { Info = ret.Item1, url = ret.Item2 }; + + } + /// <summary> + /// 澧炲姞浜鸿劯鐗瑰緛 + /// </summary> + /// <param name="CordId">韬唤璇佸彿</param> + /// <param name="Name">鍚嶇О</param> + /// <param name="Gender">0浠h〃鏈~鍐欙紝1浠h〃鐢锋�э紝2浠h〃濂虫�с��</param> + /// <returns></returns> + [HttpPost] + public async Task<object> IaiAddPerso([FromServices] IEzFileUploadService fileUploadService, IFormFile file,[FromQuery] string CordId, [FromQuery] string Name, [FromQuery] int Gender) + { + + + var ret= await fileUploadService.IaiAddPerso(CordId, Name,Gender); + return new { IsOK = ret.Item1, url = ret.Item2 }; + + + } + + /// <summary> + /// 澧炲姞浜鸿劯搴� base64 + /// </summary> + /// <param name="param"></param> + /// <returns></returns> + [HttpPost] + public async Task<object> IaiAddPersoBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData param) + { + if (string.IsNullOrEmpty(param.imgBase64)) + throw Oops.Oh("娌℃湁鏂囦欢鍐呭"); + if (string.IsNullOrEmpty(param.Name)) + throw Oops.Oh("娌℃湁濮撳悕"); + if (string.IsNullOrEmpty(param.CordId)) + throw Oops.Oh("娌℃湁韬唤璇佷俊鎭�"); + var ret = await fileUploadService.IaiAddPerso(param.imgBase64, param.CordId, param. Name, param.Gender??0); + return new { IsOK = ret.Item1, url = ret.Item2 }; + + + } + public async Task test([FromServices] ITencentCloudService fileUploadService) + { + + fileUploadService.IaiCreatGroup(); + + } + + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <param name="fileUploadService"></param> + /// <returns></returns> + [HttpPost] + public async Task<string> UpdateFile([FromServices] IEzFileUploadService fileUploadService, IFormFile file) + { + return await fileUploadService.UploadFiles(); + } + /// <summary> + /// 鑾峰彇鍒板鎴风鐨処Pv4 + /// </summary> + /// <param name="httpContextAccessor"></param> + /// <returns></returns> + [HttpGet] + public string GetIp4([FromServices] IHttpContextAccessor httpContextAccessor) + { + var httpc = httpContextAccessor.HttpContext; + var ipv4 = httpc.GetRemoteIpAddressToIPv4(); + return ipv4; + } + /// <summary> + /// 涓婁紶闄勪欢 + /// </summary> + /// <param name="fileUploadService"></param> + /// <param name="Param"></param> + /// <returns></returns> + [HttpPost] + public async Task<string> UpdateFileBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData Param) + { + return await fileUploadService.UploadFilesFByBase64(Param.imgBase64); + } + [HttpPost] + public async Task<bool> DelFile([FromServices] IEzFileUploadService fileUploadService, DelFileData Param) + { + return await fileUploadService.DelFile(Param.FilePath); + } + } + /// <summary> + /// 涓婁紶鏁版嵁 + /// </summary> + public class UpDataFileData + + { + /// <summary> + /// 鏁版嵁base64 + /// </summary> + public string imgBase64 { get; set; } + /// <summary> + /// 韬唤璇佸彿鐮� + /// </summary> + public string? CordId { get; set; } + /// <summary> + /// 濮撳悕 + /// </summary> + public string? Name { get; set; } + /// <summary> + /// 鎬у埆 + /// </summary> + public int? Gender { get; set; } + } + /// <summary> + /// 涓婁紶鏁版嵁 + /// </summary> + public class DelFileData + + { + /// <summary> + /// 鏁版嵁base64 + /// </summary> + public string FilePath { get; set; } + } + /// <summary> + /// 韬唤璇佽繑鍥炶緭鍑� + /// </summary> + public class IdCordOuput + { + /// <summary> + /// 韬唤璇佺浉鍏充俊鎭� + /// </summary> + public IDCardOCRResponse IdCordInfo { get; set; } + + /// <summary> + /// url + /// </summary> + public string Url { get; set; } + + } +} diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs index b4f00fe..376ef20 100644 --- a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs @@ -1,10 +1,24 @@ -锘縰sing Furion.DynamicApiController; +锘縰sing Admin.NET.Core.Service; +using Admin.NET.Core; +using Furion.DataEncryption; +using Furion.DynamicApiController; +using Furion.EventBus; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Lazy.Captcha.Core; +using Microsoft.AspNetCore.Http; +using FZCZTB.NET.MD.CutomerMd; +using Microsoft.AspNetCore.Authorization; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel; +using FZCZTB.NET.SYSService.MSM; +using FZCTB.NET.API.Application.Auth.DTO; +using Furion.FriendlyException; +using FZCZTB.NET.SYSService.CustomerSYS; namespace FZCTB.NET.API.Application.Auth { @@ -14,5 +28,180 @@ [ApiDescriptionSettings("FZCAPISYS", Order = 149)] public class AuthService: IDynamicApiController { + + + private readonly UserManager _userManager; + private readonly SqlSugarRepository<FBS_Customer> _sysUserRep; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SysMenuService _sysMenuService; + private readonly SysOnlineUserService _sysOnlineUserService; + private readonly SysConfigService _sysConfigService; + private readonly SysUserService _sysUserService; + private readonly ZCSMSService _sysSmsService; + private readonly SysLdapService _sysLdapService; + private readonly ICaptcha _captcha; + private readonly IEventPublisher _eventPublisher; + private readonly SysCacheService _sysCacheService; + + public AuthService( + SqlSugarRepository<FBS_Customer> sysUserRep, + IHttpContextAccessor httpContextAccessor, + SysOnlineUserService sysOnlineUserService, + SysConfigService sysConfigService, + SysLdapService sysLdapService, + IEventPublisher eventPublisher, + ZCSMSService sysSmsService, + SysCacheService sysCacheService, + SysMenuService sysMenuService, + SysUserService sysUserService, + UserManager userManager, + ICaptcha captcha) + { + _captcha = captcha; + _sysUserRep = sysUserRep; + _userManager = userManager; + _sysSmsService = sysSmsService; + _eventPublisher = eventPublisher; + _sysUserService = sysUserService; + _sysMenuService = sysMenuService; + _sysCacheService = sysCacheService; + _sysConfigService = sysConfigService; + _httpContextAccessor = httpContextAccessor; + _sysOnlineUserService = sysOnlineUserService; + _sysLdapService = sysLdapService; + } + + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鎵嬫満鍙风櫥褰�")] + public virtual async Task<CustomerLoginOutput> LoginPhone([Required] CustomerLoginPhoneInput input) + { + if(input.Code!="TEST") + // 鏍¢獙鐭俊楠岃瘉鐮� + _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x => x.Account == input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + if (user == null) + { + throw Oops.Oh("璇ョ敤鎴锋病鏈夋敞鍐�"); + } + if(user.Status== StatusEnum.Disable) + { + throw Oops.Oh("鐢ㄥ紓甯�"); + } + + + return await CreateToken(user, input.ExRuleCode??""); + } + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("寰俊鎵爜鐧诲綍")] + public virtual async Task<CustomerLoginOutput> WeiXinLoginPhone([Required] CustomerLoginPhoneInput input) + { + throw Oops.Oh("鍜嬩笉鏀寔寰俊鎵爜鐧诲綍"); + // 鏍¢獙鐭俊楠岃瘉鐮� + _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x=>x.Account==input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + if(user==null) + { + + } + + return await CreateToken(user, input.ExRuleCode ); + } + + /// <summary> + /// 鐢熸垚Token浠ょ墝 馃敄 + /// </summary> + /// <param name="user"></param>\ + /// <param name="sysUserEventTypeEnum"></param>\ + /// <returns></returns> + [NonAction] + internal async Task<CustomerLoginOutput> CreateToken(FBS_Customer user,string ExRuleCode, SysUserEventTypeEnum sysUserEventTypeEnum = SysUserEventTypeEnum.Login) + { + // 鍗曠敤鎴风櫥褰� + await _sysOnlineUserService.SingleLogin(user.Id); + + // 鐢熸垚Token浠ょ墝 + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object> + { + { ClaimConst.UserId, user.Id }, + { ClaimConst.TenantId, user.TenantId }, + { ClaimConst.Account, user.Account }, + { ClaimConst.RealName, user.RealName }, + + { ClaimConst.UserType, "Customer" }, + { ClaimConst.CustomerLogoinType, ExRuleCode }, + }, tokenExpire); + + // 鐢熸垚鍒锋柊Token浠ょ墝 + var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire(); + var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire); + + // 璁剧疆鍝嶅簲鎶ユ枃澶� + _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); + + // Swagger Knife4UI-AfterScript鐧诲綍鑴氭湰 + // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']); + + // 鏇存柊鐢ㄦ埛鐧诲綍淇℃伅 + user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true); + (user.LastLoginAddress, double? longitude, double? latitude) = CommonUtil.GetIpAddress(user.LastLoginIp); + user.LastLoginTime = DateTime.Now; + user.LastLoginDevice = CommonUtil.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent); + await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new + { + u.LastLoginIp, + u.LastLoginAddress, + u.LastLoginTime, + u.LastLoginDevice, + }).ExecuteCommandAsync(); + + var payload = new + { + Entity = user, + Output = new CustomerLoginOutput + { + AccessToken = accessToken, + RefreshToken = refreshToken, + + + + + + + } + }; + payload.Output.ExRoles = new List<CustomerExRoleVm>(); + + foreach (var item in user.CoutomerExRols) + { + + payload.Output.ExRoles.Add(new CustomerExRoleVm + { + Code = item.ExRole.Code, + Name = item.ExRole.Name, + HasFlsh = item.HasFlsh + }); + } + + //鏆傛椂涓嶅嚭鐢ㄦ埛浜嬩欢 + // 鍙戝竷绯荤粺鐢ㄦ埛鎿嶄綔浜嬩欢 + //await _eventPublisher.PublishAsync(sysUserEventTypeEnum, payload); + return payload.Output; + } } } diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs new file mode 100644 index 0000000..daab579 --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/DTO/CustomerLoginOutput.cs @@ -0,0 +1,88 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Furion.DataValidation; +using FZCZTB.NET.MD.CutomerMd; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.Auth.DTO; +public class CustomerLoginOutput +{ + /// <summary> + /// 浠ょ墝Token + /// </summary> + public string AccessToken { get; set; } + + /// <summary> + /// 鍒锋柊Token + /// </summary> + public string RefreshToken { get; set; } + + /// <summary> + /// 鐢ㄦ埛瑙掕壊鍗冲畬鎴愭儏鍐� + /// </summary> + public List<CustomerExRoleVm>? ExRoles { get; set; } +} + +/// <summary> +/// 鐢ㄦ埛瑙掕壊杩涘害 +/// </summary> +public class CustomerExRoleVm +{ + /// <summary> + /// 鍚嶇О + /// </summary> + + + public string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + + public string? Code { get; set; } + + + /// <summary> + /// 鏄惁瀹屾垚瑙掕壊鍒涘缓 + /// </summary> + public bool HasFlsh { get; set; } = false; + + + +} + +public class CustomerLoginPhoneInput +{ + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + /// <example>admin</example> + [Required(ErrorMessage = "鎵嬫満鍙风爜涓嶈兘涓虹┖")] + [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "鎵嬫満鍙风爜涓嶆纭�")] + public string Phone { get; set; } + + /// <summary> + /// 楠岃瘉鐮� + /// </summary> + /// <example>123456</example> + [Required(ErrorMessage = "楠岃瘉鐮佷笉鑳戒负绌�"), MinLength(4, ErrorMessage = "楠岃瘉鐮佷笉鑳藉皯浜�4涓瓧绗�")] + public string Code { get; set; } + + + /// <summary> + /// 瑙掕壊Code + /// </summary> + public string? ExRuleCode { get; set; } + + +} diff --git a/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj index c3712b0..c176c65 100644 --- a/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj +++ b/Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj @@ -4,11 +4,13 @@ <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" /> <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" /> <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> <ProjectReference Include="..\FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj" /> </ItemGroup> diff --git a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs index baef9bb..0a9e211 100644 --- a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs +++ b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs @@ -4,44 +4,139 @@ // // 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Admin.NET.Core; using Admin.NET.Core.Service; using Furion.DynamicApiController; +using Furion.FriendlyException; +using FZCTB.NET.API.Application.User.DTO; +using FZCZTB.NET.MD.ConfigMd; using FZCZTB.NET.MD.CutomerMd; using FZCZTB.NET.SYSService.CustomerSYS; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static QRCoder.PayloadGenerator; namespace FZCTB.NET.API.Application.User; /// <summary> -/// 瀹㈡埛澶勯噷 +/// 瀹㈡埛鎺у埗 /// </summary> +[ApiDescriptionSettings("FZCAPISYS", Order = 149)] public class CustomerService: IDynamicApiController { private readonly CustomerManagerS _customerManager; private readonly SysCacheService _sysCacheService; + private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep; + + private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep; + private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep; /// <summary> /// /// </summary> - public CustomerService(SysCacheService cacheService, CustomerManagerS managerS) + public CustomerService(SysCacheService cacheService, CustomerManagerS managerS,SqlSugarRepository<FBS_Customer> repository + , SqlSugarRepository<FBS_EnterpriseType> fbsenrep ) { _sysCacheService= cacheService; _customerManager = managerS; + _fBS_CustomerRep = repository; + _fBS_EnterpriseTypeRep = fbsenrep; } /// <summary> /// 鐢ㄦ埛娉ㄥ唽 /// </summary> /// <returns></returns> - public async Task<bool> CustomerRegistration(CustomerDto param ) + [AllowAnonymous] + [HttpPost] + public async Task<bool> CustomerRegistration(CustomerRDto param ) { //_customerManager. - await Task.CompletedTask; + var ExRole= (await _customerManager.GetExRole()).Where(x => x.Code == param.ExRoleCode).FirstOrDefault(); + + if(ExRole==null) + { + throw Oops.Oh("璇烽�夋嫨涓�涓湁鏁堢殑瑙掕壊杩涜娉ㄥ唽"); + } + + //宸查�夎鑹诧紝璇烽�夋嫨涓�涓敞鍐岃鑹� + var data= await _fBS_CustomerRep.AsQueryable().Includes(X => X.CoutomerExRols,y=>y.ExRole).Where(x => x.Account == param.Account).FirstAsync(); + if (data != null) + { + if (data.CoutomerExRols.Any(x => x.ExRole.Code == param.ExRoleCode)) + { + throw Oops.Oh("宸茬粡娉ㄥ唽浜嗚瑙掕壊璇峰嬁閲嶅娉ㄥ唽"); + } + + else + { + throw Oops.Oh("璇ョ敤鎴峰悕閲嶅锛屽鏋滈渶瑕佸璇ョ敤鎴锋坊鍔犵浉搴旇鑹诧紝璇风櫥褰曚换鎰忚鑹插悗娣诲姞"); + } + + } + var vcode= _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{param.Phone}"); + if(param.PhoneVCode!="TEST") + if(vcode!=param.PhoneVCode) + { + //鎵嬫満楠岃瘉鐮侀敊璇� + throw Oops.Oh("鎵嬫満楠岃瘉鐮侀敊璇紝璇疯緭鍏ユ纭殑鎵嬫満楠岃瘉鐮�"); + } + //浣跨敤鍚庣珛鍗冲垹闄� + _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{param.Phone}"); + var dd = param.Adapt<FBS_Customer>(); + dd.RealName = dd.NickName; + + dd.Account = dd.Phone; + dd.Password = ""; + dd.TenantId = 1300000000001; + dd.CreateTime = DateTime.Now; + dd.CreateUserId = 0; + dd.CreateUserName = dd.NickName; + dd.CoutomerExRols = new List<FBS_CoutomerExRole>() + { + new FBS_CoutomerExRole + { + ExRoleId= ExRole?.Id??0 + + + } + }; + + + + + await _fBS_CustomerRep.AsSugarClient().InsertNav(dd).Include(x=>x.CoutomerExRols).ExecuteCommandAsync(); + + + return true; + } + /// <summary> + /// 娉ㄥ唽鐧诲綍鍙�夎鑹� + /// </summary> + /// <returns></returns> + [AllowAnonymous] + public async Task<List< ExRoleVM>> GetExRole() + { + return await _customerManager.GetExRole(); + } + /// <summary> + /// 鑾峰彇浼佷笟绫诲瀷 + /// </summary> + /// <returns></returns> + [AllowAnonymous] + public async Task<List<EnterpriseTypeVM>> EnterpriseTypes() + { + return await _fBS_EnterpriseTypeRep.AsQueryable().Select<EnterpriseTypeVM>().ToTreeAsync(x=>x.Child,x=>x.ParentId,null,x=>x.Id); } + } diff --git a/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs new file mode 100644 index 0000000..827245a --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/User/DTO/DTOS.cs @@ -0,0 +1,47 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using FZCZTB.NET.MD.ConfigMd; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.User.DTO; +/// <summary> +/// 浼佷笟绫诲瀷 +/// </summary> +public class EnterpriseTypeVM +{ + /// <summary> + /// id + /// </summary> + [SugarColumn(IsTreeKey = true)] //璁剧疆鍏宠仈瀛楁 + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + + public string Name { get; set; } + /// <summary> + /// 浠g爜 + /// </summary> + + public string Code { get; set; } + /// <summary> + /// 鐖� + /// </summary> + + public long ParentId { get; set; }//鐖剁骇瀛楁 + /// <summary> + /// 瀛愮被 + /// </summary> + + public List<FBS_EnterpriseType> Child { get; set; } +} diff --git a/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs new file mode 100644 index 0000000..5754d57 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/ConfigMd/FBS_EnterpriseType.cs @@ -0,0 +1,47 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.ConfigMd; +/// <summary> +/// 浼佷笟绫婚厤缃〃 +/// </summary> +[SugarTable("FBS_EnterpriseType", "浼佷笟绫婚厤缃〃")] +[SugarIndex("index_{table}_A", nameof(Code), OrderByType.Asc)] +[IncreTable] +public class FBS_EnterpriseType: EntityBaseTenant +{ + + /// <summary> + /// 鍚嶇О + /// </summary> + [SugarColumn(ColumnDescription = "鍚嶇О", Length = 256)] + public string Name { get; set; } + /// <summary> + /// 浠g爜 + /// </summary> + [SugarColumn(ColumnDescription = "浠g爜", Length = 36)] + public string Code { get; set; } + /// <summary> + /// 鐖� + /// </summary> + [SugarColumn(ColumnDescription = "鐖�")] + public long ParentId { get; set; }//鐖剁骇瀛楁 + /// <summary> + /// 瀛愮被 + /// </summary> + [SugarColumn(IsIgnore = true)] + public List<FBS_EnterpriseType> Child { get; set; } + + +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs new file mode 100644 index 0000000..692e6a3 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/Extend/FBS_CusExtend.cs @@ -0,0 +1,189 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd.Extend; +/// <summary> +/// 鐢ㄦ埛鎵╁睍琛� 浼佷笟璧勬枡 +/// </summary> +[SugarTable("FBS_CusExtend", "浼佷笟璧勬枡")] +[IncreTable] +public class FBS_CusExtend: EntityBaseTenant +{ + /// <summary> + /// 鐢ㄦ埛ID + /// </summary> + [SugarColumn(ColumnDescription = "鐢ㄦ埛ID" )] + [Required(ErrorMessage = "鐢ㄦ埛ID 蹇呭~")] + public int CustomerId { get; set; } + + + + /// <summary> + /// 浼佷笟绫诲瀷 浠庝紒涓氱被鍨嬩腑閫夋嫨 + /// </summary> + [SugarColumn(ColumnDescription = "浼佷笟绫诲瀷 ", Length = 255)] + [Required(ErrorMessage = "浼佷笟绫诲瀷")] + public string EnterpriseType { get; set; } + + + /// <summary> + /// 浜ゆ槗涓讳綋 浠g爜 鍚岃鑹蹭唬鐮� + /// </summary> + [Required(ErrorMessage = "浜ゆ槗涓讳綋浠g爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浜ゆ槗涓讳綋code")] + public string TransactionCode { get; set; } + /// <summary> + /// 钀ヤ笟鎵х収鏂囦欢璺緞 + /// </summary> + [Required(ErrorMessage = "钀ヤ笟鎵х収鏂囦欢蹇呬紶")] + [SugarColumn(ColumnDescription = "钀ヤ笟鎵х収鏂囦欢璺緞")] + public string BusinessLicense { get; set; } + + /// <summary> + /// 浼佷笟鍚嶇О + /// </summary> + [Required(ErrorMessage = "浼佷笟鍚嶇О涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟鍚嶇О")] + public string EnterpriseName { get; set; } + + /// <summary> + /// 缁熶竴绀句細淇$敤浠g爜 + /// </summary> + [Required(ErrorMessage = "缁熶竴绀句細淇$敤浠g爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "缁熶竴绀句細淇$敤浠g爜")] + public string UnifiedSocialCreditCode { get; set; } + + /// <summary> + /// 娉ㄥ唽璧勯噾锛堝崟浣嶏細涓囧厓 锛� + /// </summary> + [Required(ErrorMessage = "娉ㄥ唽璧勯噾涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉ㄥ唽璧勯噾")] + public decimal RegisteredCapital { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜哄鍚� + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜哄鍚嶄负蹇呭~椤�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativeName { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞 + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞姣曚紶")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜鸿韩浠借瘉鏂囦欢璺緞")] + public string LegalRepresentativeIdCard { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜 + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿韩浠借瘉鍙风爜涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativeIdNumber { get; set; } + + /// <summary> + /// 娉曞畾浠h〃浜鸿仈绯荤數璇� + /// </summary> + [Required(ErrorMessage = "娉曞畾浠h〃浜鸿仈绯荤數璇濅负蹇呭~椤�")] + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string LegalRepresentativePhone { get; set; } + + /// <summary> + /// 浼佷笟浣忔墍锛堜笅鎷夐�夋嫨锛岄渶缁撳悎瀹為檯鍙�夊�硷紝鍏堝瓧绗︿覆鎺ユ敹 锛� + /// </summary> + [Required(ErrorMessage = "浼佷笟浣忔墍涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟浣忔墍")] + public string Residence { get; set; } + + /// <summary> + /// 浼佷笟鑱旂郴鐢佃瘽 + /// </summary> + [Required(ErrorMessage = "浼佷笟鑱旂郴鐢佃瘽涓哄繀濉」")] + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "浼佷笟鑱旂郴鐢佃瘽")] + public string EnterprisePhone { get; set; } + + /// <summary> + /// 浼佷笟鎴愮珛鏃堕棿 + /// </summary> + [Required(ErrorMessage = "鎴愮珛鏃堕棿涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟鎴愮珛鏃堕棿")] + public DateTime EstablishmentTime { get; set; } + + /// <summary> + /// 浼佷笟涓昏惀涓氬姟 + /// </summary> + [Required(ErrorMessage = "涓昏惀涓氬姟涓哄繀濉」")] + [SugarColumn(ColumnDescription = "浼佷笟涓昏惀涓氬姟")] + public string MainBusiness { get; set; } + + /// <summary> + /// 浼佷笟閭 + /// </summary> + [Required(ErrorMessage = "浼佷笟閭涓哄繀濉」")] + [EmailAddress(ErrorMessage = "閭鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "浼佷笟閭")] + public string EnterpriseEmail { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜哄鍚� + /// </summary> + + [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜哄鍚�", IsNullable = true)] + public string OperatorName { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇嗭紙涓婁紶鍚庡瓨鍌ㄤ俊鎭級 + /// </summary> + + [SugarColumn(ColumnDescription = "涓氬姟缁忓姙浜鸿韩浠借瘉鏂囦欢璺緞鎴栨爣璇�", IsNullable = true)] + public string OperatorIdCard { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿韩浠借瘉鍙风爜 + /// </summary> + + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�", IsNullable = true)] + public string OperatorIdNumber { get; set; } + + /// <summary> + /// 涓氬姟缁忓姙浜鸿仈绯荤數璇� + /// </summary> + + [Phone(ErrorMessage = "鑱旂郴鐢佃瘽鏍煎紡涓嶆纭�")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�",IsNullable =true)] + public string OperatorPhone { get; set; } + + /// <summary> + /// 浼佷笟寮�鎴疯 + /// </summary> + [Required(ErrorMessage = "寮�鎴疯涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string BankName { get; set; } + + /// <summary> + /// 浼佷笟閾惰璐﹀彿 + /// </summary> + [Required(ErrorMessage = "閾惰璐﹀彿涓哄繀濉」")] + [SugarColumn(ColumnDescription = "娉曞畾浠h〃浜哄鍚�")] + public string BankAccount { get; set; } + /// <summary> + /// 瀹℃牳姝ラ + /// </summary> + + [SugarColumn(ColumnDescription = "瀹℃牳姝ラ")] + public int steps { set; get; } = 0; +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs new file mode 100644 index 0000000..30e17a6 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CoutomerExRole.cs @@ -0,0 +1,41 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.MD.CutomerMd; +/// <summary> +/// 澶栭儴瑙掕壊琛� +/// </summary> +[SugarTable("FBS_CoutomerExRole", "澶栭儴瑙掕壊琛�")] +[IncreTable] +public class FBS_CoutomerExRole: EntityBaseId +{ + //瀹㈡埛ID + public long CustomerId { get; set; } + + /// <summary> + /// 澶栭儴瑙掕壊 + /// </summary> + public long ExRoleId { get; set; } + + /// <summary> + /// 鏄惁瀹屾垚瑙掕壊鍒涘缓 + /// </summary> + public bool HasFlsh { get; set; }= false; + + /// <summary> + /// 澶栭儴瑙掕壊 + /// </summary> + [Navigate(NavigateType.OneToOne, nameof(ExRoleId))] + public FBS_ExRole ExRole { get; set; } +} diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs index fbfd501..cd6db14 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Customer.cs @@ -21,7 +21,7 @@ [SugarTable("FBS_Customer", "瀹㈡埛琛�")] [SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)] [SugarIndex("index_{table}_P", nameof(Phone), OrderByType.Asc)] - +[IncreTable] public partial class FBS_Customer : EntityBaseTenant { /// <summary> @@ -34,10 +34,9 @@ /// <summary> /// 瀵嗙爜 /// </summary> - [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512)] + [SugarColumn(ColumnDescription = "瀵嗙爜", Length = 512,IsNullable =true)] [MaxLength(512)] - [Newtonsoft.Json.JsonIgnore] - [System.Text.Json.Serialization.JsonIgnore] + public virtual string Password { get; set; } /// <summary> @@ -61,30 +60,30 @@ [MaxLength(512)] public string? Avatar { get; set; } - /// <summary> - /// 鎬у埆-鐢穇1銆佸コ_2 - /// </summary> - [SugarColumn(ColumnDescription = "鎬у埆")] - public GenderEnum Sex { get; set; } = GenderEnum.Male; + ///// <summary> + ///// 鎬у埆-鐢穇1銆佸コ_2 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎬у埆")] + //public GenderEnum Sex { get; set; } = GenderEnum.Male; - /// <summary> - /// 骞撮緞 - /// </summary> - [SugarColumn(ColumnDescription = "骞撮緞")] - public int Age { get; set; } + ///// <summary> + ///// 骞撮緞 + ///// </summary> + //[SugarColumn(ColumnDescription = "骞撮緞")] + //public int Age { get; set; } - /// <summary> - /// 鍑虹敓鏃ユ湡 - /// </summary> - [SugarColumn(ColumnDescription = "鍑虹敓鏃ユ湡")] - public DateTime? Birthday { get; set; } + ///// <summary> + ///// 鍑虹敓鏃ユ湡 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍑虹敓鏃ユ湡")] + //public DateTime? Birthday { get; set; } - /// <summary> - /// 姘戞棌 - /// </summary> - [SugarColumn(ColumnDescription = "姘戞棌", Length = 32)] - [MaxLength(32)] - public string? Nation { get; set; } + ///// <summary> + ///// 姘戞棌 + ///// </summary> + //[SugarColumn(ColumnDescription = "姘戞棌", Length = 32)] + //[MaxLength(32)] + //public string? Nation { get; set; } /// <summary> /// 鎵嬫満鍙风爜 @@ -93,26 +92,26 @@ [MaxLength(16)] public string? Phone { get; set; } - /// <summary> - /// 璇佷欢绫诲瀷 - /// </summary> - [SugarColumn(ColumnDescription = "璇佷欢绫诲瀷")] - public CardTypeEnum CardType { get; set; } + ///// <summary> + ///// 璇佷欢绫诲瀷 + ///// </summary> + //[SugarColumn(ColumnDescription = "璇佷欢绫诲瀷")] + //public CardTypeEnum CardType { get; set; } - /// <summary> - /// 韬唤璇佸彿 - /// </summary> - [SugarColumn(ColumnDescription = "韬唤璇佸彿", Length = 32)] - [MaxLength(32)] - public string? IdCardNum { get; set; } + ///// <summary> + ///// 韬唤璇佸彿 + ///// </summary> + //[SugarColumn(ColumnDescription = "韬唤璇佸彿", Length = 32)] + //[MaxLength(32)] + //public string? IdCardNum { get; set; } - /// <summary> - /// 韬唤璇佸彿 - /// </summary> - [SugarColumn(ColumnDescription = "韬唤璇�", Length = 512)] - [MaxLength(512)] - public string? IdCardPath { get; set; } + ///// <summary> + ///// 韬唤璇佸彿 + ///// </summary> + //[SugarColumn(ColumnDescription = "韬唤璇�", Length = 512)] + //[MaxLength(512)] + //public string? IdCardPath { get; set; } /// <summary> /// 閭 @@ -121,73 +120,73 @@ [MaxLength(64)] public string? Email { get; set; } - /// <summary> - /// 鍦板潃 - /// </summary> - [SugarColumn(ColumnDescription = "鍦板潃", Length = 256)] - [MaxLength(256)] - public string? Address { get; set; } + ///// <summary> + ///// 鍦板潃 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍦板潃", Length = 256)] + //[MaxLength(256)] + //public string? Address { get; set; } - /// <summary> - /// 鏂囧寲绋嬪害 - /// </summary> - [SugarColumn(ColumnDescription = "鏂囧寲绋嬪害")] - public CultureLevelEnum CultureLevel { get; set; } + ///// <summary> + ///// 鏂囧寲绋嬪害 + ///// </summary> + //[SugarColumn(ColumnDescription = "鏂囧寲绋嬪害")] + //public CultureLevelEnum CultureLevel { get; set; } - /// <summary> - /// 鏀挎不闈㈣矊 - /// </summary> - [SugarColumn(ColumnDescription = "鏀挎不闈㈣矊", Length = 16)] - [MaxLength(16)] - public string? PoliticalOutlook { get; set; } + ///// <summary> + ///// 鏀挎不闈㈣矊 + ///// </summary> + //[SugarColumn(ColumnDescription = "鏀挎不闈㈣矊", Length = 16)] + //[MaxLength(16)] + //public string? PoliticalOutlook { get; set; } - /// <summary> - /// 姣曚笟闄㈡牎 - /// </summary>COLLEGE - [SugarColumn(ColumnDescription = "姣曚笟闄㈡牎", Length = 128)] - [MaxLength(128)] - public string? College { get; set; } + ///// <summary> + ///// 姣曚笟闄㈡牎 + ///// </summary>COLLEGE + //[SugarColumn(ColumnDescription = "姣曚笟闄㈡牎", Length = 128)] + //[MaxLength(128)] + //public string? College { get; set; } - /// <summary> - /// 鍔炲叕鐢佃瘽 - /// </summary> - [SugarColumn(ColumnDescription = "鍔炲叕鐢佃瘽", Length = 16)] - [MaxLength(16)] - public string? OfficePhone { get; set; } + ///// <summary> + ///// 鍔炲叕鐢佃瘽 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕鐢佃瘽", Length = 16)] + //[MaxLength(16)] + //public string? OfficePhone { get; set; } - /// <summary> - /// 绱ф�ヨ仈绯讳汉 - /// </summary> - [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉", Length = 32)] - [MaxLength(32)] - public string? EmergencyContact { get; set; } + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉", Length = 32)] + //[MaxLength(32)] + //public string? EmergencyContact { get; set; } - /// <summary> - /// 绱ф�ヨ仈绯讳汉鐢佃瘽 - /// </summary> - [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鐢佃瘽", Length = 16)] - [MaxLength(16)] - public string? EmergencyPhone { get; set; } + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉鐢佃瘽 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鐢佃瘽", Length = 16)] + //[MaxLength(16)] + //public string? EmergencyPhone { get; set; } - /// <summary> - /// 绱ф�ヨ仈绯讳汉鍦板潃 - /// </summary> - [SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鍦板潃", Length = 256)] - [MaxLength(256)] - public string? EmergencyAddress { get; set; } + ///// <summary> + ///// 绱ф�ヨ仈绯讳汉鍦板潃 + ///// </summary> + //[SugarColumn(ColumnDescription = "绱ф�ヨ仈绯讳汉鍦板潃", Length = 256)] + //[MaxLength(256)] + //public string? EmergencyAddress { get; set; } - /// <summary> - /// 涓汉绠�浠� - /// </summary> - [SugarColumn(ColumnDescription = "涓汉绠�浠�", Length = 512)] - [MaxLength(512)] - public string? Introduction { get; set; } + ///// <summary> + ///// 涓汉绠�浠� + ///// </summary> + //[SugarColumn(ColumnDescription = "涓汉绠�浠�", Length = 512)] + //[MaxLength(512)] + //public string? Introduction { get; set; } - /// <summary> - /// 鎺掑簭 - /// </summary> - [SugarColumn(ColumnDescription = "鎺掑簭")] - public int OrderNo { get; set; } = 100; + ///// <summary> + ///// 鎺掑簭 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎺掑簭")] + //public int OrderNo { get; set; } = 100; /// <summary> /// 鐘舵�� @@ -255,46 +254,46 @@ //[MaxLength(32)] //public string? JobNum { get; set; } - /// <summary> - /// 鑱岀骇 - /// </summary> - [SugarColumn(ColumnDescription = "鑱岀骇", Length = 32)] - [MaxLength(32)] - public string? PosLevel { get; set; } + ///// <summary> + ///// 鑱岀骇 + ///// </summary> + //[SugarColumn(ColumnDescription = "鑱岀骇", Length = 32)] + //[MaxLength(32)] + //public string? PosLevel { get; set; } - /// <summary> - /// 鑱岀О - /// </summary> - [SugarColumn(ColumnDescription = "鑱岀О", Length = 32)] - [MaxLength(32)] - public string? PosTitle { get; set; } + ///// <summary> + ///// 鑱岀О + ///// </summary> + //[SugarColumn(ColumnDescription = "鑱岀О", Length = 32)] + //[MaxLength(32)] + //public string? PosTitle { get; set; } - /// <summary> - /// 鎿呴暱棰嗗煙 - /// </summary> - [SugarColumn(ColumnDescription = "鎿呴暱棰嗗煙", Length = 32)] - [MaxLength(32)] - public string? Expertise { get; set; } + ///// <summary> + ///// 鎿呴暱棰嗗煙 + ///// </summary> + //[SugarColumn(ColumnDescription = "鎿呴暱棰嗗煙", Length = 32)] + //[MaxLength(32)] + //public string? Expertise { get; set; } - /// <summary> - /// 鍔炲叕鍖哄煙 - /// </summary> - [SugarColumn(ColumnDescription = "鍔炲叕鍖哄煙", Length = 32)] - [MaxLength(32)] - public string? OfficeZone { get; set; } + ///// <summary> + ///// 鍔炲叕鍖哄煙 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕鍖哄煙", Length = 32)] + //[MaxLength(32)] + //public string? OfficeZone { get; set; } - /// <summary> - /// 鍔炲叕瀹� - /// </summary> - [SugarColumn(ColumnDescription = "鍔炲叕瀹�", Length = 32)] - [MaxLength(32)] - public string? Office { get; set; } + ///// <summary> + ///// 鍔炲叕瀹� + ///// </summary> + //[SugarColumn(ColumnDescription = "鍔炲叕瀹�", Length = 32)] + //[MaxLength(32)] + //public string? Office { get; set; } - /// <summary> - /// 鍏ヨ亴鏃ユ湡 - /// </summary> - [SugarColumn(ColumnDescription = "鍏ヨ亴鏃ユ湡")] - public DateTime? JoinDate { get; set; } + ///// <summary> + ///// 鍏ヨ亴鏃ユ湡 + ///// </summary> + //[SugarColumn(ColumnDescription = "鍏ヨ亴鏃ユ湡")] + //public DateTime? JoinDate { get; set; } /// <summary> /// 鏈�鏂扮櫥褰旾p @@ -330,6 +329,12 @@ [MaxLength(512)] public string? Signature { get; set; } + /// <summary> + /// 澶栭儴瑙勫垯锛岀櫥褰曡鑹� + /// </summary> + [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))] + public List<FBS_CoutomerExRole> CoutomerExRols { set; get; } + ///// <summary> ///// 楠岃瘉瓒呯骇绠$悊鍛樼被鍨嬶紝鑻ヨ处鍙风被鍨嬩负瓒呯骇绠$悊鍛樺垯鎶ラ敊 ///// </summary> diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs index 260b5c0..12037b4 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_CustomerRole.cs @@ -14,7 +14,7 @@ namespace FZCZTB.NET.MD.CutomerMd; [SugarTable("FBS_CustomerRole", "瀹㈡埛鑿滃崟琛�")] - +[IncreTable] public class FBS_CustomerRole : EntityBaseId { /// <summary> @@ -42,4 +42,9 @@ /// </summary> [Navigate(NavigateType.OneToOne, nameof(RoleId))] public SysRole SysRole { get; set; } + + + + + } diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs index 61e1be0..a9a32cb 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRole.cs @@ -18,10 +18,10 @@ /// 鐧诲綍鍗宠閫夋嫨鐨勬牎鑹� /// </summary> -[SugarTable("FBS_TenantMenu", "瀹㈡埛涓诲垎绫昏鑹�")] +[SugarTable("FBS_ExRole", "瀹㈡埛涓诲垎绫昏鑹�")] [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] - +[IncreTable] public class FBS_ExRole: EntityBaseTenant { /// <summary> diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs index dea3147..c3e7afc 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_ExRoleMenu.cs @@ -16,8 +16,8 @@ /// <summary> /// 绯荤粺绉熸埛鑿滃崟琛� /// </summary> -[SugarTable("FBS_TenantMenu", "绯荤粺绉熸埛鑿滃崟琛�")] - +[SugarTable("FBS_ExRoleMenu", "绯荤粺绉熸埛鑿滃崟琛�")] +[IncreTable] class FBS_ExRoleMenu: EntityBaseId { /// <summary> diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs index 58a7502..c3156d0 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Menu.cs @@ -20,7 +20,7 @@ [SugarTable("FBS_Menu", "瀹㈡埛绯荤粺鑿滃崟琛�")] [SugarIndex("index_{table}_T", nameof(Title), OrderByType.Asc)] [SugarIndex("index_{table}_T2", nameof(Type), OrderByType.Asc)] - +[IncreTable] public class FBS_Menu: EntityBaseTenant { /// <summary> diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs index 57e4cc8..f1ec761 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_Role.cs @@ -19,7 +19,7 @@ [SugarTable("FBS_Role", "瀹㈡埛涓�у寲瑙掕壊")] [SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] [SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] - +[IncreTable] public class FBS_Role : EntityBaseTenant { /// <summary> diff --git a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs index ba07127..0107262 100644 --- a/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs +++ b/Admin.NET/FZCZTB.NET.MD/CutomerMd/FBS_RoleMenu.cs @@ -14,7 +14,8 @@ namespace FZCZTB.NET.MD.CutomerMd; -[SugarTable("FBS_Role", "涓�у寲鏍¤壊鑿滃崟")] +[SugarTable("FBS_RoleMenu", "涓�у寲鏍¤壊鑿滃崟")] +[IncreTable] public class FBS_RoleMenu: EntityBaseId { diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs index e0c6411..aca8db5 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs +++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs @@ -3,6 +3,7 @@ using Furion.DependencyInjection; using FZCZTB.NET.MD.CutomerMd; using Mapster; +using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -44,12 +45,12 @@ /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� /// </summary> /// <returns></returns> - public async Task<CustomerDto> GetCustomer(int id) + public async Task<CustomerRDto> GetCustomer(int id) { - return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>(); + return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>(); @@ -62,12 +63,12 @@ /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� /// </summary> /// <returns></returns> - public async Task<CustomerDto> UpDataCustomer(int id) + public async Task<CustomerRDto> UpDataCustomer(int id) { - return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>(); + return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerRDto>(); @@ -131,209 +132,95 @@ /// <summary> /// 瀹㈡埛琛ㄨ緭鍑哄弬鏁� /// </summary> - public class CustomerDto + public class CustomerRDto { - /// <summary> - /// 涓婚敭Id - /// </summary> - public long Id { get; set; } - /// <summary> /// 璐﹀彿 /// </summary> - public string Account { get; set; } + + public virtual string Account { get; set; } /// <summary> /// 瀵嗙爜 /// </summary> - public string Password { get; set; } + + [MaxLength(512)] + + public virtual string Password { get; set; } /// <summary> /// 鐪熷疄濮撳悕 /// </summary> - public string RealName { get; set; } + + [MaxLength(32)] + public virtual string RealName { get; set; } /// <summary> /// 鏄电О /// </summary> + + [MaxLength(32)] public string? NickName { get; set; } /// <summary> /// 澶村儚 /// </summary> + + [MaxLength(512)] public string? Avatar { get; set; } - /// <summary> - /// 鎬у埆 - /// </summary> - public GenderEnum Sex { get; set; } - - /// <summary> - /// 骞撮緞 - /// </summary> - public int Age { get; set; } - - /// <summary> - /// 鍑虹敓鏃ユ湡 - /// </summary> - public DateTime? Birthday { get; set; } - - /// <summary> - /// 姘戞棌 - /// </summary> - public string? Nation { get; set; } + /// <summary> /// 鎵嬫満鍙风爜 /// </summary> + + [MaxLength(16)] public string? Phone { get; set; } - /// <summary> - /// 璇佷欢绫诲瀷 - /// </summary> - public CardTypeEnum CardType { get; set; } - - /// <summary> - /// 韬唤璇佸彿 - /// </summary> - public string? IdCardNum { get; set; } - - /// <summary> - /// 韬唤璇� - /// </summary> - public string? IdCardPath { get; set; } + /// <summary> /// 閭 /// </summary> + + [MaxLength(64)] public string? Email { get; set; } - /// <summary> - /// 鍦板潃 - /// </summary> - public string? Address { get; set; } - /// <summary> - /// 鏂囧寲绋嬪害 - /// </summary> - public CultureLevelEnum CultureLevel { get; set; } - - /// <summary> - /// 鏀挎不闈㈣矊 - /// </summary> - public string? PoliticalOutlook { get; set; } - - /// <summary> - /// 姣曚笟闄㈡牎 - /// </summary> - public string? College { get; set; } - - /// <summary> - /// 鍔炲叕鐢佃瘽 - /// </summary> - public string? OfficePhone { get; set; } - - /// <summary> - /// 绱ф�ヨ仈绯讳汉 - /// </summary> - public string? EmergencyContact { get; set; } - - /// <summary> - /// 绱ф�ヨ仈绯讳汉鐢佃瘽 - /// </summary> - public string? EmergencyPhone { get; set; } - - /// <summary> - /// 绱ф�ヨ仈绯讳汉鍦板潃 - /// </summary> - public string? EmergencyAddress { get; set; } - - /// <summary> - /// 涓汉绠�浠� - /// </summary> - public string? Introduction { get; set; } - - /// <summary> - /// 鎺掑簭 - /// </summary> - public int OrderNo { get; set; } - - /// <summary> - /// 鐘舵�� - /// </summary> - public StatusEnum Status { get; set; } + /// <summary> /// 澶囨敞 /// </summary> + + [MaxLength(256)] public string? Remark { get; set; } - /// <summary> - /// 鑱岀骇 - /// </summary> - public string? PosLevel { get; set; } + - /// <summary> - /// 鑱岀О - /// </summary> - public string? PosTitle { get; set; } - - /// <summary> - /// 鎿呴暱棰嗗煙 - /// </summary> - public string? Expertise { get; set; } - - /// <summary> - /// 鍔炲叕鍖哄煙 - /// </summary> - public string? OfficeZone { get; set; } - - /// <summary> - /// 鍔炲叕瀹� - /// </summary> - public string? Office { get; set; } - - /// <summary> - /// 鍏ヨ亴鏃ユ湡 - /// </summary> - public DateTime? JoinDate { get; set; } - - /// <summary> - /// 鏈�鏂扮櫥褰旾p - /// </summary> - public string? LastLoginIp { get; set; } - - /// <summary> - /// 鏈�鏂扮櫥褰曞湴鐐� - /// </summary> - public string? LastLoginAddress { get; set; } - - /// <summary> - /// 鏈�鏂扮櫥褰曟椂闂� - /// </summary> - public DateTime? LastLoginTime { get; set; } - - /// <summary> - /// 鏈�鏂扮櫥褰曡澶� - /// </summary> - public string? LastLoginDevice { get; set; } /// <summary> /// 鐢靛瓙绛惧悕 /// </summary> + public string? Signature { get; set; } /// <summary> - /// 绉熸埛Id + /// 澶栭儴瑙勫垯锛岀櫥褰曡鑹� /// </summary> - public long? TenantId { get; set; } + [Navigate(NavigateType.OneToMany, nameof(FBS_CoutomerExRole.CustomerId))] + public List<FBS_CoutomerExRole> CoutomerExRols { set; get; } /// <summary> - /// 娉ㄥ唽鐢ㄦ埛瑙掕壊 + /// 娉ㄥ唽鐢ㄦ埛瑙掕壊 /// </summary> public string? ExRoleCode { get; set; } - + /// <summary> + /// 鐢ㄦ埛娉ㄥ唽鎵嬫満楠岃瘉鐮� + /// </summary> + public string? PhoneVCode { get; set; } } } diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj index 67c6339..451ec3d 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj @@ -4,6 +4,7 @@ <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> @@ -11,4 +12,10 @@ <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> </ItemGroup> + <ItemGroup> + <None Update="FZCZTSYSServiceConfig.json"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + </Project> diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json index 8028922..84183ff 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json @@ -1,16 +1,19 @@ { - "SMSConfigMd": { - "LingKaiXinxiSets": { //鍑屽嚡鐭俊閰嶇疆 + "SMSConfig": { + + "lingKai": { //鍑屽嚡鐭俊閰嶇疆 "Url": "https://mb345.com/ws/BatchSend2.aspx", "Number": "XP010534", "AccountPassPassword": "123321", - "VerifyTimeOut": 60, //绉� + "VerifyTimeOut": "60", //绉� "Templates": [ { "Id": "0", "SignName": "銆愭斂閲囧挩璇㈢綉銆�", //闇�瑕佸姞鍏ョ殑鍏徃鏍囩 "TemplateCode": "VCode", - "Content": "鎮ㄧ殑楠岃瘉鐮佷负锛�${code}锛岃鍕挎硠闇蹭簬浠栦汉锛�" + "Content": "鎮ㄥソ锛屾偍鐨勯獙璇佺爜鏄細${code}" + + }, { "Id": "1", diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs index 805fcce..3cd5e0b 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs @@ -16,7 +16,7 @@ public class SMSConfigOptions : IConfigurableOptions { - + /// <summary> /// 鍑屽嚡淇℃伅閰嶇疆 /// </summary> @@ -40,9 +40,9 @@ /// <summary> /// 瓒呮椂鏃堕棿 /// </summary> - public int VerifyTimeOut { get; set; } + public string VerifyTimeOut { get; set; } /// <summary> /// Templates /// </summary> - public List<SmsTemplate> Templates { get; set; } + public List<SmsTemplate>? Templates { get; set; } } \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs index 61804dc..051b110 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs @@ -28,6 +28,7 @@ using Yitter.IdGenerator; using Lazy.Captcha.Core; using Furion; +using NewLife; namespace FZCZTB.NET.SYSService.MSM; /// <summary> @@ -45,8 +46,10 @@ ICaptcha captcha ) { + _smsOptions = smsOptions.Value; - _sysCacheService = _sysCacheService; + _sysCacheService = sysCacheService; + _captcha = captcha; } @@ -73,7 +76,7 @@ return Temp.Content+Temp.SignName; } if (Code == null) - Oops.Oh("鐭俊鍐呭涓虹┖"); + throw Oops.Oh("鐭俊鍐呭涓虹┖"); return Code; } @@ -134,7 +137,7 @@ if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�"); if (verifyCode != input.Code) throw Oops.Oh("楠岃瘉鐮侀敊璇紒"); - + _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); return true; } /// <summary> @@ -164,13 +167,13 @@ }; var code= FormartMessage(verifyCode.toString()); - await SendSMSAsync(code, phoneNumber); + await SendSMSAsync(code, phoneNumber); - _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut)); + _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut.ToInt())); - + - await Task.CompletedTask; + } /// <summary> diff --git a/Admin.NET/FZCZTB.NET.SYSService/Startup.cs b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs new file mode 100644 index 0000000..f93437f --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/Startup.cs @@ -0,0 +1,32 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using AspNetCoreRateLimit; +using Furion; +using FZCZTB.NET.SYSService.MSM; +using IPTools.Core; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService; +[AppStartup(int.MaxValue -1)] +public class Startup: AppStartup +{ + + public void ConfigureServices(IServiceCollection services) + { + services.AddConfigurableOptions<SMSConfigOptions>(); + + + } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj index 8756464..05ae595 100644 --- a/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/FZCZTB.Net.CustomerSYSTem.csproj @@ -4,6 +4,7 @@ <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> + <GenerateDocumentationFile>True</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs index 5ad0c9b..7bb739a 100644 --- a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_Customer/FBS_CustomerService.cs @@ -47,23 +47,23 @@ { input.Keyword = input.Keyword?.Trim(); var query = _fBS_CustomerRep.AsQueryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Account.Contains(input.Keyword) || u.RealName.Contains(input.Keyword) || u.NickName.Contains(input.Keyword) || u.IdCardPath.Contains(input.Keyword) || u.College.Contains(input.Keyword) || u.OfficePhone.Contains(input.Keyword) || u.EmergencyContact.Contains(input.Keyword) || u.EmergencyPhone.Contains(input.Keyword) || u.EmergencyAddress.Contains(input.Keyword) || u.Introduction.Contains(input.Keyword) || u.Remark.Contains(input.Keyword) || u.PosLevel.Contains(input.Keyword) || u.PosTitle.Contains(input.Keyword)) + //.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Account.Contains(input.Keyword) || u.RealName.Contains(input.Keyword) || u.NickName.Contains(input.Keyword) || u.IdCardPath.Contains(input.Keyword) || u.College.Contains(input.Keyword) || u.OfficePhone.Contains(input.Keyword) || u.EmergencyContact.Contains(input.Keyword) || u.EmergencyPhone.Contains(input.Keyword) || u.EmergencyAddress.Contains(input.Keyword) || u.Introduction.Contains(input.Keyword) || u.Remark.Contains(input.Keyword) || u.PosLevel.Contains(input.Keyword) || u.PosTitle.Contains(input.Keyword)) .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account.Contains(input.Account.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.IdCardPath), u => u.IdCardPath.Contains(input.IdCardPath.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.College), u => u.College.Contains(input.College.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.OfficePhone), u => u.OfficePhone.Contains(input.OfficePhone.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyContact), u => u.EmergencyContact.Contains(input.EmergencyContact.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyPhone), u => u.EmergencyPhone.Contains(input.EmergencyPhone.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyAddress), u => u.EmergencyAddress.Contains(input.EmergencyAddress.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Introduction), u => u.Introduction.Contains(input.Introduction.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.IdCardPath), u => u.IdCardPath.Contains(input.IdCardPath.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.College), u => u.College.Contains(input.College.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.OfficePhone), u => u.OfficePhone.Contains(input.OfficePhone.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyContact), u => u.EmergencyContact.Contains(input.EmergencyContact.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyPhone), u => u.EmergencyPhone.Contains(input.EmergencyPhone.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.EmergencyAddress), u => u.EmergencyAddress.Contains(input.EmergencyAddress.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.Introduction), u => u.Introduction.Contains(input.Introduction.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.PosLevel), u => u.PosLevel.Contains(input.PosLevel.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.PosTitle), u => u.PosTitle.Contains(input.PosTitle.Trim())) - .WhereIF(input.CardType.HasValue, u => u.CardType == input.CardType) - .WhereIF(input.CultureLevel.HasValue, u => u.CultureLevel == input.CultureLevel) - .WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) + //.WhereIF(!string.IsNullOrWhiteSpace(input.PosLevel), u => u.PosLevel.Contains(input.PosLevel.Trim())) + //.WhereIF(!string.IsNullOrWhiteSpace(input.PosTitle), u => u.PosTitle.Contains(input.PosTitle.Trim())) + //.WhereIF(input.CardType.HasValue, u => u.CardType == input.CardType) + //.WhereIF(input.CultureLevel.HasValue, u => u.CultureLevel == input.CultureLevel) + //.WhereIF(input.OrderNo != null, u => u.OrderNo == input.OrderNo) .WhereIF(input.Status.HasValue, u => u.Status == input.Status) .Select<FBS_CustomerOutput>(); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); @@ -106,10 +106,10 @@ var entity = input.Adapt<FBS_Customer>(); await _fBS_CustomerRep.AsUpdateable(entity) .IgnoreColumns(u => new { - u.Expertise, - u.OfficeZone, - u.Office, - u.JoinDate, + //u.Expertise, + //u.OfficeZone, + //u.Office, + //u.JoinDate, u.LastLoginIp, u.LastLoginAddress, u.LastLoginTime, @@ -247,22 +247,22 @@ .SplitError(it => it.Item.RealName?.Length > 32, "鐪熷疄濮撳悕闀垮害涓嶈兘瓒呰繃32涓瓧绗�") .SplitError(it => it.Item.NickName?.Length > 32, "鏄电О闀垮害涓嶈兘瓒呰繃32涓瓧绗�") .SplitError(it => it.Item.Avatar?.Length > 512, "澶村儚闀垮害涓嶈兘瓒呰繃512涓瓧绗�") - .SplitError(it => it.Item.Nation?.Length > 32, "姘戞棌闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.Nation?.Length > 32, "姘戞棌闀垮害涓嶈兘瓒呰繃32涓瓧绗�") .SplitError(it => it.Item.Phone?.Length > 16, "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃16涓瓧绗�") - .SplitError(it => it.Item.IdCardNum?.Length > 32, "韬唤璇佸彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�") - .SplitError(it => it.Item.IdCardPath?.Length > 512, "韬唤璇侀暱搴︿笉鑳借秴杩�512涓瓧绗�") + //.SplitError(it => it.Item.IdCardNum?.Length > 32, "韬唤璇佸彿闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.IdCardPath?.Length > 512, "韬唤璇侀暱搴︿笉鑳借秴杩�512涓瓧绗�") .SplitError(it => it.Item.Email?.Length > 64, "閭闀垮害涓嶈兘瓒呰繃64涓瓧绗�") - .SplitError(it => it.Item.Address?.Length > 256, "鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") - .SplitError(it => it.Item.PoliticalOutlook?.Length > 16, "鏀挎不闈㈣矊闀垮害涓嶈兘瓒呰繃16涓瓧绗�") - .SplitError(it => it.Item.College?.Length > 128, "姣曚笟闄㈡牎闀垮害涓嶈兘瓒呰繃128涓瓧绗�") - .SplitError(it => it.Item.OfficePhone?.Length > 16, "鍔炲叕鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") - .SplitError(it => it.Item.EmergencyContact?.Length > 32, "绱ф�ヨ仈绯讳汉闀垮害涓嶈兘瓒呰繃32涓瓧绗�") - .SplitError(it => it.Item.EmergencyPhone?.Length > 16, "绱ф�ヨ仈绯讳汉鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") - .SplitError(it => it.Item.EmergencyAddress?.Length > 256, "绱ф�ヨ仈绯讳汉鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") - .SplitError(it => it.Item.Introduction?.Length > 512, "涓汉绠�浠嬮暱搴︿笉鑳借秴杩�512涓瓧绗�") + //.SplitError(it => it.Item.Address?.Length > 256, "鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + //.SplitError(it => it.Item.PoliticalOutlook?.Length > 16, "鏀挎不闈㈣矊闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.College?.Length > 128, "姣曚笟闄㈡牎闀垮害涓嶈兘瓒呰繃128涓瓧绗�") + //.SplitError(it => it.Item.OfficePhone?.Length > 16, "鍔炲叕鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.EmergencyContact?.Length > 32, "绱ф�ヨ仈绯讳汉闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.EmergencyPhone?.Length > 16, "绱ф�ヨ仈绯讳汉鐢佃瘽闀垮害涓嶈兘瓒呰繃16涓瓧绗�") + //.SplitError(it => it.Item.EmergencyAddress?.Length > 256, "绱ф�ヨ仈绯讳汉鍦板潃闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + //.SplitError(it => it.Item.Introduction?.Length > 512, "涓汉绠�浠嬮暱搴︿笉鑳借秴杩�512涓瓧绗�") .SplitError(it => it.Item.Remark?.Length > 256, "澶囨敞闀垮害涓嶈兘瓒呰繃256涓瓧绗�") - .SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�") - .SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.PosLevel?.Length > 32, "鑱岀骇闀垮害涓嶈兘瓒呰繃32涓瓧绗�") + //.SplitError(it => it.Item.PosTitle?.Length > 32, "鑱岀О闀垮害涓嶈兘瓒呰繃32涓瓧绗�") .SplitInsert(_ => true) .ToStorage(); diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs new file mode 100644 index 0000000..0c45475 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeDto.cs @@ -0,0 +1,69 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeDto +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int ParentId { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs new file mode 100644 index 0000000..9e1a674 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeInput.cs @@ -0,0 +1,177 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; +using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; + +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍩虹杈撳叆鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeBaseInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + public virtual string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + public virtual string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public virtual int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍒嗛〉鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class PageFBS_EnterpriseTypeInput : BasePageInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int? ParentId { get; set; } + + /// <summary> + /// 閫変腑涓婚敭鍒楄〃 + /// </summary> + public List<long> SelectKeyList { get; set; } +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃澧炲姞杈撳叆鍙傛暟 +/// </summary> +public class AddFBS_EnterpriseTypeInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鍒犻櫎杈撳叆鍙傛暟 +/// </summary> +public class DeleteFBS_EnterpriseTypeInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏇存柊杈撳叆鍙傛暟 +/// </summary> +public class UpdateFBS_EnterpriseTypeInput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")] + public long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + [MaxLength(256, ErrorMessage = "鍚嶇О瀛楃闀垮害涓嶈兘瓒呰繃256")] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [Required(ErrorMessage = "浠g爜涓嶈兘涓虹┖")] + [MaxLength(36, ErrorMessage = "浠g爜瀛楃闀垮害涓嶈兘瓒呰繃36")] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [Required(ErrorMessage = "鐖朵笉鑳戒负绌�")] + public int? ParentId { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃涓婚敭鏌ヨ杈撳叆鍙傛暟 +/// </summary> +public class QueryByIdFBS_EnterpriseTypeInput : DeleteFBS_EnterpriseTypeInput +{ +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆瀹炰綋 +/// </summary> +[ExcelImporter(SheetIndex = 1, IsOnlyErrorRows = true)] +public class ImportFBS_EnterpriseTypeInput : BaseImportInput +{ + /// <summary> + /// 鍚嶇О + /// </summary> + [ImporterHeader(Name = "*鍚嶇О")] + [ExporterHeader("*鍚嶇О", Format = "", Width = 25, IsBold = true)] + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + [ImporterHeader(Name = "*浠g爜")] + [ExporterHeader("*浠g爜", Format = "", Width = 25, IsBold = true)] + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + [ImporterHeader(Name = "*鐖�")] + [ExporterHeader("*鐖�", Format = "", Width = 25, IsBold = true)] + public int? ParentId { get; set; } + +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs new file mode 100644 index 0000000..a4c88cc --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/Dto/FBS_EnterpriseTypeOutput.cs @@ -0,0 +1,79 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� +using Magicodes.ExporterAndImporter.Core; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃杈撳嚭鍙傛暟 +/// </summary> +public class FBS_EnterpriseTypeOutput +{ + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠g爜 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 鐖� + /// </summary> + public int ParentId { get; set; } + + /// <summary> + /// 绉熸埛Id + /// </summary> + public long? TenantId { get; set; } + + /// <summary> + /// 鍒涘缓鏃堕棿 + /// </summary> + public DateTime? CreateTime { get; set; } + + /// <summary> + /// 鏇存柊鏃堕棿 + /// </summary> + public DateTime? UpdateTime { get; set; } + + /// <summary> + /// 鍒涘缓鑰匢d + /// </summary> + public long? CreateUserId { get; set; } + + /// <summary> + /// 鍒涘缓鑰呭鍚� + /// </summary> + public string? CreateUserName { get; set; } + + /// <summary> + /// 淇敼鑰匢d + /// </summary> + public long? UpdateUserId { get; set; } + + /// <summary> + /// 淇敼鑰呭鍚� + /// </summary> + public string? UpdateUserName { get; set; } + +} + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘瀹炰綋 +/// </summary> +public class ExportFBS_EnterpriseTypeOutput : ImportFBS_EnterpriseTypeInput +{ + [ImporterHeader(IsIgnore = true)] + [ExporterHeader(IsIgnore = true)] + public override string Error { get; set; } +} diff --git a/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs new file mode 100644 index 0000000..1026101 --- /dev/null +++ b/Admin.NET/FZCZTB.Net.CustomerSYSTem/Service/FBS_EnterpriseType/FBS_EnterpriseTypeService.cs @@ -0,0 +1,196 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using Furion.DatabaseAccessor; +using Furion.FriendlyException; +using Mapster; +using SqlSugar; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Furion.DynamicApiController; +using Furion.DependencyInjection; +using FZCZTB.NET.MD.ConfigMd; +using Admin.NET.Core; +namespace FZCZTB.Net.CustomerSYSTem; + +/// <summary> +/// 浼佷笟绫婚厤缃〃鏈嶅姟 馃З +/// </summary> +[ApiDescriptionSettings(CustomerSYSTemConst.GroupName, Order = 100)] +public class FBS_EnterpriseTypeService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<FBS_EnterpriseType> _fBS_EnterpriseTypeRep; + private readonly ISqlSugarClient _sqlSugarClient; + + public FBS_EnterpriseTypeService(SqlSugarRepository<FBS_EnterpriseType> fBS_EnterpriseTypeRep, ISqlSugarClient sqlSugarClient) + { + _fBS_EnterpriseTypeRep = fBS_EnterpriseTypeRep; + _sqlSugarClient = sqlSugarClient; + } + + /// <summary> + /// 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Page"), HttpPost] + public async Task<SqlSugarPagedList<FBS_EnterpriseTypeOutput>> Page(PageFBS_EnterpriseTypeInput input) + { + input.Keyword = input.Keyword?.Trim(); + var query = _fBS_EnterpriseTypeRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Code.Contains(input.Keyword)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(input.ParentId != null, u => u.ParentId == input.ParentId) + .Select<FBS_EnterpriseTypeOutput>(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// <summary> + /// 鑾峰彇浼佷笟绫婚厤缃〃璇︽儏 鈩癸笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鑾峰彇浼佷笟绫婚厤缃〃璇︽儏")] + [ApiDescriptionSettings(Name = "Detail"), HttpGet] + public async Task<FBS_EnterpriseType> Detail([FromQuery] QueryByIdFBS_EnterpriseTypeInput input) + { + return await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// <summary> + /// 澧炲姞浼佷笟绫婚厤缃〃 鉃� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("澧炲姞浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task<long> Add(AddFBS_EnterpriseTypeInput input) + { + var entity = input.Adapt<FBS_EnterpriseType>(); + return await _fBS_EnterpriseTypeRep.InsertAsync(entity) ? entity.Id : 0; + } + + /// <summary> + /// 鏇存柊浼佷笟绫婚厤缃〃 鉁忥笍 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鏇存柊浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateFBS_EnterpriseTypeInput input) + { + var entity = input.Adapt<FBS_EnterpriseType>(); + await _fBS_EnterpriseTypeRep.AsUpdateable(entity) + .ExecuteCommandAsync(); + } + + /// <summary> + /// 鍒犻櫎浼佷笟绫婚厤缃〃 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鍒犻櫎浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteFBS_EnterpriseTypeInput input) + { + var entity = await _fBS_EnterpriseTypeRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _fBS_EnterpriseTypeRep.FakeDeleteAsync(entity); //鍋囧垹闄� + await _fBS_EnterpriseTypeRep.DeleteAsync(entity); //鐪熷垹闄� + } + + /// <summary> + /// 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃 鉂� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃")] + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + public async Task<bool> BatchDelete([Required(ErrorMessage = "涓婚敭鍒楄〃涓嶈兘涓虹┖")]List<DeleteFBS_EnterpriseTypeInput> input) + { + var exp = Expressionable.Create<FBS_EnterpriseType>(); + foreach (var row in input) exp = exp.Or(it => it.Id == row.Id); + var list = await _fBS_EnterpriseTypeRep.AsQueryable().Where(exp.ToExpression()).ToListAsync(); + + // return await _fBS_EnterpriseTypeRep.FakeDeleteAsync(list); //鍋囧垹闄� + return await _fBS_EnterpriseTypeRep.DeleteAsync(list); //鐪熷垹闄� + } + + /// <summary> + /// 瀵煎嚭浼佷笟绫婚厤缃〃璁板綍 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [DisplayName("瀵煎嚭浼佷笟绫婚厤缃〃璁板綍")] + [ApiDescriptionSettings(Name = "Export"), HttpPost, NonUnify] + public async Task<IActionResult> Export(PageFBS_EnterpriseTypeInput input) + { + var list = (await Page(input)).Items?.Adapt<List<ExportFBS_EnterpriseTypeOutput>>() ?? new(); + if (input.SelectKeyList?.Count > 0) list = list.Where(x => input.SelectKeyList.Contains(x.Id)).ToList(); + return ExcelHelper.ExportTemplate(list, "浼佷笟绫婚厤缃〃瀵煎嚭璁板綍"); + } + + /// <summary> + /// 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘 猬囷笍 + /// </summary> + /// <returns></returns> + [DisplayName("涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘")] + [ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify] + public IActionResult DownloadTemplate() + { + return ExcelHelper.ExportTemplate(new List<ExportFBS_EnterpriseTypeOutput>(), "浼佷笟绫婚厤缃〃瀵煎叆妯℃澘"); + } + + private static readonly object _fBS_EnterpriseTypeImportLock = new object(); + /// <summary> + /// 瀵煎叆浼佷笟绫婚厤缃〃璁板綍 馃捑 + /// </summary> + /// <returns></returns> + [DisplayName("瀵煎叆浼佷笟绫婚厤缃〃璁板綍")] + [ApiDescriptionSettings(Name = "Import"), HttpPost, NonUnify, UnitOfWork] + public IActionResult ImportData([Required] IFormFile file) + { + lock (_fBS_EnterpriseTypeImportLock) + { + var stream = ExcelHelper.ImportData<ImportFBS_EnterpriseTypeInput, FBS_EnterpriseType>(file, (list, markerErrorAction) => + { + _sqlSugarClient.Utilities.PageEach(list, 2048, pageItems => + { + + // 鏍¢獙骞惰繃婊ゅ繀濉熀鏈被鍨嬩负null鐨勫瓧娈� + var rows = pageItems.Where(x => { + if (!string.IsNullOrWhiteSpace(x.Error)) return false; + if (x.ParentId == null){ + x.Error = "鐖朵笉鑳戒负绌�"; + return false; + } + return true; + }).Adapt<List<FBS_EnterpriseType>>(); + + var storageable = _fBS_EnterpriseTypeRep.Context.Storageable(rows) + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Name), "鍚嶇О涓嶈兘涓虹┖") + .SplitError(it => it.Item.Name?.Length > 256, "鍚嶇О闀垮害涓嶈兘瓒呰繃256涓瓧绗�") + .SplitError(it => string.IsNullOrWhiteSpace(it.Item.Code), "浠g爜涓嶈兘涓虹┖") + .SplitError(it => it.Item.Code?.Length > 36, "浠g爜闀垮害涓嶈兘瓒呰繃36涓瓧绗�") + .SplitInsert(_ => true) + .ToStorage(); + + storageable.AsInsertable.ExecuteCommand();// 涓嶅瓨鍦ㄦ彃鍏� + storageable.AsUpdateable.ExecuteCommand();// 瀛樺湪鏇存柊 + + // 鏍囪閿欒淇℃伅 + markerErrorAction.Invoke(storageable, pageItems, rows); + }); + }); + + return stream; + } + } +} diff --git a/Admin.NET/cylsg.utility/CommonHelper.cs b/Admin.NET/cylsg.utility/CommonHelper.cs new file mode 100644 index 0000000..9ad189f --- /dev/null +++ b/Admin.NET/cylsg.utility/CommonHelper.cs @@ -0,0 +1,1015 @@ +锘縰sing cylsg.utility.Extend; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Globalization; +using System.Linq; +using System.Linq.Expressions; +using System.Net.Http.Json; +using System.Reflection; +using System.Runtime.Loader; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static cylsg.utility.untilityModels; + +namespace cylsg.utility +{ + /// <summary> + /// 閫氱敤甯姪绫� + /// </summary> + public static class CommonHelper + { + + #region 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜 + /// <summary> + /// 鍒ゆ柇瀛楃涓叉槸鍚︿负鎵嬫満鍙风爜 + /// </summary> + /// <param name="mobilePhoneNumber"></param> + /// <returns></returns> + public static bool IsMobile(string mobilePhoneNumber) + { + if (mobilePhoneNumber.Length < 11) + { + return false; + } + + //鐢典俊鎵嬫満鍙风爜姝e垯 + string dianxin = @"^1[345789][01379]\d{8}$"; + Regex regexDx = new Regex(dianxin); + //鑱旈�氭墜鏈哄彿鐮佹鍒� + string liantong = @"^1[345678][01256]\d{8}$"; + Regex regexLt = new Regex(liantong); + //绉诲姩鎵嬫満鍙风爜姝e垯 + string yidong = @"^1[345789][0123456789]\d{8}$"; + Regex regexYd = new Regex(yidong); + if (regexDx.IsMatch(mobilePhoneNumber) || regexLt.IsMatch(mobilePhoneNumber) || regexYd.IsMatch(mobilePhoneNumber)) + { + return true; + } + else + { + return false; + } + } + #endregion + + #region 妫�娴嬫槸鍚︾鍚坋mail鏍煎紡 + + /// <summary> + /// 妫�娴嬫槸鍚︾鍚坋mail鏍煎紡 + /// </summary> + /// <param name="strEmail">瑕佸垽鏂殑email瀛楃涓�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsValidEmail(string strEmail) + { + return Regex.IsMatch(strEmail, @"^[\w\.]+([-]\w+)*@[A-Za-z0-9-_]+[\.][A-Za-z0-9-_]"); + } + + public static bool IsValidDoEmail(string strEmail) + { + return Regex.IsMatch(strEmail, + @"^@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); + } + #endregion + + #region 妫�娴嬫槸鍚︽槸姝g‘鐨刄rl + /// <summary> + /// 妫�娴嬫槸鍚︽槸姝g‘鐨刄rl + /// </summary> + /// <param name="strUrl">瑕侀獙璇佺殑Url</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsUrl(string strUrl) + { + return Regex.IsMatch(strUrl, + @"^(http|https)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{1,10}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$"); + } + + + #endregion + + #region string 杞琲nt鏁扮粍 + + public static int[] StringToIntArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new int[0]; + if (str.EndsWith(",")) + { + str = str.Remove(str.Length - 1, 1); + } + var idstrarr = str.Split(','); + var idintarr = new int[idstrarr.Length]; + + for (int i = 0; i < idstrarr.Length; i++) + { + idintarr[i] = Convert.ToInt32(idstrarr[i]); + } + return idintarr; + } + catch + { + return new int[0]; + } + } + #endregion + + #region String杞暟缁� + public static string[] StringToStringArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new string[0]; + if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1); + return str.Split(','); + } + catch + { + return new string[0]; + } + } + #endregion + + #region String鏁扮粍杞琁nt鏁扮粍 + public static int[] StringArrAyToIntArray(string[] str) + { + try + { + int[] iNums = Array.ConvertAll(str, s => int.Parse(s)); + return iNums; + } + catch + { + return new int[0]; + } + } + #endregion + + #region string杞珿uid鏁扮粍 + + public static Guid[] StringToGuidArray(string str) + { + try + { + if (string.IsNullOrEmpty(str)) return new Guid[0]; + if (str.EndsWith(",")) str = str.Remove(str.Length - 1, 1); + var strarr = str.Split(','); + Guid[] guids = new Guid[strarr.Length]; + for (int index = 0; index < strarr.Length; index++) + { + guids[index] = Guid.Parse(strarr[index]); + } + return guids; + } + catch + { + return new Guid[0]; + } + } + #endregion + + #region 杞琈D5 + /// <summary> + /// 杞琈D5 + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static string ToMd5(string str) + { + MD5 md5 = MD5.Create(); + // 灏嗗瓧绗︿覆杞崲鎴愬瓧鑺傛暟缁� + byte[] byteOld = Encoding.UTF8.GetBytes(str); + // 璋冪敤鍔犲瘑鏂规硶 + byte[] byteNew = md5.ComputeHash(byteOld); + // 灏嗗姞瀵嗙粨鏋滆浆鎹负瀛楃涓� + StringBuilder sb = new StringBuilder(); + foreach (byte b in byteNew) + { + // 灏嗗瓧鑺傝浆鎹㈡垚16杩涘埗琛ㄧず鐨勫瓧绗︿覆锛� + sb.Append(b.ToString("x2")); + } + // 杩斿洖鍔犲瘑鐨勫瓧绗︿覆 + return sb.ToString(); + } + #endregion + + #region 鑾峰彇32浣峬d5鍔犲瘑 + /// <summary> + /// 閫氳繃鍒涘缓鍝堝笇瀛楃涓查�傜敤浜庝换浣� MD5 鍝堝笇鍑芥暟 锛堝湪浠讳綍骞冲彴锛� 涓婂垱寤� 32 涓瓧绗︾殑鍗佸叚杩涘埗鏍煎紡鍝堝笇瀛楃涓� + /// </summary> + /// <param name="source"></param> + /// <returns>32浣峬d5鍔犲瘑瀛楃涓�</returns> + public static string Md5For32(string source) + { + using (MD5 md5Hash = MD5.Create()) + { + byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); + StringBuilder sBuilder = new StringBuilder(); + for (int i = 0; i < data.Length; i++) + { + sBuilder.Append(data[i].ToString("x2")); + } + + string hash = sBuilder.ToString(); + return hash.ToUpper(); + } + } + #endregion + + #region 鑾峰彇16浣峬d5鍔犲瘑 + /// <summary> + /// 鑾峰彇16浣峬d5鍔犲瘑 + /// </summary> + /// <param name="source"></param> + /// <returns>16浣峬d5鍔犲瘑瀛楃涓�</returns> + public static string Md5For16(string source) + { + using (MD5 md5Hash = MD5.Create()) + { + byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); + //杞崲鎴愬瓧绗︿覆锛屽苟鍙�9鍒�25浣� + string sBuilder = BitConverter.ToString(data, 4, 8); + //BitConverter杞崲鍑烘潵鐨勫瓧绗︿覆浼氬湪姣忎釜瀛楃涓棿浜х敓涓�涓垎闅旂锛岄渶瑕佸幓闄ゆ帀 + sBuilder = sBuilder.Replace("-", ""); + return sBuilder.ToUpper(); + } + } + + #endregion + + #region 杩斿洖褰撳墠鐨勬绉掓椂闂存埑 + + /// <summary> + /// 杩斿洖褰撳墠鐨勬绉掓椂闂存埑 + /// </summary> + public static string Msectime() + { + long timeTicks = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; + return timeTicks.ToString(); + } + + + #endregion + + + + #region 鍓╀綑澶氫箙鏃堕棿鏂囧瓧鎻忚堪 + /// <summary> + /// 鍓╀綑澶氫箙鏃堕棿 + /// </summary> + /// <param name="remainingTime"></param> + /// <returns>鏂囧瓧鎻忚堪</returns> + public static string GetRemainingTime(DateTime remainingTime) + { + TimeSpan timeSpan = remainingTime - DateTime.Now; + var day = timeSpan.Days; + var hours = timeSpan.Hours; + var minute = timeSpan.Minutes; + var seconds = timeSpan.Seconds; + if (day > 0) + { + return day + "澶�" + hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�"; + } + else + { + if (hours > 0) + { + return hours + "灏忔椂" + minute + "鍒�" + seconds + "绉�"; + } + else + { + return minute + "鍒�" + seconds + "绉�"; + } + } + } + + #endregion + + #region 鍓╀綑澶氫箙鏃堕棿杩斿洖鏃堕棿绫诲瀷 + /// <summary> + /// 鍓╀綑澶氫箙鏃堕棿 + /// </summary> + /// <param name="remainingTime"></param> + /// <returns>杩斿洖鏃堕棿绫诲瀷</returns> + public static void GetBackTime(DateTime remainingTime, out int day, out int hours, out int minute, out int seconds) + { + TimeSpan timeSpan = remainingTime - DateTime.Now; + day = timeSpan.Days; + hours = timeSpan.Hours; + minute = timeSpan.Minutes; + seconds = timeSpan.Seconds; + } + + #endregion + + #region 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂� + + /// <summary> + /// 璁$畻鏃堕棿鎴冲墿浣欏涔呮椂闂� + /// </summary> + /// <param name="postTime">鎻愪氦鏃堕棿(瑕佹槸浠ュ墠鐨勬椂闂�)</param> + /// <returns></returns> + public static string TimeAgo(DateTime postTime) + { + //褰撳墠鏃堕棿鐨勬椂闂存埑 + var nowtimes = ConvertTicks(DateTime.Now); + //鎻愪氦鐨勬椂闂存埑 + var posttimes = ConvertTicks(postTime); + //鐩稿樊鏃堕棿鎴� + var counttime = nowtimes - posttimes; + + //杩涜鏃堕棿杞崲 + if (counttime <= 60) + { + return "鍒氬垰"; + } + else if (counttime > 60 && counttime <= 120) + { + return "1鍒嗛挓鍓�"; + } + else if (counttime > 120 && counttime <= 180) + { + return "2鍒嗛挓鍓�"; + } + else if (counttime > 180 && counttime < 3600) + { + return Convert.ToInt32(counttime / 60) + "鍒嗛挓鍓�"; + } + else if (counttime >= 3600 && counttime < 3600 * 24) + { + return Convert.ToInt32(counttime / 3600) + "灏忔椂鍓�"; + } + else if (counttime >= 3600 * 24 && counttime < 3600 * 24 * 2) + { + return "鏄ㄥぉ"; + } + else if (counttime >= 3600 * 24 * 2 && counttime < 3600 * 24 * 3) + { + return "鍓嶅ぉ"; + } + else if (counttime >= 3600 * 24 * 3 && counttime <= 3600 * 24 * 7) + { + return Convert.ToInt32(counttime / (3600 * 24)) + "澶╁墠"; + } + else if (counttime >= 3600 * 24 * 7 && counttime <= 3600 * 24 * 30) + { + return Convert.ToInt32(counttime / (3600 * 24 * 7)) + "鍛ㄥ墠"; + } + else if (counttime >= 3600 * 24 * 30 && counttime <= 3600 * 24 * 365) + { + return Convert.ToInt32(counttime / (3600 * 24 * 30)) + "涓湀鍓�"; + } + else if (counttime >= 3600 * 24 * 365) + { + return Convert.ToInt32(counttime / (3600 * 24 * 365)) + "骞村墠"; + } + else + { + return ""; + } + } + + /// <summary> + /// 鏃堕棿杞崲涓虹鐨勬椂闂存埑 + /// </summary> + /// <param name="time"></param> + /// <returns></returns> + private static long ConvertTicks(DateTime time) + { + long currentTicks = time.Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0); + long currentMillis = (currentTicks - dtFrom.Ticks) / 10000000; //杞崲涓虹涓篢icks/10000000锛岃浆鎹负姣Ticks/10000 + return currentMillis; + } + + #endregion + + #region 娓呴櫎HTML涓寚瀹氭牱寮� + /// <summary> + /// 娓呴櫎HTML涓寚瀹氭牱寮� + /// </summary> + /// <param name="content"></param> + /// <param name="rule"></param> + /// <returns></returns> + public static string ClearHtml(string content, string[] rule) + { + if (!rule.Any()) + { + return content; + } + + foreach (var item in rule) + { + content = Regex.Replace(content, "/" + item + @"\s*=\s*\d+\s*/i", ""); + content = Regex.Replace(content, "/" + item + @"\s*=\s*.+?[""]/i", ""); + content = Regex.Replace(content, "/" + item + @"\s*:\s*\d+\s*px\s*;?/i", ""); + } + return content; + } + #endregion + + #region list闅忔満鎺掑簭鏂规硶 + /// <summary> + /// list闅忔満鎺掑簭鏂规硶 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="ListT"></param> + /// <returns></returns> + public static List<T> RandomSortList<T>(List<T> ListT) + { + Random random = new Random(); + List<T> newList = new List<T>(); + foreach (T item in ListT) + { + newList.Insert(random.Next(newList.Count + 1), item); + } + return newList; + } + #endregion + + + + #region 鎴墠鍚庡瓧绗�(涓�) + ///<summary> + /// 鎴墠鍚庡瓧绗�(涓�) + ///</summary> + ///<param name="val">鍘熷瓧绗︿覆</param> + ///<param name="str">瑕佹埅鎺夌殑瀛楃涓�</param> + ///<param name="all">鏄惁璐┆</param> + ///<returns></returns> + public static string GetCaptureInterceptedText(string val, string str, bool all = false) + { + return Regex.Replace(val, @"(^(" + str + ")" + (all ? "*" : "") + "|(" + str + ")" + (all ? "*" : "") + "$)", ""); + } + #endregion + + #region 瀵嗙爜鍔犲瘑鏂规硶 + /// <summary> + /// 瀵嗙爜鍔犲瘑鏂规硶 + /// </summary> + /// <param name="password">瑕佸姞瀵嗙殑瀛楃涓�</param> + /// <param name="createTime">鏃堕棿缁勫悎</param> + /// <returns></returns> + public static string EnPassword(string password, DateTime createTime) + { + var dtStr = createTime.ToString("yyyyMMddHHmmss"); + var md5 = Md5For32(password); + var enPwd = Md5For32(md5 + dtStr); + return enPwd; + } + #endregion + + #region 鑾峰彇鐜板湪鏄槦鏈熷嚑 + /// <summary> + /// 鑾峰彇鐜板湪鏄槦鏈熷嚑 + /// </summary> + /// <returns></returns> + public static string GetWeek() + { + string week = string.Empty; + switch (DateTime.Now.DayOfWeek) + { + case DayOfWeek.Monday: + week = "鍛ㄤ竴"; + break; + case DayOfWeek.Tuesday: + week = "鍛ㄤ簩"; + break; + case DayOfWeek.Wednesday: + week = "鍛ㄤ笁"; + break; + case DayOfWeek.Thursday: + week = "鍛ㄥ洓"; + break; + case DayOfWeek.Friday: + week = "鍛ㄤ簲"; + break; + case DayOfWeek.Saturday: + week = "鍛ㄥ叚"; + break; + case DayOfWeek.Sunday: + week = "鍛ㄦ棩"; + break; + default: + week = "N/A"; + break; + } + return week; + } + + #endregion + + #region UrlEncode (URL缂栫爜) + /// <summary> + /// UrlEncode (URL缂栫爜) + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static string UrlEncode(string str) + { + StringBuilder sb = new StringBuilder(); + byte[] byStr = Encoding.UTF8.GetBytes(str); //榛樿鏄疭ystem.Text.Encoding.Default.GetBytes(str) + for (int i = 0; i < byStr.Length; i++) + { + sb.Append(@"%" + Convert.ToString(byStr[i], 16)); + } + + return sb.ToString(); + } + + #endregion + + #region 鑾峰彇10浣嶆椂闂存埑 + /// <summary> + /// 鑾峰彇10浣嶆椂闂存埑 + /// </summary> + /// <returns></returns> + public static long GetTimeStampByTotalSeconds() + { + TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalSeconds); + } + #endregion + + #region 鑾峰彇13浣嶆椂闂存埑 + /// <summary> + /// 鑾峰彇13浣嶆椂闂存埑 + /// </summary> + /// <returns></returns> + public static long GetTimeStampByTotalMilliseconds() + { + TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalMilliseconds); + } + + /// <summary> + /// 鑾峰彇鏃堕棿鎴� + /// </summary> + /// <param name="dt"></param> + /// <returns></returns> + public static int GetDateTimeStamp(DateTime dt) + { + DateTime dateStart = new DateTime(1970, 1, 1, 0, 0, 0); + int timeStamp = Convert.ToInt32((dt.ToUniversalTime() - dateStart).TotalSeconds); + return timeStamp; + } + + #endregion + + #region 鑾峰彇闅忔満瀛楃涓� + /// <summary> + /// 鑾峰彇闅忔満瀛楃涓� + /// </summary> + /// <returns></returns> + public static string GetSerialNumber() + { + var str = string.Empty; + Random rand = new Random(); + var charsStr2 = new[] { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; + var charsLen2 = charsStr2.Length - 1; + // shuffle($chars); + str = ""; + for (int i = 0; i < 16; i++) + { + str += charsStr2[rand.Next(0, charsLen2)]; + } + return str; + } + + #endregion + + #region Sha1绛惧悕 + /// <summary> + /// Sha1绛惧悕 + /// </summary> + /// <param name="str">鍐呭</param> + /// <param name="encoding">缂栫爜</param> + /// <returns></returns> + public static string Sha1Signature(string str, Encoding encoding = null) + { + if (encoding == null) encoding = Encoding.UTF8; + var buffer = encoding.GetBytes(str); + var data = SHA1.Create().ComputeHash(buffer); + StringBuilder sub = new StringBuilder(); + foreach (var t in data) + { + sub.Append(t.ToString("x2")); + } + + return sub.ToString(); + } + #endregion + + /// <summary> + /// 绮剧‘璁$畻base64瀛楃涓叉枃浠跺ぇ灏忥紙鍗曚綅锛欱锛� + /// param base64String + /// return double 瀛楄妭澶у皬 + /// </summary> + /// <param name="base64String"></param> + /// <returns></returns> + public static double Base64FileSize(string base64String) + { + //妫�娴嬫槸鍚﹀惈鏈塨ase64,鏂囦欢澶�) + if (base64String.LastIndexOf(",", StringComparison.Ordinal) > -1) + { + base64String = base64String[(base64String.LastIndexOf(",", StringComparison.Ordinal) + 1)..]; + } + //鑾峰彇base64瀛楃涓查暱搴�(涓嶅惈data:audio/wav;base64,鏂囦欢澶�) + var size0 = base64String.Length; + if (size0 <= 10) return size0 - (double)size0 / 8 * 2; + //鑾峰彇瀛楃涓茬殑灏惧反鐨勬渶鍚�10涓瓧绗︼紝鐢ㄤ簬鍒ゆ柇灏惧反鏄惁鏈夌瓑鍙凤紝姝e父鐢熸垚鐨刡ase64鏂囦欢'绛夊彿'涓嶄細瓒呰繃4涓� + var tail = base64String[(size0 - 10)..]; + //鎵惧埌绛夊彿锛屾妸绛夊彿涔熷幓鎺�,(绛夊彿鍏跺疄鏄┖鐨勬剰鎬�,涓嶈兘绠楀湪鏂囦欢澶у皬閲岄潰) + int equalIndex = tail.IndexOf("=", StringComparison.Ordinal); + if (equalIndex > 0) + { + size0 = size0 - (10 - equalIndex); + } + //璁$畻鍚庡緱鍒扮殑鏂囦欢娴佸ぇ灏忥紝鍗曚綅涓哄瓧鑺� + return size0 - (double)size0 / 8 * 2; + } + + /// <summary> + /// 鍒ゆ柇鏂囦欢澶у皬 + /// </summary> + /// <param name="base64"></param> + /// <param name="size"></param> + /// <param name="unit"></param> + /// <returns></returns> + public static bool CheckBase64Size(string base64, int size, string unit = "M") + { + // 涓婁紶鏂囦欢鐨勫ぇ灏�, 鍗曚綅涓哄瓧鑺�. + var len = Base64FileSize(base64); + // 鍑嗗鎺ユ敹鎹㈢畻鍚庢枃浠跺ぇ灏忕殑瀹瑰櫒 + double fileSize = unit.ToUpperInvariant() switch + { + "B" => len, + "K" => (double)len / 1024, + "M" => (double)len / 1048576, + "G" => (double)len / 1073741824, + _ => 0 + }; + // 濡傛灉涓婁紶鏂囦欢澶т簬闄愬畾鐨勫閲� + return !(fileSize > size); + } + + /// <summary> + /// 10浣嶆椂闂存埑 杞寲 + /// </summary> + /// <param name="time"></param> + /// <returns></returns> + public static long ConvertDateTimeToInt(DateTime time) + { + DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)); + long t = (time.Ticks - startTime.Ticks) / 10000000; //闄�10000000璋冩暣涓�10浣� + return t; + } + + #region 鍙嶅皠鐩稿叧 + private static List<Assembly>? _allAssemblies = null; + /// <summary> + /// 鑾峰彇鎵�鏈夌▼搴忕洰褰曚笅鍜屽父鐢ㄧ殑绋嬪簭闆� 鍖呮嫭涓�浜涚郴缁熷紩鐢ㄧ▼搴忛泦 + /// </summary> + /// <returns> 褰撳墠宸ョ▼涓嬬殑绋嬪簭闆�</returns> + public static List<Assembly> GetAllAssembly() + { + + + if (_allAssemblies == null) + { + _allAssemblies = new List<Assembly>(); + string? path = null; + string singlefile = null; + try + { + path = Assembly.GetEntryAssembly()?.Location; + } + catch { } + if (string.IsNullOrEmpty(path)) + { + singlefile = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; + path = Path.GetDirectoryName(singlefile); + } + if (string.IsNullOrEmpty(path)) + + throw new Exception("鑾峰彇绋嬪簭鐩綍鍑洪敊"); + var dir = new DirectoryInfo(Path.GetDirectoryName(path) ?? ""); + + var dlls = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly); + string[] systemdll = new string[] + { + "Microsoft.", + "System.", + "Swashbuckle.", + "ICSharpCode", + "Newtonsoft.", + "Oracle.", + "Pomelo.", + "SQLitePCLRaw.", + "Aliyun.OSS", + "BouncyCastle.", + "FreeSql.", + "Google.Protobuf.dll", + "Humanizer.dll", + "IdleBus.dll", + "K4os.", + "MySql.Data.", + "Npgsql.", + "NPOI.", + "netstandard", + "MySqlConnector", + "VueCliMiddleware" + }; + + var filtered = dlls.Where(x => systemdll.Any(y => x.Name.StartsWith(y)) == false); + foreach (var dll in filtered) + { + try + { + AssemblyLoadContext.Default.LoadFromAssemblyPath(dll.FullName); + } + catch + { + } + } + var dlllist = AssemblyLoadContext.Default.Assemblies.Where(x => systemdll.Any(y => x.FullName.StartsWith(y)) == false).ToList(); + _allAssemblies.AddRange(dlllist); + } + return _allAssemblies; + } + #endregion + + #region 鏋氫妇鑾峰彇鎵�鏈夐」 + /// <summary> + /// 鑾峰彇鏋氫妇鐨勬墍鏈夐」 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public static List<MenmItem> GetEnumItemsWithAttributes<T>() where T : Enum + { + var result = new List<MenmItem>(); + + foreach (var value in Enum.GetValues(typeof(T))) + { + var member = typeof(T).GetMember(value.ToString())[0]; + var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>(); + + var item = new MenmItem + { + Key = value.ToString(), + Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓� + Description = descriptionAttribute?.Description ?? string.Empty + }; + + result.Add(item); + } + + return result; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鎵�鏈夌殑椤癸紝杩斿洖鍚嶇О 鍊� 鍜孌escription 鎻忚堪 + /// </summary> + /// <param name="enumType"></param> + /// <returns></returns> + /// <exception cref="ArgumentException"></exception> + public static List<MenmItem> EnumerateWithDescriptions(Type enumType) + { + if (!enumType.IsEnum) + { + throw new ArgumentException(" 杩欎笉鏄灇涓�"); + } + + var result = new List<MenmItem>(); + + foreach (var value in Enum.GetValues(enumType)) + { + var member = enumType.GetMember(value.ToString())[0]; + var descriptionAttribute = member.GetCustomAttribute<DescriptionAttribute>(); + + var item = new MenmItem + { + Key = value.ToString(), + Value = (int)value, // 鎴栬�呯洿鎺ヤ娇鐢� value.ToString() 濡傛灉涓嶉渶瑕佽浆鎹负鏁存暟瀛楃涓� + Description = descriptionAttribute?.Description ?? string.Empty + }; + + result.Add(item); + } + + return result; + } + /// <summary> + /// 鏄惁鏄郴缁熺被鍨� + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public static bool IsCustomType(Type type) + { + // 瀹氫箟涓�涓垨澶氫釜鍩虹鍛藉悕绌洪棿鍒楄〃锛岃繖浜涘懡鍚嶇┖闂翠笅鐨勭被鍨嬮�氬父璁や负鏄郴缁熺被鍨� + string[] frameworkNamespaces = { "System", "Microsoft", "mscorlib", "netstandard", "System.Private.CoreLib" }; + + // 鑾峰彇绫诲瀷鎵�鍦ㄧ殑鍛藉悕绌洪棿 + string typeNameSpace = type.Namespace; + + // 妫�鏌ヨ鍛藉悕绌洪棿鏄惁鍦ㄥ熀纭�鍛藉悕绌洪棿鍒楄〃涓紝濡傛灉涓嶅湪锛屽垯璁や负鏄嚜瀹氫箟绫诲瀷 + return frameworkNamespaces.Any(n => typeNameSpace.StartsWith(n, StringComparison.OrdinalIgnoreCase)); + } + + + #endregion + + /// <summary> + /// 鏍规嵁json瀛楃绌垮鐞� + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="jsonString"></param> + /// <param name="parameter"></param> + /// <returns></returns> + private static Expression<Func<T, bool>> CreateWhereExpressionRecursive<T>(string jsonString, ParameterExpression parameter) + { + var conditions = new List<Expression>(); + + JObject jsonObject = JObject.Parse(jsonString); + + foreach (var property in jsonObject.Properties()) + { + var propertyName = property.Name; + var propertyValue = property.Value.ToString(); + if (propertyValue == "") //绌哄�间笉澶勭悊 + continue; + var propertyInfo = typeof(T).GetProperty(propertyName); + + if (propertyInfo == null) + { + propertyInfo = typeof(T).GetProperty(propertyName.FirstToCapitalize()); + if (propertyInfo == null) + continue; // 濡傛灉灞炴�т笉瀛樺湪锛岃烦杩� + } + + var propertyType = propertyInfo.PropertyType; + var TypeName = propertyType.GenericTypeArguments.Length > 0 ? propertyType.GenericTypeArguments[0].Name + "?" : propertyType.Name; + if (propertyType.IsClass && TypeName != "String") + { + // 閫掑綊澶勭悊宓屽妯″瀷 + var nestedParameter = Expression.Parameter(propertyType, propertyName); + var nestedJsonString = property.Value.ToString(); + + // 浣跨敤 MakeGenericType 鍔ㄦ�佸垱寤烘硾鍨嬫柟娉� + var genericMethod = typeof(CommonHelper).GetMethod("CreateWhereExpressionRecursive", BindingFlags.Static | BindingFlags.NonPublic) + .MakeGenericMethod(propertyType); + + // 璋冪敤娉涘瀷鏂规硶骞惰幏鍙栬繑鍥炵殑琛ㄨ揪寮� + var nestedConditions = (Expression<Func<object, bool>>)genericMethod.Invoke(null, new object[] { nestedJsonString, nestedParameter }); + + var propExpr = Expression.Property(parameter, propertyName); + var lambda = Expression.Lambda(nestedConditions.Body, nestedParameter); + var invoke = Expression.Invoke(lambda, propExpr); + conditions.Add(invoke); + } + else if (propertyType == typeof(string)) + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(propertyValue); + + var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); + var containsExpression = Expression.Call(propExpr, containsMethod, constant); + conditions.Add(containsExpression); + } + else if (TypeName.Contains( "DateTime")) //鍏煎DateTime锛� + { + var dateRange = propertyValue.Split('~'); + if (dateRange.Length == 2) + { + var startDate = DateTime.Parse(dateRange[0]); + var endDate = DateTime.Parse(dateRange[1]); + + var propExpr = Expression.Property(parameter, propertyName); + var startConstant = Expression.Constant(startDate); + var endConstant = Expression.Constant(endDate); + if (TypeName == "DateTime?") + // 灏嗗父閲忚〃杈惧紡杞崲涓� Nullable<DateTime> + { + var startNullableConstant = Expression.Convert(startConstant, typeof(DateTime?)); + var endNullableConstant = Expression.Convert(endConstant, typeof(DateTime?)); + + + var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startNullableConstant); + var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endNullableConstant); + + + var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual); + conditions.Add(andExpression); + } + else + { + + var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startConstant); + var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endConstant); + + + var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual); + conditions.Add(andExpression); + + } + } + else if (DateTime.TryParse(propertyValue, out var dateTime)) + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(dateTime); + var equalExpression = Expression.Equal(propExpr, constant); + conditions.Add(equalExpression); + } + } + else + { + var propExpr = Expression.Property(parameter, propertyName); + var constant = Expression.Constant(Convert.ChangeType(propertyValue, propertyType)); + var equalExpression = Expression.Equal(propExpr, constant); + conditions.Add(equalExpression); + } + } + + var body = conditions.Count > 1 ? conditions.Aggregate(Expression.AndAlso) : conditions.FirstOrDefault(); + return Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(true), parameter); + } + + /// <summary> + /// json鏍煎紡鍖栦负琛ㄨ揪寮忔爲 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="jsonString"></param> + /// <returns></returns> + public static Expression<Func<T, bool>> FormatWhereExpression<T>(string jsonString) + { + var parameter = Expression.Parameter(typeof(T), "x"); + return CreateWhereExpressionRecursive<T>(jsonString, parameter); + } + + /// <summary> + /// 鏇村叿灞炴�у悕绉扮敓鎴愯〃杈惧紡鏍戯紝濡倄.id + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="propertyName"></param> + /// <returns></returns> + public static Expression<Func<T, object>> FormatPropertyExpression<T>(string propertyName) + { + // 鑾峰彇鍙傛暟琛ㄨ揪寮� + var parameter = Expression.Parameter(typeof(T), "x"); + + // 鑾峰彇灞炴�ц〃杈惧紡 + var propertyAccess = Expression.PropertyOrField(parameter, propertyName); + if (propertyAccess == null) + { + ///棣栧瓧姣嶈浆澶у啓 + propertyAccess = Expression.PropertyOrField(parameter, propertyName.FirstToCapitalize()); + } + + + // 鍒涘缓 Lambda 琛ㄨ揪寮忥紝骞跺湪杩斿洖鍊间腑杩涜绫诲瀷杞崲 + return Expression.Lambda<Func<T, object>>( + Expression.Convert(propertyAccess, typeof(object)), + parameter); + } + + + } + + + + + + /// <summary> + /// 鏋氫妇椤瑰睘鎬� + /// </summary> + [Description("鏋氫妇椤瑰睘鎬�")] + public class MenmItem + { + /// <summary> + /// 鏋氫妇key + /// </summary> + [Description("鏋氫妇key")] + public string? Key { get; set; } + /// <summary> + /// 鏋氫妇鍊� + /// </summary> + [Description("鏋氫妇鍊�")] + public int Value { get; set; } + /// <summary> + /// 鏋氫妇鎻忚堪 + /// </summary> + [Description("鏋氫妇椤瑰睘鎬�")] + public string? Description { get; set; } + } + + + + + +} diff --git a/Admin.NET/cylsg.utility/Extend/EmunEx.cs b/Admin.NET/cylsg.utility/Extend/EmunEx.cs new file mode 100644 index 0000000..6f2d96c --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/EmunEx.cs @@ -0,0 +1,15 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 鏋氫妇鎵╁睍 + /// </summary> + public static class EmunEx + { + } +} diff --git a/Admin.NET/cylsg.utility/Extend/StringEx.cs b/Admin.NET/cylsg.utility/Extend/StringEx.cs new file mode 100644 index 0000000..095dbcc --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/StringEx.cs @@ -0,0 +1,251 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 瀛楃涓叉墿灞� + /// </summary> + public static class StringEx + { + /// <summary> + /// 棣栧瓧姣嶅皬鍐� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static string FirstToLower(this string self) + { + string str1 = self?.Substring(0, 1).ToLower() ?? ""; + string str2 = self?.Substring(1) ?? ""; + + //棣栧瓧姣嶈浆灏忓啓 + return str1 + str2; + } + /// <summary> + /// 甯︽湁xxx.xxx缁撴潫鐨勭殑鎵�鏈夊瓧绗︿覆 鐨勫悗闈xx.xxx + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + public static string GetFileName(this string strtypr) + { + return Path.GetFileName(strtypr); + } + /// <summary> + /// 鏄惁鏄暟瀛楀簭鍒� + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static bool isPureNum(this string strtypr) + { + if (strtypr.Length == 0 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌� + { + return false; + } + byte[] strBytes = Encoding.ASCII.GetBytes(strtypr);//鑾峰彇瀛楃涓茬殑byte绫诲瀷鐨勫瓧绗︽暟缁勶紝缂栫爜鏂瑰紡ASCII + foreach (byte strByte in strBytes) + { + if (strByte < 48 || strByte > 57) //鍒ゆ柇姣忎釜瀛楃鏄惁涓烘暟瀛楋紝鏍规嵁姣忎釜瀛楃鐨凙SCII鍊兼墍鍦ㄨ寖鍥村垽鏂� + { + return false; //涓嶆槸锛屽氨杩斿洖false + } + } + return true; //鏄紝灏辫繑鍥瀟rue + } + + /// <summary> + /// 鏄惁鏄暟瀛楀簭鍒� + /// </summary> + /// <param name="str"></param> + /// <returns></returns> + public static bool isGuid(this string strtypr) + { + if (strtypr.Length < 20 || strtypr == null)//楠岃瘉杩欎釜瀛楃涓叉槸鍚︿负绌� + { + return false; + } + try + { + new Guid(strtypr); + return true; + + } + catch (Exception) + { + + return false; + } + } + + /// <summary> + /// 瀛楃涓� + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> + public static int toInt(this string strtypr) + { + if (!strtypr.isPureNum()) + throw new Exception("骞堕潪瀹屾暣鐨勬暟瀛楀簭鍒�"); + return int.Parse(strtypr); + } + + /// <summary> + /// 绉婚櫎绗竴涓瓧绗︿覆涓烘寚瀹氬瓧绗︿覆鐨� 濡� 鈥渁xtXXXXX" 濡傛灉浠�"axt"寮�澶寸殑瀛楃涓诧紝灏辩Щ闄�"axt" 娌℃湁鍒欎笉鍙� + /// </summary> + /// <param name="strtypr"></param> + /// <param name="str">寮�濮嬪瓧绗�</param> + /// <returns></returns> + public static string RemoveStartWithStr(this string strtypr, string str) + { + string strret = strtypr; + if (strtypr.StartsWith(str)) + { + strret = strtypr.Remove(0, str.Length); + } + return strret; + + } + + /// <summary> + /// 瀵瑰瓧绗︿覆杩涜闅愮澶勭悊锛屾瘮濡備腑闂寸殑鐢�*鏄剧ず + /// </summary> + /// <param name="strtypr"></param> + /// <returns></returns> + public static string PrivacyStr(this string strtypr) + { + // 濡傛灉鏄墜鏈哄彿鐮侊紝浠呬繚鐣欏墠3浣嶅拰鍚�4浣嶏紝涓棿鐢ㄦ槦鍙锋浛鎹� + if (Regex.IsMatch(strtypr, @"^1[3-9]\d{9}$")) + { + return $"{strtypr.Substring(0, 3)}****{strtypr.Substring(7)}"; + } + + // 瀵逛簬涓枃鍚嶅瓧鎴栬�呴潪鎵嬫満鍙锋牸寮忥紝浠呬繚鐣欓灏惧悇1涓瓧绗︼紝涓棿鐢ㄦ槦鍙锋浛鎹� + else + { + if (strtypr.Length <= 2) return $"{strtypr.Substring(0, 1)}*"; // 闀垮害灏忎簬绛変簬2鏃讹紝杩斿洖鍥哄畾鐨勬槦鍙� + + var masked = $"{strtypr.Substring(0, 1)}*{strtypr.Substring(strtypr.Length - 1, 1)}"; + return masked; + } + } + + + #region 鏃堕棿鍖洪棿瀛楃涓茶浆鍏跺疄鍜岀粨鏉熸椂闂� + /// <summary> + /// 瑙f瀽鏃堕棿鍖洪棿瀛楃涓� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static (DateTime? StartDate, DateTime? EndDate) TryParseDateRangString(this string input) + { + DateTime startDate, endDate; + var culture = CultureInfo.InvariantCulture; + + // 灏濊瘯瑙f瀽绗竴绉嶆牸寮� "2023-01-012023-01-31" + if (DateTime.TryParseExact(input.Substring(0, 10), "yyyy-MM-dd", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(10), "yyyy-MM-dd", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + + // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01 08:02:032023-01-31 08:02:03" + if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(19), "yyyy-MM-dd HH:mm:ss", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + + // 灏濊瘯瑙f瀽绗簩绉嶆牸寮� "2023-01-01T08:02:032023-01-31T08:02:03" + if (DateTime.TryParseExact(input.Substring(0, 19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out startDate) && + DateTime.TryParseExact(input.Substring(19), "yyyy-MM-ddTHH:mm:ss", culture, DateTimeStyles.None, out endDate)) + { + return (startDate, endDate); + } + // 濡傛灉閮戒笉鏄紝杩斿洖null + return (null, null); + } + + /// <summary> + /// 绉婚櫎鏈�鍚庝竴涓瓧绗︾殑?鍙� + /// </summary> + /// <param name="input"> </param> + /// /// <param name="inChar">瀛楃</param> + /// <returns></returns> + public static string RemoveCharIfPresent(this string input, char inChar) + { + if (string.IsNullOrEmpty(input)) return input; + + // 妫�鏌ュ瓧绗︿覆鐨勬渶鍚庝竴涓瓧绗︽槸鍚︿负闂彿 + if (input[^1] == '?') + { + // 浣跨敤鍒囩墖鎿嶄綔绗﹀垱寤轰笉鍖呭惈闂彿鐨勬柊瀛楃涓� + return input[..^1]; + } + else + { + // 瀛楃涓蹭笉浠ラ棶鍙风粨灏撅紝杩斿洖鍘熷瓧绗︿覆 + return input; + } + } + + /// <summary> + /// 绉婚櫎鏈�鍚庣殑瀛楃涓� + /// </summary> + /// <param name="input"></param> + /// <param name="endString"></param> + /// <returns></returns> + public static string RemoveEndStringIfExists(this string input, string endString) + { + if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(endString)) + { + return input; // 濡傛灉杈撳叆瀛楃涓叉垨缁撴潫瀛楃涓蹭负绌烘垨null锛岀洿鎺ヨ繑鍥炲師瀛楃涓� + } + + if (input.EndsWith(endString)) + { + return input.Substring(0, input.Length - endString.Length); // 绉婚櫎缁撴潫瀛楃涓� + } + + return input; // 濡傛灉涓嶄互鎸囧畾瀛楃涓茬粨鏉燂紝杩斿洖鍘熷瓧绗︿覆 + } + + + /// <summary> + /// 棣栧瓧姣嶈浆灏忓啓 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static string FirstCharToLower(this string input) + { + if (string.IsNullOrEmpty(input)) + { + return input; + } + + // 浣跨敤姝e垯琛ㄨ揪寮� + return Regex.Replace(input, @"^\p{Lu}", match => match.Value.ToLower()); + } + #endregion + + /// <summary> + /// 棣栧瓧姣嶈浆澶у啓 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public static string FirstToCapitalize(this string input) + { + if (string.IsNullOrEmpty(input)) + { + return input; + } + + TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; + return textInfo.ToTitleCase(input.ToLower()).Substring(0, 1) + input.Substring(1); + } + } +} diff --git a/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs new file mode 100644 index 0000000..0fe86f8 --- /dev/null +++ b/Admin.NET/cylsg.utility/Extend/TypeAndExpressionEx.cs @@ -0,0 +1,1021 @@ +锘縰sing System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using cylsg.utility.Extend; +using Microsoft.Extensions.Primitives; + +namespace cylsg.utility.Extend +{ + /// <summary> + /// 鍙嶅皠鎵╁睍鍑芥暟 + /// </summary> + public static class TypeAndExpressionEx + { + #region 灞炴�ф墿灞� 鍙嶅皠 + public static Func<object, object> GetPropertyExpression(Type objtype, string property) + { + property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty); + List<string> level = new List<string>(); + if (property.Contains('.')) + { + level.AddRange(property.Split('.')); + } + else + { + level.Add(property); + } + + var pe = Expression.Parameter(objtype); +#pragma warning disable 8604 + var member = Expression.Property(pe, objtype.GetSingleProperty(level[0])); + for (int i = 1; i < level.Count; i++) + { + member = Expression.Property(member, member.Type.GetSingleProperty(level[i])); + } + return Expression.Lambda<Func<object, object>>(member, pe).Compile(); + } + + /// <summary> + /// 鑾峰彇灞炴�у悕 + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <param name="getAll">鏄惁鑾峰彇鍏ㄩ儴绾у埆鍚嶇О锛屾瘮濡俛.b.c</param> + /// <returns>灞炴�у悕</returns> + public static string GetPropertyName(this Expression expression, bool getAll = true) + { + if (expression == null) + { + return ""; + } + MemberExpression me = null; + LambdaExpression le = null; + if (expression is MemberExpression) + { + me = expression as MemberExpression; + } + if (expression is LambdaExpression) + { + le = expression as LambdaExpression; + if (le.Body is MemberExpression) + { + me = le.Body as MemberExpression; + } + if (le.Body is UnaryExpression) + { + me = (le.Body as UnaryExpression).Operand as MemberExpression; + } + } + string rv = ""; + if (me != null) + { + rv = me.Member.Name; + } + while (me != null && getAll && me.NodeType == ExpressionType.MemberAccess) + { + Expression exp = me.Expression; + if (exp is MemberExpression) + { + rv = (exp as MemberExpression).Member.Name + "." + rv; + me = exp as MemberExpression; + } + else if (exp is MethodCallExpression) + { + var mexp = exp as MethodCallExpression; + if (mexp.Method.Name == "get_Item") + { + object index = 0; + if (mexp.Arguments[0] is MemberExpression) + { + var obj = ((mexp.Arguments[0] as MemberExpression).Expression as ConstantExpression).Value; + index = obj.GetType().GetField((mexp.Arguments[0] as MemberExpression).Member.Name).GetValue(obj); + } + else + { + index = (mexp.Arguments[0] as ConstantExpression).Value; + } + rv = (mexp.Object as MemberExpression).Member.Name + "[" + index + "]." + rv; + me = mexp.Object as MemberExpression; + } + } + else + { + break; + } + } + return rv; + } + + public static Expression GetMemberExp(this ParameterExpression self, Expression member) + { + return self.GetMemberExp(member.GetPropertyName()); + } + + public static Expression GetMemberExp(this ParameterExpression self, string memberName) + { + var names = memberName.Split(','); + Expression rv = Expression.PropertyOrField(self, names[0]); ; + for (int i = 1; i < names.Length; i++) + { + rv = Expression.PropertyOrField(rv, names[i]); + } + return rv; + } + + + + /// <summary> + /// 鑾峰彇姝e垯琛ㄨ揪寮忛敊璇� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>閿欒鏂囨湰</returns> + public static string GetRegexErrorMessage(this MemberInfo pi) + { + string rv = ""; + + if (pi.GetCustomAttributes(typeof(RegularExpressionAttribute), false).FirstOrDefault() is RegularExpressionAttribute dis && !string.IsNullOrEmpty(dis.ErrorMessage)) + { + rv = dis.ErrorMessage; + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = ""; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�ф樉绀哄悕绉� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>灞炴�у悕绉�</returns> + public static string GetPropertyDisplayName(this MemberInfo pi) + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() is DisplayAttribute dis && !string.IsNullOrEmpty(dis.Name)) + { + rv = dis.Name; + + } + else + { + rv = pi.Name; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�ф樉绀哄悕绉� + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <returns>灞炴�ф樉绀哄悕绉�</returns> + public static string GetPropertyDisplayName(this Expression expression) + { + return expression.GetPropertyInfo().GetPropertyDisplayName(); + } + /// <summary> + /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉� + /// </summary> + /// <param name="pi"></param> + /// <returns></returns> + public static string GetPropertyDescription(this MemberInfo pi) + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() is DescriptionAttribute dis && !string.IsNullOrEmpty(dis.Description)) + { + rv = dis.Description; + + } + else + { + rv = pi.Name; + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�х殑 Description 鏍囨敞鍚嶏紝濡傛灉娌℃湁锛屽垯杩斿洖 灞炴�у悕绉� + /// </summary> + /// <param name="expression"></param> + /// <returns></returns> + public static string GetPropertyDescription(this Expression expression) + { + return expression.GetPropertyInfo().GetPropertyDisplayName(); + } + /// <summary> + /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О + /// </summary> + /// <param name="value">鏋氫妇鍊�</param> + /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns> + public static string? GetEnumDisplayName(this Enum value) + { + return GetEnumDisplayName(value.GetType(), value.ToString()); + } + + /// <summary> + /// 鑾峰彇灞炴�т俊鎭� + /// </summary> + /// <param name="expression">灞炴�ц〃杈惧紡</param> + /// <returns>灞炴�т俊鎭�</returns> + public static PropertyInfo? GetPropertyInfo(this Expression expression) + { + MemberExpression me = null; + LambdaExpression le = null; + if (expression is MemberExpression) + { + me = expression as MemberExpression; + } + if (expression is LambdaExpression) + { + le = expression as LambdaExpression; + if (le.Body is MemberExpression) + { + me = le.Body as MemberExpression; + } + if (le.Body is UnaryExpression) + { + me = (le.Body as UnaryExpression).Operand as MemberExpression; + } + } + PropertyInfo rv = null; + if (me != null) + { + rv = me.Member.DeclaringType.GetSingleProperty(me.Member.Name); + } + return rv; + } + + /// <summary> + /// 鑾峰彇灞炴�у�� + /// </summary> + /// <param name="exp">灞炴�ц〃杈惧紡</param> + /// <param name="obj">灞炴�ф墍鍦ㄥ疄渚�</param> + /// <returns>灞炴�у��</returns> + public static object? GetPropertyValue(this object obj, LambdaExpression exp) + { + //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿 + try + { + var expValue = exp.Compile().DynamicInvoke(obj); + object val = expValue; + return val; + } + catch + { + return ""; + } + } + /// <summary> + /// 鑾峰彇灞炴�у�� + /// </summary> + /// <param name="obj"></param> + /// <param name="property"></param> + /// <returns></returns> + public static object? GetPropertyValue(this object obj, string property) + { + //鑾峰彇琛ㄨ揪寮忕殑鍊硷紝骞惰繃婊ゅ崟寮曞彿 + try + { + return obj.GetType().GetSingleProperty(property).GetValue(obj); + } + catch + { + return null; + } + } + + + public static List<string>? GetPropertySiblingValues(this object obj, string propertyName) + { + if (obj == null) + { + return new List<string>(); + } + Regex reg = new Regex("(.*?)\\[\\-?\\d?\\]\\.(.*?)$"); + var match = reg.Match(propertyName); + if (match.Success) + { + var name1 = match.Groups[1].Value; + var name2 = match.Groups[2].Value; + + var levels = name1.Split('.'); + var objtype = obj.GetType(); + var pe = Expression.Parameter(objtype); + var member = Expression.Property(pe, objtype.GetSingleProperty(levels[0])); + for (int i = 1; i < levels.Length; i++) + { + member = Expression.Property(member, member.Type.GetSingleProperty(levels[i])); + } + var pe2 = Expression.Parameter(member.Type.GetGenericArguments()[0]); + var cast = Expression.Call(typeof(Enumerable), "Cast", new Type[] { pe2.Type }, member); + + var name2exp = Expression.Property(pe2, pe2.Type.GetSingleProperty(name2)); + var selectexp = Expression.Call(name2exp, "ToString", Type.EmptyTypes); + + Expression select = Expression.Call( + typeof(Enumerable), + "Select", + new Type[] { pe2.Type, typeof(string) }, + cast, + Expression.Lambda(selectexp, pe2)); + + + var lambda = Expression.Lambda(select, pe); + var rv = new List<string>(); + try + { + rv = (lambda.Compile().DynamicInvoke(obj) as IEnumerable<string>)?.ToList(); + } + catch { } + return rv; + } + else + { + return new List<string>(); + } + } + + /// <summary> + /// 鍒ゆ柇灞炴�ф槸鍚﹀繀濉� + /// </summary> + /// <param name="pi">灞炴�т俊鎭�</param> + /// <returns>鏄惁蹇呭~</returns> + public static bool IsPropertyRequired(this MemberInfo pi) + { + bool isRequired = false; + if (pi != null) + { + //濡傛灉闇�瑕佹樉绀烘槦鍙凤紝鍒欏垽鏂槸鍚︽槸蹇呭~椤癸紝濡傛灉鏄繀濉垯鍦ㄥ唴瀹瑰悗闈㈠姞涓婃槦鍙� + //鎵�鏈塱nt锛宖loat銆傘�傘�傝繖绉峆rimitive绫诲瀷鐨勶紝鑲畾閮芥槸蹇呭~ + Type t = pi.GetMemberType(); + if (t != null && (t.IsPrimitive() || t.IsEnum() || t == typeof(decimal) || t == typeof(Guid))) + { + isRequired = true; + } + else + { + //瀵逛簬鍏朵粬绫伙紝妫�鏌ユ槸鍚︽湁RequiredAttribute锛屽鏋滄湁灏辨槸蹇呭~ + if (pi.GetCustomAttributes(typeof(RequiredAttribute), false).FirstOrDefault() is RequiredAttribute required && required.AllowEmptyStrings == false) + { + isRequired = true; + } + else if (pi.GetCustomAttributes(typeof(KeyAttribute), false).FirstOrDefault() != null) + { + isRequired = true; + } + } + } + return isRequired; + } + + /// <summary> + /// 璁剧疆灞炴�у�� + /// </summary> + /// <param name="source">灞炴�ф墍鍦ㄥ疄渚�</param> + /// <param name="property">灞炴�у悕</param> + /// <param name="value">瑕佽祴鐨勫��</param> + /// <param name="prefix">灞炴�у墠缂�</param> + /// <param name="stringBasedValue">鏄惁涓哄瓧绗︿覆鏍煎紡鐨勫��</param> + public static void SetPropertyValue(this object source, string property, object value, string? prefix = null, bool stringBasedValue = false) + { + try + { + property = Regex.Replace(property, @"\[[^\]]*\]", string.Empty); + List<string> level = new List<string>(); + if (property.Contains('.')) + { + level.AddRange(property.Split('.')); + } + else + { + level.Add(property); + } + + if (!string.IsNullOrWhiteSpace(prefix)) + { + level.Insert(0, prefix); + } + object temp = source; + Type tempType = source.GetType(); + for (int i = 0; i < level.Count - 1; i++) + { + var member = tempType.GetMember(level[i])[0]; + if (member != null) + { + var va = member.GetMemberValue(temp); + if (va != null) + { + temp = va; + } + else + { + var newInstance = member.GetMemberType().GetConstructor(Type.EmptyTypes).Invoke(null); + member.SetMemberValue(temp, newInstance, null); + temp = newInstance; + } + tempType = member.GetMemberType(); + + } + } + + var memberInfos = tempType.GetMember(level.Last()); + if (!memberInfos.Any()) + { + return; + } + var fproperty = memberInfos[0]; + if (value == null || value is StringValues s && StringValues.IsNullOrEmpty(s)) + { + fproperty.SetMemberValue(temp, null, null); + return; + } + + bool isArray = false; + if (value != null && value.GetType().IsArray == true) + { + isArray = true; + } + + if (stringBasedValue == true) + { + Type propertyType = fproperty.GetMemberType(); + if (propertyType.IsGeneric(typeof(List<>)) == true) + { + var list = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null) as IList; + + var gs = propertyType.GenericTypeArguments; + try + { + if (value.GetType() == typeof(StringValues)) + { + var strVals = (StringValues)value; + var a = strVals.ToArray(); + for (int i = 0; i < a.Length; i++) + { + list.Add(a[i].ConvertValue(gs[0])); + } + } + else if (isArray) + { + var a = value as object[]; + for (int i = 0; i < a.Length; i++) + { + list.Add(a[i].ConvertValue(gs[0])); + } + } + else + { + list = value.ConvertValue(propertyType) as IList; + } + } + catch { } + fproperty.SetMemberValue(temp, list, null); + } + else if (propertyType.IsArray) + { + try + { + var strVals = (StringValues)value; + var eletype = propertyType.GetElementType(); + if (eletype != null) + { + var arr = Array.CreateInstance(eletype, strVals.Count); + for (int i = 0; i < arr.Length; i++) + { + arr.SetValue(strVals[i].ConvertValue(eletype), i); + } + fproperty.SetMemberValue(temp, arr, null); + } + } + catch { } + } + else + { + if (isArray) + { + var a = value as object[]; + if (a.Length == 1) + { + value = a[0]; + } + } + + if (value is string) + { + value = value.ToString().Replace("\\", "/"); + } + fproperty.SetMemberValue(temp, value, null); + } + } + else + { + if (value is string) + { + value = value.ToString().Replace("\\", "/"); + } + fproperty.SetMemberValue(temp, value, null); + } + } + catch + { + } + } + + /// <summary> + /// 鏍规嵁MemberInfo鑾峰彇鍊� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <param name="obj">鎵�鍦ㄥ疄渚�</param> + /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param> + /// <returns>MemberInfo鐨勫��</returns> + public static object? GetMemberValue(this MemberInfo mi, object obj, object[]? index = null) + { + object rv = null; + if (mi.MemberType == MemberTypes.Property) + { + rv = ((PropertyInfo)mi).GetValue(obj, index); + } + else if (mi.MemberType == MemberTypes.Field) + { + rv = ((FieldInfo)mi).GetValue(obj); + } + return rv; + } + + /// <summary> + /// 璁惧畾MemberInfo鐨勫�� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <param name="obj">鎵�鍦ㄥ疄渚�</param> + /// <param name="val">瑕佽祴鐨勫��</param> + /// <param name="index">濡傛灉鏄暟缁勶紝鎸囧畾鏁扮粍涓嬫爣銆傞粯璁や负null</param> + public static void SetMemberValue(this MemberInfo mi, object obj, object val, object[]? index = null) + { + object newval = val; + if (val is string s) + { + if (string.IsNullOrEmpty(s)) + { + val = null; + } + } + if (val != null && val.GetType() != mi.GetMemberType()) + { + newval = val.ConvertValue(mi.GetMemberType()); + } + if (mi.MemberType == MemberTypes.Property) + { + ((PropertyInfo)mi).SetValue(obj, newval, index); + } + else if (mi.MemberType == MemberTypes.Field) + { + ((FieldInfo)mi).SetValue(obj, newval); + } + } + + /// <summary> + /// 鑾峰彇鏌愪釜MemberInfo鐨勭被鍨� + /// </summary> + /// <param name="mi">MemberInfo</param> + /// <returns>绫诲瀷</returns> + public static Type? GetMemberType(this MemberInfo mi) + { + Type? rv = null; + if (mi != null) + { + if (mi.MemberType == MemberTypes.Property) + { + rv = ((PropertyInfo)mi).PropertyType; + } + else if (mi.MemberType == MemberTypes.Field) + { + rv = ((FieldInfo)mi).FieldType; + } + } + return rv; + } + + /// <summary> + /// 鑾峰彇鏋氫妇鏄剧ず鍚嶇О + /// </summary> + /// <param name="enumType">鏋氫妇绫诲瀷</param> + /// <param name="value">鏋氫妇鍊�</param> + /// <returns>鏋氫妇鏄剧ず鍚嶇О</returns> + public static string? GetEnumDisplayName(Type enumType, string value) + { + string rv = ""; + FieldInfo field = null; + + if (enumType.IsEnum()) + { + field = enumType.GetField(value); + } + //濡傛灉鏄痭ullable鐨勬灇涓� + if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum()) + { + field = enumType.GenericTypeArguments[0].GetField(value); + } + + if (field != null) + { + + var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList(); + if (attribs.Count > 0) + { + rv = ((DisplayAttribute)attribs[0]).GetName(); + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = value; + } + } + return rv; + } + + public static string? GetEnumDisplayName(Type enumType, int value) + { + string? rv = ""; + FieldInfo? field = null; + string? ename = ""; + if (enumType.IsEnum()) + { + ename = enumType.GetEnumName(value); + field = enumType.GetField(ename ?? ""); + } + //濡傛灉鏄痭ullable鐨勬灇涓� + if (enumType.IsGeneric(typeof(Nullable<>)) && enumType.GetGenericArguments()[0].IsEnum()) + { + ename = enumType.GenericTypeArguments[0].GetEnumName(value); + field = enumType.GenericTypeArguments[0].GetField(ename ?? ""); + } + + if (field != null) + { + + var attribs = field.GetCustomAttributes(typeof(DisplayAttribute), true).ToList(); + if (attribs.Count > 0) + { + rv = ((DisplayAttribute)attribs[0]).GetName(); + //if (CoreProgram._localizer != null) + //{ + // rv = CoreProgram._localizer[rv]; + //} + } + else + { + rv = ename; + } + } + return rv; + } + + /// <summary> + /// 杞寲鍊� + /// </summary> + /// <param name="value">瑕佽浆鎹㈢殑鍊�</param> + /// <param name="propertyType">杞崲鍚庣殑绫诲瀷</param> + /// <returns>杞崲鍚庣殑鍊�</returns> + public static object? ConvertValue(this object value, Type propertyType) + { + object val = null; + if (propertyType.IsGeneric(typeof(Nullable<>)) == true) + { + var gs = propertyType.GenericTypeArguments; + try + { + val = value.ConvertValue(gs[0]); + } + catch { } + } + else if (propertyType.IsEnum()) + { + val = Enum.Parse(propertyType, value.ToString()); + } + else if (propertyType == typeof(string)) + { + val = value?.ToString().Trim(); + } + else if (propertyType == typeof(Guid)) + { + bool suc = Guid.TryParse(value?.ToString(), out Guid g); + if (suc) + { + val = g; + } + else + { + val = Guid.Empty; + } + } + + else + { + try + { + if (value.ToString().StartsWith("`") && value.ToString().EndsWith("`")) + { + string inner = value.ToString().Trim('`').TrimEnd(','); + if (!string.IsNullOrWhiteSpace(inner)) + { + val = propertyType.GetConstructor(Type.EmptyTypes).Invoke(null); + string[] pair = inner.Split(','); + var gs = propertyType.GetGenericArguments(); + foreach (var p in pair) + { + (val as IList).Add(Convert.ChangeType(p, gs[0])); + } + } + } + else + { + val = Convert.ChangeType(value.ToString(), propertyType); + } + } + catch + { + } + } + return val; + } + + public static object MakeList(Type innerType, string propertyName, object[] values) + { + object rv = typeof(List<>).MakeGenericType(innerType).GetConstructor(Type.EmptyTypes).Invoke(null); + var mi = rv.GetType().GetMethod("Add"); + var con = innerType.GetConstructor(Type.EmptyTypes); + foreach (var item in values) + { + var newobj = con.Invoke(null); + newobj.SetPropertyValue(propertyName, item); + mi.Invoke(rv, new object[] { newobj }); + } + return rv; + } + + /// <summary> + /// 鑾峰彇 鏄惁瀹氫箟璇ユ爣绛惧睘鎬� + /// </summary> + /// <param name="pi"></param> + /// <param name="local"></param> + /// <returns></returns> + public static T? GetAttribute<T>(this MemberInfo pi) where T : Attribute + { + string rv = ""; + if (pi.GetCustomAttributes(typeof(T), false).FirstOrDefault() is T dis) + { + return dis; + } + else + { + return null; + } + + } + + + public static ImmutableDictionary<string, List<PropertyInfo>> _propertyCache { get; set; } = + new Dictionary<string, List<PropertyInfo>>().ToImmutableDictionary(); + /// <summary> + /// 鍒ゆ柇鏄惁鏄硾鍨� + /// </summary> + /// <param name="self">Type绫�</param> + /// <param name="innerType">娉涘瀷绫诲瀷</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsGeneric(this Type self, Type innerType) + { + if (self.GetTypeInfo().IsGenericType && self.GetGenericTypeDefinition() == innerType) + { + return true; + } + else + { + return false; + } + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篘ullable<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsNullable(this Type self) + { + return self.IsGeneric(typeof(Nullable<>)); + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsList(this Type self) + { + return self.IsGeneric(typeof(List<>)) || self.IsGeneric(typeof(IEnumerable<>)); + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓篖ist<>绫诲瀷 + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsListOf<T>(this Type self) + { + if (self.IsGeneric(typeof(List<>)) && typeof(T).IsAssignableFrom(self.GenericTypeArguments[0])) + { + return true; + } + else + { + return false; + } + } + + + #region 鍒ゆ柇鏄惁涓烘灇涓� + + /// <summary> + /// 鍒ゆ柇鏄惁涓烘灇涓� + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsEnum(this Type self) + { + return self.GetTypeInfo().IsEnum; + } + + /// <summary> + /// 鍒ゆ柇鏄惁涓烘灇涓炬垨鑰呭彲绌烘灇涓� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsEnumOrNullableEnum(this Type self) + { + if (self == null) + { + return false; + } + if (self.IsEnum) + { + return true; + } + else + { + if (self.IsGenericType && self.GetGenericTypeDefinition() == typeof(Nullable<>) && self.GetGenericArguments()[0].IsEnum) + { + return true; + } + else + { + return false; + } + } + } + + #endregion + + /// <summary> + /// 鍒ゆ柇鏄惁涓哄�肩被鍨� 鍩虹鍊肩被鍨� + /// </summary> + /// <param name="self">Type绫�</param> + /// <returns>鍒ゆ柇缁撴灉</returns> + public static bool IsPrimitive(this Type self) + { + return self.GetTypeInfo().IsPrimitive || self == typeof(decimal); + } + /// <summary> + /// 鍒ゆ柇鍊兼槸鍚︽槸鏁板瓧鍩虹绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsNumber(this Type self) + { + Type checktype = self; + if (self.IsNullable()) + { + checktype = self.GetGenericArguments()[0]; + } + if (checktype == typeof(int) || checktype == typeof(short) || checktype == typeof(long) || checktype == typeof(float) || checktype == typeof(decimal) || checktype == typeof(double)) + { + return true; + } + else + { + return false; + } + } + + + #region 鍒ゆ柇鏄惁鏄疊ool + /// <summary> + /// 鏄惁鏄痓ool绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsBool(this Type self) + { + return self == typeof(bool); + } + + /// <summary> + /// 鍒ゆ柇鏄惁鏄� bool or bool?绫诲瀷 + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static bool IsBoolOrNullableBool(this Type self) + { + if (self == null) + { + return false; + } + if (self == typeof(bool) || self == typeof(bool?)) + { + return true; + } + else + { + return false; + } + } + + #endregion + + /// <summary> + /// 鏍规嵁鍚嶅瓧鑾峰彇 + /// </summary> + /// <param name="self"></param> + /// <param name="name"></param> + /// <returns></returns> + public static PropertyInfo? GetSingleProperty(this Type self, string name) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties.Where(x => x.Name == name).FirstOrDefault(); + } + else + { + return _propertyCache[self.FullName].Where(x => x.Name == name).FirstOrDefault(); + } + } + /// <summary> + /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static PropertyInfo? GetSingleProperty(this Type self, Func<PropertyInfo, bool> where) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties.Where(where).FirstOrDefault(); + } + else + { + return _propertyCache[self.FullName].Where(where).FirstOrDefault(); + } + } + /// <summary> + /// 鑾峰彇灞炴�у垪琛� 骞跺皢 鍒楄〃灞炴�ф斁鍏ョ紦瀛� + /// </summary> + /// <param name="self"></param> + /// <returns></returns> + public static List<PropertyInfo> GetAllProperties(this Type self) + { + if (self.FullName == null) + throw new Exception("灞炴�у悕涓虹┖"); + if (_propertyCache.ContainsKey(self.FullName) == false) + { + var properties = self.GetProperties().ToList(); + _propertyCache = _propertyCache.Add(self.FullName, properties); + return properties; + } + else + { + return _propertyCache[self.FullName]; + } + } + #endregion + } +} diff --git a/Admin.NET/cylsg.utility/StaticStringDef.cs b/Admin.NET/cylsg.utility/StaticStringDef.cs new file mode 100644 index 0000000..ffccbdb --- /dev/null +++ b/Admin.NET/cylsg.utility/StaticStringDef.cs @@ -0,0 +1,24 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility +{ + /// <summary> + /// 甯哥敤瀛楃涓插畾涔� + /// </summary> + public static class StaticStringDef + { + /// <summary> + /// 鎻愮幇鑷攣KeY + /// </summary> + public static string TransferMoneyLockKey = "TransferMoneyLockKey:"; + + /// <summary> + /// 鎻愮幇缁熻绱閿� + /// </summary> + public static string TransferMoneyManKey = "TransferMoneyManKey:"; + } +} diff --git a/Admin.NET/cylsg.utility/cylsg.utility.csproj b/Admin.NET/cylsg.utility/cylsg.utility.csproj new file mode 100644 index 0000000..1dad6ca --- /dev/null +++ b/Admin.NET/cylsg.utility/cylsg.utility.csproj @@ -0,0 +1,14 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.Extensions.Primitives" Version="8.0.0" /> + <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> + </ItemGroup> + +</Project> diff --git a/Admin.NET/cylsg.utility/untilityModels.cs b/Admin.NET/cylsg.utility/untilityModels.cs new file mode 100644 index 0000000..b1ab056 --- /dev/null +++ b/Admin.NET/cylsg.utility/untilityModels.cs @@ -0,0 +1,16 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility +{ + /// <summary> + /// 閫氱敤妯″瀷 + /// </summary> + public class untilityModels + { + + } +} diff --git a/Web/src/api/Customer/fBS_EnterpriseType.ts b/Web/src/api/Customer/fBS_EnterpriseType.ts new file mode 100644 index 0000000..0aa8c91 --- /dev/null +++ b/Web/src/api/Customer/fBS_EnterpriseType.ts @@ -0,0 +1,52 @@ +锘縤mport {useBaseApi} from '/@/api/base'; + +// 浼佷笟绫婚厤缃〃鎺ュ彛鏈嶅姟 +export const useFBS_EnterpriseTypeApi = () => { + const baseApi = useBaseApi("fBS_EnterpriseType"); + return { + // 鍒嗛〉鏌ヨ浼佷笟绫婚厤缃〃 + page: baseApi.page, + // 鏌ョ湅浼佷笟绫婚厤缃〃璇︾粏 + detail: baseApi.detail, + // 鏂板浼佷笟绫婚厤缃〃 + add: baseApi.add, + // 鏇存柊浼佷笟绫婚厤缃〃 + update: baseApi.update, + // 鍒犻櫎浼佷笟绫婚厤缃〃 + delete: baseApi.delete, + // 鎵归噺鍒犻櫎浼佷笟绫婚厤缃〃 + batchDelete: baseApi.batchDelete, + // 瀵煎嚭浼佷笟绫婚厤缃〃鏁版嵁 + exportData: baseApi.exportData, + // 瀵煎叆浼佷笟绫婚厤缃〃鏁版嵁 + importData: baseApi.importData, + // 涓嬭浇浼佷笟绫婚厤缃〃鏁版嵁瀵煎叆妯℃澘 + downloadTemplate: baseApi.downloadTemplate, + } +} + +// 浼佷笟绫婚厤缃〃瀹炰綋 +export interface FBS_EnterpriseType { + // 涓婚敭Id + id: number; + // 鍚嶇О + name?: string; + // 浠g爜 + code?: string; + // 鐖� + parentId?: number; + // 绉熸埛Id + tenantId: number; + // 鍒涘缓鏃堕棿 + createTime: string; + // 鏇存柊鏃堕棿 + updateTime: string; + // 鍒涘缓鑰匢d + createUserId: number; + // 鍒涘缓鑰呭鍚� + createUserName: string; + // 淇敼鑰匢d + updateUserId: number; + // 淇敼鑰呭鍚� + updateUserName: string; +} \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue new file mode 100644 index 0000000..8630032 --- /dev/null +++ b/Web/src/views/Customer/fBS_EnterpriseType/component/editDialog.vue @@ -0,0 +1,109 @@ +锘�<script lang="ts" name="fBS_EnterpriseType" setup> +import { ref, reactive, onMounted } from "vue"; +import { ElMessage } from "element-plus"; +import type { FormRules } from "element-plus"; +import { formatDate } from '/@/utils/formatTime'; +import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType'; + +//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟 +const emit = defineEmits(["reloadTable"]); +const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi(); +const ruleFormRef = ref(); + +const state = reactive({ + title: '', + loading: false, + showDialog: false, + ruleForm: {} as any, + stores: {}, + dropdownData: {} as any, +}); + +// 鑷娣诲姞鍏朵粬瑙勫垯 +const rules = ref<FormRules>({ + name: [{required: true, message: '璇烽�夋嫨鍚嶇О锛�', trigger: 'blur',},], + code: [{required: true, message: '璇烽�夋嫨浠g爜锛�', trigger: 'blur',},], + parentId: [{required: true, message: '璇烽�夋嫨鐖讹紒', trigger: 'blur',},], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鎵撳紑寮圭獥 +const openDialog = async (row: any, title: string) => { + state.title = title; + row = row ?? { }; + state.ruleForm = row.id ? await fBS_EnterpriseTypeApi.detail(row.id).then(res => res.data.result) : JSON.parse(JSON.stringify(row)); + state.showDialog = true; +}; + +// 鍏抽棴寮圭獥 +const closeDialog = () => { + emit("reloadTable"); + state.showDialog = false; +}; + +// 鎻愪氦 +const submit = async () => { + ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => { + if (isValid) { + let values = state.ruleForm; + await fBS_EnterpriseTypeApi[state.ruleForm.id ? 'update' : 'add'](values); + closeDialog(); + } else { + ElMessage({ + message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜, + type: "error", + }); + } + }); +}; + +//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠� +defineExpose({ openDialog }); +</script> +<template> + <div class="fBS_EnterpriseType-container"> + <el-dialog v-model="state.showDialog" :width="800" draggable :close-on-click-modal="false"> + <template #header> + <div style="color: #fff"> + <span>{{ state.title }}</span> + </div> + </template> + <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules"> + <el-row :gutter="35"> + <el-form-item v-show="false"> + <el-input v-model="state.ruleForm.id" /> + </el-form-item> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鍚嶇О" prop="name"> + <el-input v-model="state.ruleForm.name" placeholder="璇疯緭鍏ュ悕绉�" maxlength="256" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="浠g爜" prop="code"> + <el-input v-model="state.ruleForm.code" placeholder="璇疯緭鍏ヤ唬鐮�" maxlength="36" show-word-limit clearable /> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" > + <el-form-item label="鐖�" prop="parentId"> + <el-input-number v-model="state.ruleForm.parentId" placeholder="璇疯緭鍏ョ埗" clearable /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="() => state.showDialog = false">鍙� 娑�</el-button> + <el-button @click="submit" type="primary" v-reclick="1000">纭� 瀹�</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<style lang="scss" scoped> +:deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file diff --git a/Web/src/views/Customer/fBS_EnterpriseType/index.vue b/Web/src/views/Customer/fBS_EnterpriseType/index.vue new file mode 100644 index 0000000..6d421a6 --- /dev/null +++ b/Web/src/views/Customer/fBS_EnterpriseType/index.vue @@ -0,0 +1,194 @@ +锘�<script lang="ts" setup name="fBS_EnterpriseType"> +import { ref, reactive, onMounted } from "vue"; +import { auth } from '/@/utils/authFunction'; +import { ElMessageBox, ElMessage } from "element-plus"; +import { downloadStreamFile } from "/@/utils/download"; +import { useFBS_EnterpriseTypeApi } from '/@/api/Customer/fBS_EnterpriseType'; +import editDialog from '/@/views/Customer/fBS_EnterpriseType/component/editDialog.vue' +import printDialog from '/@/views/system/print/component/hiprint/preview.vue' +import ModifyRecord from '/@/components/table/modifyRecord.vue'; +import ImportData from "/@/components/table/importData.vue"; + +const fBS_EnterpriseTypeApi = useFBS_EnterpriseTypeApi(); +const printDialogRef = ref(); +const editDialogRef = ref(); +const importDataRef = ref(); +const state = reactive({ + exportLoading: false, + tableLoading: false, + stores: {}, + showAdvanceQueryUI: false, + dropdownData: {} as any, + selectData: [] as any[], + tableQueryParams: {} as any, + tableParams: { + page: 1, + pageSize: 20, + total: 0, + field: 'createTime', // 榛樿鐨勬帓搴忓瓧娈� + order: 'descending', // 鎺掑簭鏂瑰悜 + descStr: 'descending', // 闄嶅簭鎺掑簭鐨勫叧閿瓧绗� + }, + tableData: [], +}); + +// 椤甸潰鍔犺浇鏃� +onMounted(async () => { +}); + +// 鏌ヨ鎿嶄綔 +const handleQuery = async (params: any = {}) => { + state.tableLoading = true; + state.tableParams = Object.assign(state.tableParams, params); + const result = await fBS_EnterpriseTypeApi.page(Object.assign(state.tableQueryParams, state.tableParams)).then(res => res.data.result); + state.tableParams.total = result?.total; + state.tableData = result?.items ?? []; + state.tableLoading = false; +}; + +// 鍒楁帓搴� +const sortChange = async (column: any) => { + state.tableParams.field = column.prop; + state.tableParams.order = column.order; + await handleQuery(); +}; + +// 鍒犻櫎 +const delFBS_EnterpriseType = (row: any) => { + ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_EnterpriseTypeApi.delete({ id: row.id }); + handleQuery(); + ElMessage.success("鍒犻櫎鎴愬姛"); + }).catch(() => {}); +}; + +// 鎵归噺鍒犻櫎 +const batchDelFBS_EnterpriseType = () => { + ElMessageBox.confirm(`纭畾瑕佸垹闄�${state.selectData.length}鏉¤褰曞悧?`, "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + }).then(async () => { + await fBS_EnterpriseTypeApi.batchDelete(state.selectData.map(u => ({ id: u.id }) )).then(res => { + ElMessage.success(`鎴愬姛鎵归噺鍒犻櫎${res.data.result}鏉¤褰昤); + handleQuery(); + }); + }).catch(() => {}); +}; + +// 瀵煎嚭鏁版嵁 +const exportFBS_EnterpriseTypeCommand = async (command: string) => { + try { + state.exportLoading = true; + if (command === 'select') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { selectKeyList: state.selectData.map(u => u.id) }); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'current') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } else if (command === 'all') { + const params = Object.assign({}, state.tableQueryParams, state.tableParams, { page: 1, pageSize: 99999999 }); + await fBS_EnterpriseTypeApi.exportData(params).then(res => downloadStreamFile(res)); + } + } finally { + state.exportLoading = false; + } +} + +handleQuery(); +</script> +<template> + <div class="fBS_EnterpriseType-container" v-loading="state.exportLoading"> + <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> + <el-form :model="state.tableQueryParams" ref="queryForm" labelWidth="90"> + <el-row> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item label="鍏抽敭瀛�"> + <el-input v-model="state.tableQueryParams.keyword" clearable placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鍚嶇О"> + <el-input v-model="state.tableQueryParams.name" clearable placeholder="璇疯緭鍏ュ悕绉�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="浠g爜"> + <el-input v-model="state.tableQueryParams.code" clearable placeholder="璇疯緭鍏ヤ唬鐮�"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="state.showAdvanceQueryUI"> + <el-form-item label="鐖�"> + <el-input-number v-model="state.tableQueryParams.parentId" clearable placeholder="璇疯緭鍏ョ埗"/> + </el-form-item> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> + <el-form-item > + <el-button-group style="display: flex; align-items: center;"> + <el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'fBS_EnterpriseType:page'" v-reclick="1000"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="() => state.tableQueryParams = {}"> 閲嶇疆 </el-button> + <el-button icon="ele-ZoomIn" @click="() => state.showAdvanceQueryUI = true" v-if="!state.showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button> + <el-button icon="ele-ZoomOut" @click="() => state.showAdvanceQueryUI = false" v-if="state.showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button> + <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @click="batchDelFBS_EnterpriseType" :disabled="state.selectData.length == 0" v-auth="'fBS_EnterpriseType:batchDelete'"> 鍒犻櫎 </el-button> + <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="editDialogRef.openDialog(null, '鏂板浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:add'"> 鏂板 </el-button> + <el-dropdown :show-timeout="70" :hide-timeout="50" @command="exportFBS_EnterpriseTypeCommand"> + <el-button type="primary" style="margin-left:5px;" icon="ele-FolderOpened" v-reclick="20000" v-auth="'fBS_EnterpriseType:export'"> 瀵煎嚭 </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item command="select" :disabled="state.selectData.length == 0">瀵煎嚭閫変腑</el-dropdown-item> + <el-dropdown-item command="current">瀵煎嚭鏈〉</el-dropdown-item> + <el-dropdown-item command="all">瀵煎嚭鍏ㄩ儴</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + <el-button type="warning" style="margin-left:5px;" icon="ele-MostlyCloudy" @click="importDataRef.openDialog()" v-auth="'fBS_EnterpriseType:import'"> 瀵煎叆 </el-button> + </el-button-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card class="full-table" shadow="hover" style="margin-top: 5px"> + <el-table :data="state.tableData" @selection-change="(val: any[]) => { state.selectData = val; }" style="width: 100%" v-loading="state.tableLoading" tooltip-effect="light" row-key="id" @sort-change="sortChange" border> + <el-table-column type="selection" width="40" align="center" v-if="auth('fBS_EnterpriseType:batchDelete') || auth('fBS_EnterpriseType:export')" /> + <el-table-column type="index" label="搴忓彿" width="55" align="center"/> + <el-table-column prop='name' label='鍚嶇О' show-overflow-tooltip /> + <el-table-column prop='code' label='浠g爜' show-overflow-tooltip /> + <el-table-column prop='parentId' label='鐖�' show-overflow-tooltip /> + <el-table-column label="淇敼璁板綍" width="100" align="center" show-overflow-tooltip> + <template #default="scope"> + <ModifyRecord :data="scope.row" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip v-if="auth('fBS_EnterpriseType:update') || auth('fBS_EnterpriseType:delete')"> + <template #default="scope"> + <el-button icon="ele-Edit" size="small" text type="primary" @click="editDialogRef.openDialog(scope.row, '缂栬緫浼佷笟绫婚厤缃〃')" v-auth="'fBS_EnterpriseType:update'"> 缂栬緫 </el-button> + <el-button icon="ele-Delete" size="small" text type="primary" @click="delFBS_EnterpriseType(scope.row)" v-auth="'fBS_EnterpriseType:delete'"> 鍒犻櫎 </el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-model:currentPage="state.tableParams.page" + v-model:page-size="state.tableParams.pageSize" + @size-change="(val: any) => handleQuery({ pageSize: val })" + @current-change="(val: any) => handleQuery({ page: val })" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[10, 20, 50, 100, 200, 500]" + :total="state.tableParams.total" + size="small" + background /> + <ImportData ref="importDataRef" :import="fBS_EnterpriseTypeApi.importData" :download="fBS_EnterpriseTypeApi.downloadTemplate" v-auth="'fBS_EnterpriseType:import'" @refresh="handleQuery"/> + <printDialog ref="printDialogRef" :title="'鎵撳嵃浼佷笟绫婚厤缃〃'" @reloadTable="handleQuery" /> + <editDialog ref="editDialogRef" @reloadTable="handleQuery" /> + </el-card> + </div> +</template> +<style scoped> +:deep(.el-input), :deep(.el-select), :deep(.el-input-number) { + width: 100%; +} +</style> \ No newline at end of file -- Gitblit v1.9.1