FlexJobApi.Core/Models/UserServer/Auths/Commands/ChangePhoneNumberCommand.cs
File was renamed from FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs @@ -1,6 +1,7 @@ using 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; } } } 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; } } } FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cscopy from FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs copy to FlexJobApi.Core/Models/UserServer/Auths/Commands/RegisterPersonalUserCommand.cs
File was copied from FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs @@ -1,6 +1,7 @@ using 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; } } } FlexJobApi.Core/Models/UserServer/Auths/Commands/UpdatePhoneNumberVerifyCodeCommand.cs
New file @@ -0,0 +1,24 @@ using 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; } } } 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() }; } } 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 }); } } } FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
@@ -21,6 +21,11 @@ [ErrorCodeItemMetadata("账号已禁用")] u1001 = 1001, /// <summary> /// 该手机号已被注册 /// </summary> [ErrorCodeItemMetadata("该手机号已被注册")] u1010 = 1010, /// <summary> /// 当前账号未绑定微信小程序 /// </summary> [ErrorCodeItemMetadata("当前账号未绑定微信小程序")]