From cc8891b6a1d00f99e4bc884adf6df628c23acefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 1 Feb 2026 10:33:58 +0800 Subject: [PATCH] fix: #1575 --- .../napcat-webui-backend/src/api/PluginStore.ts | 14 ++++++++------ .../src/controllers/plugin_manager.ts | 6 ++++-- .../src/pages/dashboard/plugin_store.tsx | 8 ++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/napcat-webui-backend/src/api/PluginStore.ts b/packages/napcat-webui-backend/src/api/PluginStore.ts index 45a02657..e9630321 100644 --- a/packages/napcat-webui-backend/src/api/PluginStore.ts +++ b/packages/napcat-webui-backend/src/api/PluginStore.ts @@ -34,12 +34,12 @@ const CACHE_TTL = 10 * 60 * 1000; // 10分钟缓存 /** * 从多个源获取插件列表,使用镜像系统 - * 带10分钟缓存 + * 带10分钟缓存,支持强制刷新 */ -async function fetchPluginList (): Promise { - // 检查缓存 +async function fetchPluginList (forceRefresh: boolean = false): Promise { + // 检查缓存(如果不是强制刷新) const now = Date.now(); - if (pluginListCache && (now - cacheTimestamp) < CACHE_TTL) { + if (!forceRefresh && pluginListCache && (now - cacheTimestamp) < CACHE_TTL) { //console.log('Using cached plugin list'); return pluginListCache; } @@ -192,9 +192,11 @@ async function extractPlugin (zipPath: string, pluginId: string): Promise /** * 获取插件商店列表 */ -export const GetPluginStoreListHandler: RequestHandler = async (_req, res) => { +export const GetPluginStoreListHandler: RequestHandler = async (req, res) => { try { - const data = await fetchPluginList(); + // 支持 forceRefresh 查询参数强制刷新缓存 + const forceRefresh = req.query['forceRefresh'] === 'true'; + const data = await fetchPluginList(forceRefresh); return sendSuccess(res, data); } catch (e: any) { return sendError(res, 'Failed to fetch plugin store list: ' + e.message); diff --git a/packages/napcat-webui-frontend/src/controllers/plugin_manager.ts b/packages/napcat-webui-frontend/src/controllers/plugin_manager.ts index 1e36a917..13c8e851 100644 --- a/packages/napcat-webui-frontend/src/controllers/plugin_manager.ts +++ b/packages/napcat-webui-frontend/src/controllers/plugin_manager.ts @@ -140,9 +140,11 @@ export default class PluginManager { /** * 获取插件商店列表 + * @param forceRefresh 是否强制刷新(跳过服务端缓存) */ - public static async getPluginStoreList (): Promise { - const { data } = await serverRequest.get>('/Plugin/Store/List'); + public static async getPluginStoreList (forceRefresh: boolean = false): Promise { + const params = forceRefresh ? { forceRefresh: 'true' } : {}; + const { data } = await serverRequest.get>('/Plugin/Store/List', { params }); return data.data; } diff --git a/packages/napcat-webui-frontend/src/pages/dashboard/plugin_store.tsx b/packages/napcat-webui-frontend/src/pages/dashboard/plugin_store.tsx index 6ef0561b..f8c52ff1 100644 --- a/packages/napcat-webui-frontend/src/pages/dashboard/plugin_store.tsx +++ b/packages/napcat-webui-frontend/src/pages/dashboard/plugin_store.tsx @@ -51,10 +51,10 @@ export default function PluginStorePage () { const [pendingInstallPlugin, setPendingInstallPlugin] = useState(null); const [selectedDownloadMirror, setSelectedDownloadMirror] = useState(undefined); - const loadPlugins = async () => { + const loadPlugins = async (forceRefresh: boolean = false) => { setLoading(true); try { - const data = await PluginManager.getPluginStoreList(); + const data = await PluginManager.getPluginStoreList(forceRefresh); setPlugins(data.plugins); // 检查插件管理器是否已加载 @@ -238,7 +238,7 @@ export default function PluginStorePage () { isIconOnly className="bg-default-100/50 hover:bg-default-200/50 text-default-700 backdrop-blur-md" radius="full" - onPress={loadPlugins} + onPress={() => loadPlugins(true)} isLoading={loading} > @@ -287,7 +287,7 @@ export default function PluginStorePage () { )} - +