From 9dbb7e9fc46948967065ff86a4c30dc4bbe334b7 Mon Sep 17 00:00:00 2001 From: attacker Date: Sun, 21 Jun 2026 10:53:30 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20K8s=20=E9=9B=86=E7=BE=A4=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=8A=9F=E8=83=BD=20+=20=E8=A1=A8=E5=8D=95=E7=AE=80?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增手动同步按钮(卡片下拉菜单「同步」) - 新建集群后自动触发同步(延迟500ms等列表刷新) - 同步后刷新集群列表,节点/Pod/Deployment 数据写入 DB - 集群表单:名称即code,正则校验英文/数字/连字符 --- .../kubernetes/KubernetesClusters.tsx | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/kubernetes/KubernetesClusters.tsx b/frontend/src/components/kubernetes/KubernetesClusters.tsx index a67fac1..c96cac8 100644 --- a/frontend/src/components/kubernetes/KubernetesClusters.tsx +++ b/frontend/src/components/kubernetes/KubernetesClusters.tsx @@ -29,6 +29,7 @@ import { Container, } from 'lucide-react'; import { kubernetesApi } from '@/services/api'; +import { toast } from 'sonner'; import type { KubernetesCluster } from '@/types'; import { KubernetesClusterDetail } from './KubernetesClusterDetail'; import { KubernetesClusterDialog } from './KubernetesClusterDialog'; @@ -65,6 +66,24 @@ export function KubernetesClusters() { loadData(); }, []); + // 新建后自动同步 + const [pendingSyncId, setPendingSyncId] = useState(null); + + const handleSaved = () => { + loadData().then(() => { + if (!editingCluster) { + // 新建集群后,等列表刷新完再取最新一条同步 + setTimeout(async () => { + const res: any = await kubernetesApi.getClusters(); + const list = res?.list || []; + if (list.length > 0) { + handleSync(list[list.length - 1].id, true); + } + }, 500); + } + }); + }; + const handleDelete = async (id: string) => { try { await kubernetesApi.deleteCluster(id); @@ -74,6 +93,17 @@ export function KubernetesClusters() { } }; + const handleSync = async (id: number | string, silent?: boolean) => { + try { + if (!silent) toast.info('正在同步集群资源...'); + const res: any = await kubernetesApi.syncCluster(id); + if (!silent) toast.success(res?.message || '同步完成'); + loadData(); + } catch (e: any) { + if (!silent) toast.error(e?.message || '同步失败'); + } + }; + const filteredClusters = clusters.filter( (cluster) => (cluster.name || '').toLowerCase().includes(searchQuery.toLowerCase()) || @@ -280,6 +310,16 @@ export function KubernetesClusters() { 配置 + { + e.stopPropagation(); + handleSync(cluster.id); + }} + > + + 同步 + { @@ -377,7 +417,7 @@ export function KubernetesClusters() { open={dialogOpen} onOpenChange={setDialogOpen} editingCluster={editingCluster} - onSaved={loadData} + onSaved={handleSaved} /> {/* kubectl 终端 */}