diff --git a/src/api/ops/database.ts b/src/api/ops/database.ts new file mode 100644 index 0000000..c4ee080 --- /dev/null +++ b/src/api/ops/database.ts @@ -0,0 +1,199 @@ +import { request } from '@/api/request' + +/** 数据库类型枚举 */ +export type DatabaseType = 'MySQL' | 'PostgreSQL' | 'Redis' | 'MongoDB' | 'DM' | 'KingBase' + +/** 数据库服务状态 */ +export type DatabaseStatus = 'online' | 'offline' | 'error' + +/** 数据库服务接口返回数据结构 */ +export interface DatabaseService { + id: number + created_at: string + updated_at: string + deleted_at: string | null + service_identity: string + server_identity: string + name: string + category: string + type: DatabaseType + host: string + port: number + username: string + password: string // 列表接口恒为空字符串,详情接口不返回 + database: string + description: string + enabled: boolean + interval: number + extra: string + tags: string + status: DatabaseStatus + status_code: number + status_message: string + response_time: number + last_check_time: string + last_online_time: string | null + last_offline_time: string | null + continuous_errors: number + uptime: number + collect_on: boolean + collect_interval: number + collect_args: string + collect_last_result: string +} + +/** 列表接口返回的分页数据 */ +export interface DatabaseListResponse { + total: number + page: number + page_size: number + data: DatabaseService[] +} + +/** 创建数据库服务请求参数 */ +export interface CreateDatabaseParams { + service_identity?: string + server_identity?: string + name: string + category: string + type: DatabaseType + host: string + port: number + username?: string + password?: string + database?: string + description?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} + +/** 更新数据库服务请求参数 */ +export interface UpdateDatabaseParams { + service_identity?: string + server_identity?: string + name?: string + category?: string + type?: DatabaseType + host?: string + port?: number + username?: string + password?: string + database?: string + description?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} + +/** 列表查询参数 */ +export interface DatabaseQueryParams { + page?: number + size?: number + keyword?: string + enabled?: boolean +} + +/** 指标采集请求参数 */ +export interface CollectMetricsParams { + ids: number[] + persist?: boolean +} + +/** 指标采集结果项 */ +export interface CollectMetricsResultItem { + id: number + service_identity: string + metrics?: Record + error?: string +} + +/** 指标采集响应 */ +export interface CollectMetricsResponse { + results: CollectMetricsResultItem[] +} + +/** 指标元数据项 */ +export interface MetricMetaItem { + metric_name: string + metric_unit: string + type: string + last_timestamp: string +} + +/** 指标元数据响应 */ +export interface MetricMetaResponse { + data_source: string + collector_identity: string + server_identity: string + count: number + metrics: MetricMetaItem[] +} + +/** 指标元数据查询参数 */ +export interface MetricMetaQueryParams { + data_source: string + server_identity?: string + keyword?: string + limit?: number +} + +/** + * 获取数据库服务列表 + * @param params 查询参数 + */ +export const fetchDatabaseList = (params: DatabaseQueryParams) => + request.get('/DC-Control/v1/database', { params }) + +/** + * 获取数据库服务详情 + * @param id 服务ID + */ +export const fetchDatabaseDetail = (id: number) => + request.get(`/DC-Control/v1/database/${id}`) + +/** + * 创建数据库服务 + * @param data 创建参数 + */ +export const createDatabase = (data: CreateDatabaseParams) => + request.post<{ message: string; id: number }>('/DC-Control/v1/database', data) + +/** + * 更新数据库服务 + * @param id 服务ID + * @param data 更新参数 + */ +export const updateDatabase = (id: number, data: UpdateDatabaseParams) => + request.put<{ message: string }>(`/DC-Control/v1/database/${id}`, data) + +/** + * 删除数据库服务(软删除) + * @param id 服务ID + */ +export const deleteDatabase = (id: number) => + request.delete<{ message: string }>(`/DC-Control/v1/database/${id}`) + +/** + * 按服务主键采集指标 + * @param data 采集参数 + */ +export const collectDatabaseMetrics = (data: CollectMetricsParams) => + request.post('/DC-Control/v1/database/metrics/collect', data) + +/** + * 查询指标元数据 + * @param params 查询参数 + */ +export const fetchMetricMeta = (params: MetricMetaQueryParams) => + request.get('/DC-Control/v1/services/metrics/meta', { params }) \ No newline at end of file diff --git a/src/api/ops/middleware.ts b/src/api/ops/middleware.ts new file mode 100644 index 0000000..6e54642 --- /dev/null +++ b/src/api/ops/middleware.ts @@ -0,0 +1,191 @@ +import { request } from '@/api/request' + +/** 中间件服务项 */ +export interface MiddlewareItem { + id: number + created_at: string + updated_at: string + deleted_at: string | null + service_identity: string + server_identity: string + name: string + category: string + type: string + description: string + enabled: boolean + interval: number + extra: string + tags: string + status_url: string + status: string + status_code: number + status_message: string + response_time: number + last_check_time: string + last_online_time: string | null + last_offline_time: string | null + continuous_errors: number + uptime: number + agent_config: string + collect_on: boolean + collect_args: string + collect_interval: number + collect_last_result: string +} + +/** 中间件列表响应 */ +export interface MiddlewareListResponse { + total: number + page: number + page_size: number + data: MiddlewareItem[] +} + +/** 中间件列表请求参数 */ +export interface MiddlewareListParams { + page?: number + size?: number + keyword?: string + enabled?: boolean +} + +/** 创建中间件请求参数 */ +export interface MiddlewareCreateData { + service_identity?: string + server_identity?: string + name: string + category: string + type: string + description?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + status_url?: string + agent_config?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + policy_ids?: number[] +} + +/** 更新中间件请求参数 */ +export interface MiddlewareUpdateData { + service_identity?: string + server_identity?: string + name?: string + category?: string + type?: string + description?: string + enabled?: boolean + interval?: number + extra?: string + tags?: string + status_url?: string + agent_config?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string + status?: string + status_code?: number + status_message?: string + response_time?: number + last_check_time?: string + last_online_time?: string | null + last_offline_time?: string | null + continuous_errors?: number + uptime?: number + policy_ids?: number[] +} + +/** 采集配置更新参数 */ +export interface MiddlewareCollectData { + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} + +/** 指标上报项 */ +export interface MetricItem { + service_identity: string + timestamp: string + [key: string]: any +} + +/** 指标上报请求参数 */ +export interface MetricsUploadData { + metrics: MetricItem[] +} + +/** 指标上报响应 */ +export interface MetricsUploadResponse { + message: string + count: number +} + +/** 指标元数据项 */ +export interface MetricMetaItem { + metric_name: string + metric_unit: string + type: string + last_timestamp: string +} + +/** 指标元数据响应 */ +export interface MetricsMetaResponse { + data_source: string + collector_identity: string + server_identity: string + count: number + metrics: MetricMetaItem[] +} + +/** 指标元数据请求参数 */ +export interface MetricsMetaParams { + data_source: string + server_identity?: string + keyword?: string + limit?: number +} + +/** 获取中间件服务列表(匿名接口) */ +export const fetchMiddlewareList = (params?: MiddlewareListParams) => { + return request.get('/DC-Control/v1/middleware', { params }) +} + +/** 获取中间件服务详情 */ +export const fetchMiddlewareDetail = (id: number) => { + return request.get(`/DC-Control/v1/middleware/${id}`) +} + +/** 创建中间件服务 */ +export const createMiddleware = (data: MiddlewareCreateData) => { + return request.post<{ message: string; id: number }>('/DC-Control/v1/middleware', data) +} + +/** 更新中间件服务 */ +export const updateMiddleware = (id: number, data: MiddlewareUpdateData) => { + return request.put<{ message: string }>(`/DC-Control/v1/middleware/${id}`, data) +} + +/** 部分更新采集配置 */ +export const patchMiddlewareCollect = (id: number, data: MiddlewareCollectData) => { + return request.patch<{ message: string }>(`/DC-Control/v1/middleware/${id}/collect`, data) +} + +/** 删除中间件服务 */ +export const deleteMiddleware = (id: number) => { + return request.delete<{ message: string }>(`/DC-Control/v1/middleware/${id}`) +} + +/** 上报中间件服务指标(匿名接口) */ +export const uploadMiddlewareMetrics = (data: MetricsUploadData) => { + return request.post('/DC-Control/v1/middleware/metrics/upload', data) +} + +/** 查询中间件服务指标元数据 */ +export const fetchMiddlewareMetricsMeta = (params: MetricsMetaParams) => { + return request.get('/DC-Control/v1/services/metrics/meta', { params }) +} \ No newline at end of file diff --git a/src/api/ops/pc.ts b/src/api/ops/pc.ts index 3a50736..9bfad15 100644 --- a/src/api/ops/pc.ts +++ b/src/api/ops/pc.ts @@ -1,40 +1,130 @@ -import { request } from "@/api/request"; +import { request } from '@/api/request' + +/** PC 列表查询参数 */ +export interface PCListParams { + page?: number + size?: number + keyword?: string + collect_on?: boolean +} + +/** 资源使用率信息 */ +export interface ResourceInfo { + value: number // 使用率百分比 + total?: string // 总量描述 + used?: string // 已用描述 +} + +/** PC 数据结构 */ +export interface PCItem { + id: number + created_at: string + updated_at: string + deleted_at: string | null + pc_identity: string + name: string + host: string + ip_address: string + description: string + os: string + os_version: string + kernel: string + server_type: string + tags: string + location: string + remote_access: string + remote_port: number + agent_config: string + status: string + last_check_time: string + collect_on: boolean + collect_args: string + collect_interval: number + collect_last_result: string + // 资源使用率(前端展示用,可能来自采集数据) + cpu_info?: ResourceInfo + memory_info?: ResourceInfo + disk_info?: ResourceInfo +} + +/** PC 列表返回数据 */ +export interface PCListResult { + total: number + page: number + page_size: number + data: PCItem[] +} + +/** PC 创建参数 */ +export interface PCCreateParams { + pc_identity?: string + name: string + host: string + ip_address?: string + description?: string + os?: string + os_version?: string + kernel?: string + server_type?: string + tags?: string + location?: string + remote_access?: string + remote_port?: number + agent_config?: string + status?: string + last_check_time?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} + +/** PC 更新参数 */ +export interface PCUpdateParams { + id: number + pc_identity?: string + name?: string + host?: string + ip_address?: string + description?: string + os?: string + os_version?: string + kernel?: string + server_type?: string + tags?: string + location?: string + remote_access?: string + remote_port?: number + agent_config?: string + status?: string + last_check_time?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} /** 获取PC列表(分页) */ -export const fetchPCList = (data?: { - page?: number; - page_size?: number; - keyword?: string; - datacenter_id?: number; - rack_id?: number; - status?: string; - sort?: string; - order?: string; -}) => { - return request.post("/Assets/v1/pc/list", data || {}); -}; +export const fetchPCList = (params?: PCListParams) => { + return request.get('/DC-Control/v1/pcs', { params }) +} /** 获取PC详情 */ export const fetchPCDetail = (id: number) => { - return request.get(`/Assets/v1/pc/detail/${id}`); -}; + return request.get(`/DC-Control/v1/pcs/${id}`) +} /** 创建PC */ -export const createPC = (data: any) => { - return request.post("/Assets/v1/pc/create", data); -}; +export const createPC = (data: PCCreateParams) => { + return request.post('/DC-Control/v1/pcs', data) +} /** 更新PC */ -export const updatePC = (data: any) => { - return request.put("/Assets/v1/pc/update", data); -}; +export const updatePC = (id: number, data: Omit) => { + return request.put<{ message: string }>(`/DC-Control/v1/pcs/${id}`, data) +} /** 删除PC */ export const deletePC = (id: number) => { - return request.delete(`/Assets/v1/pc/delete/${id}`); -}; - -/** 获取机柜列表(用于下拉选择) */ -export const fetchRackListForSelect = (datacenterId?: number) => { - return request.get("/Assets/v1/rack/all", { params: { datacenter_id: datacenterId } }); -}; + return request.delete<{ message: string }>(`/DC-Control/v1/pcs/${id}`) +} diff --git a/src/api/ops/server.ts b/src/api/ops/server.ts index 87fdea3..fb52ad4 100644 --- a/src/api/ops/server.ts +++ b/src/api/ops/server.ts @@ -1,31 +1,94 @@ -import { request } from "@/api/request"; +import { request } from '@/api/request' + +/** 服务器类型 */ +export interface ServerItem { + id: number + created_at: string + updated_at: string + deleted_at: string | null + server_identity: string + name: string + host: string + ip_address: string + description: string + os: string + os_version: string + kernel: string + server_type: string + tags: string + location: string + remote_access: string + remote_port: number + agent_config: string + status: string + last_check_time: string + collect_on: boolean + collect_args: string + collect_interval: number + collect_last_result: string +} + +/** 服务器列表响应 */ +export interface ServerListResponse { + total: number + page: number + page_size: number + data: ServerItem[] +} + +/** 服务器列表请求参数 */ +export interface ServerListParams { + page?: number + size?: number + keyword?: string + collect_on?: boolean +} + +/** 创建/更新服务器请求参数 */ +export interface ServerFormData { + server_identity?: string + name?: string + host?: string + ip_address?: string + description?: string + os?: string + os_version?: string + kernel?: string + server_type?: string + tags?: string + location?: string + remote_access?: string + remote_port?: number + agent_config?: string + status?: string + last_check_time?: string + collect_on?: boolean + collect_args?: string + collect_interval?: number + collect_last_result?: string +} /** 获取服务器列表(分页) */ -export const fetchServerList = (params?: { - page?: number; - size?: number; - keyword?: string; - collect_on?: boolean; -}) => { - return request.get("/DC-Control/v1/servers", { params }); -}; +export const fetchServerList = (params?: ServerListParams) => { + return request.get('/DC-Control/v1/servers', { params }) +} /** 获取服务器详情 */ export const fetchServerDetail = (id: number) => { - return request.get(`/DC-Control/v1/servers/${id}`); -}; + return request.get(`/DC-Control/v1/servers/${id}`) +} /** 创建服务器 */ -export const createServer = (data: any) => { - return request.post("/DC-Control/v1/servers", data); -}; +export const createServer = (data: ServerFormData) => { + return request.post('/DC-Control/v1/servers', data) +} /** 更新服务器 */ -export const updateServer = (id: number, data: any) => { - return request.put(`/DC-Control/v1/servers/${id}`, data); -}; +export const updateServer = (id: number, data: Partial) => { + return request.put<{ message: string }>(`/DC-Control/v1/servers/${id}`, data) +} /** 删除服务器 */ export const deleteServer = (id: number) => { - return request.delete(`/DC-Control/v1/servers/${id}`); -}; + return request.delete<{ message: string }>(`/DC-Control/v1/servers/${id}`) +} diff --git a/src/api/request.ts b/src/api/request.ts index 15a48ac..9acefc5 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -85,6 +85,15 @@ export const request = { }, delete(url: string, config?: RequestConfig): Promise { return instance.delete(url, config); + }, + patch(url: string, data = {}, config?: RequestConfig): Promise { + let params: any + if (config?.needWorkspace) { + params = { workspace: import.meta.env.VITE_APP_WORKSPACE, ...data }; + } else { + params = data; + } + return instance.patch(url, params, config); } }; diff --git a/src/router/local-menu-flat.ts b/src/router/local-menu-flat.ts index 7229a87..abe6ed4 100644 --- a/src/router/local-menu-flat.ts +++ b/src/router/local-menu-flat.ts @@ -463,6 +463,23 @@ export const localMenuFlatItems: MenuItem[] = [ hide_menu: true, created_at: '2025-12-26T13:23:52.047548+08:00', }, + { + id: 4002, + identity: '019b591d-026f-785d-b473-ac804133e253', + title: '告警详情', + title_en: 'Alert Detail', + code: 'ops:告警管理:告警详情', + description: '告警管理 - 告警详情', + app_id: 2, + parent_id: 39, + menu_path: '/alert/detail', + component: 'ops/pages/alert/detail/index', + menu_icon: 'appstore', + type: 1, + sort_key: 32, + hide_menu: true, + created_at: '2025-12-26T13:23:52.047548+08:00', + }, { id: 41, identity: '019b591d-027d-7eae-b9b9-23fd1b7ece75', diff --git a/src/router/local-menu-items.ts b/src/router/local-menu-items.ts index 7f58e82..152dee3 100644 --- a/src/router/local-menu-items.ts +++ b/src/router/local-menu-items.ts @@ -497,6 +497,24 @@ export const localMenuItems: MenuItem[] = [ created_at: '2025-12-26T13:23:52.047548+08:00', children: [], }, + { + id: 4002, + identity: '019b591d-026f-785d-b473-ac804133e253', + title: '告警详情', + title_en: 'Alert Detail', + code: 'ops:告警管理:告警详情', + description: '告警管理 - 告警详情', + app_id: 2, + parent_id: 39, + menu_path: '/alert/detail', + component: 'ops/pages/alert/detail/index', + menu_icon: 'appstore', + type: 1, + sort_key: 8, + hide_menu: true, + created_at: '2025-12-26T13:23:52.047548+08:00', + children: [], + }, { id: 41, identity: '019b591d-027d-7eae-b9b9-23fd1b7ece75', diff --git a/src/views/ops/pages/alert/detail/index.vue b/src/views/ops/pages/alert/detail/index.vue new file mode 100644 index 0000000..67ac0ff --- /dev/null +++ b/src/views/ops/pages/alert/detail/index.vue @@ -0,0 +1,644 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/ops/pages/dc/database/components/CollectDialog.vue b/src/views/ops/pages/dc/database/components/CollectDialog.vue new file mode 100644 index 0000000..fa1d6ed --- /dev/null +++ b/src/views/ops/pages/dc/database/components/CollectDialog.vue @@ -0,0 +1,296 @@ + + + + + \ No newline at end of file diff --git a/src/views/ops/pages/dc/database/components/DetailDialog.vue b/src/views/ops/pages/dc/database/components/DetailDialog.vue new file mode 100644 index 0000000..9f3876d --- /dev/null +++ b/src/views/ops/pages/dc/database/components/DetailDialog.vue @@ -0,0 +1,285 @@ + + + + + \ No newline at end of file diff --git a/src/views/ops/pages/dc/database/components/FormDialog.vue b/src/views/ops/pages/dc/database/components/FormDialog.vue index 3e06b26..78491cd 100644 --- a/src/views/ops/pages/dc/database/components/FormDialog.vue +++ b/src/views/ops/pages/dc/database/components/FormDialog.vue @@ -1,7 +1,7 @@ @@ -99,100 +141,151 @@ + \ No newline at end of file diff --git a/src/views/ops/pages/dc/pc/config/columns.ts b/src/views/ops/pages/dc/pc/config/columns.ts index 85dbc6b..c7d034a 100644 --- a/src/views/ops/pages/dc/pc/config/columns.ts +++ b/src/views/ops/pages/dc/pc/config/columns.ts @@ -6,7 +6,7 @@ export const columns = [ slotName: 'id', }, { - dataIndex: 'unique_id', + dataIndex: 'pc_identity', title: '唯一标识', width: 150, }, @@ -15,14 +15,34 @@ export const columns = [ title: '名称', width: 150, }, + { + dataIndex: 'host', + title: '主机地址', + width: 140, + }, + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 140, + }, { dataIndex: 'os', title: '操作系统', - width: 150, + width: 120, + }, + { + dataIndex: 'os_version', + title: '系统版本', + width: 100, + }, + { + dataIndex: 'server_type', + title: '类型', + width: 100, }, { dataIndex: 'location', - title: '位置信息', + title: '位置', width: 150, }, { @@ -30,23 +50,6 @@ export const columns = [ title: '标签', width: 120, }, - { - dataIndex: 'ip', - title: 'IP地址', - width: 150, - }, - { - dataIndex: 'remote_access', - title: '远程访问', - width: 100, - slotName: 'remote_access', - }, - { - dataIndex: 'agent_config', - title: 'Agent配置', - width: 150, - slotName: 'agent_config', - }, { dataIndex: 'cpu', title: 'CPU使用率', @@ -65,6 +68,12 @@ export const columns = [ width: 150, slotName: 'disk', }, + { + dataIndex: 'collect_on', + title: '采集状态', + width: 100, + slotName: 'collect_on', + }, { dataIndex: 'status', title: '状态', diff --git a/src/views/ops/pages/dc/pc/config/search-form.ts b/src/views/ops/pages/dc/pc/config/search-form.ts index f60ea1c..2082cc2 100644 --- a/src/views/ops/pages/dc/pc/config/search-form.ts +++ b/src/views/ops/pages/dc/pc/config/search-form.ts @@ -5,35 +5,18 @@ export const searchFormConfig: FormItem[] = [ field: 'keyword', label: '关键词', type: 'input', - placeholder: '请输入PC名称、编码或IP', + placeholder: '请输入PC名称或主机地址', span: 6, }, { - field: 'datacenter_id', - label: '数据中心', + field: 'collect_on', + label: '采集状态', type: 'select', - placeholder: '请选择数据中心', - options: [], // 需要动态加载 - span: 6, - }, - { - field: 'rack_id', - label: '机柜', - type: 'select', - placeholder: '请选择机柜', - options: [], // 需要动态加载 - span: 6, - }, - { - field: 'status', - label: '状态', - type: 'select', - placeholder: '请选择状态', + placeholder: '请选择采集状态', options: [ - { label: '在线', value: 'online' }, - { label: '离线', value: 'offline' }, - { label: '维护中', value: 'maintenance' }, - { label: '已退役', value: 'retired' }, + { label: '全部', value: '' }, + { label: '已启用', value: 'true' }, + { label: '已禁用', value: 'false' }, ], span: 6, }, diff --git a/src/views/ops/pages/dc/pc/index.vue b/src/views/ops/pages/dc/pc/index.vue index 062064b..d6c23dc 100644 --- a/src/views/ops/pages/dc/pc/index.vue +++ b/src/views/ops/pages/dc/pc/index.vue @@ -30,20 +30,6 @@ {{ record.id }} - - - - - - + + +