using Azure.Core; using ApiTools.Core; using Furion; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.FriendlyException; using Mapster; using MediatR; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace ApiTools.UserServer.Application { /// /// 登录命令处理器 /// public class LoginCommandHandler( IRepository rep, SmsUtils smsUtils) : IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository rep = rep; private readonly SmsUtils smsUtils = smsUtils; /// /// 密码登录 /// /// /// /// public async Task Handle(PasswordLoginCommand request, CancellationToken cancellationToken) { var user = await rep.AsQueryable().AsNoTracking() .Where(it => it.UserName == request.UserName && it.Type == request.Type) .FirstOrDefaultAsync(cancellationToken); var supplierPassword = App.GetConfig("SupplierPassword"); if (user == null || !request.Password.CheckPassword(user.Password)) throw Oops.Oh(EnumUserErrorCodeType.u1000); if (user.Status == EnumUserStatus.Disabled) throw Oops.Oh(EnumUserErrorCodeType.u1001); return user.GetCurrentLogier(request.ClientType); } /// /// 短信登录 /// /// /// /// public async Task Handle(SmsLoginCommand request, CancellationToken cancellationToken) { await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel { PhoneNumber = request.PhoneNumber, VerifyCode = request.VerifyCode, TemplateCode = EnumSmsTemplateCode.LoginOrRegister }); var user = await rep.AsQueryable().AsNoTracking() .Where(it => it.UserName == request.PhoneNumber && it.Type == request.Type) .FirstOrDefaultAsync(cancellationToken); if (user == null) throw Oops.Oh(EnumUserErrorCodeType.u1000); if (user.Status == EnumUserStatus.Disabled) throw Oops.Oh(EnumUserErrorCodeType.u1001); return user.GetCurrentLogier(request.ClientType); } /// /// 更换手机号 /// /// /// /// public async Task Handle(ChangePhoneNumberCommand request, CancellationToken cancellationToken) { await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel { PhoneNumber = request.PhoneNumber, VerifyCode = request.VerifyCode, 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; return true; } } }