fix: show manually deleted chat messages

This commit is contained in:
ngfchl
2026-07-07 08:43:56 +08:00
parent 5bab60f118
commit a60c56da01
2 changed files with 19 additions and 8 deletions
+3 -3
View File
@@ -116,14 +116,14 @@ def normalize_ban(row: dict) -> dict:
@app.get("/api/messages")
async def api_messages(limit: int = Query(default=50, ge=1, le=500)):
msgs = await Message.filter(manually_deleted=False).order_by("-created_at").limit(limit).values()
msgs = await Message.all().order_by("-created_at").limit(limit).values()
return JSONResponse(json_safe([normalize_message(m) for m in msgs]))
@app.get("/api/chat")
async def api_chat(limit: int = Query(default=100, ge=1, le=500)):
"""兼容旧前端:返回聊天记录。"""
msgs = await Message.filter(manually_deleted=False).order_by("-created_at").limit(limit).values()
msgs = await Message.all().order_by("-created_at").limit(limit).values()
return JSONResponse(json_safe([normalize_message(m) for m in msgs]))
@@ -229,7 +229,7 @@ async def api_delete_message(message_id: int):
"chat_id": rec.chat_id,
"deleted_at": rec.deleted_at,
}))
return JSONResponse({"ok": True, "tg_deleted": tg_deleted, "tg_error": tg_error})
return JSONResponse(json_safe({"ok": True, "tg_deleted": tg_deleted, "tg_error": tg_error, "deleted_at": rec.deleted_at}))
@app.get("/api/scores")
+16 -5
View File
@@ -68,6 +68,8 @@
.chat-item { padding: 8px 10px; border-bottom: 1px solid #edf2f7; border-radius: 8px; transition: background .15s; }
.chat-item:hover { background: #f8fafc; }
.chat-item.spam { background: #fff1f2; border-left: 3px solid #ef4444; }
.chat-item.deleted { background: #f8fafc; border-left: 3px solid #94a3b8; opacity: .72; }
.chat-item.deleted .text { color: #94a3b8; text-decoration: line-through; }
.chat-item .meta { display: flex; justify-content: space-between; gap: 8px; margin-bottom: 4px; }
.chat-item .meta-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
.chat-item .user { font-weight: 700; color: #2563eb; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -170,16 +172,18 @@
</div>
<div class="scroll-area" ref="chatScroll">
<div v-if="chatLogs.length === 0" class="empty-text"><span class="icon">💬</span>等待消息...</div>
<div v-for="(item, i) in chatLogs" :key="i" class="chat-item" :class="{spam: item.spam}">
<div v-for="(item, i) in chatLogs" :key="i" class="chat-item" :class="{spam: item.spam, deleted: item.deleted}">
<div class="meta">
<span class="user">@{{ item.username || item.first_name || 'unknown' }} <small>({{ item.user_id }})</small></span>
<span class="meta-right">
<span class="time">#{{ item.msg_id || '-' }} · {{ formatTime(item.time) }}</span>
<el-button type="text" size="mini" icon="el-icon-delete" :loading="item._deleting" @click="deleteChatMessage(item)">删除</el-button>
<el-tag v-if="item.deleted" size="mini" type="info">手动删除</el-tag>
<el-button v-else type="text" size="mini" icon="el-icon-delete" :loading="item._deleting" @click="deleteChatMessage(item)">删除</el-button>
</span>
</div>
<div class="text">{{ item.text }}</div>
<el-tag v-if="item.spam" size="mini" type="danger">垃圾:{{ item.reason || item.spam_reason }}</el-tag>
<el-tag v-if="item.deleted" size="mini" type="info">已手动删除 · {{ formatTime(item.deleted_at) }}</el-tag>
</div>
</div>
</el-card>
@@ -286,7 +290,12 @@ new Vue({
})
es.addEventListener('chat_delete', (e) => {
const data = JSON.parse(e.data)
this.chatLogs = this.chatLogs.filter(m => m.id !== data.id)
const item = this.chatLogs.find(m => m.id === data.id)
if (item) {
this.$set(item, 'deleted', true)
this.$set(item, 'manually_deleted', true)
this.$set(item, 'deleted_at', data.deleted_at)
}
this.loadStats()
})
es.addEventListener('ban', (e) => {
@@ -362,8 +371,10 @@ new Vue({
try {
const data = await (await fetch(`/api/messages/${item.id}/delete`, { method: 'POST' })).json()
if (data.ok) {
this.chatLogs = this.chatLogs.filter(m => m.id !== item.id)
this.$message.success('✅ 已删除并标记')
this.$set(item, 'deleted', true)
this.$set(item, 'manually_deleted', true)
this.$set(item, 'deleted_at', data.deleted_at || new Date().toISOString())
this.$message.success('✅ 已标记为手动删除')
this.loadStats()
} else {
this.$message.error(`❌ 删除失败: ${data.error}`)