@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;
}
}