@page "/admin/dashboard" @attribute [Authorize] @using TaxBaik.Web.Services @inject IAdminDashboardClient DashboardClient @inject NavigationManager Nav 대시보드
Overview

대시보드

문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다.

@if (summary is null) {
} else {
이번달 문의
@summary.ThisMonthInquiries 💬
월간 상담 유입
신규 문의
@summary.NewInquiries ⚠️
처리 대기
전체 포스트
@summary.TotalPosts 📄
콘텐츠 자산
발행된 포스트
@summary.PublishedPosts 🌐
검색 노출 대상
} @if (upcomingFilings.Count == 0) {
이번 달 마감 임박 신고가 없습니다.
} else {

이번 달 마감 임박 신고

30일 이내 신고 예정 건

전체 일정 보기
@foreach (var f in upcomingFilings) { var dday = (f.DueDate.Date - DateTime.Today).Days; }
고객 신고 유형 기한 D-day
@f.ClientName @f.FilingType @f.DueDate.ToString("yyyy-MM-dd") @if (dday < 0) { 기한 초과 (@(-dday)일) } else if (dday <= 7) { D-@dday } else { D-@dday }
} @if (summary is not null) {

최근 문의

최근 유입된 상담 요청을 빠르게 확인합니다.

문의 전체 보기
@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; private List upcomingFilings = []; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { try { var summaryTask = DashboardClient.GetSummaryAsync(); var filingsTask = DashboardClient.GetUpcomingFilingsAsync(30); await Task.WhenAll(summaryTask, filingsTask); summary = await summaryTask; upcomingFilings = (await filingsTask).ToList(); } catch (Exception ex) { Console.Error.WriteLine($"Dashboard error: {ex.Message}"); } StateHasChanged(); } } } private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status); private static string GetStatusClass(string status) => status switch { "new" => "warning", "consulting" => "info", "contracted" => "success", "rejected" => "danger", "closed" => "dark", _ => "default" }; }