You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
297 lines
13 KiB
297 lines
13 KiB
using BaseService.BaseData;
|
|
using BaseService.Systems.UserManagement.Dto;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading.Tasks;
|
|
using Volo.Abp.Application.Dtos;
|
|
using Volo.Abp.Application.Services;
|
|
using Volo.Abp.Authorization.Permissions;
|
|
using Volo.Abp.Domain.Repositories;
|
|
using Volo.Abp.Identity;
|
|
using Volo.Abp.ObjectExtending;
|
|
using Volo.Abp.PermissionManagement;
|
|
using Volo.Abp.Users;
|
|
|
|
namespace BaseService.Systems.UserManagement
|
|
{
|
|
[Authorize(IdentityPermissions.Users.Default)]
|
|
public class UserAppService : ApplicationService, IUserAppService
|
|
{
|
|
protected IdentityUserManager UserManager { get; }
|
|
protected IIdentityUserRepository UserRepository { get; }
|
|
|
|
/// <summary>
|
|
/// 权限列表
|
|
/// </summary>
|
|
protected IPermissionGrantRepository PermissionGrantRepository { get; }
|
|
public IIdentityRoleRepository RoleRepository { get; }
|
|
private readonly IRepository<Organization, Guid> _orgRepository;
|
|
private readonly IRepository<UserJob> _userJobsRepository;
|
|
private readonly IRepository<UserOrganization> _userOrgsRepository;
|
|
private readonly IConfiguration _config;
|
|
|
|
public UserAppService(
|
|
IdentityUserManager userManager,
|
|
IIdentityUserRepository userRepository,
|
|
IIdentityRoleRepository roleRepository,
|
|
IRepository<Organization, Guid> orgRepository,
|
|
IRepository<UserJob> userJobsRepository,
|
|
IConfiguration config,
|
|
IRepository<UserOrganization> userOrgsRepository
|
|
)
|
|
{
|
|
UserManager = userManager;
|
|
UserRepository = userRepository;
|
|
RoleRepository = roleRepository;
|
|
_orgRepository = orgRepository;
|
|
_userJobsRepository = userJobsRepository;
|
|
_userOrgsRepository = userOrgsRepository;
|
|
_config = config;
|
|
}
|
|
|
|
#region 新增方法
|
|
/// <summary>
|
|
/// 获取当前登录用户信息
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[AllowAnonymous]
|
|
public async Task<IdentityUserDto> GetCurrentUserAsync()
|
|
{
|
|
var id = CurrentUser.GetId();
|
|
var currentUser = await UserManager.GetByIdAsync(id);
|
|
var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(currentUser);
|
|
|
|
return dto;
|
|
}
|
|
/// <summary>
|
|
/// 重置密码功能
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <returns></returns>
|
|
// [Authorize(IdentityPermissions.Users.Update)]
|
|
public async Task<IdentityUserDto> ResetPasswordAsync(Guid userId)
|
|
{
|
|
var user = await UserManager.FindByIdAsync(userId.ToString());
|
|
string repastword = _config["RePassword"];
|
|
//string token = await UserManager.GeneratePasswordResetTokenAsync(user);//err:No IUserTwoFactorTokenProvider<TUser> named 'Default' is registered.
|
|
//await UserManager.ResetPasswordAsync(user, token, "1q2w3E*");
|
|
await UserManager.RemovePasswordAsync(user);
|
|
if (user.PasswordHash == null)
|
|
{
|
|
(await UserManager.AddPasswordAsync(user, repastword)).CheckErrors();
|
|
}
|
|
var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
|
|
|
|
return dto;
|
|
}
|
|
/// <summary>
|
|
/// 根据用户ID,获取当前登录用户的所有权限信息,带角色名称
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <returns></returns>
|
|
protected virtual async Task<List<PermissionGrant>> GetUserGrantedPermissionsAsync(Guid userId)
|
|
{
|
|
var listPermiss = new List<PermissionGrant>();
|
|
var listRolesName = await UserRepository.GetRoleNamesAsync(userId);
|
|
if (listRolesName != null)
|
|
{
|
|
foreach (var rolename in listRolesName)
|
|
{
|
|
var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync(RolePermissionValueProvider.ProviderName, rolename);
|
|
if (permissionGrantsInRole != null)
|
|
{
|
|
foreach (var permiss in permissionGrantsInRole)
|
|
{
|
|
listPermiss.Add(permiss);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return listPermiss;
|
|
}
|
|
|
|
#endregion
|
|
|
|
public async Task<BaseIdentityUserDto> Get(Guid id)
|
|
{
|
|
var dto = ObjectMapper.Map<IdentityUser, BaseIdentityUserDto>(await UserManager.GetByIdAsync(id));
|
|
var jobIds = await (await _userJobsRepository.GetQueryableAsync()).Where(_ => _.UserId == id).Select(_ => _.JobId).ToListAsync();
|
|
var orgIds = await (await _userOrgsRepository.GetQueryableAsync()).Where(_ => _.UserId == id).Select(_ => _.OrganizationId).ToListAsync();
|
|
dto.JobIds = jobIds;
|
|
dto.OrganizationIds = orgIds;
|
|
dto.RoleNames = await UserRepository.GetRoleNamesAsync(id);
|
|
|
|
return dto;
|
|
}
|
|
|
|
[Authorize(IdentityPermissions.Users.Create)]
|
|
public async Task<IdentityUserDto> Create(BaseIdentityUserCreateDto input)
|
|
{
|
|
var user = new IdentityUser(
|
|
GuidGenerator.Create(),
|
|
input.UserName,
|
|
input.Email,
|
|
CurrentTenant.Id
|
|
);
|
|
|
|
input.MapExtraPropertiesTo(user);
|
|
|
|
(await UserManager.CreateAsync(user, input.Password)).CheckErrors();
|
|
await UpdateUserByInput(user, input);
|
|
|
|
var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
|
|
|
|
if (input.JobIds != null && input.JobIds.Count > 0)
|
|
{
|
|
foreach (var id in input.JobIds)
|
|
{
|
|
await _userJobsRepository.InsertAsync(new UserJob(CurrentTenant.Id, user.Id, id));
|
|
}
|
|
}
|
|
|
|
if(input.OrganizationIds!=null&& input.OrganizationIds.Count>0)
|
|
{
|
|
foreach (var id in input.OrganizationIds)
|
|
{
|
|
await _userOrgsRepository.InsertAsync(new UserOrganization(CurrentTenant.Id, user.Id, id));
|
|
}
|
|
}
|
|
|
|
await CurrentUnitOfWork.SaveChangesAsync();
|
|
|
|
return dto;
|
|
}
|
|
|
|
[Authorize(IdentityPermissions.Users.Update)]
|
|
public async Task<IdentityUserDto> UpdateAsync(Guid id, BaseIdentityUserUpdateDto input)
|
|
{
|
|
var user = await UserManager.GetByIdAsync(id);
|
|
user.ConcurrencyStamp = input.ConcurrencyStamp;
|
|
|
|
(await UserManager.SetUserNameAsync(user, input.UserName)).CheckErrors();
|
|
|
|
await UpdateUserByInput(user, input);
|
|
input.MapExtraPropertiesTo(user);
|
|
|
|
(await UserManager.UpdateAsync(user)).CheckErrors();
|
|
|
|
if (!input.Password.IsNullOrEmpty())
|
|
{
|
|
(await UserManager.RemovePasswordAsync(user)).CheckErrors();
|
|
(await UserManager.AddPasswordAsync(user, input.Password)).CheckErrors();
|
|
}
|
|
|
|
var dto = ObjectMapper.Map<IdentityUser, IdentityUserDto>(user);
|
|
|
|
await _userJobsRepository.DeleteAsync(_ => _.UserId == id);
|
|
if (input.JobIds != null && input.JobIds.Count > 0)
|
|
{
|
|
foreach (var jid in input.JobIds)
|
|
{
|
|
await _userJobsRepository.InsertAsync(new UserJob(CurrentTenant.Id, id, jid));
|
|
}
|
|
}
|
|
|
|
|
|
await _userOrgsRepository.DeleteAsync(_ => _.UserId == id);
|
|
if (input.OrganizationIds != null && input.OrganizationIds.Count > 0)
|
|
{
|
|
foreach (var oid in input.OrganizationIds)
|
|
{
|
|
await _userOrgsRepository.InsertAsync(new UserOrganization(CurrentTenant.Id, id, oid));
|
|
}
|
|
}
|
|
|
|
await CurrentUnitOfWork.SaveChangesAsync();
|
|
|
|
return dto;
|
|
}
|
|
|
|
public async Task<PagedResultDto<BaseIdentityUserDto>> GetAll(GetBaseIdentityUsersInput input)
|
|
{
|
|
var orgQueryable = await _orgRepository.GetQueryableAsync();
|
|
var userOrgQueryable = await _userOrgsRepository.GetQueryableAsync();
|
|
if (input.OrganizationId.HasValue)
|
|
{
|
|
var userDbSet = await UserRepository.GetDbSetAsync();
|
|
var org = await _orgRepository.GetAsync(input.OrganizationId.Value);
|
|
var orgs = await (await _orgRepository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(org.CascadeId)).ToListAsync();
|
|
|
|
var totalCount = await userOrgQueryable.Where(_ => orgs.Select(o => o.Id).Contains(_.OrganizationId))
|
|
.GroupBy(_ => _.UserId)
|
|
.LongCountAsync();
|
|
|
|
//TODO: Redis Query
|
|
var userIds = await userOrgQueryable.Where(_ => orgs.Select(o => o.Id).Contains(_.OrganizationId))
|
|
.Select(_ => _.UserId)
|
|
.Distinct()
|
|
.Skip(input.SkipCount)
|
|
.Take(input.MaxResultCount)
|
|
.ToListAsync();
|
|
|
|
var items = await userDbSet.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.UserName.Contains(input.Filter))
|
|
.Where(_ => userIds.Contains(_.Id)).ToListAsync();
|
|
var userOrgs = await userOrgQueryable.Where(_ => items.Select(i => i.Id).Contains(_.UserId))
|
|
.ToListAsync();
|
|
var allOrg = await orgQueryable.Where(_ => userOrgs.Select(uo => uo.OrganizationId).Contains(_.Id))
|
|
.OrderBy(_ => _.CascadeId)
|
|
.ToListAsync();
|
|
var dtos = ObjectMapper.Map<List<IdentityUser>, List<BaseIdentityUserDto>>(items);
|
|
|
|
foreach (var dto in dtos)
|
|
{
|
|
var oids = userOrgs.Where(_ => _.UserId == dto.Id).Select(_ => _.OrganizationId);
|
|
dto.OrganizationNames = string.Join(", ", allOrg.Where(_ => oids.Contains(_.Id)).Select(_ => _.Name).ToArray());
|
|
}
|
|
return new PagedResultDto<BaseIdentityUserDto>(totalCount, dtos);
|
|
}
|
|
else
|
|
{
|
|
var totalCount = await UserRepository.GetCountAsync(input.Filter);
|
|
var items = await UserRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter);
|
|
//TODO: Redis Query
|
|
var userOrgs = await userOrgQueryable.Where(_ => items.Select(i => i.Id).Contains(_.UserId))
|
|
.ToListAsync();
|
|
var orgs = await orgQueryable.Where(_ => userOrgs.Select(uo => uo.OrganizationId).Contains(_.Id))
|
|
.OrderBy(_ => _.CascadeId)
|
|
.ToListAsync();
|
|
var dtos = ObjectMapper.Map<List<IdentityUser>, List<BaseIdentityUserDto>>(items);
|
|
foreach (var dto in dtos)
|
|
{
|
|
var oids = userOrgs.Where(_ => _.UserId == dto.Id).Select(_ => _.OrganizationId);
|
|
dto.OrganizationNames = string.Join(", ", orgs.Where(_ => oids.Contains(_.Id)).Select(_ => _.Name).ToArray());
|
|
}
|
|
return new PagedResultDto<BaseIdentityUserDto>(totalCount, dtos);
|
|
}
|
|
}
|
|
|
|
protected virtual async Task UpdateUserByInput(IdentityUser user, IdentityUserCreateOrUpdateDtoBase input)
|
|
{
|
|
if (!string.Equals(user.Email, input.Email, StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
(await UserManager.SetEmailAsync(user, input.Email)).CheckErrors();
|
|
}
|
|
|
|
if (!string.Equals(user.PhoneNumber, input.PhoneNumber, StringComparison.InvariantCultureIgnoreCase))
|
|
{
|
|
(await UserManager.SetPhoneNumberAsync(user, input.PhoneNumber)).CheckErrors();
|
|
}
|
|
|
|
(await UserManager.SetLockoutEnabledAsync(user, input.LockoutEnabled)).CheckErrors();
|
|
|
|
user.Name = input.Name;
|
|
user.Surname = input.Surname;
|
|
|
|
if (input.RoleNames != null)
|
|
{
|
|
(await UserManager.SetRolesAsync(user, input.RoleNames)).CheckErrors();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|