feat: 시즌별 마케팅 + 공지사항 관리 기능 추가
- 연간 세무 캘린더(7개 시즌) 기반 자동 Hero 섹션 전환 - 시즌 감지 시 D-Day 카운트다운, 긴박감 배지, 시즌 CTA 표시 - 서비스 카드 순서 시즌 관련 항목 우선 정렬 - 어드민 공지사항 CRUD (등록·수정·삭제, 기간·유형 설정) - 홈페이지 상단 공지 배너 자동 노출 (일반/배너/긴급) - CLAUDE.md에 세무 캘린더 및 마케팅 방향 하네스 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,41 +5,60 @@
|
||||
|
||||
<PageTitle>대시보드</PageTitle>
|
||||
|
||||
<h1 class="mb-4">대시보드</h1>
|
||||
<section class="admin-page-hero">
|
||||
<div>
|
||||
<MudText Typo="Typo.caption" Class="admin-eyebrow">Overview</MudText>
|
||||
<MudText Typo="Typo.h4" Class="admin-page-title">대시보드</MudText>
|
||||
<MudText Typo="Typo.body2" Class="admin-page-subtitle">문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다.</MudText>
|
||||
</div>
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Add" Href="/taxbaik/admin/blog/create">
|
||||
새 포스트 작성
|
||||
</MudButton>
|
||||
</section>
|
||||
|
||||
<MudGrid>
|
||||
<MudGrid Class="admin-metric-grid">
|
||||
<MudItem xs="12" sm="6" md="3">
|
||||
<MudPaper Class="pa-4" Elevation="1">
|
||||
<MudText Typo="Typo.subtitle2">이번달 문의</MudText>
|
||||
<MudText Typo="Typo.h4">@summary.ThisMonthInquiries</MudText>
|
||||
<MudPaper Class="admin-metric-card accent-blue" Elevation="0">
|
||||
<MudText Typo="Typo.caption">이번달 문의</MudText>
|
||||
<MudText Typo="Typo.h3">@summary.ThisMonthInquiries</MudText>
|
||||
<MudText Typo="Typo.body2">월간 상담 유입</MudText>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6" md="3">
|
||||
<MudPaper Class="pa-4" Elevation="1">
|
||||
<MudText Typo="Typo.subtitle2">신규 문의</MudText>
|
||||
<MudText Typo="Typo.h4">@summary.NewInquiries</MudText>
|
||||
<MudPaper Class="admin-metric-card accent-amber" Elevation="0">
|
||||
<MudText Typo="Typo.caption">신규 문의</MudText>
|
||||
<MudText Typo="Typo.h3">@summary.NewInquiries</MudText>
|
||||
<MudText Typo="Typo.body2">처리 대기</MudText>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6" md="3">
|
||||
<MudPaper Class="pa-4" Elevation="1">
|
||||
<MudText Typo="Typo.subtitle2">전체 포스트</MudText>
|
||||
<MudText Typo="Typo.h4">@summary.TotalPosts</MudText>
|
||||
<MudPaper Class="admin-metric-card accent-slate" Elevation="0">
|
||||
<MudText Typo="Typo.caption">전체 포스트</MudText>
|
||||
<MudText Typo="Typo.h3">@summary.TotalPosts</MudText>
|
||||
<MudText Typo="Typo.body2">콘텐츠 자산</MudText>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6" md="3">
|
||||
<MudPaper Class="pa-4" Elevation="1">
|
||||
<MudText Typo="Typo.subtitle2">발행된 포스트</MudText>
|
||||
<MudText Typo="Typo.h4">@summary.PublishedPosts</MudText>
|
||||
<MudPaper Class="admin-metric-card accent-green" Elevation="0">
|
||||
<MudText Typo="Typo.caption">발행된 포스트</MudText>
|
||||
<MudText Typo="Typo.h3">@summary.PublishedPosts</MudText>
|
||||
<MudText Typo="Typo.body2">검색 노출 대상</MudText>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
|
||||
<MudPaper Class="pa-4 mt-4" Elevation="1">
|
||||
<MudText Typo="Typo.h6" Class="mb-3">최근 문의</MudText>
|
||||
<MudSimpleTable Striped="true" Dense="true">
|
||||
<MudPaper Class="admin-surface mt-4" Elevation="0">
|
||||
<div class="admin-section-header">
|
||||
<div>
|
||||
<MudText Typo="Typo.h6">최근 문의</MudText>
|
||||
<MudText Typo="Typo.body2">최근 유입된 상담 요청을 빠르게 확인합니다.</MudText>
|
||||
</div>
|
||||
<MudButton Variant="Variant.Outlined" Color="Color.Primary" Href="/taxbaik/admin/inquiries">문의 전체 보기</MudButton>
|
||||
</div>
|
||||
<MudSimpleTable Striped="true" Dense="true" Class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>이름</th>
|
||||
@@ -59,7 +78,7 @@
|
||||
<td>
|
||||
<MudChip Size="Size.Small"
|
||||
Color="@(inquiry.Status == "new" ? Color.Warning : inquiry.Status == "contacted" ? Color.Info : Color.Success)">
|
||||
@inquiry.Status
|
||||
@GetStatusLabel(inquiry.Status)
|
||||
</MudChip>
|
||||
</td>
|
||||
<td>@inquiry.CreatedAt.ToString("yyyy-MM-dd")</td>
|
||||
@@ -75,5 +94,13 @@
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
summary = await DashboardService.GetSummaryAsync();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetStatusLabel(string status) => status switch
|
||||
{
|
||||
"new" => "신규",
|
||||
"contacted" => "연락함",
|
||||
"completed" => "완료",
|
||||
_ => status
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user