feat(admin): 지역별 매칭건수 통계 화면 + 메뉴 정리

- 통계 화면(/statistics): 시군구 지역별 매칭건수 전체 — 요약카드·막대분포·상세표(비율)
- 대시보드 지역 카드는 상위 5개만 노출 + '전체 통계' 링크
- 메뉴: '피신고자 관리' → '신고 관리', '통계' 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-07-11 23:19:07 +09:00
parent 3e0219388a
commit bd5ccb6201
4 changed files with 135 additions and 5 deletions
+9 -4
View File
@@ -77,12 +77,16 @@
<div class="col-12 col-md-6">
<q-card flat bordered>
<q-card-section class="q-pb-none">
<div class="text-subtitle1 text-weight-medium">지역별 매칭 (시군구)</div>
<div class="text-caption text-grey-6">체크인 지역 기준</div>
<q-card-section class="row items-center q-pb-none">
<div>
<div class="text-subtitle1 text-weight-medium">지역별 매칭건수 (시군구)</div>
<div class="text-caption text-grey-6">체크인 지역 기준 · 상위 5</div>
</div>
<q-space />
<q-btn flat dense size="sm" color="primary" label="전체 통계" icon-right="chevron_right" :to="{ name: 'statistics' }" />
</q-card-section>
<q-card-section>
<div v-for="r in regions" :key="r.region" class="q-mb-sm">
<div v-for="r in topRegions" :key="r.region" class="q-mb-sm">
<div class="row items-center q-mb-xs">
<div class="text-body2">{{ r.region }}</div>
<q-space />
@@ -127,6 +131,7 @@ const tierRows = computed(() => {
const order = ['FREE', 'AD_FREE', 'PREMIUM']
return [...(summary.value?.members.byTier ?? [])].sort((a, b) => order.indexOf(a.key) - order.indexOf(b.key))
})
const topRegions = computed(() => regions.value.slice(0, 5))
const regionMax = computed(() => Math.max(1, ...regions.value.map((r) => r.checkIns)))
const visitorMax = computed(() => Math.max(1, ...visitors.value.map((v) => v.count)))