调整项目

This commit is contained in:
movingsam 2026-02-21 15:05:37 +08:00
parent fc8fcc7de2
commit df7c7e0717
7 changed files with 44 additions and 32 deletions

View File

@ -14,7 +14,7 @@ public class CreateUserDto
[Required] [Required]
public string RealName { get; set; } = string.Empty; public string RealName { get; set; } = string.Empty;
public string? Phone { get; set; } public string? PhoneNumber { get; set; }
public long? TenantId { get; set; } public long? TenantId { get; set; }

View File

@ -10,5 +10,5 @@ public class RoleDto
public bool IsSystem { get; set; } public bool IsSystem { get; set; }
public List<string>? Permissions { get; set; } public List<string>? Permissions { get; set; }
public int UserCount { get; set; } public int UserCount { get; set; }
public DateTime CreatedAt { get; set; } public DateTimeOffset CreatedAt { get; set; }
} }

View File

@ -11,7 +11,7 @@ public class UpdateUserDto
[Required] [Required]
public string RealName { get; set; } = string.Empty; public string RealName { get; set; } = string.Empty;
public string? Phone { get; set; } public string? PhoneNumber { get; set; }
public bool EmailConfirmed { get; set; } public bool EmailConfirmed { get; set; }

View File

@ -6,11 +6,11 @@ public class UserDto
public string? UserName { get; set; } public string? UserName { get; set; }
public string? Email { get; set; } public string? Email { get; set; }
public string? RealName { get; set; } public string? RealName { get; set; }
public string? Phone { get; set; } public string? PhoneNumber { get; set; }
public string TenantCode { get; set; } = ""; public string? TenantCode { get; set; } = "";
public string TenantName { get; set; } = ""; public string? TenantName { get; set; } = "";
public List<string> Roles { get; set; } = new(); public List<string> Roles { get; set; } = new();
public bool EmailConfirmed { get; set; } public bool EmailConfirmed { get; set; }
public bool IsActive { get; set; } public bool IsActive { get; set; }
public DateTime CreatedAt { get; set; } public DateTimeOffset CreatedAt { get; set; }
} }

View File

@ -120,14 +120,14 @@ public class RoleService : IRoleService
foreach (var user in users) foreach (var user in users)
{ {
var roles = await _userManager.GetRolesAsync(user); var roles = await _userManager.GetRolesAsync(user);
var tenant = user.TenantInfo.TenantId > 0 ? await _tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null; var tenant = user.TenantInfo?.TenantId > 0 ? await _tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null;
userDtos.Add(new UserDto userDtos.Add(new UserDto
{ {
Id = user.Id, Id = user.Id,
UserName = user.UserName, UserName = user.UserName,
Email = user.Email, Email = user.Email,
RealName = user.RealName, RealName = user.RealName,
TenantCode = user.TenantInfo.TenantId.ToString(), TenantCode = user.TenantInfo?.TenantCode,
TenantName = tenant?.Name ?? "", TenantName = tenant?.Name ?? "",
Roles = roles.ToList(), Roles = roles.ToList(),
EmailConfirmed = user.EmailConfirmed, EmailConfirmed = user.EmailConfirmed,

View File

@ -93,7 +93,7 @@ public class TenantService(
} }
var users = await context.Users var users = await context.Users
.Where(u => u.TenantInfo.TenantId == tenantId) .Where(u => u.TenantInfo!.TenantId == tenantId)
.ToListAsync(); .ToListAsync();
var userDtos = new List<UserDto>(); var userDtos = new List<UserDto>();

View File

@ -11,7 +11,9 @@ namespace Fengling.Console.Services;
public interface IUserService public interface IUserService
{ {
Task<(IEnumerable<UserDto> Items, int TotalCount)> GetUsersAsync(int page, int pageSize, string? userName = null, string? email = null, string? tenantId = null); Task<(IEnumerable<UserDto> Items, int TotalCount)> GetUsersAsync(int page, int pageSize, string? userName = null,
string? email = null, string? tenantCode = null);
Task<UserDto?> GetUserAsync(long id); Task<UserDto?> GetUserAsync(long id);
Task<UserDto> CreateUserAsync(CreateUserDto dto); Task<UserDto> CreateUserAsync(CreateUserDto dto);
Task<UserDto> UpdateUserAsync(long id, UpdateUserDto dto); Task<UserDto> UpdateUserAsync(long id, UpdateUserDto dto);
@ -27,7 +29,9 @@ public class UserService(
IHttpContextAccessor httpContextAccessor) IHttpContextAccessor httpContextAccessor)
: IUserService : IUserService
{ {
public async Task<(IEnumerable<UserDto> Items, int TotalCount)> GetUsersAsync(int page, int pageSize, string? userName = null, string? email = null, string? tenantId = null) public async Task<(IEnumerable<UserDto> Items, int TotalCount)> GetUsersAsync(int page, int pageSize,
string? userName = null, string? email = null,
string? tenantCode = null)
{ {
var query = context.Users.AsQueryable(); var query = context.Users.AsQueryable();
@ -41,9 +45,11 @@ public class UserService(
query = query.Where(u => u.Email != null && u.Email.Contains(email)); query = query.Where(u => u.Email != null && u.Email.Contains(email));
} }
if (!string.IsNullOrEmpty(tenantId)) if (!string.IsNullOrEmpty(tenantCode))
{ {
query = query.Where(u => u.TenantInfo.TenantId.ToString().Contains(tenantId)); query = query.Where(u => u.TenantInfo != null &&
u.TenantInfo.TenantCode != null &&
u.TenantInfo.TenantCode.Contains(tenantCode));
} }
var totalCount = await query.CountAsync(); var totalCount = await query.CountAsync();
@ -57,15 +63,17 @@ public class UserService(
foreach (var user in users) foreach (var user in users)
{ {
var roles = await userManager.GetRolesAsync(user); var roles = await userManager.GetRolesAsync(user);
var tenant = user.TenantInfo.TenantId > 0 ? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null; var tenant = user.TenantInfo?.TenantId > 0
? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId)
: null;
userDtos.Add(new UserDto userDtos.Add(new UserDto
{ {
Id = user.Id, Id = user.Id,
UserName = user.UserName, UserName = user.UserName,
Email = user.Email, Email = user.Email,
RealName = user.RealName, RealName = user.RealName,
Phone = user.Phone, PhoneNumber = user.PhoneNumber,
TenantCode = user.TenantInfo.TenantId.ToString(), TenantCode = user.TenantInfo?.TenantCode,
TenantName = tenant?.Name ?? "", TenantName = tenant?.Name ?? "",
Roles = roles.ToList(), Roles = roles.ToList(),
EmailConfirmed = user.EmailConfirmed, EmailConfirmed = user.EmailConfirmed,
@ -83,15 +91,15 @@ public class UserService(
if (user == null) return null; if (user == null) return null;
var roles = await userManager.GetRolesAsync(user); var roles = await userManager.GetRolesAsync(user);
var tenant = user.TenantInfo.TenantId > 0 ? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null; var tenant = user.TenantInfo?.TenantId > 0 ? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null;
return new UserDto return new UserDto
{ {
Id = user.Id, Id = user.Id,
UserName = user.UserName, UserName = user.UserName,
Email = user.Email, Email = user.Email,
RealName = user.RealName, RealName = user.RealName,
Phone = user.Phone, PhoneNumber = user.PhoneNumber,
TenantCode = user.TenantInfo.TenantId.ToString(), TenantCode = user.TenantInfo?.TenantCode,
TenantName = tenant?.Name ?? "", TenantName = tenant?.Name ?? "",
Roles = roles.ToList(), Roles = roles.ToList(),
EmailConfirmed = user.EmailConfirmed, EmailConfirmed = user.EmailConfirmed,
@ -122,7 +130,7 @@ public class UserService(
UserName = dto.UserName, UserName = dto.UserName,
Email = dto.Email, Email = dto.Email,
RealName = dto.RealName, RealName = dto.RealName,
Phone = dto.Phone, PhoneNumber = dto.PhoneNumber,
TenantInfo = tenantInfo, TenantInfo = tenantInfo,
EmailConfirmed = dto.EmailConfirmed, EmailConfirmed = dto.EmailConfirmed,
CreatedTime = DateTime.UtcNow CreatedTime = DateTime.UtcNow
@ -134,7 +142,7 @@ public class UserService(
throw new InvalidOperationException(string.Join(", ", result.Errors.Select(e => e.Description))); throw new InvalidOperationException(string.Join(", ", result.Errors.Select(e => e.Description)));
} }
if (dto.RoleIds != null && dto.RoleIds.Any()) if (dto.RoleIds.Count != 0)
{ {
foreach (var roleId in dto.RoleIds) foreach (var roleId in dto.RoleIds)
{ {
@ -152,7 +160,8 @@ public class UserService(
await userManager.SetLockoutEndDateAsync(user, DateTimeOffset.MaxValue); await userManager.SetLockoutEndDateAsync(user, DateTimeOffset.MaxValue);
} }
await CreateAuditLog("user", "create", "User", user.Id, user.UserName, null, System.Text.Json.JsonSerializer.Serialize(dto)); await CreateAuditLog("user", "create", "User", user.Id, user.UserName, null,
System.Text.Json.JsonSerializer.Serialize(dto));
var roles = await userManager.GetRolesAsync(user); var roles = await userManager.GetRolesAsync(user);
return new UserDto return new UserDto
@ -161,7 +170,7 @@ public class UserService(
UserName = user.UserName, UserName = user.UserName,
Email = user.Email, Email = user.Email,
RealName = user.RealName, RealName = user.RealName,
Phone = user.Phone, PhoneNumber = user.PhoneNumber,
TenantCode = user.TenantInfo.TenantId.ToString(), TenantCode = user.TenantInfo.TenantId.ToString(),
TenantName = tenant?.Name ?? "", TenantName = tenant?.Name ?? "",
Roles = roles.ToList(), Roles = roles.ToList(),
@ -183,7 +192,7 @@ public class UserService(
user.Email = dto.Email; user.Email = dto.Email;
user.RealName = dto.RealName; user.RealName = dto.RealName;
user.Phone = dto.Phone; user.PhoneNumber = dto.PhoneNumber;
user.EmailConfirmed = dto.EmailConfirmed; user.EmailConfirmed = dto.EmailConfirmed;
user.UpdatedTime = DateTime.UtcNow; user.UpdatedTime = DateTime.UtcNow;
@ -200,9 +209,10 @@ public class UserService(
await userManager.SetLockoutEndDateAsync(user, DateTimeOffset.MaxValue); await userManager.SetLockoutEndDateAsync(user, DateTimeOffset.MaxValue);
} }
var tenant = user.TenantInfo.TenantId > 0 ? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null; var tenant = user.TenantInfo?.TenantId > 0 ? await tenantManager.FindByIdAsync(user.TenantInfo.TenantId) : null;
await CreateAuditLog("user", "update", "User", user.Id, user.UserName, oldValue, System.Text.Json.JsonSerializer.Serialize(user)); await CreateAuditLog("user", "update", "User", user.Id, user.UserName, oldValue,
System.Text.Json.JsonSerializer.Serialize(user));
var roles = await userManager.GetRolesAsync(user); var roles = await userManager.GetRolesAsync(user);
return new UserDto return new UserDto
@ -211,8 +221,8 @@ public class UserService(
UserName = user.UserName, UserName = user.UserName,
Email = user.Email, Email = user.Email,
RealName = user.RealName, RealName = user.RealName,
Phone = user.Phone, PhoneNumber = user.PhoneNumber,
TenantCode = user.TenantInfo.TenantId.ToString(), TenantCode = user.TenantInfo?.TenantCode,
TenantName = tenant?.Name ?? "", TenantName = tenant?.Name ?? "",
Roles = roles.ToList(), Roles = roles.ToList(),
EmailConfirmed = user.EmailConfirmed, EmailConfirmed = user.EmailConfirmed,
@ -256,10 +266,12 @@ public class UserService(
await CreateAuditLog("user", "delete", "User", user.Id, user.UserName, oldValue); await CreateAuditLog("user", "delete", "User", user.Id, user.UserName, oldValue);
} }
private async Task CreateAuditLog(string operation, string action, string targetType, long? targetId, string? targetName, string? oldValue = null, string? newValue = null) private async Task CreateAuditLog(string operation, string action, string targetType, long? targetId,
string? targetName, string? oldValue = null, string? newValue = null)
{ {
var httpContext = httpContextAccessor.HttpContext; var httpContext = httpContextAccessor.HttpContext;
var userName = httpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) ?? httpContext?.User?.Identity?.Name ?? "system"; var userName = httpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) ??
httpContext?.User?.Identity?.Name ?? "system";
var tenantIdClaim = httpContext?.User?.FindFirstValue("TenantId"); var tenantIdClaim = httpContext?.User?.FindFirstValue("TenantId");
var log = new AuditLog var log = new AuditLog
@ -281,4 +293,4 @@ public class UserService(
context.AuditLogs.Add(log); context.AuditLogs.Add(log);
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
} }