From 2ceb18cbee34ef29b3c977398c37d60da90e76b3 Mon Sep 17 00:00:00 2001 From: daxiong Date: Thu, 9 Apr 2026 00:02:42 +0800 Subject: [PATCH] feat --- src/api/ops/ipam.ts | 440 +++++++++++ .../netarch/ip/components/AnomaliesTab.vue | 282 +++++++ .../netarch/ip/components/ChangesTab.vue | 275 +++++++ .../netarch/ip/components/ConflictsTab.vue | 247 ++++++ .../netarch/ip/components/DHCPLeasesTab.vue | 192 +++++ .../ip/components/IPAddressListTab.vue | 343 +++++++++ .../netarch/ip/components/IPFormDialog.vue | 176 +++++ .../netarch/ip/components/OverviewTab.vue | 332 ++++++++ .../ip/components/SubnetFormDialog.vue | 147 ++++ .../netarch/ip/components/SubnetListTab.vue | 233 ++++++ .../ops/pages/netarch/ip/config/columns.ts | 325 ++++++++ .../pages/netarch/ip/config/search-form.ts | 194 +++++ src/views/ops/pages/netarch/ip/index.vue | 707 +----------------- tsconfig.tsbuildinfo | 2 +- 14 files changed, 3222 insertions(+), 673 deletions(-) create mode 100644 src/api/ops/ipam.ts create mode 100644 src/views/ops/pages/netarch/ip/components/AnomaliesTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/ChangesTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/ConflictsTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/DHCPLeasesTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/IPAddressListTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/IPFormDialog.vue create mode 100644 src/views/ops/pages/netarch/ip/components/OverviewTab.vue create mode 100644 src/views/ops/pages/netarch/ip/components/SubnetFormDialog.vue create mode 100644 src/views/ops/pages/netarch/ip/components/SubnetListTab.vue create mode 100644 src/views/ops/pages/netarch/ip/config/columns.ts create mode 100644 src/views/ops/pages/netarch/ip/config/search-form.ts diff --git a/src/api/ops/ipam.ts b/src/api/ops/ipam.ts new file mode 100644 index 0000000..b0fad33 --- /dev/null +++ b/src/api/ops/ipam.ts @@ -0,0 +1,440 @@ +import { request } from '@/api/request' + +/** IP地址运行状态 */ +export type IPStatus = 'online' | 'offline' | 'unknown' + +/** IP地址分配状态 */ +export type AllocationStatus = 'allocated' | 'unallocated' | 'reserved' + +/** IP地址使用状态 */ +export type UsageStatus = 'used' | 'unused' | 'used_within_30d' | 'used_before_30d' + +/** IP来源类型 */ +export type SourceType = 'scan' | 'dhcp' | 'manual' + +/** 概览统计 */ +export interface IPAMOverview { + total_ip: number + allocated: number + unallocated: number + reserved: number + used: number + unused: number + used_within_30d: number + used_before_30d: number + conflict_total: number + conflict_unresolved: number + subnet_usage_top10?: SubnetUsageItem[] +} + +/** 子网使用率项 */ +export interface SubnetUsageItem { + subnet_id: number + cidr: string + name: string + total: number + used: number + usage_percent: number +} + +/** IP地址项 */ +export interface IPAddressItem { + id: number + ip_address: string + status: IPStatus + allocation_status: AllocationStatus + usage_status: UsageStatus + subnet_id: number + subnet_name?: string + subnet_cidr?: string + hostname: string + mac_address: string + last_used_at: string + source_type: SourceType + owner_type: string + owner_id: number + remark: string + tags: string + created_at: string + updated_at: string +} + +/** IP地址列表参数 */ +export interface IPAddressListParams { + page?: number + size?: number + scan_id?: number + subnet_id?: number + status?: IPStatus + allocation_status?: AllocationStatus + usage_status?: UsageStatus + keyword?: string +} + +/** IP地址列表响应 */ +export interface IPAddressListResponse { + total: number + page: number + page_size: number + data: IPAddressItem[] +} + +/** IP地址表单数据 */ +export interface IPAddressFormData { + ip_address?: string + status?: IPStatus + allocation_status?: AllocationStatus + subnet_id?: number + hostname?: string + mac_address?: string + source_type?: SourceType + owner_type?: string + owner_id?: number + remark?: string + tags?: string +} + +/** IP分组项 */ +export interface IPGroupItem { + id: number + name: string + parent_id: number + description: string + is_default: boolean + created_at: string + updated_at: string + children?: IPGroupItem[] +} + +/** IP分组列表参数 */ +export interface IPGroupListParams { + parent_id?: number + keyword?: string +} + +/** IP分组列表响应 */ +export interface IPGroupListResponse { + data: IPGroupItem[] +} + +/** IP分组表单数据 */ +export interface IPGroupFormData { + name?: string + parent_id?: number + description?: string +} + +/** IP子网项 */ +export interface IPSubnetItem { + id: number + cidr: string + name: string + group_id: number + group_name?: string + gateway: string + vlan: string + total: number + used: number + available: number + reserved_ranges_json: string + description: string + created_at: string + updated_at: string +} + +/** IP子网列表参数 */ +export interface IPSubnetListParams { + page?: number + size?: number + group_id?: number + keyword?: string +} + +/** IP子网列表响应 */ +export interface IPSubnetListResponse { + total: number + page: number + page_size: number + data: IPSubnetItem[] +} + +/** IP子网表单数据 */ +export interface IPSubnetFormData { + cidr?: string + name?: string + group_id?: number + gateway?: string + vlan?: string + reserved_ranges_json?: string + description?: string +} + +/** DHCP租约项 */ +export interface DHCPLeaseItem { + id: number + ip_address: string + mac_address: string + hostname: string + subnet_id: number + subnet_name?: string + lease_start: string + lease_end: string + dhcp_server: string + status: string + created_at: string + updated_at: string +} + +/** DHCP租约列表参数 */ +export interface DHCPLeaseListParams { + page?: number + size?: number + subnet_id?: number + keyword?: string +} + +/** DHCP租约列表响应 */ +export interface DHCPLeaseListResponse { + total: number + page: number + page_size: number + data: DHCPLeaseItem[] +} + +/** DHCP租约表单数据 */ +export interface DHCPLeaseFormData { + ip_address?: string + mac_address?: string + hostname?: string + subnet_id?: number + lease_start?: string + lease_end?: string + dhcp_server?: string + status?: string +} + +/** IP冲突项 */ +export interface IPConflictItem { + id: number + ip_address: string + mac_address_1: string + mac_address_2: string + hostname_1: string + hostname_2: string + subnet_id: number + subnet_name?: string + detected_at: string + resolved_at: string + status: string + evidence_json: string + created_at: string + updated_at: string +} + +/** IP冲突列表参数 */ +export interface IPConflictListParams { + page?: number + size?: number + subnet_id?: number + status?: string + keyword?: string +} + +/** IP冲突列表响应 */ +export interface IPConflictListResponse { + total: number + page: number + page_size: number + data: IPConflictItem[] +} + +/** IP冲突表单数据 */ +export interface IPConflictFormData { + ip_address?: string + mac_address_1?: string + mac_address_2?: string + hostname_1?: string + hostname_2?: string + subnet_id?: number + evidence_json?: string + status?: string +} + +/** IP变更项 */ +export interface IPChangeItem { + id: number + ip_address: string + change_type: string + before_json: string + after_json: string + subnet_id: number + subnet_name?: string + changed_by: string + changed_at: string + remark: string + created_at: string +} + +/** IP变更列表参数 */ +export interface IPChangeListParams { + page?: number + size?: number + subnet_id?: number + change_type?: string + keyword?: string +} + +/** IP变更列表响应 */ +export interface IPChangeListResponse { + total: number + page: number + page_size: number + data: IPChangeItem[] +} + +/** IP变更表单数据 */ +export interface IPChangeFormData { + ip_address?: string + change_type?: string + before_json?: string + after_json?: string + subnet_id?: number + changed_by?: string + remark?: string +} + +/** IP异常项 */ +export interface IPAnomalyItem { + id: number + ip_address: string + anomaly_type: string + subnet_id: number + subnet_name?: string + detail_json: string + detected_at: string + status: string + remark: string + created_at: string + updated_at: string +} + +/** IP异常列表参数 */ +export interface IPAnomalyListParams { + page?: number + size?: number + subnet_id?: number + anomaly_type?: string + status?: string + keyword?: string +} + +/** IP异常列表响应 */ +export interface IPAnomalyListResponse { + total: number + page: number + page_size: number + data: IPAnomalyItem[] +} + +/** IP异常表单数据 */ +export interface IPAnomalyFormData { + ip_address?: string + anomaly_type?: string + subnet_id?: number + detail_json?: string + status?: string + remark?: string +} + +/** ========== 概览 API ========== */ + +/** 获取IPAM概览统计 */ +export const fetchIPAMOverview = () => request.get('/DC-Control/v1/ipam/overview') + +/** ========== IP地址 API ========== */ + +/** 获取IP地址列表 */ +export const fetchIPAddressList = (params?: IPAddressListParams) => + request.get('/DC-Control/v1/ipaddresses', { params }) + +/** 获取IP地址详情 */ +export const fetchIPAddressDetail = (id: number) => request.get(`/DC-Control/v1/ipaddresses/${id}`) + +/** 创建IP地址 */ +export const createIPAddress = (data: IPAddressFormData) => request.post('/DC-Control/v1/ipaddresses', data) + +/** 更新IP地址 */ +export const updateIPAddress = (id: number, data: Partial) => + request.put<{ message: string }>(`/DC-Control/v1/ipaddresses/${id}`, data) + +/** 删除IP地址 */ +export const deleteIPAddress = (id: number) => request.delete<{ message: string }>(`/DC-Control/v1/ipaddresses/${id}`) + +/** ========== IP分组 API ========== */ + +/** 获取IP分组列表(树形) */ +export const fetchIPGroupList = (params?: IPGroupListParams) => request.get('/DC-Control/v1/ip-groups', { params }) + +/** 创建IP分组 */ +export const createIPGroup = (data: IPGroupFormData) => request.post('/DC-Control/v1/ip-groups', data) + +/** 更新IP分组 */ +export const updateIPGroup = (id: number, data: Partial) => + request.put<{ message: string }>(`/DC-Control/v1/ip-groups/${id}`, data) + +/** 删除IP分组 */ +export const deleteIPGroup = (id: number) => request.delete<{ message: string }>(`/DC-Control/v1/ip-groups/${id}`) + +/** ========== IP子网 API ========== */ + +/** 获取IP子网列表 */ +export const fetchIPSubnetList = (params?: IPSubnetListParams) => request.get('/DC-Control/v1/ip-subnets', { params }) + +/** 获取IP子网详情 */ +export const fetchIPSubnetDetail = (id: number) => request.get(`/DC-Control/v1/ip-subnets/${id}`) + +/** 创建IP子网 */ +export const createIPSubnet = (data: IPSubnetFormData) => request.post('/DC-Control/v1/ip-subnets', data) + +/** 更新IP子网 */ +export const updateIPSubnet = (id: number, data: Partial) => + request.put<{ message: string }>(`/DC-Control/v1/ip-subnets/${id}`, data) + +/** 删除IP子网 */ +export const deleteIPSubnet = (id: number) => request.delete<{ message: string }>(`/DC-Control/v1/ip-subnets/${id}`) + +/** ========== DHCP租约 API ========== */ + +/** 获取DHCP租约列表 */ +export const fetchDHCPLeaseList = (params?: DHCPLeaseListParams) => + request.get('/DC-Control/v1/ipam/dhcp-leases', { params }) + +/** 创建DHCP租约 */ +export const createDHCPLease = (data: DHCPLeaseFormData) => request.post('/DC-Control/v1/ipam/dhcp-leases', data) + +/** ========== IP冲突 API ========== */ + +/** 获取IP冲突列表 */ +export const fetchIPConflictList = (params?: IPConflictListParams) => + request.get('/DC-Control/v1/ipam/conflicts', { params }) + +/** 创建IP冲突记录 */ +export const createIPConflict = (data: IPConflictFormData) => request.post('/DC-Control/v1/ipam/conflicts', data) + +/** ========== IP变更 API ========== */ + +/** 获取IP变更列表 */ +export const fetchIPChangeList = (params?: IPChangeListParams) => + request.get('/DC-Control/v1/ipam/changes', { params }) + +/** 创建IP变更记录 */ +export const createIPChange = (data: IPChangeFormData) => request.post('/DC-Control/v1/ipam/changes', data) + +/** ========== IP异常 API ========== */ + +/** 获取IP异常列表 */ +export const fetchIPAnomalyList = (params?: IPAnomalyListParams) => + request.get('/DC-Control/v1/ipam/anomalies', { params }) + +/** 创建IP异常记录 */ +export const createIPAnomaly = (data: IPAnomalyFormData) => request.post('/DC-Control/v1/ipam/anomalies', data) diff --git a/src/views/ops/pages/netarch/ip/components/AnomaliesTab.vue b/src/views/ops/pages/netarch/ip/components/AnomaliesTab.vue new file mode 100644 index 0000000..13bd95d --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/AnomaliesTab.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/src/views/ops/pages/netarch/ip/components/ChangesTab.vue b/src/views/ops/pages/netarch/ip/components/ChangesTab.vue new file mode 100644 index 0000000..f9fc8e9 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/ChangesTab.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/views/ops/pages/netarch/ip/components/ConflictsTab.vue b/src/views/ops/pages/netarch/ip/components/ConflictsTab.vue new file mode 100644 index 0000000..e33411c --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/ConflictsTab.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/src/views/ops/pages/netarch/ip/components/DHCPLeasesTab.vue b/src/views/ops/pages/netarch/ip/components/DHCPLeasesTab.vue new file mode 100644 index 0000000..45970d5 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/DHCPLeasesTab.vue @@ -0,0 +1,192 @@ + + + diff --git a/src/views/ops/pages/netarch/ip/components/IPAddressListTab.vue b/src/views/ops/pages/netarch/ip/components/IPAddressListTab.vue new file mode 100644 index 0000000..8172319 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/IPAddressListTab.vue @@ -0,0 +1,343 @@ + + + diff --git a/src/views/ops/pages/netarch/ip/components/IPFormDialog.vue b/src/views/ops/pages/netarch/ip/components/IPFormDialog.vue new file mode 100644 index 0000000..4e64f68 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/IPFormDialog.vue @@ -0,0 +1,176 @@ + + + diff --git a/src/views/ops/pages/netarch/ip/components/OverviewTab.vue b/src/views/ops/pages/netarch/ip/components/OverviewTab.vue new file mode 100644 index 0000000..5671909 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/OverviewTab.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/src/views/ops/pages/netarch/ip/components/SubnetFormDialog.vue b/src/views/ops/pages/netarch/ip/components/SubnetFormDialog.vue new file mode 100644 index 0000000..fbd7783 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/SubnetFormDialog.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/views/ops/pages/netarch/ip/components/SubnetListTab.vue b/src/views/ops/pages/netarch/ip/components/SubnetListTab.vue new file mode 100644 index 0000000..b794ef3 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/components/SubnetListTab.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/views/ops/pages/netarch/ip/config/columns.ts b/src/views/ops/pages/netarch/ip/config/columns.ts new file mode 100644 index 0000000..81cc730 --- /dev/null +++ b/src/views/ops/pages/netarch/ip/config/columns.ts @@ -0,0 +1,325 @@ +export const subnetColumns = [ + { + dataIndex: 'cidr', + title: '子网', + width: 140, + }, + { + dataIndex: 'name', + title: '名称', + width: 120, + }, + { + dataIndex: 'vlan', + title: 'VLAN', + width: 100, + }, + { + dataIndex: 'gateway', + title: '网关', + width: 120, + }, + { + dataIndex: 'total', + title: '总数', + width: 80, + align: 'center' as const, + }, + { + dataIndex: 'used', + title: '已用', + width: 80, + align: 'center' as const, + }, + { + dataIndex: 'available', + title: '可用', + width: 80, + align: 'center' as const, + }, + { + dataIndex: 'usage', + title: '使用率', + width: 160, + slotName: 'usage', + }, + { + dataIndex: 'status', + title: '状态', + width: 100, + align: 'center' as const, + slotName: 'status', + }, + { + dataIndex: 'actions', + title: '操作', + width: 120, + fixed: 'right' as const, + slotName: 'actions', + }, +] + +export const ipAllocationColumns = [ + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 150, + }, + { + dataIndex: 'hostname', + title: '主机名', + width: 200, + }, + { + dataIndex: 'mac_address', + title: 'MAC地址', + width: 180, + }, + { + dataIndex: 'allocation_status', + title: '分配状态', + width: 100, + align: 'center' as const, + slotName: 'allocation_status', + }, + { + dataIndex: 'status', + title: '运行状态', + width: 100, + align: 'center' as const, + slotName: 'status', + }, + { + dataIndex: 'usage_status', + title: '使用状态', + width: 120, + align: 'center' as const, + slotName: 'usage_status', + }, + { + dataIndex: 'source_type', + title: '来源', + width: 80, + align: 'center' as const, + slotName: 'source_type', + }, + { + dataIndex: 'last_used_at', + title: '最后使用', + width: 180, + slotName: 'last_used_at', + }, + { + dataIndex: 'remark', + title: '备注', + width: 150, + }, + { + dataIndex: 'actions', + title: '操作', + width: 100, + fixed: 'right' as const, + slotName: 'actions', + }, +] + +export const dhcpLeaseColumns = [ + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 150, + }, + { + dataIndex: 'mac_address', + title: 'MAC地址', + width: 180, + }, + { + dataIndex: 'hostname', + title: '主机名', + width: 200, + }, + { + dataIndex: 'subnet_name', + title: '所属子网', + width: 150, + }, + { + dataIndex: 'dhcp_server', + title: 'DHCP服务器', + width: 150, + }, + { + dataIndex: 'lease_start', + title: '租约开始', + width: 180, + slotName: 'lease_start', + }, + { + dataIndex: 'lease_end', + title: '租约结束', + width: 180, + slotName: 'lease_end', + }, + { + dataIndex: 'status', + title: '状态', + width: 100, + align: 'center' as const, + slotName: 'status', + }, + { + dataIndex: 'actions', + title: '操作', + width: 80, + fixed: 'right' as const, + slotName: 'actions', + }, +] + +export const conflictColumns = [ + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 150, + }, + { + dataIndex: 'mac_address_1', + title: 'MAC地址1', + width: 180, + }, + { + dataIndex: 'hostname_1', + title: '主机名1', + width: 150, + }, + { + dataIndex: 'mac_address_2', + title: 'MAC地址2', + width: 180, + }, + { + dataIndex: 'hostname_2', + title: '主机名2', + width: 150, + }, + { + dataIndex: 'subnet_name', + title: '所属子网', + width: 150, + }, + { + dataIndex: 'detected_at', + title: '发现时间', + width: 180, + slotName: 'detected_at', + }, + { + dataIndex: 'resolved_at', + title: '解决时间', + width: 180, + slotName: 'resolved_at', + }, + { + dataIndex: 'status', + title: '状态', + width: 100, + align: 'center' as const, + slotName: 'status', + }, + { + dataIndex: 'actions', + title: '操作', + width: 80, + fixed: 'right' as const, + slotName: 'actions', + }, +] + +export const changeColumns = [ + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 150, + }, + { + dataIndex: 'change_type', + title: '变更类型', + width: 120, + align: 'center' as const, + slotName: 'change_type', + }, + { + dataIndex: 'subnet_name', + title: '所属子网', + width: 150, + }, + { + dataIndex: 'changed_by', + title: '变更人', + width: 120, + }, + { + dataIndex: 'changed_at', + title: '变更时间', + width: 180, + slotName: 'changed_at', + }, + { + dataIndex: 'remark', + title: '备注', + width: 200, + }, + { + dataIndex: 'actions', + title: '操作', + width: 80, + fixed: 'right' as const, + slotName: 'actions', + }, +] + +export const anomalyColumns = [ + { + dataIndex: 'ip_address', + title: 'IP地址', + width: 150, + }, + { + dataIndex: 'anomaly_type', + title: '异常类型', + width: 120, + align: 'center' as const, + slotName: 'anomaly_type', + }, + { + dataIndex: 'subnet_name', + title: '所属子网', + width: 150, + }, + { + dataIndex: 'detected_at', + title: '发现时间', + width: 180, + slotName: 'detected_at', + }, + { + dataIndex: 'status', + title: '状态', + width: 100, + align: 'center' as const, + slotName: 'status', + }, + { + dataIndex: 'remark', + title: '备注', + width: 200, + }, + { + dataIndex: 'actions', + title: '操作', + width: 80, + fixed: 'right' as const, + slotName: 'actions', + }, +] diff --git a/src/views/ops/pages/netarch/ip/config/search-form.ts b/src/views/ops/pages/netarch/ip/config/search-form.ts new file mode 100644 index 0000000..9bf612b --- /dev/null +++ b/src/views/ops/pages/netarch/ip/config/search-form.ts @@ -0,0 +1,194 @@ +import type { FormItem } from '@/components/search-form/types' + +export const subnetSearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入子网CIDR、名称', + span: 6, + }, + { + field: 'group_id', + label: '分组', + type: 'select', + placeholder: '全部分组', + options: [], + span: 6, + }, +] + +export const ipSearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入IP地址、主机名', + span: 6, + }, + { + field: 'subnet_id', + label: '子网', + type: 'select', + placeholder: '全部子网', + options: [], + span: 6, + }, + { + field: 'allocation_status', + label: '分配状态', + type: 'select', + placeholder: '全部状态', + options: [ + { label: '已分配', value: 'allocated' }, + { label: '未分配', value: 'unallocated' }, + { label: '保留', value: 'reserved' }, + ], + span: 6, + }, + { + field: 'status', + label: '运行状态', + type: 'select', + placeholder: '全部状态', + options: [ + { label: '在线', value: 'online' }, + { label: '离线', value: 'offline' }, + { label: '未知', value: 'unknown' }, + ], + span: 6, + }, + { + field: 'usage_status', + label: '使用状态', + type: 'select', + placeholder: '全部状态', + options: [ + { label: '已使用', value: 'used' }, + { label: '未使用', value: 'unused' }, + { label: '30天内使用', value: 'used_within_30d' }, + { label: '30天前使用', value: 'used_before_30d' }, + ], + span: 6, + }, +] + +export const dhcpLeaseSearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入IP地址、MAC地址', + span: 8, + }, + { + field: 'subnet_id', + label: '子网', + type: 'select', + placeholder: '全部子网', + options: [], + span: 8, + }, +] + +export const conflictSearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入IP地址', + span: 8, + }, + { + field: 'subnet_id', + label: '子网', + type: 'select', + placeholder: '全部子网', + options: [], + span: 8, + }, + { + field: 'status', + label: '状态', + type: 'select', + placeholder: '全部状态', + options: [ + { label: '未解决', value: 'unresolved' }, + { label: '已解决', value: 'resolved' }, + ], + span: 8, + }, +] + +export const changeSearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入IP地址', + span: 8, + }, + { + field: 'subnet_id', + label: '子网', + type: 'select', + placeholder: '全部子网', + options: [], + span: 8, + }, + { + field: 'change_type', + label: '变更类型', + type: 'select', + placeholder: '全部类型', + options: [ + { label: '分配', value: 'allocate' }, + { label: '释放', value: 'release' }, + { label: '修改', value: 'modify' }, + { label: '状态变更', value: 'status_change' }, + ], + span: 8, + }, +] + +export const anomalySearchForm: FormItem[] = [ + { + field: 'keyword', + label: '关键词', + type: 'input', + placeholder: '请输入IP地址', + span: 6, + }, + { + field: 'subnet_id', + label: '子网', + type: 'select', + placeholder: '全部子网', + options: [], + span: 6, + }, + { + field: 'anomaly_type', + label: '异常类型', + type: 'select', + placeholder: '全部类型', + options: [ + { label: 'IP扫描异常', value: 'scan_anomaly' }, + { label: 'MAC地址变更', value: 'mac_change' }, + { label: '未知设备', value: 'unknown_device' }, + { label: 'IP地址泄漏', value: 'ip_leak' }, + ], + span: 6, + }, + { + field: 'status', + label: '状态', + type: 'select', + placeholder: '全部状态', + options: [ + { label: '待处理', value: 'pending' }, + { label: '已处理', value: 'resolved' }, + ], + span: 6, + }, +] diff --git a/src/views/ops/pages/netarch/ip/index.vue b/src/views/ops/pages/netarch/ip/index.vue index 29dfe34..0cffa61 100644 --- a/src/views/ops/pages/netarch/ip/index.vue +++ b/src/views/ops/pages/netarch/ip/index.vue @@ -1,420 +1,42 @@