From 4de81e21e02e4bd30fc60bfd9c2ea9dce02abdb5 Mon Sep 17 00:00:00 2001 From: 移动系统liao <liaoxujun@qq.com> Date: 星期一, 23 六月 2025 14:25:22 +0800 Subject: [PATCH] 增加部分客户逻辑和模型 --- /dev/null | 12 - Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs | 18 + Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs | 2 Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs | 47 +++ Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json | 24 ++ Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs | 48 ++++ Admin.NET/Admin.NET.Application/Configuration/Swagger.json | 7 Admin.NET/FZCTB.NET.API.Application/FZCTB.NET.API.Application.csproj | 1 Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj | 1 Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs | 339 ++++++++++++++++++++++++++++ Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs | 213 +++++++++++++++++ 11 files changed, 699 insertions(+), 13 deletions(-) diff --git a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json index 9ff0518..1aca37f 100644 --- a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json +++ b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json @@ -31,6 +31,13 @@ "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�", "Version": "1.0.0", "Order": 10000 + }, + { + "Group": "FZCAPISYS", + "Title": "鍓嶇绯荤粺", + "Description": "闈炴斂搴滈噰璐氦鏄撳钩鍙�", + "Version": "1.0.0", + "Order": 10000 } ], "DefaultGroupName": "Default", // 榛樿鍒嗙粍鍚� diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs index 9be2d3a..55c0fa2 100644 --- a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs @@ -394,7 +394,7 @@ { var codeId = YitIdHelper.NextId().ToString(); var captcha = _captcha.Generate(codeId); - var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60; + var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ??60 ; return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds }; } diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs new file mode 100644 index 0000000..b4f00fe --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs @@ -0,0 +1,18 @@ +锘縰sing Furion.DynamicApiController; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.Auth +{ + /// <summary> + /// 閴存潈鏈嶅姟 + /// </summary> + [ApiDescriptionSettings("FZCAPISYS", Order = 149)] + public class AuthService: IDynamicApiController + { + } +} 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 8756464..c3712b0 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 @@ -10,6 +10,7 @@ <ProjectReference Include="..\Admin.NET.Application\Admin.NET.Application.csproj" /> <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.SYSService\FZCZTB.NET.SYSService.csproj" /> </ItemGroup> </Project> diff --git a/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs new file mode 100644 index 0000000..baef9bb --- /dev/null +++ b/Admin.NET/FZCTB.NET.API.Application/User/CustomerService.cs @@ -0,0 +1,47 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Furion.DynamicApiController; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.NET.SYSService.CustomerSYS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCTB.NET.API.Application.User; +/// <summary> +/// 瀹㈡埛澶勯噷 +/// </summary> +public class CustomerService: IDynamicApiController +{ + private readonly CustomerManagerS _customerManager; + + private readonly SysCacheService _sysCacheService; + /// <summary> + /// + /// </summary> + public CustomerService(SysCacheService cacheService, CustomerManagerS managerS) + { + _sysCacheService= cacheService; + _customerManager = managerS; + } + + /// <summary> + /// 鐢ㄦ埛娉ㄥ唽 + /// </summary> + /// <returns></returns> + public async Task<bool> CustomerRegistration(CustomerDto param ) + { + //_customerManager. + await Task.CompletedTask; + return true; + } + + +} diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs deleted file mode 100644 index 3994bc7..0000000 --- a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManager.cs +++ /dev/null @@ -1,12 +0,0 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FZCZTB.NET.SYSService.CustomerSYS -{ - public class CustomerManager - { - } -} diff --git a/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs new file mode 100644 index 0000000..e0c6411 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/CustomerSYS/CustomerManagerS.cs @@ -0,0 +1,339 @@ +锘縰sing Admin.NET.Core; +using Admin.NET.Core.Service; +using Furion.DependencyInjection; +using FZCZTB.NET.MD.CutomerMd; +using Mapster; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService.CustomerSYS +{ + /// <summary> + /// customermanger 鏈嶅姟 + /// </summary> + public class CustomerManagerS: IScoped + { + private readonly SqlSugarRepository<FBS_ExRole> _fBS_ExRoleRep; + private readonly SqlSugarRepository<FBS_Customer> _fBS_CustomerRep; + private readonly SysCacheService _sysCacheService; + + public CustomerManagerS(SysCacheService sysCacheService, + SqlSugarRepository<FBS_ExRole> fBS_ExRoleRep, + SqlSugarRepository<FBS_Customer> fBS_CustomerRep) + { + _sysCacheService = sysCacheService; + _fBS_ExRoleRep = fBS_ExRoleRep; + _fBS_CustomerRep = fBS_CustomerRep; + } + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task< List<ExRoleVM>> GetExRole() + { + return await _fBS_ExRoleRep.AsQueryable().Where(x=>x.Status== StatusEnum.Enable) + .Select<ExRoleVM>().WithCache(20).ToListAsync(); + + } + + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task<CustomerDto> GetCustomer(int id) + { + + + + return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>(); + + + + + + } + + + /// <summary> + /// 杩斿洖褰撳墠鍙敤鐨勭敤鎴疯鑹� 鍐嶆敞鍐屽拰鐧诲綍鏃堕渶瑕佽繑鍥炵紪鐮� + /// </summary> + /// <returns></returns> + public async Task<CustomerDto> UpDataCustomer(int id) + { + + + + return (await _fBS_CustomerRep.GetFirstAsync(x => x.Id == id && x.Status == StatusEnum.Enable)).Adapt<CustomerDto>(); + + + + + + } + + + } + + + /// <summary> + /// 瀹㈡埛涓诲垎绫昏鑹插熀纭�杈撳叆鍙傛暟 + /// </summary> + public class ExRoleVM + { + /// <summary> + /// 涓婚敭Id + /// </summary> + public virtual long? Id { get; set; } + + /// <summary> + /// 鍚嶇О + /// </summary> + [Required(ErrorMessage = "鍚嶇О涓嶈兘涓虹┖")] + public virtual string Name { get; set; } + + /// <summary> + /// 缂栫爜 + /// </summary> + public virtual string? Code { get; set; } + + /// <summary> + /// 鎺掑簭 + /// </summary> + [Required(ErrorMessage = "鎺掑簭涓嶈兘涓虹┖")] + public virtual int? OrderNo { get; set; } + + /// <summary> + /// 鏁版嵁鑼冨洿 + /// </summary> + [Dict(nameof(DataScopeEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鏁版嵁鑼冨洿涓嶈兘涓虹┖")] + public virtual DataScopeEnum? DataScope { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public virtual string? Remark { get; set; } + + /// <summary> + /// 鐘舵�� + /// </summary> + [Dict(nameof(StatusEnum), AllowNullValue = true)] + [Required(ErrorMessage = "鐘舵�佷笉鑳戒负绌�")] + public virtual StatusEnum? Status { get; set; } + + } + + + /// <summary> + /// 瀹㈡埛琛ㄨ緭鍑哄弬鏁� + /// </summary> + public class CustomerDto + { + /// <summary> + /// 涓婚敭Id + /// </summary> + public long Id { get; set; } + + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Account { get; set; } + + /// <summary> + /// 瀵嗙爜 + /// </summary> + public string Password { get; set; } + + /// <summary> + /// 鐪熷疄濮撳悕 + /// </summary> + public string RealName { get; set; } + + /// <summary> + /// 鏄电О + /// </summary> + public string? NickName { get; set; } + + /// <summary> + /// 澶村儚 + /// </summary> + 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> + 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> + 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> + 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; } + + /// <summary> + /// 娉ㄥ唽鐢ㄦ埛瑙掕壊 + /// </summary> + public string? ExRoleCode { 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 01c693f..67c6339 100644 --- a/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTB.NET.SYSService.csproj @@ -8,6 +8,7 @@ <ItemGroup> <ProjectReference Include="..\Admin.NET.Core\Admin.NET.Core.csproj" /> + <ProjectReference Include="..\FZCZTB.NET.MD\FZCZTB.NET.MD.csproj" /> </ItemGroup> </Project> diff --git a/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json new file mode 100644 index 0000000..8028922 --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/FZCZTSYSServiceConfig.json @@ -0,0 +1,24 @@ +{ + "SMSConfigMd": { + "LingKaiXinxiSets": { //鍑屽嚡鐭俊閰嶇疆 + "Url": "https://mb345.com/ws/BatchSend2.aspx", + "Number": "XP010534", + "AccountPassPassword": "123321", + "VerifyTimeOut": 60, //绉� + "Templates": [ + { + "Id": "0", + "SignName": "銆愭斂閲囧挩璇㈢綉銆�", //闇�瑕佸姞鍏ョ殑鍏徃鏍囩 + "TemplateCode": "VCode", + "Content": "鎮ㄧ殑楠岃瘉鐮佷负锛�${code}锛岃鍕挎硠闇蹭簬浠栦汉锛�" + }, + { + "Id": "1", + "SignName": "銆愭斂閲囧挩璇㈢綉銆�", + "TemplateCode": "RegistrationOK ", + "Content": "娉ㄥ唽鎴愬姛锛屾劅璋㈡偍鐨勬敞鍐岋紝璇峰Ε鍠勪繚绠℃偍鐨勮处鎴蜂俊鎭�" + } + ] + } + } +} \ No newline at end of file diff --git a/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs new file mode 100644 index 0000000..805fcce --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/SMSConfigMd.cs @@ -0,0 +1,48 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core; +using Furion.ConfigurableOptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FZCZTB.NET.SYSService.MSM; +public class SMSConfigOptions : IConfigurableOptions +{ + + + /// <summary> + /// 鍑屽嚡淇℃伅閰嶇疆 + /// </summary> + public LingKaiXinxiSets lingKai { get; set; } +} + +public class LingKaiXinxiSets +{ + /// <summary> + /// d鍦板潃 + /// </summary> + public string Url { get; set; } + /// <summary> + /// 璐﹀彿 + /// </summary> + public string Number { get; set; } + /// <summary> + /// 瀵嗙爜 + /// </summary> + public string AccountPassPassword { get; set; } + /// <summary> + /// 瓒呮椂鏃堕棿 + /// </summary> + public int VerifyTimeOut { get; set; } + /// <summary> + /// Templates + /// </summary> + 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 new file mode 100644 index 0000000..61804dc --- /dev/null +++ b/Admin.NET/FZCZTB.NET.SYSService/MSM/ZCSMSService.cs @@ -0,0 +1,213 @@ +锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆� +// +// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆� +// +// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛� + +using Admin.NET.Core.Service; +using Admin.NET.Core; +using Furion.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Dm.util; +using Aop.Api.Domain; +using Furion.FriendlyException; +using Furion.DataValidation; +using static QRCoder.PayloadGenerator; +using System.Net; +using Org.BouncyCastle.Asn1.Ocsp; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Furion.DynamicApiController; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using Yitter.IdGenerator; +using Lazy.Captcha.Core; +using Furion; + +namespace FZCZTB.NET.SYSService.MSM; +/// <summary> +/// 鏀块噰鐭俊鏈嶅姟 +/// </summary> +[AllowAnonymous] +[ApiDescriptionSettings("FZCAPISYS",Order = 149)] +public class ZCSMSService : IDynamicApiController,ITransient +{ + private readonly SMSConfigOptions _smsOptions; + private readonly SysCacheService _sysCacheService; + private readonly ICaptcha _captcha; + public ZCSMSService(IOptions<SMSConfigOptions> smsOptions, + SysCacheService sysCacheService, + ICaptcha captcha + ) + { + _smsOptions = smsOptions.Value; + _sysCacheService = _sysCacheService; + _captcha = captcha; + } + + + /// <summary> + /// 鏍规嵁钘忕敤妯$増鏍煎紡鍖栫煭淇″唴瀹� 浼氳嚜鍔ㄨ创涓婃爣绛� + /// </summary> + /// <param name="Code"> 闇�瑕佹浛鎹㈢殑鍐呭锛岀敤浜庢浛鎹㈡湯鐝唴瀹圭殑code閮ㄥ垎</param> + /// <param name="Key"></param> + [NonAction] + public string FormartMessage(string? Code, string Key = "VCode") + { + var Temp= _smsOptions.lingKai.Templates.Where(x => x.TemplateCode == Key).FirstOrDefault(); + if ( Temp != null ) + { + if(Code != null) + { + + return Temp.Content.replace("${code}", Code) + Temp.SignName; + + } + + else + return Temp.Content+Temp.SignName; + } + if (Code == null) + Oops.Oh("鐭俊鍐呭涓虹┖"); + return Code; + } + + + /// <summary> + /// 鍙戦�佺煭淇� + /// </summary> + /// <param name="Content">瑕佹浛鎹㈢殑鍐呭</param> + [NonAction] + public async Task SendSMSAsync(string Content,string Phone) + { + if (!Phone.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�"); + + if( string.IsNullOrEmpty(Content)) throw Oops.Oh("璇峰~鍐欐纭殑鎵嬫満鍙风爜"); + + string postdata1 = "CorpID=" + _smsOptions.lingKai.Number + "&Pwd=" + _smsOptions.lingKai.AccountPassPassword + "&Mobile=" + Phone + "&Content="+ Content + "&SendTime="; + string code = (string)await HttpPost(_smsOptions.lingKai.Url, postdata1); + + var data = Convert.ToInt64(code); + if (data > 0) + { + return ; + } + Oops.Oh($"鍙戦�佺煭淇″け璐ワ紝閿欒鐮亄data}"); + + + } + + + + + /// <summary> + /// 鑾峰彇楠岃瘉鐮� 馃敄 + /// </summary> + /// <returns></returns> + [AllowAnonymous] + [SuppressMonitor] + [DisplayName("鑾峰彇楠岃瘉鐮�")] + public dynamic GetCaptcha() + { + var codeId = YitIdHelper.NextId().ToString(); + var captcha = _captcha.Generate(codeId); + var expirySeconds = App.GetOptions<CaptchaOptions>()?.ExpirySeconds ?? 60; + return new { Id = codeId, Img = captcha.Base64, ExpirySeconds = expirySeconds }; + } + + /// <summary> + /// 鏍¢獙鐭俊楠岃瘉鐮� + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鏍¢獙鐭俊楠岃瘉鐮�")] + public bool VerifyCode(SmsVerifyCodeInput input) + { + var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + + if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�"); + + if (verifyCode != input.Code) throw Oops.Oh("楠岃瘉鐮侀敊璇紒"); + + return true; + } + /// <summary> + /// 鍙戦�侀獙璇佺煭淇★紝瑕佽楠岃瘉鐮� 闇�瑕佽緭鍏ユ牎楠岋紝閬垮厤鐢佃剳鏀诲嚮 + /// </summary> + /// <param name="phoneNumber"> 鐢佃瘽鍙风爜</param> + /// <param name="VerifyCode">鍥剧墖鏍¢獙鏁版嵁</param> + /// <param name="VerifyCodeId">妫�楠岀殑ID</param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鍙戦�侀獙璇佺爜")] + public async Task SendSMS([Required] string phoneNumber , [Required] string VerifyCode, [Required] string VerifyCodeId) + { + if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid) throw Oops.Oh("璇锋纭~鍐欐墜鏈哄彿鐮�"); + + // 鏍¢獙楠岃瘉鐮� + if (!_captcha.Validate(VerifyCodeId, VerifyCode)) throw Oops.Oh(ErrorCodeEnum.D0008); + _captcha.Generate(VerifyCodeId); + + // 鐢熸垚闅忔満楠岃瘉鐮� + var random = new Random(); + var verifyCode = random.Next(100000, 999999); + + var templateParam = new + { + code = verifyCode + }; + var code= FormartMessage(verifyCode.toString()); + + await SendSMSAsync(code, phoneNumber); + + _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut)); + + + + await Task.CompletedTask; + } + + /// <summary> + /// 鍙戦�侀獙璇佺爜 + /// </summary> + /// <param name="Url"> 閾炬帴</param> + /// <param name="postDataStr"> 楠岃瘉鐮�</param> + /// <returns></returns> + private async Task<string> HttpPost(string Url, string postDataStr) + { + //HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); + //request.Method = "POST"; + //request.ContentType = "application/x-www-form-urlencoded;charset=gb2312"; + + //byte[] postData = Encoding.GetEncoding("gb2312").GetBytes(postDataStr); + //request.ContentLength = postData.Length; + //Stream myRequestStream = request.GetRequestStream(); + //myRequestStream.Write(postData, 0, postData.Length); + //myRequestStream.Close(); + //HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); + //Stream myResponseStream = response.GetResponseStream(); + //StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312")); + //string retString = myStreamReader.ReadToEnd(); + //myStreamReader.Close(); + //myResponseStream.Close(); + + //return retString; + // 鍒涘缓 HttpClient 瀹炰緥 + using var httpClient = new HttpClient(); + // 鍑嗗瑕佸彂閫佺殑鍐呭锛岃缃紪鐮佸拰鍐呭绫诲瀷 + var content = new StringContent(postDataStr, Encoding.GetEncoding("gb2312"), "application/x-www-form-urlencoded"); + // 鍙戦�� POST 璇锋眰 + var response = await httpClient.PostAsync(Url, content); + // 纭繚璇锋眰鎴愬姛锛岃嫢澶辫触鍒欐姏鍑哄紓甯� + response.EnsureSuccessStatusCode(); + // 璇诲彇鍝嶅簲鍐呭 + return await response.Content.ReadAsStringAsync(); + } + +} -- Gitblit v1.9.1