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 分层的原则。
1 public interface IAccountRepository
2 {
3 Task<bool> IsPhoneNumberExistAsync(string phoneNumber);
4 }
View Code
Repository
实现Domain 层定义的接口
1 public class AccountRepository: IAccountRepository, ITransientDependency2 {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
[Dependency(ReplaceServices = true)][ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(PublicAccountAppService))]public class PublicAccountAppService: IdentityUserAppService{...}
View Code
其他
主要的修改已经调整完毕。但是由于AbpUser 表没有 PhoneNumber 的相关索引,可以自行通过 Migration 进行添加。
Abp 框架比较优秀,很多方面也算是最佳实践,推荐使用。
改动比较小,修改起来也比较方便;当然也可以完全重写 注册的方法。下次有时间可以再整理下通过手机号登陆的实现。