@page "/users" @attribute [Authorize] @using MudBlazor @inject HttpClient Http @inject ISnackbar Snackbar @inject IDialogService DialogService QuantEngine - 사용자 관리
사용자 관리 시스템 사용자 및 권한 관리
새 사용자 추가
@if (_users.Count == 0) { 사용자가 없습니다. } else { 이름 역할 상태 생성일 수정일 작업
@context.Username[0].ToString().ToUpper() @context.Username
@context.Role @(context.IsActive ? "활성" : "비활성") @FormatDate(context.CreatedAt) @FormatDate(context.UpdatedAt) 편집 삭제
}
@(_isEditMode ? "사용자 편집" : "새 사용자 추가") Admin (관리자) Operator (운영자) Viewer (조회자) @if (_isEditMode) { } 취소 저장 @code { private List _users = new(); private string SearchQuery = ""; private bool _dialogVisible; private bool _isEditMode; private MudForm _form = new(); private UserFormModel _formModel = new(); private DialogOptions _dialogOptions = new() { MaxWidth = MaxWidth.Small, FullWidth = true, CloseButton = true }; private IEnumerable FilteredUsers { get => string.IsNullOrEmpty(SearchQuery) ? _users : _users.Where(u => u.Username.Contains(SearchQuery, StringComparison.OrdinalIgnoreCase)); } protected override async Task OnInitializedAsync() { await LoadUsers(); } private async Task LoadUsers() { try { var res = await Http.GetFromJsonAsync>("api/users"); if (res != null) { _users = res; } } catch (Exception ex) { Snackbar.Add($"사용자 목록 로드 실패: {ex.Message}", Severity.Error); } } private void OpenAddUserDialog() { _isEditMode = false; _formModel = new UserFormModel { Role = "Viewer", IsActive = true }; _dialogVisible = true; } private void EditUser(UserDto user) { _isEditMode = true; _formModel = new UserFormModel { Username = user.Username, Role = user.Role, IsActive = user.IsActive, Password = "" // Clear password field for security }; _dialogVisible = true; } private async Task DeleteUser(UserDto user) { bool? result = await DialogService.ShowMessageBox( "사용자 삭제", $"정말로 사용자 '{user.Username}' 계정을 비활성화하시겠습니까?", yesText: "비활성화", cancelText: "취소"); if (result == true) { try { var response = await Http.DeleteAsync($"api/users?username={user.Username}"); if (response.IsSuccessStatusCode) { Snackbar.Add("사용자 계정이 비활성화되었습니다.", Severity.Success); await LoadUsers(); } else { Snackbar.Add("계정 비활성화 작업에 실패했습니다.", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"API 에러: {ex.Message}", Severity.Error); } } } private void CloseDialog() { _dialogVisible = false; } private async Task SaveUser() { await _form.Validate(); if (!_form.IsValid) return; try { HttpResponseMessage response; if (_isEditMode) { response = await Http.PutAsJsonAsync("api/users", _formModel); } else { response = await Http.PostAsJsonAsync("api/users", _formModel); } if (response.IsSuccessStatusCode) { Snackbar.Add("사용자 정보가 성공적으로 저장되었습니다.", Severity.Success); _dialogVisible = false; await LoadUsers(); } else { var error = await response.Content.ReadAsStringAsync(); Snackbar.Add($"저장 실패: {error}", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"API 오류 발생: {ex.Message}", Severity.Error); } } private string FormatDate(string isoString) { if (string.IsNullOrWhiteSpace(isoString)) return "-"; if (DateTime.TryParse(isoString, out var dt)) { return dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm"); } return isoString; } public class UserDto { public string Username { get; set; } = string.Empty; public string Role { get; set; } = string.Empty; public bool IsActive { get; set; } public string CreatedAt { get; set; } = string.Empty; public string UpdatedAt { get; set; } = string.Empty; } public class UserFormModel { public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public string Role { get; set; } = "Viewer"; public bool IsActive { get; set; } = true; } }