-
格式说明:
-
- -
- 单个端口:
eth0/1、gigabitethernet1/0/1
-
- -
- 端口范围:
1/0/1-1/0/48(创建 1/0/1 到 1/0/48 共48个端口)
-
- -
- 简单范围:
eth1-eth24(创建 eth1 到 eth24 共24个端口)
-
-
+
+
+ {portCount > 0 && (
+
+ 将创建 {portCount} 个端口
+
+ )}
-
+
+
+ }
+ style={{ ...styles.button, ...styles.buttonPrimary, minWidth: '120px' }}
+ >
+ {portCount > 1 ? `创建 ${portCount} 个` : '创建'}
+
+
+
);
}
-export default React.memo(PortCreateModal);
+export default React.memo(PortCreateModal);
\ No newline at end of file
diff --git a/frontend/src/pages/PortManagement.jsx b/frontend/src/pages/PortManagement.jsx
index e8fe03a..98c6470 100644
--- a/frontend/src/pages/PortManagement.jsx
+++ b/frontend/src/pages/PortManagement.jsx
@@ -38,7 +38,6 @@ import {
DownloadOutlined,
UploadOutlined as UploadIcon,
AppstoreOutlined,
- UnorderedListOutlined,
FilterOutlined,
ClearOutlined,
CloudServerOutlined,
@@ -48,12 +47,15 @@ import {
DisconnectOutlined,
UpOutlined,
DownOutlined,
+ TagOutlined,
+ ThunderboltOutlined,
+ FileTextOutlined,
+ InfoCircleOutlined,
} from '@ant-design/icons';
import api from '../api';
import * as XLSX from 'xlsx';
import Papa from 'papaparse';
import { motion, AnimatePresence } from 'framer-motion';
-import VirtualDeviceList from '../components/VirtualDeviceList';
import NetworkCardPanel from '../components/NetworkCardPanel';
import NetworkCardCreateModal from '../components/NetworkCardCreateModal';
import { designTokens } from '../config/theme';
@@ -94,7 +96,6 @@ function PortManagement() {
const [ports, setPorts] = useState([]);
const [devices, setDevices] = useState([]);
const [deviceSearching, setDeviceSearching] = useState(false);
- const [cables, setCables] = useState([]);
const [groupedPorts, setGroupedPorts] = useState({});
const [loading, setLoading] = useState(false);
const [filters, setFilters] = useState({
@@ -116,10 +117,13 @@ function PortManagement() {
const [updateExisting, setUpdateExisting] = useState(false);
// 视图模式:list 或 panel
- const [viewMode, setViewMode] = useState('list');
+ // const [viewMode, setViewMode] = useState('list');
// 网卡管理相关状态
const [networkCardModalVisible, setNetworkCardModalVisible] = useState(false);
+ const [serverNicListVisible, setServerNicListVisible] = useState(false);
+ const [serverNicList, setServerNicList] = useState([]);
+ const [serverNicLoading, setServerNicLoading] = useState(false);
const [portCreateModalVisible, setPortCreateModalVisible] = useState(false);
const [selectedDeviceForNic, setSelectedDeviceForNic] = useState(null);
const [refreshTrigger, setRefreshTrigger] = useState(0);
@@ -201,20 +205,10 @@ function PortManagement() {
[fetchDevices]
);
- const fetchCables = useCallback(async () => {
- try {
- const response = await api.get('/cables');
- setCables(response.cables || response || []);
- } catch (error) {
- console.error('获取接线列表失败:', error);
- }
- }, []);
-
useEffect(() => {
fetchPorts();
fetchDevices();
- fetchCables();
- }, [fetchPorts, fetchDevices, fetchCables]);
+ }, [fetchPorts, fetchDevices]);
useEffect(() => {
const grouped = {};
@@ -275,6 +269,42 @@ function PortManagement() {
setSelectDeviceModalVisible(true);
};
+ const handleManageServerNics = async () => {
+ setServerNicListVisible(true);
+ setServerNicLoading(true);
+ try {
+ const [devicesResponse, portsResponse, nicsResponse] = await Promise.all([
+ api.get('/devices/all', { params: { type: 'server' } }),
+ api.get('/device-ports', { params: { pageSize: 10000 } }),
+ api.get('/network-cards'),
+ ]);
+
+ const servers = devicesResponse.devices || devicesResponse || [];
+ const ports = portsResponse.ports || portsResponse || [];
+ const allNics = nicsResponse.data || nicsResponse || [];
+
+ const serversWithPorts = new Set(ports.map(p => p.deviceId));
+ const serversWithNics = servers.filter(server => {
+ const serverNics = allNics.filter(nic => nic.deviceId === server.deviceId);
+ return serverNics.length > 0;
+ });
+
+ const serversNeedingAttention = serversWithNics
+ .filter(server => !serversWithPorts.has(server.deviceId))
+ .map(server => {
+ const serverNics = allNics.filter(nic => nic.deviceId === server.deviceId);
+ return { ...server, nics: serverNics, nicCount: serverNics.length };
+ });
+
+ setServerNicList(serversNeedingAttention);
+ } catch (error) {
+ console.error('获取服务器列表失败:', error);
+ message.error('获取服务器列表失败: ' + (error.message || error));
+ } finally {
+ setServerNicLoading(false);
+ }
+ };
+
const handleSelectDeviceForPort = device => {
setSelectDeviceModalVisible(false);
if (!device) return;
@@ -284,7 +314,7 @@ function PortManagement() {
if (deviceType === 'server') {
api.get(`/network-cards/device/${device.deviceId}`)
.then(nicList => {
- const validNicList = Array.isArray(nicList) ? nicList : (nicList.data || []);
+ const validNicList = Array.isArray(nicList) ? nicList : [];
if (validNicList.length === 0) {
message.warning({
content: '该服务器尚未添加网卡,请先在网卡管理中添加网卡',
@@ -321,9 +351,9 @@ function PortManagement() {
if (deviceType === 'server') {
api.get(`/network-cards/device/${device.deviceId}`)
- .then(response => {
- const nicList = response.data || [];
- if (nicList.length === 0) {
+ .then(nicList => {
+ const validNicList = Array.isArray(nicList) ? nicList : [];
+ if (validNicList.length === 0) {
message.warning({
content: '该服务器尚未添加网卡,请先在网卡管理中添加网卡',
icon:
,
@@ -331,7 +361,7 @@ function PortManagement() {
});
handleManageNetworkCards(device);
} else {
- setNicList(nicList);
+ setNicList(validNicList);
setSelectedDeviceForPort(device);
form.resetFields();
form.setFieldsValue({ deviceId: device.deviceId });
@@ -485,8 +515,7 @@ function PortManagement() {
deviceId: targetDeviceId,
portName: name,
portType: values.portType,
- portSpeed: values.portSpeed,
- status: values.status,
+ status: 'free',
vlanId: values.vlanId,
description: values.description,
nicId: values.nicId || null,
@@ -509,8 +538,7 @@ function PortManagement() {
deviceId: targetDeviceId,
portName: portNames[0],
portType: values.portType,
- portSpeed: values.portSpeed,
- status: values.status,
+ status: 'free',
vlanId: values.vlanId,
description: values.description,
nicId: values.nicId || null,
@@ -1181,6 +1209,14 @@ function PortManagement() {
>
新增端口
+
}
+ onClick={handleManageServerNics}
+ size="large"
+ style={{ borderRadius: designTokens.borderRadius.sm }}
+ >
+ 管理网卡
+
}
onClick={handleImport}
@@ -1200,30 +1236,6 @@ function PortManagement() {
-
- }
- onClick={() => setViewMode('list')}
- style={viewMode === 'list' ? {
- background: designTokens.colors.primary.gradient,
- border: 'none',
- } : {}}
- >
- 列表
-
- }
- onClick={() => setViewMode('panel')}
- style={viewMode === 'panel' ? {
- background: designTokens.colors.primary.gradient,
- border: 'none',
- } : {}}
- >
- 面板
-
-
}
@@ -1254,7 +1266,7 @@ function PortManagement() {
暂无端口数据
- 点击"新增端口"按钮创建第一个端口
+ 点击下方按钮添加端口
}
@@ -1263,8 +1275,8 @@ function PortManagement() {
type="primary"
icon={