all(); } public function enablePlugin(string $key): void { try { app(PluginManager::class)->enable($key); Notification::make()->title('已启用:'.$key)->success()->send(); } catch (\Throwable $e) { Notification::make()->title('启用失败')->body($e->getMessage())->danger()->send(); } } public function disablePlugin(string $key): void { try { app(PluginManager::class)->disable($key); Notification::make()->title('已停用:'.$key)->warning()->send(); } catch (\Throwable $e) { Notification::make()->title('停用失败')->body($e->getMessage())->danger()->send(); } } public function uninstallPlugin(string $key): void { try { app(PackageInstaller::class)->uninstallPlugin($key); Notification::make()->title('已卸载:'.$key)->success()->send(); } catch (\Throwable $e) { Notification::make()->title('卸载失败')->body($e->getMessage())->danger()->send(); } } public function uploadZip(): void { $this->validate([ 'zip' => ['required', 'file', 'mimes:zip'], ]); try { $result = app(PackageInstaller::class)->installZip($this->zip->getRealPath()); Notification::make() ->title('安装成功:'.($result['type'] === 'plugin' ? '插件' : '主题').' '.$result['key']) ->success() ->send(); } catch (\Throwable $e) { Notification::make()->title('安装失败')->body($e->getMessage())->danger()->send(); } $this->zip = null; } public function loadMarket(): void { try { $this->marketItems = app(MarketplaceClient::class)->items(); Notification::make()->title('市场已刷新:'.count($this->marketItems).' 个包')->success()->send(); } catch (\Throwable $e) { Notification::make()->title('市场加载失败')->body($e->getMessage())->danger()->send(); } } public function installFromMarket(string $index): void { $item = $this->marketItems[(int) $index] ?? null; if (! $item) { return; } try { $result = app(PackageInstaller::class)->installFromMarket($item); Notification::make()->title('安装成功:'.$result['key'])->success()->send(); } catch (\Throwable $e) { Notification::make()->title('安装失败')->body($e->getMessage())->danger()->send(); } } public function getMarketConfiguredProperty(): bool { return (bool) config('market.url'); } }