From 345de08ba60e93aa448083cf70ccccbd4cfdd0e3 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期五, 08 八月 2025 17:08:27 +0800 Subject: [PATCH] pref:优化 --- FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs | 49 ++++++++ FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs | 40 ++++++ FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs | 4 FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs | 2 FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs | 17 ++ FlexJobApi.Web.Entry/appsettings.json | 16 ++ FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs | 5 FlexJobApi.Core/FlexJobApiCoreStartup.cs | 1 FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs | 11 + FlexJobApi.Core/FlexJobApi.Core.xml | 60 +++++++++ FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs | 4 FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs | 26 ++++ FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml | 18 ++ FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs | 77 ++++++++++++ 14 files changed, 313 insertions(+), 17 deletions(-) diff --git a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs index 31eede6..9fb8daf 100644 --- a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs +++ b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs @@ -16,6 +16,11 @@ [ErrorCodeItemMetadata("{0}")] s400 = 400, /// <summary> + /// 褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁� + /// </summary> + [ErrorCodeItemMetadata("褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁�")] + s401 = 401, + /// <summary> /// {0}涓嶅瓨鍦� /// </summary> [ErrorCodeItemMetadata("{0}涓嶅瓨鍦�")] diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml index f2b9a20..89bf13e 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.xml +++ b/FlexJobApi.Core/FlexJobApi.Core.xml @@ -1749,6 +1749,11 @@ 鍙傛暟閿欒 </summary> </member> + <member name="F:FlexJobApi.Core.EnumErrorCodeType.s401"> + <summary> + 褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁� + </summary> + </member> <member name="F:FlexJobApi.Core.EnumErrorCodeType.s404"> <summary> {0}涓嶅瓨鍦� @@ -3355,27 +3360,27 @@ 鎺ㄨ崘鐘舵�� </summary> </member> - <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.Count"> + <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.ObjectData"> <summary> 缁熻 </summary> </member> - <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.WaitAssignCount"> + <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.WaitAssignCount"> <summary> 寰呭畨鎺掓暟閲� </summary> </member> - <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.CompletedAssignCount"> + <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.CompletedAssignCount"> <summary> 宸插畨鎺掓暟閲� </summary> </member> - <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.InProcessReleaseCount"> + <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.InProcessReleaseCount"> <summary> 鍙戝竷涓暟閲� </summary> </member> - <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.StoppedReleaseCount"> + <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.StoppedReleaseCount"> <summary> 宸插仠姝㈡暟閲� </summary> @@ -3529,6 +3534,21 @@ <param name="logier"></param> <returns></returns> </member> + <member name="T:FlexJobApi.Core.BindPhoneNumberCommand"> + <summary> + 缁戝畾鎵嬫満鍙� + </summary> + </member> + <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.PhoneNumber"> + <summary> + 鎵嬫満鍙风爜 + </summary> + </member> + <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.VerifyCode"> + <summary> + 楠岃瘉鐮� + </summary> + </member> <member name="T:FlexJobApi.Core.PasswordLoginCommand"> <summary> 瀵嗙爜鐧诲綍 @@ -3612,6 +3632,11 @@ <member name="P:FlexJobApi.Core.WxmpLoginCommand.Code"> <summary> 鐢ㄦ埛鐧诲綍鍑瘉 + </summary> + </member> + <member name="P:FlexJobApi.Core.WxmpLoginCommand.Type"> + <summary> + 鐢ㄦ埛绫诲瀷 </summary> </member> <member name="T:FlexJobApi.Core.GetAliyunOSSAcsQuery"> @@ -6257,6 +6282,31 @@ <param name="singularName"></param> <returns></returns> </member> + <member name="T:FlexJobApi.Core.WxmpOptions"> + <summary> + 寰俊灏忕▼搴忛厤缃� + </summary> + </member> + <member name="P:FlexJobApi.Core.WxmpOptionsItem.Code"> + <summary> + 缂栧彿 + </summary> + </member> + <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppId"> + <summary> + 灏忕▼搴廔D + </summary> + </member> + <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppSecret"> + <summary> + 灏忕▼搴忓瘑閽� + </summary> + </member> + <member name="T:FlexJobApi.Core.WxmpUtils"> + <summary> + 寰俊灏忕▼搴忓伐鍏� + </summary> + </member> <member name="T:FlexJobApi.Core.XmlDoc"> <summary> 娉ㄩ噴鏂囨。 diff --git a/FlexJobApi.Core/FlexJobApiCoreStartup.cs b/FlexJobApi.Core/FlexJobApiCoreStartup.cs index dcc3bed..de3bf71 100644 --- a/FlexJobApi.Core/FlexJobApiCoreStartup.cs +++ b/FlexJobApi.Core/FlexJobApiCoreStartup.cs @@ -52,6 +52,7 @@ services.AddHttpRemote(); services.AddSingleton<ResourceHttpUtils>(); services.AddSingleton<AliyunSmsUtils>(); + services.AddSingleton<WxmpUtils>(); services.AddScoped<SmsUtils>(); services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(App.Assemblies.ToArray())); diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs index 0c3cea9..61955a8 100644 --- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs @@ -79,10 +79,10 @@ /// <summary> /// 缁熻 /// </summary> - public GetTaskInfosQueryResultCount Count { get; set; } + public GetTaskInfosQueryResultObjectData ObjectData { get; set; } } - public class GetTaskInfosQueryResultCount + public class GetTaskInfosQueryResultObjectData { /// <summary> /// 寰呭畨鎺掓暟閲� diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs new file mode 100644 index 0000000..edb04bd --- /dev/null +++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs @@ -0,0 +1,26 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 缁戝畾鎵嬫満鍙� + /// </summary> + [Resource([EnumResourceController.Auth])] + public class BindPhoneNumberCommand : IRequest<bool> + { + /// <summary> + /// 鎵嬫満鍙风爜 + /// </summary> + public string PhoneNumber { get; set; } + + /// <summary> + /// 楠岃瘉鐮� + /// </summary> + public string VerifyCode { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs index be2f9b2..f1d6aa7 100644 --- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs +++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs @@ -17,13 +17,11 @@ /// <summary> /// 鎵嬫満鍙风爜 /// </summary> - [Required] public string PhoneNumber { get; set; } /// <summary> /// 楠岃瘉鐮� /// </summary> - [Required] public string VerifyCode { get; set; } /// <summary> diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs index 8ce3492..70f9933 100644 --- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs +++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs @@ -1,4 +1,5 @@ -锘縰sing System; +锘縰sing MediatR; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -10,12 +11,18 @@ /// <summary> /// 寰俊灏忕▼搴忕櫥褰� /// </summary> - public class WxmpLoginCommand + [Resource([EnumResourceController.Auth], AllowAnonymous = true)] + public class WxmpLoginCommand : IRequest<LoginCommandCallback> { /// <summary> /// 鐢ㄦ埛鐧诲綍鍑瘉 /// </summary> [Required] public string Code { get; set; } + + /// <summary> + /// 鐢ㄦ埛绫诲瀷 + /// </summary> + public EnumUserType Type { get; set; } } } diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs new file mode 100644 index 0000000..0e60ecf --- /dev/null +++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs @@ -0,0 +1,40 @@ +锘縰sing Furion.ConfigurableOptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 寰俊灏忕▼搴忛厤缃� + /// </summary> + public class WxmpOptions : IConfigurableOptions + { + public WxmpOptions() + { + Items = []; + } + + public List<WxmpOptionsItem> Items { get; set; } + } + + public class WxmpOptionsItem + { + /// <summary> + /// 缂栧彿 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 灏忕▼搴廔D + /// </summary> + public string AppId { get; set; } + + /// <summary> + /// 灏忕▼搴忓瘑閽� + /// </summary> + public string AppSecret { get; set; } + } +} diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs new file mode 100644 index 0000000..7080916 --- /dev/null +++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs @@ -0,0 +1,17 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + public class WxmpSnsJscode2sessionCallback + { + public string session_key { get; set; } + public string unionid { get; set; } + public string errmsg { get; set; } + public string openid { get; set; } + public int errcode { get; set; } + } +} diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs new file mode 100644 index 0000000..0a200da --- /dev/null +++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs @@ -0,0 +1,49 @@ +锘縰sing Furion.FriendlyException; +using Furion.HttpRemote; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 寰俊灏忕▼搴忓伐鍏� + /// </summary> + public class WxmpUtils + { + private readonly IOptions<WxmpOptions> options; + private readonly IHttpRemoteService httpRemoteService; + + public WxmpUtils( + IOptions<WxmpOptions> options, + IHttpRemoteService httpRemoteService) + { + this.options = options; + this.httpRemoteService = httpRemoteService; + } + + public async Task<WxmpSnsJscode2sessionCallback> SnsJscode2sessionAsync(EnumUserType userType, string code, CancellationToken cancellationToken = default) + { + var option = options.Value.Items.FirstOrDefault(it => it.Code == userType.ToString()); + if (option == null || option.AppId.IsNull() || option.AppSecret.IsNull()) + throw Oops.Oh(EnumErrorCodeType.s400, "鐧诲綍澶辫触锛岀己澶遍厤缃細WxmpOptions"); + if (code.IsNull()) + throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐橶xmpCode"); + var callback = await httpRemoteService.GetAsAsync<WxmpSnsJscode2sessionCallback>("https://api.weixin.qq.com/sns/jscode2session", + builder => builder.WithQueryParameters(new Dictionary<string, string> + { + { "appid", option.AppId }, + { "secret", option.AppSecret }, + { "js_code", code }, + { "grant_type", "authorization_code" } + })); + if (callback == null || callback.errcode != 0) + throw Oops.Oh(EnumErrorCodeType.s510, $"鐧诲綍澶辫触锛歿callback.errmsg}锛岃鑱旂郴绠$悊鍛�"); + return callback; + } + } +} diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs index ef10f33..8c9427a 100644 --- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs @@ -82,7 +82,7 @@ q = q.Where(it => it.GenderLimit == request.GenderLimit); } - var count = new GetTaskInfosQueryResultCount + var count = new GetTaskInfosQueryResultObjectData { WaitAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Wait), CompletedAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Complete), @@ -141,7 +141,7 @@ SettlementStatus = t.SettlementStatus }; var result = await request.PageModel.GetPagedListAsync<GetTaskInfosQueryResult, GetTaskInfosQueryResultItem>(s, cancellationToken); - result.Count = count; + result.ObjectData = count; return result; } } diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs index dad1665..11c64e3 100644 --- a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs @@ -19,12 +19,16 @@ /// </summary> public class LoginCommandHandler( IRepository<User> rep, - SmsUtils smsUtils) : + SmsUtils smsUtils, + WxmpUtils wxmpUtils) : IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, - IRequestHandler<SmsLoginCommand, LoginCommandCallback> + IRequestHandler<SmsLoginCommand, LoginCommandCallback>, + IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, + IRequestHandler<BindPhoneNumberCommand, bool> { private readonly IRepository<User> rep = rep; private readonly SmsUtils smsUtils = smsUtils; + private readonly WxmpUtils wxmpUtils = wxmpUtils; /// <summary> /// 瀵嗙爜鐧诲綍 @@ -62,6 +66,19 @@ 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) @@ -70,6 +87,62 @@ } /// <summary> + /// 寰俊灏忕▼搴忕櫥褰� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<LoginCommandCallback> Handle(WxmpLoginCommand request, CancellationToken cancellationToken) + { + var snsJscode2session = await wxmpUtils.SnsJscode2sessionAsync(request.Type, request.Code, cancellationToken); + var user = await rep.AsQueryable().AsNoTracking() + .Where(it => it.WxmpOpenId == snsJscode2session.openid && it.Type == request.Type) + .FirstOrDefaultAsync(cancellationToken); + if (user == null && request.Type == EnumUserType.Personal) + { + user = new User + { + Type = request.Type, + UserName = snsJscode2session.openid, + WxmpOpenId = snsJscode2session.openid, + Level = 1, + Status = EnumUserStatus.Normal + }; + await rep.InsertAsync(user); + } + if (user == null) + throw Oops.Oh(EnumUserErrorCodeType.u1000); + if (user.Status == EnumUserStatus.Disabled) + throw Oops.Oh(EnumUserErrorCodeType.u1001); + return GetCurrentLogier(user, EnumClientType.Wxmp); + } + + /// <summary> + /// 缁戝畾鎵嬫満鍙� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken) + { + await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel + { + PhoneNumber = request.PhoneNumber, + VerifyCode = request.VerifyCode, + TemplateCode = EnumSmsTemplateCode.LoginOrRegister + }); + var logier = JwtUtils.GetCurrentLogier(); + var user = await rep.AsQueryable() + .FirstOrDefaultAsync(it => it.Id == logier.Id); + if (user == null) + throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿涓嶅瓨鍦�"); + user.UserName = request.PhoneNumber; + user.PhoneNumber = request.PhoneNumber; + user.IsCheckPhoneNumber = true; + return true; + } + + /// <summary> /// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛 /// </summary> /// <param name="user"></param> diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml index dd027d8..d61e627 100644 --- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml +++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml @@ -9,7 +9,7 @@ 鐧诲綍鍛戒护澶勭悊鍣� </summary> </member> - <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils)"> + <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils,FlexJobApi.Core.WxmpUtils)"> <summary> 鐧诲綍鍛戒护澶勭悊鍣� </summary> @@ -30,6 +30,22 @@ <param name="cancellationToken"></param> <returns></returns> </member> + <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.WxmpLoginCommand,System.Threading.CancellationToken)"> + <summary> + 寰俊灏忕▼搴忕櫥褰� + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.BindPhoneNumberCommand,System.Threading.CancellationToken)"> + <summary> + 缁戝畾鎵嬫満鍙� + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType)"> <summary> 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛 diff --git a/FlexJobApi.Web.Entry/appsettings.json b/FlexJobApi.Web.Entry/appsettings.json index 02ec129..f265ac3 100644 --- a/FlexJobApi.Web.Entry/appsettings.json +++ b/FlexJobApi.Web.Entry/appsettings.json @@ -16,6 +16,20 @@ "Access": "Redis", "Configuration": "118.178.252.28:5390,password=Bole123!" }, + "Wxmp": { + "Items": [ + { + "Code": "Personal", + "AppId": "wxb9e0baf4f87aa0de", + "AppSecret": "24abded2cd32b677b1f14ea9ec5767f0" + }, + { + "Code": "Enterprise", + "AppId": "wx3669dd12a0915f7d ", + "AppSecret": "c03a62ad6822f1c925532c34183e7f7f" + } + ] + }, "Aliyun": { "OSS": { "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS", @@ -31,7 +45,7 @@ } }, "SMS": { - "Enable": false, + "Enable": true, "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H", "AccessSecret": "TEHSXK6f6Njg0v0MSFkrjURofdjuKQ", "Version": "2017-05-25", -- Gitblit v1.9.1