From 1ed646654c13e57e452e31e60331e0bfafa8a026 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 11 八月 2025 13:52:49 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Web.Entry/Startup.cs                                             |    1 
 FlexJobApi.Core/FlexJobApi.Core.xml                                         |   20 +++++
 FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs |   58 ++++++++++++++
 FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml     |   24 ++++++
 FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs     |   73 ++++++++++++++++++
 FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs                  |   16 ++++
 FlexJobApi.Core/FlexJobApi.Core.csproj                                      |    1 
 7 files changed, 193 insertions(+), 0 deletions(-)

diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj
index b34761c..e622fd7 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.csproj
+++ b/FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -26,6 +26,7 @@
 		<PackageReference Include="MediatR" Version="13.0.0" />
 		<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.7" />
 		<PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
+		<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="9.0.3" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 9f5194c..5946ca1 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -3911,6 +3911,26 @@
             楠岃瘉鐮�
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.BindWxmpUserInfoCommand">
+            <summary>
+            缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.EncryptedData">
+            <summary>
+            鍖呮嫭鏁忔劅鏁版嵁鍦ㄥ唴鐨勫畬鏁寸敤鎴蜂俊鎭殑鍔犲瘑鏁版嵁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.Iv">
+            <summary>
+            鍔犲瘑绠楁硶鐨勫垵濮嬪悜閲�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.SessionKey">
+            <summary>
+            鑾峰彇浼氳瘽瀵嗛挜
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.PasswordLoginCommand">
             <summary>
             瀵嗙爜鐧诲綍
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs
new file mode 100644
index 0000000..1f3bb6b
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs
@@ -0,0 +1,58 @@
+锘縰sing 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 BindWxmpUserInfoCommand : IRequest<LoginCommandCallback>
+    {
+        /// <summary>
+        /// 鍖呮嫭鏁忔劅鏁版嵁鍦ㄥ唴鐨勫畬鏁寸敤鎴蜂俊鎭殑鍔犲瘑鏁版嵁
+        /// </summary>
+        [Required]
+        public string EncryptedData { get; set; }
+
+        /// <summary>
+        /// 鍔犲瘑绠楁硶鐨勫垵濮嬪悜閲�
+        /// </summary>
+        [Required]
+        public string Iv { get; set; }
+
+        /// <summary>
+        /// 鑾峰彇浼氳瘽瀵嗛挜
+        /// </summary>
+        [Required]
+        public string SessionKey { get; set; }
+    }
+
+    public class BindWxmpUserInfoCommandEncryptedData
+    {
+        public string OpenId { get; set; }
+
+        public string PhoneNumber { get; set; }
+
+        public string NickName { get; set; }
+
+        public int Gender { get; set; }
+
+        public string Language { get; set; }
+
+        public string City { get; set; }
+
+        public string Province { get; set; }
+
+        public string Country { get; set; }
+
+        public string AvatarUrl { get; set; }
+
+        public string CountryCode { get; set; }
+    }
+}
diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
index 2bcd723..71a666a 100644
--- a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
@@ -9,6 +9,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Cryptography;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -24,6 +25,7 @@
         IRequestHandler<PasswordLoginCommand, LoginCommandCallback>,
         IRequestHandler<SmsLoginCommand, LoginCommandCallback>,
         IRequestHandler<WxmpLoginCommand, LoginCommandCallback>,
+        IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>,
         IRequestHandler<BindPhoneNumberCommand, bool>
     {
         private readonly IRepository<User> rep = rep;
@@ -143,6 +145,77 @@
         }
 
         /// <summary>
+        /// 缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task<LoginCommandCallback> Handle(BindWxmpUserInfoCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var user = await rep.AsQueryable()
+                .Where(it => it.Type == logier.Type && it.Id == logier.Id)
+                .FirstOrDefaultAsync(cancellationToken);
+            if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿");
+            if (user.WxmpOpenId.IsNull()) throw Oops.Oh(EnumUserErrorCodeType.u1100);
+
+            if (user.PhoneNumber.IsNull())
+            {
+                var result = string.Empty;
+                RijndaelManaged rijalg = new RijndaelManaged();
+                rijalg.KeySize = 128;
+                rijalg.Padding = PaddingMode.PKCS7;
+                rijalg.Mode = CipherMode.CBC;
+                rijalg.Key = Convert.FromBase64String(request.SessionKey);
+                rijalg.IV = Convert.FromBase64String(request.Iv);
+                byte[] encryptedData = Convert.FromBase64String(request.EncryptedData);
+                ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
+                using (MemoryStream msDecrypt = new MemoryStream(encryptedData))
+                {
+                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
+                    {
+                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
+                        {
+                            result = srDecrypt.ReadToEnd();
+                        }
+                    }
+                }
+                var info = result.JsonTo<BindWxmpUserInfoCommandEncryptedData>();
+                if (info == null || info.PhoneNumber.IsNull())
+                {
+                    throw Oops.Oh(EnumUserErrorCodeType.u1110);
+                }
+
+                var bindPhoneNumberUser = await rep.AsQueryable()
+                    .Where(it => it.Type == logier.Type && it.PhoneNumber == info.PhoneNumber && it.Id != user.Id)
+                    .FirstOrDefaultAsync(cancellationToken);
+                if (bindPhoneNumberUser == null)
+                {
+                    user.PhoneNumber = info.PhoneNumber;
+                    user.ContactPhoneNumber = info.PhoneNumber;
+                    user.IsCheckPhoneNumber = true;
+
+                    if (user.UserName == user.WxmpOpenId)
+                    {
+                        user.UserName = info.PhoneNumber;
+                    }
+                }
+                else if (bindPhoneNumberUser.WxmpOpenId.IsNull())
+                {
+                    bindPhoneNumberUser.WxmpOpenId = user.WxmpOpenId;
+                    await rep.DeleteAsync(user);
+                    return GetCurrentLogier(bindPhoneNumberUser, EnumClientType.Wxmp);
+                }
+                else if (bindPhoneNumberUser.WxmpOpenId != user.WxmpOpenId)
+                {
+                    throw Oops.Oh(EnumUserErrorCodeType.u1120);
+                }
+            }
+            return GetCurrentLogier(user, EnumClientType.Wxmp);
+        }
+
+        /// <summary>
         /// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
         /// </summary>
         /// <param name="user"></param>
diff --git a/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs b/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
index 3a48188..09bc54c 100644
--- a/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
+++ b/FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
@@ -20,6 +20,22 @@
         /// </summary>
         [ErrorCodeItemMetadata("璐﹀彿宸茬鐢�")]
         u1001 = 1001,
+        /// <summary>
+        /// 褰撳墠璐﹀彿鏈粦瀹氬井淇″皬绋嬪簭
+        /// </summary>
+        [ErrorCodeItemMetadata("褰撳墠璐﹀彿鏈粦瀹氬井淇″皬绋嬪簭")]
+        u1100 = 1100,
+        /// <summary>
+        /// 鎵嬫満鎺堟潈澶辫触
+        /// </summary>
+        [ErrorCodeItemMetadata("鎵嬫満鎺堟潈澶辫触")]
+        u1110 = 1110,
+        /// <summary>
+        /// 宸叉湁鍏朵粬寰俊缁戝畾璇ユ墜鏈哄彿
+        /// </summary>
+        [ErrorCodeItemMetadata("宸叉湁鍏朵粬寰俊缁戝畾璇ユ墜鏈哄彿")]
+        u1120 = 1120,
+
 
     }
 }
diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
index 5ec45ad..5dd1cce 100644
--- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
+++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -46,6 +46,15 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.BindWxmpUserInfoCommand,System.Threading.CancellationToken)">
+            <summary>
+            缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+            <exception cref="T:System.NotImplementedException"></exception>
+        </member>
         <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType)">
             <summary>
             鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
@@ -200,6 +209,21 @@
             璐﹀彿宸茬鐢�
             </summary>
         </member>
+        <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1100">
+            <summary>
+            褰撳墠璐﹀彿鏈粦瀹氬井淇″皬绋嬪簭
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1110">
+            <summary>
+            鎵嬫満鎺堟潈澶辫触
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1120">
+            <summary>
+            宸叉湁鍏朵粬寰俊缁戝畾璇ユ墜鏈哄彿
+            </summary>
+        </member>
         <member name="T:FlexJobApi.UserServer.Application.DeleteMenuCommandHandler">
             <summary>
             鍒犻櫎鑿滃崟
diff --git a/FlexJobApi.Web.Entry/Startup.cs b/FlexJobApi.Web.Entry/Startup.cs
index 21d2a78..1606c03 100644
--- a/FlexJobApi.Web.Entry/Startup.cs
+++ b/FlexJobApi.Web.Entry/Startup.cs
@@ -62,6 +62,7 @@
                 options.OperationFilter<CustomOperationIdFilter>();
                 options.SchemaFilter<EnumSchemaFilter>();
             });
+            services.AddSwaggerGenNewtonsoftSupport();
 
             services.AddControllers()
                     .AddNewtonsoftJson(options =>

--
Gitblit v1.9.1