业务背景:
我的需求是现在有个微信公众号程序,用户会在那里注册用户,然后我想要当前注册的用户名字(电话号码)默认创建一个租户,然后这个用户默认是这个租户的超级管理员。
经过各种试错和查询,具体业务流程应该是如此:先拿用户提交的电话号码或者用户名啥的作为租户名称创建租户(必须要让这个过程有独立的事物,不然他不能提前执行得到租户id),这时候系统已经完成了租户创建,默认管理员账户admin和默认管理角色admin的创建,并且账户admin默认是绑定管理员角色。
然后拿着租户id,用用户提交的用户信息新建一个用户,隶属于当前租户,角色隶属于新建的管理员角色。最后再给自己新建的用户业务扩展表也增加一条相同用户ID的数据。
下面直接上代码
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using JQ.TAHM.Domain.Shared;
using JQ.TAHM.Domain;
using JQ.TAHM.Application.Contracts;
using Volo.Abp.Users;
using Volo.Abp.Identity;
using Volo.Abp.Data;
using System.Transactions;
using Volo.Abp.TenantManagement;
using Volo.Abp.ObjectExtending;
using Microsoft.AspNetCore.Identity;
using Senparc.NeuChar.Helpers;
using Volo.Abp.Uow;
using IdentityRole = Volo.Abp.Identity.IdentityRole;
using JQ.TAHM.BasicManagement.Roles;
using JQ.TAHM.BasicManagement.Roles.Dtos;
using Volo.Abp.MultiTenancy;
namespace JQ.TAHM.Application;
/// <summary>
/// tahmAbpusers_extension
/// </summary>
public class tahmAbpusers_extensionAppService : ApplicationService, ItahmAbpusers_extensionAppService
{
private readonly tahmAbpusers_extensionManager _tahmAbpusersExtensionManager;
private readonly IdentityUserManager _identityUserManager;
private readonly IIdentityUserAppService _identityUserAppService;
//private readonly IIdentityUserRepository _identityuserRepository;
//private readonly ITenantRepository _tenantrepository;
private readonly ITenantManager _tenantmanager;
private readonly ITenantAppService _tenantAppService;
private readonly IIdentityRoleRepository _identityrolerepository;
private readonly IIdentityRoleAppService _identityroleappservice;
private readonly IRoleAppService _iroleappservice;
private readonly IDataFilter _dataFilter;
protected readonly IUnitOfWorkManager _myunitofworkmanager;
public tahmAbpusers_extensionAppService(tahmAbpusers_extensionManager tahmAbpusersExtensionManager, IdentityUserManager identityUserManager, IIdentityUserAppService identityUserAppService, ITenantManager tenantmanager, ITenantAppService tenantAppService, IIdentityRoleRepository identityrolerepository, IIdentityRoleAppService identityroleappservice, IUnitOfWorkManager myunitofworkmanager, IRoleAppService iroleappservice, IDataFilter dataFilter)
{
_tahmAbpusersExtensionManager = tahmAbpusersExtensionManager;
_identityUserManager = identityUserManager;
_identityUserAppService = identityUserAppService;
_tenantmanager = tenantmanager;
_tenantAppService = tenantAppService;
_identityrolerepository = identityrolerepository;
_identityroleappservice = identityroleappservice;
_myunitofworkmanager = myunitofworkmanager;
_iroleappservice = iroleappservice;
_dataFilter = dataFilter;
}
public async Task<tahmAbpusers_extensionDto> CreateOrUpdateAsync(UpdatetahmAbpusers_extensionInput input)
{
tahmAbpusers_extensionDto myabpuserextdto = new tahmAbpusers_extensionDto();
if (input.Id.IsNullOrEmpty())
{
TenantDto mytenant_ret = new TenantDto();
TenantCreateDto tenant_dto = new TenantCreateDto();
tenant_dto.AdminEmailAddress = input.PhoneNumber + "@qq.com";
tenant_dto.AdminPassword = input.PasswordHash;
tenant_dto.Name = input.PhoneNumber;
using (var myuow = _myunitofworkmanager.Begin(requiresNew: true, isTransactional: false))
{
mytenant_ret = await _tenantAppService.CreateAsync(tenant_dto);
//await CurrentUnitOfWork.SaveChangesAsync();
await myuow.CompleteAsync();
}
//上面这一段是使用单独工作单元事物创建租户。
List<IdentityRole> myRoleretList = null;
using (_dataFilter.Disable<IMultiTenant>())
{
//禁用租户过滤条件下取得所有角色表数据。
myRoleretList = await _identityrolerepository.GetListAsync();
}
IdentityRole myrole = null;
//abp封装得比较死,没办法传递租户ID去查询上面创建的租户的角色,所以只能全部查出来再到列表里用linq去查询
myrole = myRoleretList.Where(x => x.TenantId == mytenant_ret.Id).FirstOrDefault();
if (mytenant_ret != null&&!mytenant_ret.Id.IsNullOrEmpty()&& myrole != null)
{
Guid userId = GuidGenerator.Create();
input.TenantId = mytenant_ret.Id.ToString();
Volo.Abp.Identity.IdentityUser myuser = new Volo.Abp.Identity.IdentityUser(userId, input.UserName, input.UserName + "@qq.com", mytenant_ret.Id);
myuser.Surname = input.UserName;
myuser.SetPhoneNumber(input.PhoneNumber, true);
List<IdentityUserRole> myuserroleList= new List<IdentityUserRole>();
myuser.AddRole(myrole.Id); //给已经创建的用户实体加入角色ID
var myretuser = await _identityUserManager.CreateAsync(myuser, input.PasswordHash);
//await _identityUserAppService.UpdateAsync(input.UserId, input.UserInfo);
if (myretuser != null&& myretuser.Succeeded==true)
{
//给用户表加完用户之后同步给自己加的用户扩展表也加一行同样用户ID的数据
myabpuserextdto = await _tahmAbpusersExtensionManager.CreateAsync(
userId,
input.TenantId,
input.UserName,
input.Name,
input.Surname,
input.UserDeptId,
input.UserRoleId,
input.Col1,
input.Col2,
input.Col3,
input.Col4,
input.Col5,
input.Col6,
input.Col7,
input.Col8,
input.Col9,
input.Col10,
input.Col11,
input.Col12,
input.Col13,
input.Col14,
input.Col15,
input.Col16,
input.Col17,
input.Col18,
input.Col19,
input.Col20,
input.PhoneNumber,
input.PasswordHash
);
}
}
}
else
{
myabpuserextdto = await _tahmAbpusersExtensionManager.UpdateAsync(
Guid.Parse(input.Id),
input.TenantId,
input.UserName,
input.Name,
input.Surname,
input.UserDeptId,
input.UserRoleId,
input.Col1,
input.Col2,
input.Col3,
input.Col4,
input.Col5,
input.Col6,
input.Col7,
input.Col8,
input.Col9,
input.Col10,
input.Col11,
input.Col12,
input.Col13,
input.Col14,
input.Col15,
input.Col16,
input.Col17,
input.Col18,
input.Col19,
input.Col20,
input.PhoneNumber,
input.PasswordHash
);
}
return myabpuserextdto;
}
}