diff --git a/pkg/api/http/controller/groups/plugins.py b/pkg/api/http/controller/groups/plugins.py index f1fd809c..c78daf31 100644 --- a/pkg/api/http/controller/groups/plugins.py +++ b/pkg/api/http/controller/groups/plugins.py @@ -49,3 +49,21 @@ class PluginsRouterGroup(group.RouterGroup): data = await quart.request.json await self.ap.plugin_mgr.reorder_plugins(data.get('plugins')) return self.success() + + @self.route('/install/github', methods=['POST']) + async def _() -> str: + data = await quart.request.json + + ctx = taskmgr.TaskContext.new() + short_source_str = data['source'][-8:] + wrapper = self.ap.task_mgr.create_user_task( + self.ap.plugin_mgr.install_plugin(data['source'], task_context=ctx), + kind="plugin-operation", + name=f'plugin-install-github', + label=f'安装插件 ...{short_source_str}', + context=ctx + ) + + return self.success(data={ + 'task_id': wrapper.id + }) diff --git a/pkg/plugin/installer.py b/pkg/plugin/installer.py index 88b4628f..042d2ecf 100644 --- a/pkg/plugin/installer.py +++ b/pkg/plugin/installer.py @@ -21,6 +21,7 @@ class PluginInstaller(metaclass=abc.ABCMeta): async def install_plugin( self, plugin_source: str, + task_context: taskmgr.TaskContext = taskmgr.TaskContext.placeholder(), ): """安装插件 """ diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index 75b94591..a1e50ad8 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -65,10 +65,11 @@ class PluginManager: async def install_plugin( self, plugin_source: str, + task_context: taskmgr.TaskContext = taskmgr.TaskContext.placeholder(), ): """安装插件 """ - await self.installer.install_plugin(plugin_source) + await self.installer.install_plugin(plugin_source, task_context) await self.ap.ctr_mgr.plugin.post_install_record( { diff --git a/web/src/pages/Plugins.vue b/web/src/pages/Plugins.vue index 4ffb72f6..03db36c9 100644 --- a/web/src/pages/Plugins.vue +++ b/web/src/pages/Plugins.vue @@ -13,8 +13,8 @@ + 安装 + + + + @@ -113,6 +141,28 @@ const updatePlugin = (plugin) => { }) } +const installPlugin = () => { + + if (installDialogSource.value == '' || installDialogSource.value.trim() == '') { + snackbar.error("请输入插件仓库地址") + return + } + + proxy.$axios.post(`/plugins/install/github`, { + source: installDialogSource.value + }).then(res => { + if (res.data.code != 0) { + snackbar.error(res.data.msg) + return + } + installDialogSource.value = '' + snackbar.success(`已添加插件安装任务 请到任务列表查看进度`) + isInstallDialogActive.value = false + }).catch(error => { + snackbar.error(error) + }) +} + const isOrchestrationDialogActive = ref(false) const cancelOrderChanges = () => { @@ -136,6 +186,10 @@ const saveOrder = () => { snackbar.error(error) }) } + +const isInstallDialogActive = ref(false) +const installDialogSource = ref('') + \ No newline at end of file