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