diff --git a/docs/history.md b/docs/history.md index d279080..0568840 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,10 @@ # 의사결정 이력 +## 2026-03-30 v1.2.9 +- 관리자 화면은 기능보다 먼저 정보 계층이 읽혀야 하므로, 현재 탭에 맞는 요약 통계를 헤더에서 먼저 보여주는 편이 운영 판단에 더 유리하다고 정리했다. +- 게임/아이템/티어표/회원 카드는 기능이 다른 대신 같은 제품 안에 있으므로, 배경층·반경·패딩은 하나의 대시보드 문법으로 맞춰 시안 톤을 더 강하게 유지하기로 결정했다. +- 우측 운영 패널은 단순 필터 모음보다 “현재 상태를 짧게 읽고 바로 액션하는 패널”에 가까워야 하므로, 입력과 통계 카드를 더 단단한 카드형 레이어로 정리하는 편이 맞다고 판단했다. + ## 2026-03-30 v1.2.8 - 에디터는 “보드 편집”과 “옵션 편집”의 역할이 다르므로, 보드 옆에는 드래그용 아이템 풀을 두고 제목/설명/썸네일/저장 같은 설정은 최우측 사이드바에만 남기는 편이 맞다고 판단했다. - 커스텀 아이템 이름 정리는 배치 중에 계속 보는 정보보다 저장 전 정리용 정보에 가까우므로, 아이템 풀 아래보다 우측 편집 패널 내부가 더 적합하다고 정리했다. diff --git a/docs/spec.md b/docs/spec.md index 9a16011..70b20c3 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -40,6 +40,7 @@ - 관리자 화면 - 공통 우측 패널 대신 전용 로컬 운영 패널을 사용한다. - 우측 로컬 패널에는 `게임/아이템/티어표/회원 관리` 탭, 검색, 필터, 새로고침, 빠른 작업 제어를 배치하고, 중앙 영역에는 실제 관리 대상 목록과 상세만 렌더링한다. + - 상단 헤더에는 현재 탭 기준 요약 통계 카드를 배치해 운영 상태를 먼저 읽고, 각 관리 카드는 공통 대시보드 카드 문법(두꺼운 반경, 얕은 레이어 배경, 강조된 액션 버튼)을 공유한다. ## DB 스키마 - `users` diff --git a/docs/todo.md b/docs/todo.md index 68a3f41..e0d8c3b 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -7,6 +7,7 @@ - 공통 셸과 에디터에는 일부 실제 SVG 아이콘을 연결했지만, 아직 즐겨찾기/설정/관리자 등 나머지 내비 아이콘은 임시 선형 SVG이므로 추가 에셋 교체가 남아 있다. - 공통 우측 패널의 토글과 독립 컬럼 구조는 반영되었지만, 현재는 안내 카드 중심이므로 실제 화면별 기능 컨트롤을 이 패널로 옮기는 작업이 남아 있다. - 티어표 편집 화면과 관리자 화면 모두 로컬 우측 패널 구조로 옮겼지만, 아직 세부 카드 밀도와 아이콘/모션 디테일은 피그마 시안 수준으로 더 다듬을 필요가 있다. +- 관리자 화면은 헤더 요약 통계와 카드 계층까지 정리됐지만, 아직 표준 SVG 아이콘 교체와 더 세밀한 상태 색상/선택 상태 표현은 남아 있다. - 머티리얼 아이콘 SVG는 아직 임시 문자/배지 스타일로 대체된 부분이 있으므로, 최종 아이콘 에셋을 받아 반영하는 작업이 필요하다. - 미사용 커스텀 이미지 일괄 삭제는 현재 "참조가 없는 항목" 기준이며, 보관 기간 정책 같은 운영 규칙은 아직 없다. - 업로드 이미지는 현재 원본 파일을 그대로 저장하므로, 운영 부담이 커지면 서버 저장 전 리사이즈/압축(예: 긴 변 제한, WebP 변환) 도입이 필요하다. diff --git a/docs/update.md b/docs/update.md index e62f095..64a80ed 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,10 @@ # 업데이트 로그 +## 2026-03-30 v1.2.9 +- **관리자 대시보드 헤더 보강**: 관리자 화면 상단에 현재 탭 기준 요약 통계 카드를 추가해, 게임/아이템/티어표/회원 상태를 즉시 읽을 수 있게 정리 +- **운영 패널 질감 정리**: 우측 `320px` 운영 패널의 탭, 입력, 통계 카드, 버튼 라운드/배경/호버 상태를 공통 셸 톤에 맞춰 더 두꺼운 대시보드 카드 문법으로 통일 +- **관리 카드 밀도 개선**: 게임 상세, 커스텀 아이템, 템플릿 요청, 전체 티어표, 회원 카드의 배경층·패딩·반경을 함께 다듬어 시안에 가까운 평평한 관리용 레이아웃으로 보정 + ## 2026-03-30 v1.2.8 - **실제 SVG 아이콘 연결 시작**: 사용자가 추가한 `grid_view`, `lists`, `dock_to_left`, `dock_to_right` 아이콘을 공통 셸 내비와 우측 패널 토글에 연결해 문자 기반 아이콘을 일부 실제 에셋으로 교체 - **에디터 3열 구조 복구**: 티어표 편집 화면을 `보드 / 아이템 풀 / 우측 편집 사이드바` 구조로 재배치해, 아이템 풀은 보드 옆에서 바로 드래그 가능하고 편집 옵션은 최우측 패널에만 남도록 수정 diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 5c40c8a..6020523 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -95,6 +95,45 @@ const activeTabDescription = computed(() => { } return '계정 정보, 권한, 비밀번호와 최근 활동을 함께 확인합니다.' }) +const adminOverviewStats = computed(() => { + const publishedTierLists = adminTierLists.value.filter((tierList) => tierList.isPublic).length + const pendingRequests = templateRequests.value.length + const orphanItems = customItems.value.filter((item) => item.usageCount === 0).length + const adminCount = users.value.filter((user) => user.isAdmin || user.draftIsAdmin).length + + if (activeTab.value === 'games') { + return [ + { label: '전체 게임', value: `${games.value.length}` }, + { label: '상단 고정', value: `${featuredGameIds.value.length}/50` }, + { label: '선택 상태', value: hasSelectedGame.value ? '활성' : '대기' }, + ] + } + if (activeTab.value === 'items') { + return [ + { label: '검색 결과', value: `${customItemTotal.value}` }, + { label: '미사용', value: `${orphanItems}` }, + { label: '대상 게임', value: customItemTargetGameId.value ? '선택됨' : '미선택' }, + ] + } + if (activeTab.value === 'tierlists') { + return tierlistsMode.value === 'requests' + ? [ + { label: '대기 요청', value: `${pendingRequests}` }, + { label: '생성 요청', value: `${templateRequests.value.filter((request) => request.type === 'create').length}` }, + { label: '업데이트 요청', value: `${templateRequests.value.filter((request) => request.type === 'update').length}` }, + ] + : [ + { label: '검색 결과', value: `${adminTierListTotal.value}` }, + { label: '공개 티어표', value: `${publishedTierLists}` }, + { label: '현재 페이지', value: `${adminTierListPage.value}/${adminTierListPageCount.value}` }, + ] + } + return [ + { label: '가입 회원', value: `${users.value.length}` }, + { label: '관리자', value: `${adminCount}` }, + { label: '활동 계정', value: `${users.value.filter((user) => user.tierListCount > 0).length}` }, + ] +}) onMounted(async () => { await auth.refresh() @@ -897,6 +936,12 @@ async function saveFeaturedOrder() {
Admin Workspace

{{ activeTabTitle }}

{{ activeTabDescription }}

+
+
+ {{ stat.label }} + {{ stat.value }} +
+