@page "/admin/dashboard" @attribute [Authorize] @using TaxBaik.Web.Services @inject IAdminDashboardClient DashboardClient @inject NavigationManager Nav 대시보드
Overview 대시보드 문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다.
새 포스트 작성
이번달 문의
@summary.ThisMonthInquiries 💬
월간 상담 유입 (클릭 시 이동)
신규 문의
@summary.NewInquiries ⚠️
처리 대기 (클릭 시 이동)
전체 포스트
@summary.TotalPosts 📄
콘텐츠 자산 (클릭 시 이동)
발행된 포스트
@summary.PublishedPosts 🌐
검색 노출 대상 (클릭 시 이동)
@if (upcomingFilings.Count > 0) {
이번 달 마감 임박 신고 30일 이내 신고 예정 건 (고객명 클릭 시 상세 카드로 연결)
전체 일정 보기
고객 신고 유형 기한 D-day @foreach (var f in upcomingFilings) { var dday = (f.DueDate.Date - DateTime.Today).Days; @f.ClientName @f.FilingType @f.DueDate.ToString("yyyy-MM-dd") @if (dday < 0) { 기한 초과 (@(-dday)일) } else if (dday <= 7) { D-@dday } else { D-@dday } }
}
최근 문의 최근 유입된 상담 요청을 빠르게 확인합니다. (이름 클릭 시 상세 관리 화면으로 연계)
문의 전체 보기
이름 전화 분야 상태 날짜 @foreach (var inquiry in summary.RecentInquiries) { @inquiry.Name @inquiry.Phone @inquiry.ServiceType @GetStatusLabel(inquiry.Status) @inquiry.CreatedAt.ToString("yyyy-MM-dd") }
@code { [CascadingParameter] private Task? AuthStateTask { get; set; } private AdminDashboardSummary summary = new(0, 0, 0, 0, []); private List upcomingFilings = []; private string? errorMessage; private bool isLoading = true; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { if (AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { try { // API 클라이언트 사용 (서비스 직접 호출 X) var summaryTask = DashboardClient.GetSummaryAsync(); var filingsTask = DashboardClient.GetUpcomingFilingsAsync(30); await Task.WhenAll(summaryTask, filingsTask); summary = await summaryTask; upcomingFilings = (await filingsTask).ToList(); } catch (Exception ex) { errorMessage = "대시보드 데이터를 불러올 수 없습니다."; Console.Error.WriteLine($"Dashboard error: {ex.Message}"); } finally { isLoading = false; StateHasChanged(); } } } } } private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status); private static Color StatusColor(string status) => status switch { "new" => Color.Warning, "consulting" => Color.Info, "contracted" => Color.Success, "rejected" => Color.Error, "closed" => Color.Dark, _ => Color.Default }; }