diff --git a/src/api/ops/url-device.ts b/src/api/ops/url-device.ts new file mode 100644 index 0000000..4821611 --- /dev/null +++ b/src/api/ops/url-device.ts @@ -0,0 +1,145 @@ +import { request } from '@/api/request' + +export interface UrlDeviceItem { + id: number + created_at: string + updated_at: string + deleted_at: string | null + service_identity: string + name: string + description: string + target_url: string + method: string + enabled: boolean + interval: number + extra: string + tags: string + collect_on: boolean + collect_interval: number + collect_last_result: string + status: string + status_code: number + response_time: number + last_check_time: string + last_online_time: string | null + last_offline_time: string | null + continuous_errors: number +} + +export interface UrlDeviceListResponse { + total: number + page: number + page_size: number + data: UrlDeviceItem[] +} + +export interface UrlDeviceListParams { + page?: number + size?: number + keyword?: string + enabled?: boolean +} + +export interface UrlDeviceCreateData { + service_identity?: string + name: string + description?: string + target_url: string + method?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + collect_on?: boolean + collect_interval?: number + collect_last_result?: string +} + +export interface UrlDeviceUpdateData { + name?: string + description?: string + target_url?: string + method?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + collect_on?: boolean + collect_interval?: number + collect_last_result?: string + status?: string + status_code?: number + response_time?: number + last_check_time?: string + last_online_time?: string | null + last_offline_time?: string | null + continuous_errors?: number +} + +export interface UrlDeviceCollectData { + collect_on?: boolean + collect_interval?: number + collect_last_result?: string +} + +export const fetchUrlDeviceList = (params?: UrlDeviceListParams) => { + return request.get('/DC-Control/v1/url-devices', { params }) +} + +export const fetchUrlDeviceDetail = (id: number) => { + return request.get(`/DC-Control/v1/url-devices/${id}`) +} + +export const createUrlDevice = (data: UrlDeviceCreateData) => { + return request.post<{ message: string; id: number }>('/DC-Control/v1/url-devices', data) +} + +export const updateUrlDevice = (id: number, data: UrlDeviceUpdateData) => { + return request.put<{ message: string }>(`/DC-Control/v1/url-devices/${id}`, data) +} + +export const patchUrlDeviceCollect = (id: number, data: UrlDeviceCollectData) => { + return request.patch<{ message: string }>(`/DC-Control/v1/url-devices/${id}/collect`, data) +} + +export const deleteUrlDevice = (id: number) => { + return request.delete<{ message: string }>(`/DC-Control/v1/url-devices/${id}`) +} + +export interface UrlDeviceStatsOverview { + total: number + online: number + today_alert_count: number + avg_response_time_ms: number +} + +export interface ResponseTimePoint { + hour: string + avg_response_time_ms: number +} + +export interface UrlDeviceResponseTimeTrend { + points: ResponseTimePoint[] +} + +export interface StatusDistributionItem { + status: string + count: number +} + +export interface UrlDeviceStatusDistribution { + total: number + by_status: StatusDistributionItem[] +} + +export const fetchUrlDeviceStatsOverview = () => { + return request.get('/DC-Control/v1/url-devices/stats/overview') +} + +export const fetchUrlDeviceResponseTimeTrend = () => { + return request.get('/DC-Control/v1/url-devices/stats/response-time-trend') +} + +export const fetchUrlDeviceStatusDistribution = () => { + return request.get('/DC-Control/v1/url-devices/stats/status-distribution') +} diff --git a/src/views/ops/pages/dc/url-harvest/components/Detail.vue b/src/views/ops/pages/dc/url-harvest/components/Detail.vue new file mode 100644 index 0000000..73ca677 --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/components/Detail.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/ops/pages/dc/url-harvest/components/FormDialog.vue b/src/views/ops/pages/dc/url-harvest/components/FormDialog.vue new file mode 100644 index 0000000..1e2a848 --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/components/FormDialog.vue @@ -0,0 +1,220 @@ + + + diff --git a/src/views/ops/pages/dc/url-harvest/components/QuickConfigDialog.vue b/src/views/ops/pages/dc/url-harvest/components/QuickConfigDialog.vue new file mode 100644 index 0000000..3a246ff --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/components/QuickConfigDialog.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/views/ops/pages/dc/url-harvest/config/columns.ts b/src/views/ops/pages/dc/url-harvest/config/columns.ts new file mode 100644 index 0000000..6ae1980 --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/config/columns.ts @@ -0,0 +1,71 @@ +export const columns = [ + { + dataIndex: 'id', + title: 'ID', + width: 80, + slotName: 'id', + }, + { + dataIndex: 'service_identity', + title: '服务标识', + width: 150, + }, + { + dataIndex: 'name', + title: '服务名称', + width: 150, + }, + { + dataIndex: 'target_url', + title: '目标URL', + width: 200, + ellipsis: true, + tooltip: true, + }, + { + dataIndex: 'method', + title: 'HTTP方法', + width: 100, + }, + { + dataIndex: 'enabled', + title: '启用状态', + width: 100, + slotName: 'enabled', + }, + { + dataIndex: 'collect_on', + title: '数据采集', + width: 100, + slotName: 'data_collection', + }, + { + dataIndex: 'status', + title: '状态', + width: 100, + slotName: 'status', + }, + { + dataIndex: 'status_code', + title: '状态码', + width: 100, + }, + { + dataIndex: 'response_time', + title: '响应时间(ms)', + width: 120, + }, + { + dataIndex: 'last_check_time', + title: '最后检查时间', + width: 180, + slotName: 'last_check_time', + }, + { + dataIndex: 'actions', + title: '操作', + width: 180, + fixed: 'right' as const, + slotName: 'actions', + }, +] diff --git a/src/views/ops/pages/dc/url-harvest/config/search-form.ts b/src/views/ops/pages/dc/url-harvest/config/search-form.ts new file mode 100644 index 0000000..631136a --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/config/search-form.ts @@ -0,0 +1,22 @@ +import type { FormItem } from '@/components/search-form/types' + +export const searchFormConfig: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入服务名称', + span: 6, + }, + { + field: 'enabled', + label: '启用状态', + type: 'select', + placeholder: '请选择启用状态', + options: [ + { label: '已启用', value: true }, + { label: '已禁用', value: false }, + ], + span: 6, + }, +] diff --git a/src/views/ops/pages/dc/url-harvest/index.vue b/src/views/ops/pages/dc/url-harvest/index.vue new file mode 100644 index 0000000..4221c8c --- /dev/null +++ b/src/views/ops/pages/dc/url-harvest/index.vue @@ -0,0 +1,300 @@ + + + + + + + diff --git a/src/views/ops/pages/monitor/url/index.vue b/src/views/ops/pages/monitor/url/index.vue index 2912855..e79a150 100644 --- a/src/views/ops/pages/monitor/url/index.vue +++ b/src/views/ops/pages/monitor/url/index.vue @@ -24,9 +24,9 @@
正常运行
-
{{ stats.normal }}
+
{{ stats.online }}
- {{ stats.normalPercent }}% + {{ Math.round(stats.total > 0 ? (stats.online / stats.total) * 100 : 0) }}%
@@ -39,9 +39,9 @@
-
异常告警
-
{{ stats.warning }}
-
较昨日 -2
+
今日告警
+
{{ stats.today_alert_count }}
+
当日告警数
@@ -54,8 +54,11 @@
平均响应
-
{{ stats.avgResponse }}ms
-
较昨日 -15ms
+
+ {{ Math.round(stats.avg_response_time_ms) }} + ms +
+
全设备平均
@@ -94,12 +97,7 @@ {{ item.name }} {{ item.uptime }}% - + @@ -108,34 +106,30 @@ - - + - - -