卸载扩展包时同时卸载package包含的本地模块

This commit is contained in:
jingrow 2025-10-27 01:05:38 +08:00
parent 196c8ecc7c
commit 7f648df653
2 changed files with 72 additions and 6 deletions

View File

@ -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"))

View File

@ -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目录"""