From 4708a8bbf7c7da0d3ec05c9d3a9d8dc248f997ea Mon Sep 17 00:00:00 2001 From: ygx Date: Sat, 21 Mar 2026 15:52:38 +0800 Subject: [PATCH] feat --- package.json | 3 +- src/api/module/pmn.ts | 2 + src/api/ops/pc.ts | 40 + src/api/ops/report.ts | 39 + src/api/ops/server.ts | 40 + src/api/ops/template.ts | 31 + src/layout/default-layout.vue | 8 +- src/locale/en-US.ts | 2 + src/locale/zh-CN.ts | 2 + src/router/menu-data.ts | 70 +- src/router/routes/base.ts | 1 + src/router/routes/modules/ops.ts | 10 + src/router/routes/modules/remote.ts | 45 ++ .../components/TemplateFormDialog.vue | 430 ++++++++++ .../pages/alert/template/config/columns.ts | 113 +++ .../alert/template/config/search-form.ts | 15 + src/views/ops/pages/alert/template/index.vue | 396 +++++++++ src/views/ops/pages/dc/detail/index.vue | 754 ++++++++++++++++++ .../pages/dc/pc/components/RemoteControl.vue | 310 +++++++ .../pages/dc/pc/components/ServerDetail.vue | 714 +++++++++++++++++ .../dc/pc/components/ServerFormDialog.vue | 235 ++++++ src/views/ops/pages/dc/pc/config/columns.ts | 81 ++ .../ops/pages/dc/pc/config/search-form.ts | 40 + src/views/ops/pages/dc/pc/index.vue | 562 +++++++++++++ src/views/ops/pages/dc/remote/index.vue | 481 +++++++++++ .../ops/pages/dc/server/config/columns.ts | 92 +++ .../ops/pages/dc/server/config/search-form.ts | 40 + src/views/ops/pages/dc/server/index.vue | 631 +++++++++++++++ .../components/MetricsSummaryPanel.vue | 315 ++++++++ .../history/components/MetricsTopNPanel.vue | 255 ++++++ .../components/NetworkDeviceStatusPanel.vue | 300 +++++++ .../history/components/ServerStatusPanel.vue | 266 ++++++ .../components/TrafficSummaryPanel.vue | 350 ++++++++ .../history/components/TrafficTrendPanel.vue | 530 ++++++++++++ src/views/ops/pages/report/history/index.vue | 85 ++ .../menu-management/components/MenuForm.vue | 20 + 36 files changed, 7280 insertions(+), 28 deletions(-) create mode 100644 src/api/ops/pc.ts create mode 100644 src/api/ops/report.ts create mode 100644 src/api/ops/server.ts create mode 100644 src/api/ops/template.ts create mode 100644 src/router/routes/modules/remote.ts create mode 100644 src/views/ops/pages/alert/template/components/TemplateFormDialog.vue create mode 100644 src/views/ops/pages/alert/template/config/columns.ts create mode 100644 src/views/ops/pages/alert/template/config/search-form.ts create mode 100644 src/views/ops/pages/alert/template/index.vue create mode 100644 src/views/ops/pages/dc/detail/index.vue create mode 100644 src/views/ops/pages/dc/pc/components/RemoteControl.vue create mode 100644 src/views/ops/pages/dc/pc/components/ServerDetail.vue create mode 100644 src/views/ops/pages/dc/pc/components/ServerFormDialog.vue create mode 100644 src/views/ops/pages/dc/pc/config/columns.ts create mode 100644 src/views/ops/pages/dc/pc/config/search-form.ts create mode 100644 src/views/ops/pages/dc/pc/index.vue create mode 100644 src/views/ops/pages/dc/remote/index.vue create mode 100644 src/views/ops/pages/dc/server/config/columns.ts create mode 100644 src/views/ops/pages/dc/server/config/search-form.ts create mode 100644 src/views/ops/pages/dc/server/index.vue create mode 100644 src/views/ops/pages/report/history/components/MetricsSummaryPanel.vue create mode 100644 src/views/ops/pages/report/history/components/MetricsTopNPanel.vue create mode 100644 src/views/ops/pages/report/history/components/NetworkDeviceStatusPanel.vue create mode 100644 src/views/ops/pages/report/history/components/ServerStatusPanel.vue create mode 100644 src/views/ops/pages/report/history/components/TrafficSummaryPanel.vue create mode 100644 src/views/ops/pages/report/history/components/TrafficTrendPanel.vue create mode 100644 src/views/ops/pages/report/history/index.vue diff --git a/package.json b/package.json index 5f12778..4393493 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,8 @@ "vue": "^3.5.29", "vue-echarts": "^8.0.1", "vue-i18n": "^11.2.8", - "vue-router": "5" + "vue-router": "5", + "vue-web-terminal": "^3.4.1" }, "devDependencies": { "@arco-plugins/vite-vue": "^1.4.6", diff --git a/src/api/module/pmn.ts b/src/api/module/pmn.ts index 59646a3..acfc5c2 100644 --- a/src/api/module/pmn.ts +++ b/src/api/module/pmn.ts @@ -20,6 +20,8 @@ export interface MenuItem { web_url?: string; // 嵌入的网页URL component?: string; // 路由文件地址 is_new_tab?: boolean; // 是否在新窗口打开 + is_full?: boolean; // 单独的页面,不包含菜单 + hide_menu?: boolean; // 隐藏菜单栏的菜单 } /** 获取菜单 */ diff --git a/src/api/ops/pc.ts b/src/api/ops/pc.ts new file mode 100644 index 0000000..3a50736 --- /dev/null +++ b/src/api/ops/pc.ts @@ -0,0 +1,40 @@ +import { request } from "@/api/request"; + +/** 获取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 || {}); +}; + +/** 获取PC详情 */ +export const fetchPCDetail = (id: number) => { + return request.get(`/Assets/v1/pc/detail/${id}`); +}; + +/** 创建PC */ +export const createPC = (data: any) => { + return request.post("/Assets/v1/pc/create", data); +}; + +/** 更新PC */ +export const updatePC = (data: any) => { + return request.put("/Assets/v1/pc/update", 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 } }); +}; diff --git a/src/api/ops/report.ts b/src/api/ops/report.ts new file mode 100644 index 0000000..55b43ef --- /dev/null +++ b/src/api/ops/report.ts @@ -0,0 +1,39 @@ +import { request } from "@/api/request"; + +// ============ 监测指标类接口 ============ + +/** 监测指标TOPN */ +export const fetchMetricsTopN = (params: any) => + request.get("/DC-Control/v1/reports/metrics/topn", { params }); + +/** 监测指标汇总 */ +export const fetchMetricsSummary = (params: any) => + request.get("/DC-Control/v1/reports/metrics/summary", { params }); + +/** 监测指标汇总导出 */ +export const exportMetricsSummary = (params: any) => + request.get("/DC-Control/v1/reports/metrics/export", { params, responseType: 'blob' }); + +// ============ 流量报表接口 ============ + +/** 流量报表汇总 */ +export const fetchTrafficSummary = (params: any) => + request.get("/DC-Control/v1/reports/traffic/summary", { params }); + +/** 流量报表趋势 */ +export const fetchTrafficTrend = (params: any) => + request.get("/DC-Control/v1/reports/traffic/trend", { params }); + +/** 流量报表导出 */ +export const exportTrafficReport = (params: any) => + request.get("/DC-Control/v1/reports/traffic/export", { params, responseType: 'blob' }); + +// ============ 状态报表接口 ============ + +/** 服务器状态报表 */ +export const fetchServerStatus = (params: any) => + request.get("/DC-Control/v1/reports/servers/status", { params }); + +/** 网络设备状态报表 */ +export const fetchNetworkDeviceStatus = (params: any) => + request.get("/DC-Control/v1/reports/network-devices/status", { params }); diff --git a/src/api/ops/server.ts b/src/api/ops/server.ts new file mode 100644 index 0000000..94868c6 --- /dev/null +++ b/src/api/ops/server.ts @@ -0,0 +1,40 @@ +import { request } from "@/api/request"; + +/** 获取服务器列表(分页) */ +export const fetchServerList = (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/server/list", data || {}); +}; + +/** 获取服务器详情 */ +export const fetchServerDetail = (id: number) => { + return request.get(`/Assets/v1/server/detail/${id}`); +}; + +/** 创建服务器 */ +export const createServer = (data: any) => { + return request.post("/Assets/v1/server/create", data); +}; + +/** 更新服务器 */ +export const updateServer = (data: any) => { + return request.put("/Assets/v1/server/update", data); +}; + +/** 删除服务器 */ +export const deleteServer = (id: number) => { + return request.delete(`/Assets/v1/server/delete/${id}`); +}; + +/** 获取机柜列表(用于下拉选择) */ +export const fetchRackListForSelect = (datacenterId?: number) => { + return request.get("/Assets/v1/rack/all", { params: { datacenter_id: datacenterId } }); +}; diff --git a/src/api/ops/template.ts b/src/api/ops/template.ts new file mode 100644 index 0000000..4ea2a99 --- /dev/null +++ b/src/api/ops/template.ts @@ -0,0 +1,31 @@ +import { request } from "@/api/request"; + +/** 获取工单模板列表 */ +export const fetchTemplates = (data?: { + page?: number, + page_size?: number, + status?: string +}) => { + return request.get("/Feedback/v1/templates", data ? { params: data } : undefined); +}; + +/** 创建工单模板 */ +export const createTemplate = (data: any) => request.post("/Feedback/v1/templates", data); + +/** 更新工单模板 */ +export const updateTemplate = (id: number, data: any) => request.put(`/Feedback/v1/templates/${id}`, data); + +/** 获取工单模板详情 */ +export const fetchTemplateDetail = (id: number) => request.get(`/Feedback/v1/templates/${id}`); + +/** 删除工单模板 */ +export const deleteTemplate = (id: number) => request.delete(`/Feedback/v1/templates/${id}`); + +/** 启用工单模板 */ +export const activateTemplate = (id: number) => request.post(`/Feedback/v1/templates/${id}/activate`); + +/** 禁用工单模板 */ +export const deactivateTemplate = (id: number) => request.post(`/Feedback/v1/templates/${id}/deactivate`); + +/** 按模板创建工单 */ +export const createTicketByTemplate = (id: number) => request.post(`/Feedback/v1/templates/${id}/create-ticket`); diff --git a/src/layout/default-layout.vue b/src/layout/default-layout.vue index d359552..8589465 100644 --- a/src/layout/default-layout.vue +++ b/src/layout/default-layout.vue @@ -1,13 +1,13 @@