diff --git a/docs/changelog/index.md b/docs/changelog/index.md index 059f4d48..9aedc3d3 100644 --- a/docs/changelog/index.md +++ b/docs/changelog/index.md @@ -24,6 +24,7 @@ sidebar: false - 修复全局搜索数据源覆盖不全的问题,补全了所有核心业务控制台页面(节点、规则、域名、证书、DNS、源站、WAF、IP组、Pages、版本发布、访问日志、应用记录和性能调优)及缺失的管理员专有页面(存储、数据、推送、日志)的搜索检索支持。 - 修复系统自更新(Updater)检测上游 GitHub Action Release 时,因资产包名称前缀(`openflare-server`)与仓库名不完全一致导致匹配失败并报错“未找到兼容的 Release”的问题。 - 修复系统设置页面(`/admin/settings`)基于 URL `tab` 参数的定位逻辑,补全缺失的 `openflare-ops` (OpenFlare) Tab,且在不带参数时默认选中 OpenFlare 选项卡。 +- 移除系统设置中 OpenFlare 标签页下的“版本信息”卡片及对应的升级管理弹窗逻辑。 ## [v3.0.2] - 2026-06-30 diff --git a/frontend/app/(main)/admin/settings/components/openflare-ops.tsx b/frontend/app/(main)/admin/settings/components/openflare-ops.tsx index 9aba6c8c..0faf13c4 100644 --- a/frontend/app/(main)/admin/settings/components/openflare-ops.tsx +++ b/frontend/app/(main)/admin/settings/components/openflare-ops.tsx @@ -16,7 +16,6 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" -import {Badge} from "@/components/ui/badge" import {Button} from "@/components/ui/button" import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card" import {Input} from "@/components/ui/input" @@ -28,9 +27,6 @@ import {ErrorInline} from "@/components/layout/error" import {LoadingStateWithBorder} from "@/components/layout/loading" import type {DatabaseCleanupTarget} from "@/lib/services/openflare" import {NodeService, OptionService, StatusService, UptimeKumaService,} from "@/lib/services/openflare" -import {AdminStatusService} from "@/lib/services/admin" -import {VersionUpgradeDialog} from "@/app/(main)/components/version-upgrade-dialog" -import {adminUpdateStatusQueryKey, openflarePublicStatusQueryKey,} from "@/lib/hooks/use-openflare-server-upgrade" import { agentOptionEntries, @@ -47,6 +43,7 @@ import { import {UptimeKumaSiteSelectModal} from "./uptimekuma-site-modal" const optionsQueryKey = ["openflare", "options"] as const +const openflarePublicStatusQueryKey = ["openflare", "public-status"] as const const cleanupTargets: Array<{ target: DatabaseCleanupTarget @@ -85,7 +82,6 @@ export function OpenFlareOpsSettings() { label: string } | null>(null) const [cleanupRetentionDays, setCleanupRetentionDays] = useState("") - const [versionDialogOpen, setVersionDialogOpen] = useState(false) const optionsQuery = useQuery({ queryKey: optionsQueryKey, @@ -102,10 +98,6 @@ export function OpenFlareOpsSettings() { queryFn: () => NodeService.getBootstrapToken(), }) - const releaseQuery = useQuery({ - queryKey: adminUpdateStatusQueryKey, - queryFn: () => AdminStatusService.getUpdateStatus(), - }) useEffect(() => { if (!optionsQuery.data) return @@ -605,50 +597,6 @@ export function OpenFlareOpsSettings() { - - -
- 版本信息 - - 检查上游 GitHub Release 并升级当前服务。 - -
- -
- - - -
-

更新状态

-
- {releaseQuery.data?.update_available ? ( - 有新版本 - ) : ( - 已是最新 - )} -
-
- -
-
- - void; - canUpgrade?: boolean; -}) { - const { - currentVersion, - update, - releaseErrorMessage, - isInitialLoading, - isChecking, - isUpgrading, - handleOpen, - handleCheckRelease, - handleUpgrade, - } = useOpenFlareServerUpgrade({ open, canUpgrade }); - - useEffect(() => { - if (open) { - handleOpen(); - } - }, [open, handleOpen]); - - const upgradeBadge = getUpgradeBadge(update); - const isBusy = isChecking || isUpgrading; - - return ( - - - - 服务端版本 - - 检查上游 GitHub Release 并升级当前服务。升级开始后服务会短暂重启。 - - - -
-
- - - 当前版本 - - -
-

{currentVersion}

- {upgradeBadge.label} -
-
-
- - - - 最新版本 - - -

{update?.latest_version || '未检查'}

- {canUpgrade ? ( - - ) : null} -
-
-
- - {isInitialLoading ? ( -
- - 加载版本信息... -
- ) : null} - - {!isInitialLoading && releaseErrorMessage ? ( -
- {releaseErrorMessage} -
- ) : null} - - {!isInitialLoading && !releaseErrorMessage && !update ? ( -
- 尚未检查更新,点击「检查更新」后展示 GitHub Release 信息。 -
- ) : null} - - {update ? ( - - - GitHub Release · {update.latest_version} - - {update.published_at - ? `发布时间:${formatRelativeTime(update.published_at)} · ${formatDateTime(update.published_at)}` - : '未提供发布时间'} - - - -
- - {update.update_available ? '发现新版本' : '已经是最新版本'} - - {update.prerelease ? ( - Preview 发布 - ) : ( - 正式发布 - )} - {!update.can_upgrade ? ( - 当前平台不支持自动升级 - ) : null} -
- -
- - {update.release_notes || '暂无更新说明'} - -
- - {update.release_url ? ( - - 查看发布详情 - - - ) : null} - - {canUpgrade ? ( -
- - - - - - - 升级到 {update.latest_version}? - - 服务将下载并校验 {update.asset_name},随后替换当前二进制并重启。请确保安装目录可写,且服务允许原地重启。 - - - - 取消 - 确认升级 - - - -
- ) : null} - - {!update.can_upgrade ? ( -

- {update.current_version === 'dev' - ? '开发构建没有可比较的 Release 版本,不能执行自动升级。' - : update.update_available - ? '当前平台暂不支持自动替换二进制,请从 Release 页面手动升级。' - : '当前版本无需升级。'} -

- ) : null} -
-
- ) : null} -
-
-
- ); -} \ No newline at end of file diff --git a/frontend/lib/hooks/use-openflare-server-upgrade.ts b/frontend/lib/hooks/use-openflare-server-upgrade.ts deleted file mode 100644 index 46f2e8bc..00000000 --- a/frontend/lib/hooks/use-openflare-server-upgrade.ts +++ /dev/null @@ -1,127 +0,0 @@ -'use client'; - -import {useMutation, useQuery} from '@tanstack/react-query'; -import {useCallback, useEffect, useRef, useState} from 'react'; - -import {AdminStatusService} from '@/lib/services/admin'; -import type {AppUpdateStatus} from '@/lib/services/admin/types'; -import {StatusService} from '@/lib/services/openflare'; - -export const openflarePublicStatusQueryKey = ['openflare', 'public-status'] as const; - -export const adminUpdateStatusQueryKey = ['admin', 'update'] as const; - -export function useOpenFlareServerUpgrade({ - open, - canUpgrade, -}: { - open: boolean; - canUpgrade: boolean; -}) { - const [feedback, setFeedback] = useState(null); - - const upgradeReloadStartedRef = useRef(false); - const upgradeReloadTimerRef = useRef(null); - - const statusQuery = useQuery({ - queryKey: openflarePublicStatusQueryKey, - queryFn: () => StatusService.getPublicStatus(), - enabled: open, - }); - - const updateQuery = useQuery({ - queryKey: adminUpdateStatusQueryKey, - queryFn: () => AdminStatusService.getUpdateStatus(), - enabled: open && canUpgrade, - staleTime: 5 * 60 * 1000, - }); - - const scheduleUpgradePageReload = useCallback(() => { - if (upgradeReloadStartedRef.current) { - return; - } - - upgradeReloadStartedRef.current = true; - setFeedback('服务升级已进入重启阶段,页面将在服务恢复后自动刷新。'); - - const reloadWhenServerReady = async () => { - try { - await StatusService.getPublicStatus(); - window.location.reload(); - } catch { - upgradeReloadTimerRef.current = window.setTimeout(reloadWhenServerReady, 1500); - } - }; - - upgradeReloadTimerRef.current = window.setTimeout(reloadWhenServerReady, 1200); - }, []); - - useEffect(() => { - return () => { - if (upgradeReloadTimerRef.current !== null) { - window.clearTimeout(upgradeReloadTimerRef.current); - } - }; - }, []); - - const upgradeMutation = useMutation({ - mutationFn: () => AdminStatusService.applyUpdate(), - onSuccess: () => { - scheduleUpgradePageReload(); - setFeedback('升级包已校验完成,服务正在重启。'); - }, - onError: (error) => { - setFeedback(error instanceof Error ? error.message : '升级失败,请稍后重试。'); - }, - }); - - const resetTransientState = useCallback(() => { - setFeedback(null); - upgradeReloadStartedRef.current = false; - }, []); - - const handleOpen = useCallback(() => { - resetTransientState(); - if (canUpgrade) { - void updateQuery.refetch(); - } - }, [canUpgrade, resetTransientState, updateQuery]); - - const handleCheckRelease = useCallback(() => { - setFeedback(null); - if (!canUpgrade) { - return; - } - void updateQuery.refetch(); - }, [canUpgrade, updateQuery]); - - const handleUpgrade = useCallback(() => { - setFeedback(null); - upgradeMutation.mutate(); - }, [upgradeMutation]); - - const update = updateQuery.data; - const releaseErrorMessage = - feedback || - (updateQuery.isError - ? updateQuery.error instanceof Error - ? updateQuery.error.message - : '版本检查失败,请稍后重试。' - : undefined); - - const currentVersion = statusQuery.data?.version || update?.current_version || 'unknown'; - - return { - currentVersion, - update, - releaseErrorMessage, - isInitialLoading: updateQuery.isLoading && !updateQuery.data && canUpgrade, - isChecking: updateQuery.isFetching, - isUpgrading: upgradeMutation.isPending, - handleOpen, - handleCheckRelease, - handleUpgrade, - }; -} - -export type {AppUpdateStatus}; \ No newline at end of file