diff --git a/vite-frontend/.env.development b/vite-frontend/.env.development index fe059ef..a1c927f 100644 --- a/vite-frontend/.env.development +++ b/vite-frontend/.env.development @@ -1 +1 @@ -VITE_API_BASE=http://192.168.31.126:6365 +VITE_API_BASE=http://192.168.100.11:6365 diff --git a/vite-frontend/index.html b/vite-frontend/index.html index c26343a..7c3bc59 100644 --- a/vite-frontend/index.html +++ b/vite-frontend/index.html @@ -148,7 +148,7 @@ /> diff --git a/vite-frontend/src/config/site.ts b/vite-frontend/src/config/site.ts index 4178eea..cd15c75 100644 --- a/vite-frontend/src/config/site.ts +++ b/vite-frontend/src/config/site.ts @@ -4,8 +4,8 @@ export type SiteConfig = typeof siteConfig; // 缓存相关常量 const CACHE_PREFIX = 'vite_config_'; -const VERSION = "1.3.3"; -const APP_VERSION = "1.0.2"; +const VERSION = "1.3.4"; +const APP_VERSION = "1.0.3"; const getInitialConfig = () => { if (typeof window === 'undefined') { diff --git a/vite-frontend/src/pages/forward.tsx b/vite-frontend/src/pages/forward.tsx index e00ae51..7e2ab21 100644 --- a/vite-frontend/src/pages/forward.tsx +++ b/vite-frontend/src/pages/forward.tsx @@ -138,13 +138,13 @@ export default function ForwardPage() { return () => window.removeEventListener('resize', checkMobile); }, []); - // 显示模式状态 - 从localStorage读取,默认为分类显示 + // 显示模式状态 - 从localStorage读取,默认为平铺显示 const [viewMode, setViewMode] = useState<'grouped' | 'direct'>(() => { try { const savedMode = localStorage.getItem('forward-view-mode'); - return (savedMode as 'grouped' | 'direct') || 'grouped'; + return (savedMode as 'grouped' | 'direct') || 'direct'; } catch { - return 'grouped'; + return 'direct'; } }); diff --git a/vite-frontend/src/pages/node.tsx b/vite-frontend/src/pages/node.tsx index 2ad4ff8..bb3c86f 100644 --- a/vite-frontend/src/pages/node.tsx +++ b/vite-frontend/src/pages/node.tsx @@ -58,6 +58,9 @@ export default function NodePage() { const [dialogTitle, setDialogTitle] = useState(''); const [isEdit, setIsEdit] = useState(false); const [submitLoading, setSubmitLoading] = useState(false); + const [deleteModalOpen, setDeleteModalOpen] = useState(false); + const [deleteLoading, setDeleteLoading] = useState(false); + const [nodeToDelete, setNodeToDelete] = useState(null); const [form, setForm] = useState({ id: null, name: '', @@ -419,19 +422,29 @@ export default function NodePage() { }; // 删除节点 - const handleDelete = async (node: Node) => { - if (window.confirm(`确定要删除节点 "${node.name}" 吗?`)) { - try { - const res = await deleteNode(node.id); - if (res.code === 0) { - toast.success('删除成功'); - setNodeList(prev => prev.filter(n => n.id !== node.id)); - } else { - toast.error(res.msg || '删除失败'); - } - } catch (error) { - toast.error('网络错误,请重试'); + const handleDelete = (node: Node) => { + setNodeToDelete(node); + setDeleteModalOpen(true); + }; + + const confirmDelete = async () => { + if (!nodeToDelete) return; + + setDeleteLoading(true); + try { + const res = await deleteNode(nodeToDelete.id); + if (res.code === 0) { + toast.success('删除成功'); + setNodeList(prev => prev.filter(n => n.id !== nodeToDelete.id)); + setDeleteModalOpen(false); + setNodeToDelete(null); + } else { + toast.error(res.msg || '删除失败'); } + } catch (error) { + toast.error('网络错误,请重试'); + } finally { + setDeleteLoading(false); } }; @@ -883,6 +896,40 @@ export default function NodePage() { + {/* 删除确认模态框 */} + + + {(onClose) => ( + <> + + 确认删除 + + + 确定要删除节点 "{nodeToDelete?.name}" 吗? + 此操作不可恢复,请谨慎操作。 + + + + 取消 + + + {deleteLoading ? '删除中...' : '确认删除'} + + + > + )} + + + {/* 安装命令模态框 */} {(onClose) => (
确定要删除节点 "{nodeToDelete?.name}" 吗?
此操作不可恢复,请谨慎操作。