From 91bebd62f70a33c20a0a8880cfc0b2e99a9cc487 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 11 八月 2025 14:16:00 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Models/UserServer/Auths/Commands/ChangePhoneNumberCommand.cs           |    7 +
 FlexJobApi.Core/Models/UserServer/Auths/Commands/UpdatePhoneNumberVerifyCodeCommand.cs |   24 ++++++++
 FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cs        |    9 ++-
 FlexJobApi.Core/Models/UserServer/Auths/Commands/PasswordLoginCommand.cs               |    5 +
 FlexJobApi.UserServer.Application/Auths/Commands/VerifyCodeCommandHandler.cs           |   20 ++++++
 FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs                |   62 +++++++++++++++-----
 FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs                             |    5 +
 7 files changed, 108 insertions(+), 24 deletions(-)

diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/ChangePhoneNumberCommand.cs
similarity index 74%
rename from FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
rename to FlexJobApi.Core/Models/UserServer/Auths/Commands/ChangePhoneNumberCommand.cs
index edb04bd..7c4d34a 100644
--- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/ChangePhoneNumberCommand.cs
@@ -1,6 +1,7 @@
 锘縰sing MediatR;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -8,19 +9,21 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 缁戝畾鎵嬫満鍙�
+    /// 鏇存崲鎵嬫満鍙�
     /// </summary>
     [Resource([EnumResourceController.Auth])]
-    public class BindPhoneNumberCommand : IRequest<bool>
+    public class ChangePhoneNumberCommand : IRequest<bool>
     {
         /// <summary>
         /// 鎵嬫満鍙风爜
         /// </summary>
+        [Required]
         public string PhoneNumber { get; set; }
 
         /// <summary>
         /// 楠岃瘉鐮�
         /// </summary>
+        [Required]
         public string VerifyCode { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/PasswordLoginCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/PasswordLoginCommand.cs
index feef68c..46aa238 100644
--- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/PasswordLoginCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/PasswordLoginCommand.cs
@@ -57,5 +57,10 @@
         /// 鍒锋柊浠ょ墝
         /// </summary>
         public string RefreshToken { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸茬粦瀹氭墜鏈哄彿
+        /// </summary>
+        public bool IsBindPhoneNumber { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cs
similarity index 65%
copy from FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
copy to FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cs
index edb04bd..8fb0eea 100644
--- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cs
@@ -1,6 +1,7 @@
 锘縰sing MediatR;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -8,19 +9,21 @@
 namespace FlexJobApi.Core
 {
     /// <summary>
-    /// 缁戝畾鎵嬫満鍙�
+    /// 娉ㄥ唽涓汉璐﹀彿
     /// </summary>
-    [Resource([EnumResourceController.Auth])]
-    public class BindPhoneNumberCommand : IRequest<bool>
+    [Resource([EnumResourceController.Auth], AllowAnonymous = true)]
+    public class RegisterPersonalUserCommand : IRequest<bool>
     {
         /// <summary>
         /// 鎵嬫満鍙风爜
         /// </summary>
+        [Required]
         public string PhoneNumber { get; set; }
 
         /// <summary>
         /// 楠岃瘉鐮�
         /// </summary>
+        [Required]
         public string VerifyCode { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/UpdatePhoneNumberVerifyCodeCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/UpdatePhoneNumberVerifyCodeCommand.cs
new file mode 100644
index 0000000..6fba1e1
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/UpdatePhoneNumberVerifyCodeCommand.cs
@@ -0,0 +1,24 @@
+锘縰sing Furion.DataValidation;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍙戦�佹洿鎹㈡墜鏈哄彿鐭俊
+    /// </summary>
+    [Resource([EnumResourceController.Auth])]
+    public class UpdatePhoneNumberVerifyCodeCommand : IRequest<Guid>
+    {
+        /// <summary>
+        /// 鎵嬫満鍙风爜
+        /// </summary>
+        [Required, DataValidation(ValidationTypes.PhoneNumber)]
+        public string PhoneNumber { get; set; }
+    }
+}
diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
index 71a666a..6319fcd 100644
--- a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
@@ -26,7 +26,8 @@
         IRequestHandler<SmsLoginCommand, LoginCommandCallback>,
         IRequestHandler<WxmpLoginCommand, LoginCommandCallback>,
         IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>,
-        IRequestHandler<BindPhoneNumberCommand, bool>
+        IRequestHandler<ChangePhoneNumberCommand, bool>,
+        IRequestHandler<RegisterPersonalUserCommand, bool>
     {
         private readonly IRepository<User> rep = rep;
         private readonly SmsUtils smsUtils = smsUtils;
@@ -68,19 +69,6 @@
             var user = await rep.AsQueryable().AsNoTracking()
                 .Where(it => it.UserName == request.PhoneNumber && it.Type == request.Type)
                 .FirstOrDefaultAsync(cancellationToken);
-            if (user == null && request.Type == EnumUserType.Personal)
-            {
-                user = new User
-                {
-                    Type = request.Type,
-                    UserName = request.PhoneNumber,
-                    PhoneNumber = request.PhoneNumber,
-                    IsCheckPhoneNumber = true,
-                    Level = 1,
-                    Status = EnumUserStatus.Normal
-                };
-                await rep.InsertAsync(user);
-            }
             if (user == null)
                 throw Oops.Oh(EnumUserErrorCodeType.u1000);
             if (user.Status == EnumUserStatus.Disabled)
@@ -120,24 +108,30 @@
         }
 
         /// <summary>
-        /// 缁戝畾鎵嬫満鍙�
+        /// 鏇存崲鎵嬫満鍙�
         /// </summary>
         /// <param name="request"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken)
+        public async Task<bool> Handle(ChangePhoneNumberCommand request, CancellationToken cancellationToken)
         {
             await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel
             {
                 PhoneNumber = request.PhoneNumber,
                 VerifyCode = request.VerifyCode,
-                TemplateCode = EnumSmsTemplateCode.LoginOrRegister
+                TemplateCode = EnumSmsTemplateCode.UpdateUserPhoneNumber
             });
             var logier = JwtUtils.GetCurrentLogier();
             var user = await rep.AsQueryable()
                 .FirstOrDefaultAsync(it => it.Id == logier.Id);
             if (user == null)
                 throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿涓嶅瓨鍦�");
+
+            var exist = await rep.AsQueryable()
+                .Where(it => it.Type == logier.Type && it.PhoneNumber == request.PhoneNumber && it.Id != user.Id)
+                .AnyAsync(cancellationToken);
+            if (exist) throw Oops.Oh(EnumUserErrorCodeType.u1010);
+
             user.UserName = request.PhoneNumber;
             user.PhoneNumber = request.PhoneNumber;
             user.IsCheckPhoneNumber = true;
@@ -216,6 +210,39 @@
         }
 
         /// <summary>
+        /// 娉ㄥ唽涓汉璐﹀彿
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<bool> Handle(RegisterPersonalUserCommand request, CancellationToken cancellationToken)
+        {
+            await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel
+            {
+                PhoneNumber = request.PhoneNumber,
+                VerifyCode = request.VerifyCode,
+                TemplateCode = EnumSmsTemplateCode.LoginOrRegister
+            });
+            var user = await rep.AsQueryable()
+                .FirstOrDefaultAsync(it => it.Type == EnumUserType.Personal && it.UserName == request.PhoneNumber);
+            if (user != null)
+                throw Oops.Oh(EnumUserErrorCodeType.u1010);
+
+            user = new User
+            {
+                Type = EnumUserType.Personal,
+                UserName = request.PhoneNumber,
+                PhoneNumber = request.PhoneNumber,
+                IsCheckPhoneNumber = true,
+                Level = 1,
+                Status = EnumUserStatus.Normal
+            };
+            await rep.InsertAsync(user);
+
+            return true;
+        }
+
+        /// <summary>
         /// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
         /// </summary>
         /// <param name="user"></param>
@@ -242,6 +269,7 @@
                 Id = logier.Id,
                 AccessToken = logier.AccessToken,
                 RefreshToken = logier.RefreshToken,
+                IsBindPhoneNumber = logier.PhoneNumber.IsNotNull()
             };
         }
     }
diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/VerifyCodeCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/VerifyCodeCommandHandler.cs
index 4831a8d..e9a5d26 100644
--- a/FlexJobApi.UserServer.Application/Auths/Commands/VerifyCodeCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/Auths/Commands/VerifyCodeCommandHandler.cs
@@ -15,8 +15,9 @@
     /// </summary>
     public class VerifyCodeCommandHandler(
             SmsUtils smsUtils
-        )
-        : IRequestHandler<SendLoginOrRegisterVerifyCodeCommand, Guid>
+        ) : 
+        IRequestHandler<SendLoginOrRegisterVerifyCodeCommand, Guid>,
+        IRequestHandler<UpdatePhoneNumberVerifyCodeCommand, Guid>
     {
         private readonly SmsUtils smsUtils = smsUtils;
 
@@ -34,5 +35,20 @@
                 TemplateCode = EnumSmsTemplateCode.LoginOrRegister
             });
         }
+
+        /// <summary>
+        /// 鍙戦�佹洿鎹㈡墜鏈哄彿鐭俊
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<Guid> Handle(UpdatePhoneNumberVerifyCodeCommand request, CancellationToken cancellationToken)
+        {
+            return smsUtils.SendVerifyCode(new SendVerifyCodeModel
+            {
+                PhoneNumber = request.PhoneNumber,
+                TemplateCode = EnumSmsTemplateCode.UpdateUserPhoneNumber
+            });
+        }
     }
 }
diff --git a/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs b/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
index 09bc54c..77000b2 100644
--- a/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
+++ b/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
@@ -21,6 +21,11 @@
         [ErrorCodeItemMetadata("璐﹀彿宸茬鐢�")]
         u1001 = 1001,
         /// <summary>
+        /// 璇ユ墜鏈哄彿宸茶娉ㄥ唽
+        /// </summary>
+        [ErrorCodeItemMetadata("璇ユ墜鏈哄彿宸茶娉ㄥ唽")]
+        u1010 = 1010,
+        /// <summary>
         /// 褰撳墠璐﹀彿鏈粦瀹氬井淇″皬绋嬪簭
         /// </summary>
         [ErrorCodeItemMetadata("褰撳墠璐﹀彿鏈粦瀹氬井淇″皬绋嬪簭")]

--
Gitblit v1.9.1