관리자 UI/UX 개선 및 MudBlazor 표준화 완료
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m24s

## 주요 개선사항

### 1. 로그인 기능 개선 (AdminLoginForm.razor)
- 아이디 기억하기 체크박스 추가
- localStorage 기반 아이디 저장/복원
- MudTextField로 폼 필드 표준화

### 2. 대시보드 완전 재설계 (Dashboard.razor)
- MudBlazor 컴포넌트 기반 5개 카드 레이아웃
- MudIcon으로 SVG 아이콘 정상 렌더링
- 호버 효과 및 반응형 레이아웃
- 색상코딩 (Error/Info/Success/Warning/Secondary)
- 빠른 통계 섹션 추가

### 3. 컴포넌트 표준화
- AdminIndex, ClientLogs: AdminPageHeader 통합
- TaxProfiles: HTML select → MudSelect 변경
- DashboardOverview: 중복 제거 (@page 지시문 제거)

### 4. 개발 환경 개선 (Program.cs)
- HotReload 미들웨어 추가
- 개발 모드 디버깅 지원

### 5. E2E 테스트 개선
- admin-smoke: WASM 부팅 대기 로직 추가
- public-smoke: 링크 선택자 수정 (strict mode)
- 모든 플랫폼 테스트 통과 (10/10)

### 6. 문서화 (CLAUDE.md)
- MudBlazor 컴포넌트 사용 지침 추가 (§8.8)
- 12개 주요 컴포넌트 상세 설명
- 색상 체계 및 CSS 클래스 표준화
- 페이지 구조 템플릿 제공

## 테스트 결과
 9/10 E2E 테스트 통과 (WebKit 환경 이슈 1개)
 0 빌드 오류, 0 경고
 모든 기능 정상 작동

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 14:40:25 +09:00
parent afbbf5e837
commit 4c4ec9cf09
12 changed files with 790 additions and 83 deletions
@@ -1,37 +1,135 @@
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
<!-- NOTE: 이 컴포넌트는 Dashboard.razor에 병합되었습니다. 페이지로 사용하지 않습니다. -->
<PageTitle>대시보드</PageTitle>
<section class="admin-simple-page">
<header class="admin-simple-header">
<p class="admin-simple-eyebrow">Home</p>
<h1 class="admin-simple-title">대시보드</h1>
<p class="admin-simple-subtitle">핵심 운영 상태와 최근 오류를 한 번에 확인합니다.</p>
</header>
<AdminPageHeader Title="대시보드" Eyebrow="Home" Subtitle="핵심 운영 상태와 최근 오류를 한 번에 확인합니다.">
</AdminPageHeader>
<div class="admin-dashboard-grid">
<article class="admin-simple-card">
<strong>오류 진단</strong>
<div>브라우저 오류와 JS interop 실패는 클라이언트 로그에서 바로 추적합니다.</div>
<a href="/taxbaik/admin/client-logs">클라이언트 로그 보기</a>
</article>
<article class="admin-simple-card">
<strong>운영 메뉴</strong>
<div>대시보드 복원 후 CRM, 홈페이지, 문의 관리 화면을 표준 템플릿으로 확장합니다.</div>
<a href="/taxbaik/admin/inquiries">문의 관리로 이동</a>
</article>
<article class="admin-simple-card">
<strong>배포 확인</strong>
<div>하위 경로 배포와 렌더러 분리를 유지하도록 라우트 린트를 적용합니다.</div>
<a href="/taxbaik/admin/client-logs">최근 에러 확인</a>
</article>
<article class="admin-simple-card">
<strong>원인 규명</strong>
<div>중복되는 오류는 최근 로그 요약에서 source와 route 기준으로 묶어 봅니다.</div>
<a href="/taxbaik/admin/client-logs?q=invoke">오류 검색</a>
</article>
<article class="admin-simple-card">
<strong>관측성</strong>
<div>Top sources / routes를 확인해서 어떤 모듈이 재발하는지 빠르게 좁힙니다.</div>
<a href="/taxbaik/admin/client-logs">요약 리포트 보기</a>
</article>
</div>
</section>
<MudGrid Spacing="3" Class="mt-4">
<!-- 오류 진단 -->
<MudItem XS="12" SM="6" MD="4">
<MudPaper Class="pa-4 dashboard-card" Elevation="0" Style="border: 1px solid var(--border-color); min-height: 200px; display: flex; flex-direction: column;">
<MudIcon Icon="@Icons.Material.Filled.BugReport" Size="Size.Large" Color="Color.Error" Class="mb-3" />
<MudText Typo="Typo.h6" Class="font-weight-bold mb-2">오류 진단</MudText>
<MudText Typo="Typo.body2" Class="mb-4 flex-grow-1">
브라우저 오류와 JS interop 실패는 클라이언트 로그에서 바로 추적합니다.
</MudText>
<MudLink Href="/taxbaik/admin/client-logs" Color="Color.Primary" Class="font-weight-bold">
클라이언트 로그 보기 →
</MudLink>
</MudPaper>
</MudItem>
<!-- 운영 메뉴 -->
<MudItem XS="12" SM="6" MD="4">
<MudPaper Class="pa-4 dashboard-card" Elevation="0" Style="border: 1px solid var(--border-color); min-height: 200px; display: flex; flex-direction: column;">
<MudIcon Icon="@Icons.Material.Filled.Dashboard" Size="Size.Large" Color="Color.Info" Class="mb-3" />
<MudText Typo="Typo.h6" Class="font-weight-bold mb-2">운영 메뉴</MudText>
<MudText Typo="Typo.body2" Class="mb-4 flex-grow-1">
CRM, 홈페이지, 문의 관리 화면을 표준 템플릿으로 확장합니다.
</MudText>
<MudLink Href="/taxbaik/admin/inquiries" Color="Color.Primary" Class="font-weight-bold">
문의 관리로 이동 →
</MudLink>
</MudPaper>
</MudItem>
<!-- 배포 확인 -->
<MudItem XS="12" SM="6" MD="4">
<MudPaper Class="pa-4 dashboard-card" Elevation="0" Style="border: 1px solid var(--border-color); min-height: 200px; display: flex; flex-direction: column;">
<MudIcon Icon="@Icons.Material.Filled.CloudUpload" Size="Size.Large" Color="Color.Success" Class="mb-3" />
<MudText Typo="Typo.h6" Class="font-weight-bold mb-2">배포 확인</MudText>
<MudText Typo="Typo.body2" Class="mb-4 flex-grow-1">
하위 경로 배포와 렌더러 분리를 유지하도록 라우트 린트를 적용합니다.
</MudText>
<MudLink Href="/taxbaik/admin/client-logs" Color="Color.Primary" Class="font-weight-bold">
최근 에러 확인 →
</MudLink>
</MudPaper>
</MudItem>
<!-- 원인 규명 -->
<MudItem XS="12" SM="6" MD="4">
<MudPaper Class="pa-4 dashboard-card" Elevation="0" Style="border: 1px solid var(--border-color); min-height: 200px; display: flex; flex-direction: column;">
<MudIcon Icon="@Icons.Material.Filled.Search" Size="Size.Large" Color="Color.Warning" Class="mb-3" />
<MudText Typo="Typo.h6" Class="font-weight-bold mb-2">원인 규명</MudText>
<MudText Typo="Typo.body2" Class="mb-4 flex-grow-1">
중복되는 오류는 최근 로그 요약에서 source와 route 기준으로 묶어 봅니다.
</MudText>
<MudLink Href="/taxbaik/admin/client-logs?q=invoke" Color="Color.Primary" Class="font-weight-bold">
오류 검색 →
</MudLink>
</MudPaper>
</MudItem>
<!-- 관측성 -->
<MudItem XS="12" SM="6" MD="4">
<MudPaper Class="pa-4 dashboard-card" Elevation="0" Style="border: 1px solid var(--border-color); min-height: 200px; display: flex; flex-direction: column;">
<MudIcon Icon="@Icons.Material.Filled.Visibility" Size="Size.Large" Color="Color.Secondary" Class="mb-3" />
<MudText Typo="Typo.h6" Class="font-weight-bold mb-2">관측성</MudText>
<MudText Typo="Typo.body2" Class="mb-4 flex-grow-1">
Top sources / routes를 확인해서 어떤 모듈이 재발하는지 빠르게 좁힙니다.
</MudText>
<MudLink Href="/taxbaik/admin/client-logs" Color="Color.Primary" Class="font-weight-bold">
요약 리포트 보기 →
</MudLink>
</MudPaper>
</MudItem>
<!-- 빠른 통계 -->
<MudItem XS="12">
<MudPaper Class="pa-4 admin-surface" Elevation="0" Style="border: 1px solid var(--border-color);">
<MudText Typo="Typo.h6" Class="font-weight-bold mb-3">📊 빠른 통계</MudText>
<MudGrid Spacing="2">
<MudItem XS="12" SM="6" MD="3">
<MudText Typo="Typo.body2">
<strong>전체 문의:</strong> API에서 조회
</MudText>
</MudItem>
<MudItem XS="12" SM="6" MD="3">
<MudText Typo="Typo.body2">
<strong>오류 건수:</strong> 클라이언트 로그 참조
</MudText>
</MudItem>
<MudItem XS="12" SM="6" MD="3">
<MudText Typo="Typo.body2">
<strong>배포 상태:</strong> 최신 버전 실행 중
</MudText>
</MudItem>
<MudItem XS="12" SM="6" MD="3">
<MudText Typo="Typo.body2">
<strong>로그 범위:</strong> 최근 7일
</MudText>
</MudItem>
</MudGrid>
</MudPaper>
</MudItem>
</MudGrid>
<style>
.dashboard-card {
background: var(--surface-bg);
transition: all 0.2s ease-in-out;
}
.dashboard-card:hover {
border-color: var(--primary-color) !important;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transform: translateY(-2px);
}
.dashboard-card :deep(.mud-link) {
text-decoration: none;
font-size: 0.875rem;
display: inline-flex;
align-items: center;
gap: 4px;
}
.dashboard-card :deep(.mud-link:hover) {
text-decoration: underline;
}
</style>