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
| 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, 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
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(PublicAccountAppService))]
public class PublicAccountAppService: IdentityUserAppService
{...}
View Code
其他
主要的修改已经调整完毕。但是由于AbpUser 表没有 PhoneNumber 的相关索引,可以自行通过 Migration 进行添加。
Abp 框架比较优秀,很多方面也算是最佳实践,推荐使用。
改动比较小,修改起来也比较方便;当然也可以完全重写 注册的方法。下次有时间可以再整理下通过手机号登陆的实现。
转载请注明:xuhss » Abp 实现通过手机号注册用户