diff --git a/frontend/src/components/ui/Modal.jsx b/frontend/src/components/ui/Modal.jsx
new file mode 100644
index 0000000..34777be
--- /dev/null
+++ b/frontend/src/components/ui/Modal.jsx
@@ -0,0 +1,63 @@
+import React, { useEffect } from 'react';
+
+const Modal = ({ isOpen, onClose, title, children, size = 'md' }) => {
+ useEffect(() => {
+ const handleEscape = (e) => {
+ if (e.key === 'Escape' && isOpen) {
+ onClose();
+ }
+ };
+
+ if (isOpen) {
+ document.addEventListener('keydown', handleEscape);
+ document.body.style.overflow = 'hidden';
+ }
+
+ return () => {
+ document.removeEventListener('keydown', handleEscape);
+ document.body.style.overflow = 'unset';
+ };
+ }, [isOpen, onClose]);
+
+ if (!isOpen) return null;
+
+ const sizeClasses = {
+ sm: 'max-w-md',
+ md: 'max-w-2xl',
+ lg: 'max-w-4xl',
+ xl: 'max-w-6xl'
+ };
+
+ return (
+
+ {/* 遮罩层 */}
+
+
+ {/* 弹窗内容 */}
+
+ {/* 头部 */}
+
+
+ {/* 内容区域 */}
+
+ {children}
+
+
+
+ );
+};
+
+export default Modal;
\ No newline at end of file
diff --git a/frontend/src/features/providers/components/ProviderList.jsx b/frontend/src/features/providers/components/ProviderList.jsx
index f0a9768..57df11b 100644
--- a/frontend/src/features/providers/components/ProviderList.jsx
+++ b/frontend/src/features/providers/components/ProviderList.jsx
@@ -1,6 +1,7 @@
-import React, { useState, useEffect } from 'react';
+import { useState, useEffect } from 'react';
import { getProviders, createProvider, updateProvider, deleteProvider } from '../api';
import ProviderForm from './ProviderForm';
+import Modal from '../../../components/ui/Modal';
const ProviderList = () => {
const [providers, setProviders] = useState([]);
@@ -75,32 +76,35 @@ const ProviderList = () => {
);
}
- if (showCreateForm) {
- return (
-
-
创建新提供商
+ return (
+ <>
+ {/* 创建提供商弹窗 */}
+
setShowCreateForm(false)}
+ title="创建新提供商"
+ size="md"
+ >
setShowCreateForm(false)}
/>
-
- );
- }
+
- if (editingProvider) {
- return (
-
-
编辑提供商
+ {/* 编辑提供商弹窗 */}
+
setEditingProvider(null)}
+ title="编辑提供商"
+ size="md"
+ >
setEditingProvider(null)}
/>
-
- );
- }
+
- return (
+ >
);
-};
+}
export default ProviderList;
\ No newline at end of file
diff --git a/frontend/src/features/virtual-models/index.jsx b/frontend/src/features/virtual-models/index.jsx
index 7590104..b840acd 100644
--- a/frontend/src/features/virtual-models/index.jsx
+++ b/frontend/src/features/virtual-models/index.jsx
@@ -2,6 +2,7 @@ import { useState } from 'react';
import VirtualModelList from './components/VirtualModelList';
import VirtualModelForm from './components/VirtualModelForm';
import { createVirtualModel, updateVirtualModel } from './api';
+import Modal from '../../components/ui/Modal';
const VirtualModelsPage = () => {
const [editingModel, setEditingModel] = useState(null);
@@ -36,6 +37,34 @@ const VirtualModelsPage = () => {
return (
+ {/* 创建虚拟模型弹窗 */}
+
+
+
+
+ {/* 编辑虚拟模型弹窗 */}
+
+
+
+
虚拟模型管理
- {(isCreating || editingModel) && (
-
- )}
+
);