From 21ca43248aa963b3176dd781b6ac6c00b857d74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Wed, 16 Sep 2026 15:42:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8E=9F=E5=A7=8B=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=98=E5=82=A8=EF=BC=88raw=5Fbatch=20?= =?UTF-8?q?=E8=A1=A8/=E8=84=B1=E6=95=8F/=E8=AE=BF=E5=AE=A2=E5=85=B3?= =?UTF-8?q?=E8=81=94/=E8=AF=A6=E6=83=85=E9=A1=B5=20Tab/30=E5=A4=A9?= =?UTF-8?q?=E6=B8=85=E7=90=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- admin/src/api/tracker/visitors.ts | 27 +++ admin/src/views/tracker/visitor/detail.vue | 193 +++++++++++++++++- server/config/urls.py | 5 +- server/tracker/api/collect.py | 30 ++- server/tracker/api/visitors.py | 30 ++- .../management/commands/cleanup_raw.py | 19 ++ server/tracker/migrations/0003_rawbatch.py | 33 +++ server/tracker/models.py | 24 +++ server/tracker/services/validation.py | 13 ++ server/tracker/tests/test_raw.py | 166 +++++++++++++++ 10 files changed, 534 insertions(+), 6 deletions(-) create mode 100644 server/tracker/management/commands/cleanup_raw.py create mode 100644 server/tracker/migrations/0003_rawbatch.py create mode 100644 server/tracker/tests/test_raw.py diff --git a/admin/src/api/tracker/visitors.ts b/admin/src/api/tracker/visitors.ts index 54f5ddb..044bbd2 100644 --- a/admin/src/api/tracker/visitors.ts +++ b/admin/src/api/tracker/visitors.ts @@ -93,6 +93,26 @@ export interface VisitorListResp { page: number } +/** 原始上报批次行(visitors.py `VisitorRawBatchesView`) */ +export interface RawBatchRow { + id: number + batch_id: string + /** accepted / partial / rejected */ + status: string + event_count: number + rejected_count: number + received_at: string + /** 脱敏后的整包 JSON 文本(敏感值已 [FILTERED]、被拒批次已截断)——只做文本渲染,禁 v-html */ + body: string +} + +/** 原始批次列表响应 */ +export interface RawBatchListResp { + list: RawBatchRow[] + total: number + page: number +} + /** * 访客列表筛选参数。 * online/is_new/show_bot 是后端字符串哨兵(仅 "1" 生效,见 visitors.py `_page_visitors`)—— @@ -135,3 +155,10 @@ export const getSession = (visitorId: string, sessionId: string) => request.get({ url: `/admin/visitors/${visitorId}/sessions/${sessionId}` }) + +/** 访客原始上报批次(page_size 10,按接收时间倒序;404 时后端返回 visitor_not_found) */ +export const getRawBatches = (visitorId: string, page = 1) => + request.get({ + url: `/admin/visitors/${visitorId}/raw-batches`, + params: { page } + }) diff --git a/admin/src/views/tracker/visitor/detail.vue b/admin/src/views/tracker/visitor/detail.vue index 558baac..3efa985 100644 --- a/admin/src/views/tracker/visitor/detail.vue +++ b/admin/src/views/tracker/visitor/detail.vue @@ -1,4 +1,4 @@ - + + + + + +
@@ -268,9 +364,11 @@