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 ( +
+ {/* 遮罩层 */} +
+ + {/* 弹窗内容 */} +
+ {/* 头部 */} +
+

{title}

+ +
+ + {/* 内容区域 */} +
+ {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) && ( - - )} +
);