From 9bc227f3a3feb5b0cff4aa7b2d00d86f843f44ef Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 16 Jun 2026 16:20:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=97=A5=E5=BF=97=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=20=E2=80=94=208=20=E4=B8=AA=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 概览仪表盘(统计卡片 + echarts 趋势图 + Top5) - 错误列表(分页 + 筛选) - 错误详情(stack trace + 源码上下文) - 事件流水(分页 + 筛选) - 漏斗分析(动态步骤 + 转化率) - Webhook 配置(CRUD) - 高频/高危排行 Co-Authored-By: Claude --- ops-platform/src/api/log.ts | 144 ++++++++++++++ ops-platform/src/router/index.ts | 8 + ops-platform/src/views/layout/MainLayout.vue | 3 +- .../src/views/log-monitor/LogEvents.vue | 111 +++++++++++ .../src/views/log-monitor/LogFunnels.vue | 151 +++++++++++++++ .../src/views/log-monitor/LogIssueDetail.vue | 111 +++++++++++ .../src/views/log-monitor/LogIssues.vue | 130 +++++++++++++ .../src/views/log-monitor/LogOverview.vue | 128 +++++++++++++ .../src/views/log-monitor/LogRankFreq.vue | 72 +++++++ .../src/views/log-monitor/LogRankRisk.vue | 72 +++++++ .../src/views/log-monitor/LogWebhooks.vue | 178 ++++++++++++++++++ ops-platform/vite.config.ts | 5 + 12 files changed, 1112 insertions(+), 1 deletion(-) create mode 100644 ops-platform/src/api/log.ts create mode 100644 ops-platform/src/views/log-monitor/LogEvents.vue create mode 100644 ops-platform/src/views/log-monitor/LogFunnels.vue create mode 100644 ops-platform/src/views/log-monitor/LogIssueDetail.vue create mode 100644 ops-platform/src/views/log-monitor/LogIssues.vue create mode 100644 ops-platform/src/views/log-monitor/LogOverview.vue create mode 100644 ops-platform/src/views/log-monitor/LogRankFreq.vue create mode 100644 ops-platform/src/views/log-monitor/LogRankRisk.vue create mode 100644 ops-platform/src/views/log-monitor/LogWebhooks.vue diff --git a/ops-platform/src/api/log.ts b/ops-platform/src/api/log.ts new file mode 100644 index 0000000..4134ee5 --- /dev/null +++ b/ops-platform/src/api/log.ts @@ -0,0 +1,144 @@ +import client from './client' + +// ---- Types ---- + +export interface LogOverview { + totalIssues: number + todayNew: number + affectedUsers: number + crashRate: number + dailyTrend: Array<{ date: string; crashRate: number }> + topIssues: LogIssueSummary[] +} + +export interface LogIssueSummary { + id: string + title: string + type: string + count: number + affectedUsers: number + platform: string + lastSeenAt: string +} + +export interface LogIssuePage { + content: LogIssueSummary[] + total: number + totalPages: number +} + +export interface LogIssueDetail { + id: string + title: string + type: string + count: number + affectedUsers: number + platform: string + firstSeenAt: string + lastSeenAt: string + status: string + events: LogEvent[] + sourceContext?: string +} + +export interface LogEvent { + id: string + issueId: string + userId: string + platform: string + appVersion: string + osVersion: string + device: string + timestamp: string + properties: Record + stackTrace?: string +} + +export interface LogEventPage { + content: LogEvent[] + total: number + totalPages: number +} + +export interface LogFunnelStep { + name: string + count: number + rate: number +} + +export interface LogFunnelResult { + steps: LogFunnelStep[] + totalStart: number + totalEnd: number + overallRate: number +} + +export interface LogRankingItem { + id: string + title: string + type: string + count: number + affectedUsers: number + platform: string + rank: number +} + +export interface LogWebhook { + id: string + name: string + url: string + events: string[] + enabled: boolean + secret?: string + createdAt: string + updatedAt: string +} + +// ---- API ---- + +export const logApi = { + getOverview: () => + client.get<{ data: LogOverview }>('/log/v1/overview'), + + listIssues: (params: { + type?: string + platform?: string + startDate?: string + endDate?: string + page?: number + size?: number + }) => + client.get<{ data: LogIssuePage }>('/log/v1/issues', { params }), + + getIssueDetail: (id: string) => + client.get<{ data: LogIssueDetail }>(`/log/v1/issues/${id}`), + + getFrequencyRanking: (limit = 10) => + client.get<{ data: LogRankingItem[] }>('/log/v1/issues/rankings/frequency', { params: { limit } }), + + getRiskRanking: (limit = 10) => + client.get<{ data: LogRankingItem[] }>('/log/v1/issues/rankings/risk', { params: { limit } }), + + listEvents: (params: { + eventName?: string + userId?: string + page?: number + size?: number + }) => + client.get<{ data: LogEventPage }>('/log/v1/events', { params }), + + getFunnel: (steps: string[]) => + client.get<{ data: LogFunnelResult }>('/log/v1/events/funnel', { params: { steps } }), + + listWebhooks: () => + client.get<{ data: LogWebhook[] }>('/log/v1/webhooks'), + + createWebhook: (data: Omit) => + client.post<{ data: LogWebhook }>('/log/v1/webhooks', data), + + updateWebhook: (id: string, data: Partial) => + client.put<{ data: LogWebhook }>(`/log/v1/webhooks/${id}`, data), + + deleteWebhook: (id: string) => + client.delete(`/log/v1/webhooks/${id}`), +} diff --git a/ops-platform/src/router/index.ts b/ops-platform/src/router/index.ts index dadc959..9824a02 100644 --- a/ops-platform/src/router/index.ts +++ b/ops-platform/src/router/index.ts @@ -20,6 +20,14 @@ const router = createRouter({ { path: 'operation-logs', component: () => import('@/views/logs/OperationLogView.vue') }, { path: 'risk-control', component: () => import('@/views/risk/RiskControlView.vue') }, { path: 'system-logs', component: () => import('@/views/system/ServerLogsView.vue') }, + { path: 'log/overview', component: () => import('@/views/log-monitor/LogOverview.vue') }, + { path: 'log/issues', component: () => import('@/views/log-monitor/LogIssues.vue') }, + { path: 'log/issues/:id', component: () => import('@/views/log-monitor/LogIssueDetail.vue') }, + { path: 'log/events', component: () => import('@/views/log-monitor/LogEvents.vue') }, + { path: 'log/funnels', component: () => import('@/views/log-monitor/LogFunnels.vue') }, + { path: 'log/webhooks', component: () => import('@/views/log-monitor/LogWebhooks.vue') }, + { path: 'log/rank/freq', component: () => import('@/views/log-monitor/LogRankFreq.vue') }, + { path: 'log/rank/risk', component: () => import('@/views/log-monitor/LogRankRisk.vue') }, ], }, ], diff --git a/ops-platform/src/views/layout/MainLayout.vue b/ops-platform/src/views/layout/MainLayout.vue index 4db4564..5ab066c 100644 --- a/ops-platform/src/views/layout/MainLayout.vue +++ b/ops-platform/src/views/layout/MainLayout.vue @@ -66,7 +66,7 @@ diff --git a/ops-platform/src/views/log-monitor/LogFunnels.vue b/ops-platform/src/views/log-monitor/LogFunnels.vue new file mode 100644 index 0000000..ab0164e --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogFunnels.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/ops-platform/src/views/log-monitor/LogIssueDetail.vue b/ops-platform/src/views/log-monitor/LogIssueDetail.vue new file mode 100644 index 0000000..0282804 --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogIssueDetail.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/ops-platform/src/views/log-monitor/LogIssues.vue b/ops-platform/src/views/log-monitor/LogIssues.vue new file mode 100644 index 0000000..9b93dd0 --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogIssues.vue @@ -0,0 +1,130 @@ + + + diff --git a/ops-platform/src/views/log-monitor/LogOverview.vue b/ops-platform/src/views/log-monitor/LogOverview.vue new file mode 100644 index 0000000..b210d92 --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogOverview.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/ops-platform/src/views/log-monitor/LogRankFreq.vue b/ops-platform/src/views/log-monitor/LogRankFreq.vue new file mode 100644 index 0000000..dd0499d --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogRankFreq.vue @@ -0,0 +1,72 @@ + + + diff --git a/ops-platform/src/views/log-monitor/LogRankRisk.vue b/ops-platform/src/views/log-monitor/LogRankRisk.vue new file mode 100644 index 0000000..505fd81 --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogRankRisk.vue @@ -0,0 +1,72 @@ + + + diff --git a/ops-platform/src/views/log-monitor/LogWebhooks.vue b/ops-platform/src/views/log-monitor/LogWebhooks.vue new file mode 100644 index 0000000..d9b39d0 --- /dev/null +++ b/ops-platform/src/views/log-monitor/LogWebhooks.vue @@ -0,0 +1,178 @@ + + + diff --git a/ops-platform/vite.config.ts b/ops-platform/vite.config.ts index 4f6d892..9b258be 100644 --- a/ops-platform/vite.config.ts +++ b/ops-platform/vite.config.ts @@ -36,6 +36,11 @@ export default defineConfig(({ mode }) => { server: { port: 5174, proxy: { + '/api/log': { + target: 'http://127.0.0.1:9006', + changeOrigin: true, + rewrite: (path: string) => path.replace(/^\/api/, ''), + }, '/api': { target: 'http://127.0.0.1:8081', changeOrigin: true }, }, },