From 08347a4e20e95a477a3407a8a39e9324115b922a Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Tue, 7 Jul 2026 23:16:31 +0900 Subject: [PATCH] Refactor admin dashboard and standardize UI shells --- .../Announcements/AnnouncementEdit.razor | 11 +- .../Announcements/AnnouncementList.razor | 19 +- .../Admin/Pages/Clients/ClientDetail.razor | 8 +- .../Admin/Pages/Clients/ClientEdit.razor | 8 +- .../Admin/Pages/Clients/ClientList.razor | 36 +-- .../Admin/Pages/Companies/CompanyCreate.razor | 9 +- .../Admin/Pages/Companies/CompanyEdit.razor | 9 +- .../Admin/Pages/Companies/CompanyList.razor | 9 +- .../Admin/Pages/ConsultingActivities.razor | 8 +- .../Components/Admin/Pages/Contracts.razor | 22 +- .../Components/Admin/Pages/Dashboard.razor | 13 +- .../Admin/Pages/DashboardOverview.razor | 240 ++++++++++++++++++ .../Components/Admin/Pages/Faqs/FaqEdit.razor | 8 +- .../Components/Admin/Pages/Faqs/FaqList.razor | 19 +- .../Admin/Pages/Inquiries/InquiryDetail.razor | 8 +- .../Admin/Pages/RevenueTrackings.razor | 8 +- .../Admin/Pages/SeasonSimulator.razor | 8 +- .../Admin/Pages/Settings/SiteSettings.razor | 18 +- .../Admin/Pages/TaxFilingSchedules.razor | 9 +- .../Pages/TaxFilings/TaxFilingList.razor | 9 +- .../Components/Admin/Pages/TaxProfiles.razor | 9 +- .../Admin/Services/AdminDashboardClient.cs | 18 +- .../Admin/Shared/AdminCrudPageShell.razor | 15 +- .../Admin/Shared/AdminNavigationModel.cs | 45 ++++ .../Admin/Shared/AdminSearchBar.razor | 21 ++ .../Components/Admin/Shared/AdminShell.razor | 41 +-- .../Admin/Shared/AdminSidebar.razor | 62 +++++ .../Endpoints/Admin/ValidationEndpoints.cs | 6 +- .../AdminDashboard/GetMonthlyStatsEndpoint.cs | 2 +- .../GetRecentInquiriesEndpoint.cs | 2 +- .../AdminDashboard/GetSummaryEndpoint.cs | 2 +- .../GetUpcomingFilingsEndpoint.cs | 2 +- src/TaxBaik.Web/Program.cs | 4 + src/TaxBaik.Web/Services/AuthService.cs | 3 +- src/TaxBaik.Web/wwwroot/css/admin.css | 144 +++++++++++ 35 files changed, 625 insertions(+), 230 deletions(-) create mode 100644 src/TaxBaik.Web.Client/Components/Admin/Pages/DashboardOverview.razor create mode 100644 src/TaxBaik.Web.Client/Components/Admin/Shared/AdminNavigationModel.cs create mode 100644 src/TaxBaik.Web.Client/Components/Admin/Shared/AdminSearchBar.razor create mode 100644 src/TaxBaik.Web.Client/Components/Admin/Shared/AdminSidebar.razor diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor index 580470a..6ba4c8f 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementEdit.razor @@ -12,14 +12,9 @@ @(Id.HasValue ? "공지 수정" : "공지 등록") -
-
- Homepage - @(Id.HasValue ? "공지 수정" : "공지 등록") -
-
+ - + @@ -89,7 +84,7 @@ - + @code { [Parameter] public int? Id { get; set; } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor index a274453..6022c53 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor @@ -10,23 +10,20 @@ 공지사항 관리 -
-
- Homepage - 공지사항 관리 - 홈페이지 상단에 노출되는 공지사항을 등록하고 관리합니다. -
+ 공지 등록 -
+
-
- -
+ + + + + @if (announcements is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor index 63e87c1..3c6734b 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientDetail.razor @@ -11,13 +11,7 @@ 고객 상세 -
-
- Client Details - 고객 상세 - 고객 정보와 상담 이력을 관리합니다. -
-
+ @if (client == null) { diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor index 15ef217..e342673 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientEdit.razor @@ -12,14 +12,10 @@ @(Id.HasValue ? "고객 수정" : "고객 등록") -
-
- CRM - @(Id.HasValue ? "고객 수정" : "고객 등록") -
+ 목록으로 -
+
@if (isLoading) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor index aec6e3b..8d0fb5a 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor @@ -21,24 +21,24 @@ @* 검색/필터 바 *@ - - - - - - - - - - 검색 - - - 초기화 - - - + + + + + + + + + + + + + 검색 + 초기화 + + @if (clients is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor index 4dcca5f..780f4db 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyCreate.razor @@ -8,14 +8,9 @@ 고객사 등록 -
-
- Settings - 새 고객사 등록 - 새로운 고객사를 추가합니다. -
+ 취소 -
+ diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor index 360a3f8..70939d5 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyEdit.razor @@ -9,14 +9,9 @@ 고객사 수정 -
-
- Settings - 고객사 수정 - 고객사 정보를 수정합니다. -
+ 취소 -
+ @if (formModel == null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor index 62a5221..fe077d6 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Companies/CompanyList.razor @@ -6,15 +6,10 @@ 고객사 관리 -
-
- Settings - 고객사 관리 - 등록된 고객사를 관리하고 새로운 고객사를 추가합니다. -
+ 새 고객사 등록 -
+ diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor index 0928eba..a37e041 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor @@ -9,13 +9,7 @@ 상담 활동 관리 -
-
- CRM & 세무관리 - 상담 활동 관리 - 초기 렌더 진단용 최소 화면입니다. -
-
+ @if (activities is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor index 30f5647..c2ea8b6 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor @@ -10,23 +10,17 @@ 계약 관리 -
-
- CRM & 세무관리 - 계약 관리 - 고객 계약과 월 정기수익을 함께 관리합니다. + + @if (mrr > 0) { - - 월 정기수익: - ₩@mrr.ToString("N0") - + 월 정기수익 ₩@mrr.ToString("N0") } -
- - 새 계약 추가 - -
+ + 새 계약 추가 + +
+ @if (contracts is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor index e7ef8e6..f778f5c 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor @@ -1,14 +1,5 @@ @page "/admin/dashboard" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) +@attribute [Authorize] -대시보드 - -
-

대시보드

-

관리자 SPA 부팅 검증용 최소 화면입니다.

-
    -
  • WASM 부팅 성공 여부
  • -
  • 라우팅 성공 여부
  • -
  • JS interop 예외 여부
  • -
-
+ diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/DashboardOverview.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/DashboardOverview.razor new file mode 100644 index 0000000..cd58745 --- /dev/null +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/DashboardOverview.razor @@ -0,0 +1,240 @@ +@inject TaxBaik.Web.Client.Components.Admin.Services.IAdminDashboardClient DashboardClient +@inject NavigationManager Navigation + +대시보드 + + + + 새로고침 + + + + + @if (loading) + { + + + + } + else + { + + + + + + + + + + + + + + + + + + @foreach (var action in QuickActions) + { + + @action.Label + + } + + + + + + + + @if (summary?.RecentInquiries is null || !summary.RecentInquiries.Any()) + { + + } + else + { + + + + 제목 + 상태 + 접수일 + + + + @foreach (var inquiry in summary.RecentInquiries) + { + + @inquiry.Name + @inquiry.Status + @inquiry.CreatedAt.ToString("yyyy-MM-dd") + + } + + + } + + + + + + + @if (monthlyStats is not null) + { +
+
+ 총 문의 + @monthlyStats.TotalInquiries +
+
+ 상담 중 + @monthlyStats.ConsultingCount +
+
+ 완료 + @monthlyStats.CompletedCount +
+
+ 완료율 + @monthlyStats.CompletionRate.ToString("0.#")% +
+
+
+
+ 최근 6개월 문의 추세 + @monthlyStats.Month +
+
+ @foreach (var point in trendPoints) + { +
+ @point.Label +
+
+
+ @point.Total +
+ } +
+
+ } +
+
+ + + + +
+ @foreach (var action in QuickActions) + { + + + @action.Label + + } +
+
+
+ + + + +
+
대시보드와 메뉴가 역할 기반으로 필터링됩니다.
+
공통 CRUD 화면은 `AdminPageHeader`/`AdminCrudPageShell` 슬롯 패턴을 따릅니다.
+
월간 통계는 문의 전환 흐름을 빠르게 보는 용도입니다.
+
+
+
+ + + + + + + @(summary is not null && summary.NewInquiries > 0 + ? $"처리 대기 중인 신규 문의가 {summary.NewInquiries}건 있습니다." + : "현재 신규 문의가 없습니다.") + + + @(summary is not null && summary.PublishedPosts < summary.TotalPosts + ? "비공개 중인 게시글이 있어 발행 상태 확인이 필요합니다." + : "게시글 발행 상태가 안정적입니다.") + + + + + } +
+ +@code { + private bool loading = true; + private bool statsLoading = true; + private AdminDashboardSummary? summary; + private TaxBaik.Web.Client.Components.Admin.Services.MonthlyStatsDto? monthlyStats; + private readonly List<(string Label, int Total)> trendPoints = []; + + private static readonly (string Label, string Href, string Icon)[] QuickActions = + [ + ("공지 등록", "/taxbaik/admin/announcements/create", Icons.Material.Filled.Campaign), + ("고객사 등록", "/taxbaik/admin/companies/create", Icons.Material.Filled.Business), + ("문의 관리", "/taxbaik/admin/inquiries", Icons.Material.Filled.Inbox), + ("설정 열기", "/taxbaik/admin/settings", Icons.Material.Filled.Settings), + ]; + + protected override async Task OnInitializedAsync() + { + await LoadAsync(); + await LoadStatsAsync(); + await LoadTrendAsync(); + } + + private async Task ReloadAsync() + { + await LoadAsync(); + } + + private async Task LoadAsync() + { + loading = true; + try + { + summary = await DashboardClient.GetSummaryAsync(); + } + finally + { + loading = false; + } + } + + private async Task LoadStatsAsync() + { + statsLoading = true; + try + { + monthlyStats = await DashboardClient.GetMonthlyStatsAsync(); + } + finally + { + statsLoading = false; + } + } + + private async Task LoadTrendAsync() + { + trendPoints.Clear(); + var today = DateTime.Today; + for (var i = 5; i >= 0; i--) + { + var month = today.AddMonths(-i); + var monthly = await DashboardClient.GetMonthlyStatsAsync(month.ToString("yyyy-MM")); + trendPoints.Add(($"{month:MM}", monthly.TotalInquiries)); + } + } + + private static string BarWidth(int value, int total) + => total <= 0 ? "0%" : $"{Math.Max(6, (int)Math.Round(value * 100.0 / total))}%"; + + private int trendMax => Math.Max(1, trendPoints.Count == 0 ? 1 : trendPoints.Max(x => x.Total)); +} diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor index ece5d07..56e5240 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor @@ -9,14 +9,10 @@ @(Id.HasValue ? "FAQ 수정" : "FAQ 등록") -
-
- 홈페이지 - @(Id.HasValue ? "FAQ 수정" : "FAQ 등록") -
+ 목록으로 -
+ diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor index 902855f..c1457d5 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor @@ -10,23 +10,20 @@ FAQ 관리 -
-
- 홈페이지 - FAQ 관리 - 홈페이지 자주 묻는 질문을 등록하고 순서를 관리합니다. -
+ FAQ 등록 -
+ -
- -
+ + + + + @if (faqs is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor index ffdc1f7..d2f2e57 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryDetail.razor @@ -9,13 +9,7 @@ 문의 상세 -
-
- Inquiry Details - 문의 상세 - 문의 정보를 확인하고 처리 상태를 관리합니다. -
-
+ @if (inquiry != null) { diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor index 21537f5..36e7189 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor @@ -9,13 +9,7 @@ 수익 추적 관리 -
-
- CRM & 세무관리 - 수익 추적 관리 - 초기 렌더 진단용 최소 화면입니다. -
-
+ @if (revenues is null) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor index 31a96f9..4652e49 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/SeasonSimulator.razor @@ -6,13 +6,7 @@ 시즌 시뮬레이터 -
-
- Season Preview - 시즌 시뮬레이터 - 날짜를 선택해 홈페이지 시즌 화면이 어떻게 보이는지 미리 확인합니다. -
-
+ diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor index dda7c2b..67a9b09 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Settings/SiteSettings.razor @@ -9,19 +9,11 @@ 설정 - -
-
- System - 설정 - 공개 사이트 연락처와 관리자 계정 보안을 관리합니다. -
-
-
+ - +
사이트 정보 @@ -45,11 +37,11 @@ StartIcon="@Icons.Material.Filled.Save" @onclick="SaveSettings">사이트 정보 저장 - + -