Merge pull request #2167 from hotlcc/develop-20240524-插件支持多仪表板组件

This commit is contained in:
jxxghp 2024-05-24 15:49:00 +08:00 committed by GitHub
commit 355dad9205
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 66 additions and 23 deletions

View File

@ -150,12 +150,12 @@ def plugin_page(plugin_id: str, _: schemas.TokenPayload = Depends(verify_token))
return PluginManager().get_plugin_page(plugin_id) return PluginManager().get_plugin_page(plugin_id)
@router.get("/dashboards", summary="获取有仪表板的插件清单") @router.get("/dashboard/meta", summary="获取所有插件仪表板元信息")
def dashboard_plugins(_: schemas.TokenPayload = Depends(verify_token)) -> List[dict]: def plugin_dashboard_meta(_: schemas.TokenPayload = Depends(verify_token)) -> List[dict]:
""" """
获取所有插件仪表板 获取所有插件仪表板元信息
""" """
return PluginManager().get_dashboard_plugins() return PluginManager().get_plugin_dashboard_meta()
@router.get("/dashboard/{plugin_id}", summary="获取插件仪表板配置") @router.get("/dashboard/{plugin_id}", summary="获取插件仪表板配置")
@ -164,7 +164,16 @@ def plugin_dashboard(plugin_id: str, user_agent: Annotated[str | None, Header()]
""" """
根据插件ID获取插件仪表板 根据插件ID获取插件仪表板
""" """
return PluginManager().get_plugin_dashboard(plugin_id, user_agent=user_agent) return PluginManager().get_plugin_dashboard(plugin_id, key=None, user_agent=user_agent)
@router.get("/dashboard/{plugin_id}/{key}", summary="获取插件仪表板配置")
def plugin_dashboard(plugin_id: str, key: str, user_agent: Annotated[str | None, Header()] = None,
_: schemas.TokenPayload = Depends(verify_token)) -> schemas.PluginDashboard:
"""
根据插件ID获取插件仪表板
"""
return PluginManager().get_plugin_dashboard(plugin_id, key=key, user_agent=user_agent)
@router.get("/reset/{plugin_id}", summary="重置插件配置", response_model=schemas.Response) @router.get("/reset/{plugin_id}", summary="重置插件配置", response_model=schemas.Response)

View File

@ -344,10 +344,11 @@ class PluginManager(metaclass=Singleton):
return plugin.get_page() or [] return plugin.get_page() or []
return [] return []
def get_plugin_dashboard(self, pid: str, **kwargs) -> Optional[schemas.PluginDashboard]: def get_plugin_dashboard(self, pid: str, key: str, **kwargs) -> Optional[schemas.PluginDashboard]:
""" """
获取插件仪表盘 获取插件仪表盘
:param pid: 插件ID :param pid: 插件ID
:param key: 仪表盘key
""" """
def __get_params_count(func: Callable): def __get_params_count(func: Callable):
""" """
@ -361,7 +362,10 @@ class PluginManager(metaclass=Singleton):
return None return None
if hasattr(plugin, "get_dashboard"): if hasattr(plugin, "get_dashboard"):
# 检查方法的参数个数 # 检查方法的参数个数
if __get_params_count(plugin.get_dashboard) > 0: params_count = __get_params_count(plugin.get_dashboard)
if params_count > 1:
dashboard: Tuple = plugin.get_dashboard(key=key, **kwargs)
elif params_count > 0:
dashboard: Tuple = plugin.get_dashboard(**kwargs) dashboard: Tuple = plugin.get_dashboard(**kwargs)
else: else:
dashboard: Tuple = plugin.get_dashboard() dashboard: Tuple = plugin.get_dashboard()
@ -370,6 +374,7 @@ class PluginManager(metaclass=Singleton):
return schemas.PluginDashboard( return schemas.PluginDashboard(
id=pid, id=pid,
name=plugin.plugin_name, name=plugin.plugin_name,
key=key or "",
cols=cols or {}, cols=cols or {},
elements=elements, elements=elements,
attrs=attrs or {} attrs=attrs or {}
@ -445,24 +450,35 @@ class PluginManager(metaclass=Singleton):
logger.error(f"获取插件 {pid} 服务出错:{str(e)}") logger.error(f"获取插件 {pid} 服务出错:{str(e)}")
return ret_services return ret_services
def get_dashboard_plugins(self) -> List[dict]: def get_plugin_dashboard_meta(self):
""" """
获取有仪表盘的插件列表 获取所有插件仪表盘元信息
""" """
dashboards = [] dashboard_meta = []
for pid, plugin in self._running_plugins.items(): for plugin_id, plugin in self._running_plugins.items():
if hasattr(plugin, "get_dashboard") \ if not hasattr(plugin, "get_dashboard") or not ObjectUtils.check_method(plugin.get_dashboard):
and ObjectUtils.check_method(plugin.get_dashboard): continue
try: try:
if not plugin.get_state(): if not plugin.get_state():
continue continue
dashboards.append({ # 如果是多仪表盘实现
"id": pid, if hasattr(plugin, "get_dashboard_meta") and ObjectUtils.check_method(plugin.get_dashboard_meta):
"name": plugin.plugin_name meta = plugin.get_dashboard_meta()
if meta:
dashboard_meta.extend([{
"id": plugin_id,
"name": m.get("name"),
"key": m.get("key"),
} for m in meta if m])
else:
dashboard_meta.append({
"id": plugin_id,
"name": plugin.plugin_name,
"key": "",
}) })
except Exception as e: except Exception as e:
logger.error(f"获取有仪表盘的插件出错:{str(e)}") logger.error(f"获取插件[{plugin_id}]仪表盘元数据出错:{str(e)}")
return dashboards return dashboard_meta
def get_plugin_attr(self, pid: str, attr: str) -> Any: def get_plugin_attr(self, pid: str, attr: str) -> Any:
""" """

View File

@ -120,7 +120,7 @@ class _PluginBase(metaclass=ABCMeta):
""" """
pass pass
def get_dashboard(self, **kwargs) -> Optional[Tuple[Dict[str, Any], Dict[str, Any], List[dict]]]: def get_dashboard(self, key: str, **kwargs) -> Optional[Tuple[Dict[str, Any], Dict[str, Any], List[dict]]]:
""" """
获取插件仪表盘页面需要返回1仪表板col配置字典2全局配置自动刷新等3仪表板页面元素配置json含数据 获取插件仪表盘页面需要返回1仪表板col配置字典2全局配置自动刷新等3仪表板页面元素配置json含数据
1col配置参考 1col配置参考
@ -137,6 +137,22 @@ class _PluginBase(metaclass=ABCMeta):
3页面配置使用Vuetify组件拼装参考https://vuetifyjs.com/ 3页面配置使用Vuetify组件拼装参考https://vuetifyjs.com/
kwargs参数可获取的值1user_agent浏览器UA kwargs参数可获取的值1user_agent浏览器UA
:param key: 仪表盘key根据指定的key返回相应的仪表盘数据缺省时返回一个固定的仪表盘数据兼容旧版
"""
pass
def get_dashboard_meta(self) -> Optional[List[Dict[str, str]]]:
"""
获取插件仪表盘元信息
返回示例
[{
"key": "dashboard1", // 仪表盘的key在当前插件范围唯一
"name": "仪表盘1" // 仪表盘的名称
}, {
"key": "dashboard2",
"name": "仪表盘2"
}]
""" """
pass pass

View File

@ -55,6 +55,8 @@ class PluginDashboard(Plugin):
id: Optional[str] = None id: Optional[str] = None
# 名称 # 名称
name: Optional[str] = None name: Optional[str] = None
# 仪表板key
key: Optional[str] = None
# 全局配置 # 全局配置
attrs: Optional[dict] = {} attrs: Optional[dict] = {}
# col列数 # col列数