diff --git a/apps/jingrow/frontend/src/views/pagetype/package/package_toolbar.vue b/apps/jingrow/frontend/src/views/pagetype/package/package_toolbar.vue index 77dfc43..11297ef 100644 --- a/apps/jingrow/frontend/src/views/pagetype/package/package_toolbar.vue +++ b/apps/jingrow/frontend/src/views/pagetype/package/package_toolbar.vue @@ -110,16 +110,12 @@ const uninstallPackage = async (packageName: string) => { try { uninstalling.value = true - const response = await axios.post('/api/action/jingrow.core.pagetype.package.package.uninstall_package', { - package_name: packageName - }, { + const response = await axios.post(`/jingrow/uninstall-extension/${packageName}`, {}, { headers: get_session_api_headers() }) - if (response.data.message.status === 'success') { + if (response.data.success) { message.success(props.context.t("Package '{0}' uninstalled successfully").replace('{0}', packageName)) - - // 卸载成功后跳转到Package列表页 props.context.router.push('/app/package') } else { message.error(props.context.t("Failed to uninstall package")) diff --git a/apps/jingrow/jingrow/api/local_app_installer.py b/apps/jingrow/jingrow/api/local_app_installer.py index 3942bda..4ca1ce9 100644 --- a/apps/jingrow/jingrow/api/local_app_installer.py +++ b/apps/jingrow/jingrow/api/local_app_installer.py @@ -441,6 +441,76 @@ async def get_installed_apps(request: Request): raise HTTPException(status_code=500, detail=str(e)) +@router.post("/jingrow/uninstall-extension/{package_name}") +async def uninstall_extension(request: Request, package_name: str): + """卸载扩展包""" + try: + apps_dir, _ = get_app_directories() + jingrow_backend_dir = apps_dir / "jingrow" / "jingrow" + + if not jingrow_backend_dir.exists(): + return {'success': False, 'error': '找不到 jingrow 应用目录'} + + modules = [] + try: + api_url = f"{Config.jingrow_server_url}/api/action/jingrow.core.pagetype.package.package.get_package_dependencies" + response = requests.post( + api_url, + json={'package_name': package_name}, + headers=get_jingrow_api_headers(), + timeout=60 + ) + + if response.status_code == 200: + result = response.json() + if result.get('message', {}).get('status') == 'success': + modules = result['message'].get('modules', []) + except Exception as e: + print(f"[DEBUG] Failed to get modules: {str(e)}") + + print(f"[DEBUG] Package: {package_name}") + print(f"[DEBUG] Modules: {modules}") + + try: + uninstall_url = f"{Config.jingrow_server_url}/api/action/jingrow.core.pagetype.package.package.uninstall_package" + uninstall_response = requests.post( + uninstall_url, + json={'package_name': package_name}, + headers=get_jingrow_api_headers(), + timeout=60 + ) + print(f"[DEBUG] Uninstall database status: {uninstall_response.status_code}") + except Exception as e: + print(f"[DEBUG] Failed to uninstall from database: {str(e)}") + + # 删除本地模块目录 + removed_count = 0 + removed_dirs = [] + for module_name in modules: + module_dir_name = module_name.lower().replace(" ", "_").replace("-", "_") + module_dir = jingrow_backend_dir / module_dir_name + + print(f"[DEBUG] Module: {module_name} -> Dir: {module_dir_name}") + print(f"[DEBUG] Full path: {module_dir}, exists: {module_dir.exists()}") + + if module_dir.exists(): + shutil.rmtree(module_dir) + removed_count += 1 + removed_dirs.append(module_dir_name) + print(f"[DEBUG] Removed: {module_dir_name}") + + print(f"[DEBUG] Total removed: {removed_count}, dirs: {removed_dirs}") + + return { + 'success': True, + 'message': f'扩展包模块卸载成功,删除了 {removed_count} 个目录', + 'removed_count': removed_count + } + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + @router.post("/jingrow/uninstall/{app_name}") async def uninstall_app(request: Request, app_name: str): """卸载应用 - 直接删除整个app目录"""