feat(admin): 스팸 감지 항목 관리자 신고 목록 표시
Deploy / deploy (push) Failing after 11m46s

- 스팸 감지 항목에 🤖 스팸감지 뱃지 표시 (🚩 신고 수 대신)
- blockReason(블라인드 사유) 카드에 표시
- 스팸 항목에는 신고 무시 버튼 숨김
- 안내 문구에 스팸 자동 블라인드 정책 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-07-05 13:47:27 +09:00
parent 066ada961a
commit 9994456f30
+18 -4
View File
@@ -17,6 +17,9 @@ const blockedCount = computed(() => items.value.filter((i) => i.blocked).length)
function keyOf(it) { function keyOf(it) {
return `${it.targetType}:${it.targetId}` return `${it.targetType}:${it.targetId}`
} }
function isSpam(it) {
return it.blockReason === '스팸 키워드 감지'
}
function categoryLabel(c) { function categoryLabel(c) {
return CATEGORY_LABEL[c] || c || '게시판' return CATEGORY_LABEL[c] || c || '게시판'
} }
@@ -99,8 +102,8 @@ onMounted(load)
<div class="report-admin"> <div class="report-admin">
<div class="head"> <div class="head">
<p class="desc"> <p class="desc">
신고 누적 <strong>5</strong> 이상이면 자동 블라인드됩니다. 관리자는 여기서 신고 내용을 검토해 신고 누적 <strong>5</strong> 이상 또는 스팸 키워드 포함 자동 블라인드됩니다.
<b>블라인드</b> 하거나, 정상 글이면 <b>신고 무시</b> 정리할 있습니다. 관리자는 여기서 내용을 검토해 <b>블라인드</b> 하거나, 정상 글이면 <b>신고 무시</b> 정리할 있습니다.
</p> </p>
<button class="reload" type="button" :disabled="loading" @click="load"> 새로고침</button> <button class="reload" type="button" :disabled="loading" @click="load"> 새로고침</button>
</div> </div>
@@ -123,7 +126,8 @@ onMounted(load)
{{ it.targetType === 'POST' ? '글' : '댓글' }} {{ it.targetType === 'POST' ? '글' : '댓글' }}
</span> </span>
<span class="cat">{{ categoryLabel(it.category) }}</span> <span class="cat">{{ categoryLabel(it.category) }}</span>
<span class="report-count">🚩 {{ it.reportCount }}</span> <span v-if="isSpam(it)" class="badge spam">🤖 스팸감지</span>
<span v-else class="report-count">🚩 {{ it.reportCount }}</span>
<span v-if="it.blocked" class="badge blind">블라인드됨</span> <span v-if="it.blocked" class="badge blind">블라인드됨</span>
<span class="time">{{ formatTime(it.lastReportedAt) }}</span> <span class="time">{{ formatTime(it.lastReportedAt) }}</span>
</div> </div>
@@ -134,6 +138,7 @@ onMounted(load)
</RouterLink> </RouterLink>
<p class="content">{{ it.content }}</p> <p class="content">{{ it.content }}</p>
<p class="author">작성자: {{ it.authorName || '알 수 없음' }}</p> <p class="author">작성자: {{ it.authorName || '알 수 없음' }}</p>
<p v-if="it.blockReason" class="block-reason">사유: {{ it.blockReason }}</p>
<div class="actions"> <div class="actions">
<RouterLink :to="linkTo(it)" class="btn ghost"> 보기</RouterLink> <RouterLink :to="linkTo(it)" class="btn ghost"> 보기</RouterLink>
@@ -156,7 +161,7 @@ onMounted(load)
블라인드 해제 블라인드 해제
</button> </button>
<button <button
v-if="!it.blocked" v-if="!it.blocked && !isSpam(it)"
class="btn ghost" class="btn ghost"
type="button" type="button"
:disabled="busyKey === keyOf(it)" :disabled="busyKey === keyOf(it)"
@@ -257,6 +262,15 @@ onMounted(load)
background: #e5484d22; background: #e5484d22;
color: #e5484d; color: #e5484d;
} }
.badge.spam {
background: #f9731622;
color: #ea580c;
}
.block-reason {
margin: 0 0 0.4rem;
font-size: 0.75rem;
color: #ea580c;
}
.cat { .cat {
font-size: 0.78rem; font-size: 0.78rem;
color: var(--color-text-soft, #888); color: var(--color-text-soft, #888);