using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Media; using OrpaonVision.Core.Security; using OrpaonVision.Core.Security.Contracts; using OrpaonVision.Core.Security.Contracts.Commands; using OrpaonVision.Core.Security.Contracts.Queries; namespace OrpaonVision.ConfigApp.ViewModels; /// /// 用户管理ViewModel。 /// public sealed class UserManagementViewModel : INotifyPropertyChanged { private readonly IUserAppService _userAppService; private string _statusText = "准备就绪。"; private Brush _statusBrush = Brushes.DarkGreen; private string _outputText = string.Empty; private UserDetailDto? _selectedUser; private string _searchKeyword = string.Empty; /// /// 构造函数。 /// public UserManagementViewModel(IUserAppService userAppService) { _userAppService = userAppService; } /// /// 状态文本。 /// public string StatusText { get => _statusText; private set => SetProperty(ref _statusText, value); } /// /// 状态画刷。 /// public Brush StatusBrush { get => _statusBrush; private set => SetProperty(ref _statusBrush, value); } /// /// 输出文本。 /// public string OutputText { get => _outputText; private set => SetProperty(ref _outputText, value); } /// /// 选中的用户。 /// public UserDetailDto? SelectedUser { get => _selectedUser; private set => SetProperty(ref _selectedUser, value); } /// /// 搜索关键词。 /// public string SearchKeyword { get => _searchKeyword; set => SetProperty(ref _searchKeyword, value); } /// /// 查询用户详情。 /// public async Task QueryUserDetailAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在查询用户详情..."; if (string.IsNullOrWhiteSpace(SearchKeyword)) { StatusBrush = Brushes.Orange; StatusText = "请输入用户ID或用户名"; return; } // 这里演示如何查询用户详情 // 实际实现需要根据SearchKeyword判断是用户ID还是用户名 var userId = Guid.TryParse(SearchKeyword, out var parsedId) ? parsedId : Guid.NewGuid(); var result = await _userAppService.GetDetailAsync(userId); if (result.Succeeded && result.Data != null) { SelectedUser = result.Data; StatusText = "用户详情查询成功"; OutputText = $"用户名:{result.Data.UserName}\n" + $"显示名称:{result.Data.DisplayName}\n" + $"邮箱:{result.Data.Email}\n" + $"状态:{result.Data.Status}\n" + $"角色数:{result.Data.Roles.Count}\n" + $"权限数:{result.Data.Permissions.Count}\n" + $"最后登录:{result.Data.LastLoginAtUtc:yyyy-MM-dd HH:mm}"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "查询用户详情失败"; OutputText = $"错误:{result.Message}"; SelectedUser = null; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "查询用户详情异常"; OutputText = $"异常:{ex.Message}"; SelectedUser = null; } } /// /// 创建新用户。 /// public async Task CreateUserAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在创建新用户..."; // 这里演示如何创建用户 var command = new OrpaonVision.Core.Security.Contracts.Commands.CreateUserCommand { UserName = "newuser_" + DateTime.Now.Ticks, DisplayName = "新用户", Email = "newuser@example.com", Password = "TempPassword123!", Roles = ["Operator"], Permissions = ["production.view", "training.view"], CreatedBy = "Admin" }; var result = await _userAppService.CreateAsync(command); if (result.Succeeded) { StatusText = "用户创建成功"; OutputText = $"用户ID:{result.Data}\n" + $"用户名:{command.UserName}\n" + $"显示名称:{command.DisplayName}\n" + $"角色:{string.Join(", ", command.Roles)}\n" + $"请及时修改初始密码"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "创建用户失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "创建用户异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 更新用户信息。 /// public async Task UpdateUserAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在更新用户信息..."; if (SelectedUser == null) { StatusBrush = Brushes.Orange; StatusText = "请先选择要更新的用户"; return; } // 这里演示如何更新用户信息 var command = new OrpaonVision.Core.Security.Contracts.Commands.UpdateUserCommand { UserId = SelectedUser.UserId, DisplayName = SelectedUser.DisplayName + " (已更新)", Email = SelectedUser.Email, IsActive = SelectedUser.IsActive, Roles = SelectedUser.Roles.ToList(), UpdatedBy = "Admin" }; var result = await _userAppService.UpdateAsync(command); if (result.Succeeded) { StatusText = "用户信息更新成功"; OutputText = $"用户ID:{command.UserId}\n" + $"显示名称:{command.DisplayName}\n" + $"状态:{(command.IsActive ? "激活" : "停用")}\n" + $"角色:{string.Join(", ", command.Roles)}"; // 重新查询用户详情以更新显示 await QueryUserDetailAsync(); } else { StatusBrush = Brushes.OrangeRed; StatusText = "更新用户信息失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "更新用户信息异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 删除用户。 /// public async Task DeleteUserAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在删除用户..."; if (SelectedUser == null) { StatusBrush = Brushes.Orange; StatusText = "请先选择要删除的用户"; return; } // 这里演示如何删除用户 var command = new OrpaonVision.Core.Security.Contracts.Commands.DeleteUserCommand { UserId = SelectedUser.UserId, DeletedBy = "Admin" }; var result = await _userAppService.DeleteAsync(command); if (result.Succeeded) { StatusText = "用户删除成功"; OutputText = $"已删除用户:{SelectedUser.UserName} ({SelectedUser.DisplayName})\n" + $"用户ID:{command.UserId}\n" + $"操作时间:{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}"; SelectedUser = null; SearchKeyword = string.Empty; } else { StatusBrush = Brushes.OrangeRed; StatusText = "删除用户失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "删除用户异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 重置用户密码。 /// public async Task ResetUserPasswordAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在重置用户密码..."; if (SelectedUser == null) { StatusBrush = Brushes.Orange; StatusText = "请先选择要重置密码的用户"; return; } // 这里演示如何重置用户密码 var command = new OrpaonVision.Core.Security.Contracts.Commands.ResetUserPasswordCommand { UserId = SelectedUser.UserId, NewPassword = "NewTempPassword123!", ForceChangeOnNextLogin = true, ResetBy = "Admin" }; var result = await _userAppService.ResetPasswordAsync(command); if (result.Succeeded) { StatusText = "密码重置成功"; OutputText = $"用户:{SelectedUser.UserName}\n" + $"新密码:{command.NewPassword}\n" + $"下次登录必须修改:{(command.ForceChangeOnNextLogin ? "是" : "否")}\n" + $"请及时通知用户"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "重置密码失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "重置密码异常"; OutputText = $"异常:{ex.Message}"; } } /// /// 分页查询用户列表。 /// public async Task QueryUserListAsync() { try { StatusBrush = Brushes.DarkGreen; StatusText = "正在查询用户列表..."; // 这里演示如何分页查询用户列表 var query = new OrpaonVision.Core.Security.Contracts.Queries.UserQueryDto { Keyword = SearchKeyword, PageIndex = 1, PageSize = 20, SortField = "UserName", SortDirection = "ASC" }; var result = await _userAppService.GetPagedListAsync(query); if (result.Succeeded && result.Data != null) { StatusText = "用户列表查询成功"; OutputText = $"查询条件:{query.Keyword ?? "全部"}\n" + $"用户总数:{result.Data.TotalCount}\n" + $"当前页:{result.Data.PageIndex}/{result.Data.TotalPages}\n" + $"本页记录:{result.Data.Items.Count}\n" + $"查询时间:{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}"; } else { StatusBrush = Brushes.OrangeRed; StatusText = "查询用户列表失败"; OutputText = $"错误:{result.Message}"; } } catch (Exception ex) { StatusBrush = Brushes.OrangeRed; StatusText = "查询用户列表异常"; OutputText = $"异常:{ex.Message}"; } } /// public event PropertyChangedEventHandler? PropertyChanged; private void SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) { return; } field = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }