Abp 实现通过手机号注册用户

虚幻大学 xuhss 439℃ 0评论

Python微信订餐小程序课程视频

https://blog.csdn.net/m0_56069948/article/details/122285951

Python实战量化交易理财系统

https://blog.csdn.net/m0_56069948/article/details/122285941

前言

Abp 的 Identity 模块,实现了用户的管理,但是对于国内来讲,很多场景不能很好适配。比如:通过手机号进行注册的场景。

Abp vnext Identity 以及 asp.net core identity 默认只有 Email 必填以及唯一的校验,缺少手机号必要的校验;对此我们需要进行适当的调整,以作适配。

准备

建议先参考 IdentityUserAppService 对用户注册的实现;

由于手机号验证的场景基本上是需要的,所以本次采用重写的方式,当然也可以参考其代码,自定义自己的实现。

Application

+ View Code?

| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | public class PublicAccountAppService: IdentityUserAppService{public PublicAccountAppService(IdentityUserManager userManager,IIdentityUserRepository userRepository,IIdentityRoleRepository roleRepository,IOptions identityOptions) : base(userManager, userRepository, roleRepository, identityOptions){ } public override async Task CreateAsync(IdentityUserCreateDto input){ValidateRegisterInput(input);await CheckRegisterableByPhone(input.PhoneNumber);return await base.CreateAsync(input);} private static void ValidateRegisterInput(IdentityUserCreateDto input){if (input.PhoneNumber.IsNullOrWhiteSpace()){throw new AbpValidationException("Phone number is required for new users!",new List{new ValidationResult("Phone number can not be empty!",new []{"PhoneNumber"})});}} private async Task CheckRegisterableByPhone(string phoneNumber){var isPhoneNumberExist = await _accountRepository.IsPhoneNumberExistAsync(phoneNumber);if (isPhoneNumberExist){throw new AbpValidationException("Phone number already exist!",new List{new ValidationResult("Phone number already exist!",new []{"PhoneNumber"})});}}} |

  

Domain

由于 IIdentityUserRepository 缺少对手机号是否存在的默认实现,我们可以新增对应Repository 来实现相关功能。

尽量遵守DDD 分层的原则。

997dd8bb321b54e4b127e881915b1238 - Abp 实现通过手机号注册用户070b14fc581241fb6d1b9bad1165ab8a - Abp 实现通过手机号注册用户

1  public interface IAccountRepository
2  {
3         Task<bool> IsPhoneNumberExistAsync(string phoneNumber);
4     }

View Code

Repository

实现Domain 层定义的接口

24fe0a0cba35044545d04630d1349f4c - Abp 实现通过手机号注册用户2175026d1896897c7a3758b4068e9998 - Abp 实现通过手机号注册用户

 1  public class AccountRepository: IAccountRepository, ITransientDependency
 2  {
 3         private readonly IRepository \_identityUserRepository;
 4 
 5 public AccountRepository(IRepository identityUserRepository)
 6  {
 7 \_identityUserRepository = identityUserRepository;
 8  }
 9 
10 public async Task<bool> IsPhoneNumberExistAsync(string phoneNumber)
11  {
12 return await \_identityUserRepository.AnyAsync(
13 c => c.PhoneNumber == phoneNumber);
14  }
15 }

View Code

替换默认实例

我们已经完成了对 IdentityUserAppService 创建方法的重写,需要替换默认的接口实例对象,可以参考 Customizing Application Modules Overriding Services | Documentation Center | ABP.IO

770e85cfa72d7adb009700d0fd83816d - Abp 实现通过手机号注册用户6aa8349f5b1409de7701fa8da95e46dd - Abp 实现通过手机号注册用户

    [Dependency(ReplaceServices = true)]
 [ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(PublicAccountAppService))]
 public class PublicAccountAppService: IdentityUserAppService
 {...}

View Code

其他

主要的修改已经调整完毕。但是由于AbpUser 表没有 PhoneNumber 的相关索引,可以自行通过 Migration 进行添加。

Abp 框架比较优秀,很多方面也算是最佳实践,推荐使用。

改动比较小,修改起来也比较方便;当然也可以完全重写 注册的方法。下次有时间可以再整理下通过手机号登陆的实现。

转载请注明:xuhss » Abp 实现通过手机号注册用户

喜欢 (0)

您必须 登录 才能发表评论!