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