릴리스: v1.3.65 누락 이미지 참조 정리 도구 추가

This commit is contained in:
2026-04-02 14:37:59 +09:00
parent 2918a0423c
commit 5db1e57f13
7 changed files with 189 additions and 0 deletions

View File

@@ -55,6 +55,7 @@ export const api = {
return request(`/api/admin/image-assets/stats?${query.toString()}`)
},
resetAdminImageAssetStats: (payload) => request('/api/admin/image-assets/stats/reset', { method: 'POST', body: payload || {} }),
cleanupAdminMissingImageReferences: () => request('/api/admin/image-assets/missing/cleanup', { method: 'POST', body: {} }),
listAdminUnusedImageAssets: ({ limit = 100, minAgeHours = 24 } = {}) => request(`/api/admin/image-assets/orphans?limit=${encodeURIComponent(limit)}&minAgeHours=${encodeURIComponent(minAgeHours)}`),
cleanupAdminUnusedImageAssets: (payload) => request('/api/admin/image-assets/cleanup', { method: 'POST', body: payload || {} }),
promoteAdminCustomItem: (itemId, payload) =>

View File

@@ -90,6 +90,7 @@ const imageRecentJobs = ref([])
const imageStatsMonth = ref('')
const imageStatsLimit = ref(12)
const imageResetModalOpen = ref(false)
const imageMissingCleanupBusy = ref(false)
const error = ref('')
const success = ref('')
@@ -667,6 +668,23 @@ async function confirmImageReset() {
}
}
async function cleanupMissingImageReferences() {
const ok = window.confirm('파일이 실제로 없는 이미지 참조만 정리할까요? 누락된 썸네일은 비워지고, 누락된 게임/커스텀 아이템은 관련 참조와 함께 정리됩니다.')
if (!ok) return
try {
imageMissingCleanupBusy.value = true
const data = await api.cleanupAdminMissingImageReferences()
await Promise.all([refreshImageDiagnostics(), refreshGames(), refreshCustomItems(), refreshTemplateRequests()])
const result = data.result || {}
success.value = `누락 참조를 정리했어요. 아바타 ${result.clearedAvatars || 0}건, 게임 썸네일 ${result.clearedGameThumbnails || 0}건, 게임 아이템 ${result.deletedGameItems || 0}건, 커스텀 아이템 ${result.deletedCustomItems || 0}`
} catch (e) {
error.value = '누락 이미지 참조 정리에 실패했어요.'
} finally {
imageMissingCleanupBusy.value = false
}
}
function setTab(tab) {
resetMessages()
const nextRouteName = adminRouteNameByTab[tab]
@@ -2065,6 +2083,11 @@ function userAvatarFallback(user) {
<button class="btn btn--ghost" @click="refreshImageDiagnostics">현황 새로고침</button>
<button class="btn btn--ghost" @click="openImageResetModal">기록 비우기</button>
</div>
<div class="adminSidebar__actions">
<button class="btn btn--danger" :disabled="!imageStats?.missingReferencedCount || imageMissingCleanupBusy" @click="cleanupMissingImageReferences">
{{ imageMissingCleanupBusy ? '누락 참조 정리중...' : '누락 참조 정리' }}
</button>
</div>
<div class="hint hint--tight">{{ imageStatsPeriodLabel }}</div>
<div v-if="imageDiagnosticsCards.length" class="adminSidebar__stats adminSidebar__stats--grid">
<article v-for="stat in imageDiagnosticsCards" :key="stat.label" class="sidebarStat">