diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 0117c3f5..128983ad 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -1,6 +1,6 @@ -from typing import Any, List +from typing import Any, List, Annotated -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Header from app import schemas from app.core.plugin import PluginManager @@ -159,11 +159,12 @@ def dashboard_plugins(_: schemas.TokenPayload = Depends(verify_token)) -> List[d @router.get("/dashboard/{plugin_id}", summary="获取插件仪表板配置") -def plugin_dashboard(plugin_id: str, _: schemas.TokenPayload = Depends(verify_token)) -> schemas.PluginDashboard: +def plugin_dashboard(plugin_id: str, user_agent: Annotated[str | None, Header()] = None, + _: schemas.TokenPayload = Depends(verify_token)) -> schemas.PluginDashboard: """ 根据插件ID获取插件仪表板 """ - return PluginManager().get_plugin_dashboard(plugin_id) + return PluginManager().get_plugin_dashboard(plugin_id, user_agent=user_agent) @router.get("/reset/{plugin_id}", summary="重置插件配置", response_model=schemas.Response) diff --git a/app/core/plugin.py b/app/core/plugin.py index e6b9648a..035cce77 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -1,10 +1,11 @@ import concurrent import concurrent.futures +import inspect import os import threading import time import traceback -from typing import List, Any, Dict, Tuple, Optional +from typing import List, Any, Dict, Tuple, Optional, Callable from watchdog.events import FileSystemEventHandler from watchdog.observers import Observer @@ -337,16 +338,27 @@ class PluginManager(metaclass=Singleton): return plugin.get_page() or [] return [] - def get_plugin_dashboard(self, pid: str) -> Optional[schemas.PluginDashboard]: + def get_plugin_dashboard(self, pid: str, **kwargs) -> Optional[schemas.PluginDashboard]: """ 获取插件仪表盘 :param pid: 插件ID """ + def __get_params_count(func: Callable): + """ + 获取函数的参数信息 + """ + signature = inspect.signature(func) + return len(signature.parameters) + plugin = self._running_plugins.get(pid) if not plugin: return None if hasattr(plugin, "get_dashboard"): - dashboard: Tuple = plugin.get_dashboard() + # 检查方法的参数个数 + if __get_params_count(plugin.get_dashboard) > 0: + dashboard: Tuple = plugin.get_dashboard(**kwargs) + else: + dashboard: Tuple = plugin.get_dashboard() if dashboard: cols, attrs, elements = dashboard return schemas.PluginDashboard( diff --git a/app/plugins/__init__.py b/app/plugins/__init__.py index 7d947bb9..af1694ef 100644 --- a/app/plugins/__init__.py +++ b/app/plugins/__init__.py @@ -120,7 +120,7 @@ class _PluginBase(metaclass=ABCMeta): """ pass - def get_dashboard(self) -> Optional[Tuple[Dict[str, Any], Dict[str, Any], List[dict]]]: + def get_dashboard(self, **kwargs) -> Optional[Tuple[Dict[str, Any], Dict[str, Any], List[dict]]]: """ 获取插件仪表盘页面,需要返回:1、仪表板col配置字典;2、全局配置(自动刷新等);3、仪表板页面元素配置json(含数据) 1、col配置参考: @@ -133,6 +133,8 @@ class _PluginBase(metaclass=ABCMeta): "border": True, // 是否显示边框,默认True,为False时取消组件边框和边距,由插件自行控制 } 3、页面配置使用Vuetify组件拼装,参考:https://vuetifyjs.com/ + + 输入参数中:user_agent:浏览器UA """ pass