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 }, }, },