all(); } public function activateTheme(string $name): void { try { app(ThemeManager::class)->activate($name); Notification::make()->title('已激活主题:'.$name)->success()->send(); } catch (\Throwable $e) { Notification::make()->title('激活失败')->body($e->getMessage())->danger()->send(); } } public function uploadThemeZip(): void { $this->validate([ 'zip' => ['required', 'file', 'mimes:zip'], ]); try { $result = app(PackageInstaller::class)->installZip($this->zip->getRealPath()); Notification::make()->title('主题安装成功:'.$result['key'])->success()->send(); } catch (\Throwable $e) { Notification::make()->title('安装失败')->body($e->getMessage())->danger()->send(); } $this->zip = null; } public function uninstallTheme(string $name): void { try { app(PackageInstaller::class)->uninstallTheme($name); Notification::make()->title('已删除主题:'.$name)->success()->send(); } catch (\Throwable $e) { Notification::make()->title('删除失败')->body($e->getMessage())->danger()->send(); } } public function loadThemeMarket(): void { try { $items = app(MarketplaceClient::class)->items(); $this->marketItems = array_values(array_filter( $items, fn (array $item) => ($item['type'] ?? 'plugin') === 'theme' )); Notification::make()->title('市场已刷新:'.count($this->marketItems).' 个主题')->success()->send(); } catch (\Throwable $e) { Notification::make()->title('市场加载失败')->body($e->getMessage())->danger()->send(); } } public function installFromThemeMarket(string $index): void { $item = $this->marketItems[(int) $index] ?? null; if (! $item) { return; } try { app(MarketPurchaseService::class)->assertCanInstall($item); $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 purchaseThemeMarketItem(string $index) { $item = $this->marketItems[(int) $index] ?? null; if (! $item) { return; } try { $payment = app(MarketPurchaseService::class)->purchase($item); if (! $payment) { Notification::make()->title('该商品已购买')->info()->send(); return; } return redirect()->route('pay.checkout', $payment); } catch (\Throwable $e) { Notification::make()->title('购买失败')->body($e->getMessage())->danger()->send(); } } public function isThemeMarketPurchased(string $index): bool { $item = $this->marketItems[(int) $index] ?? null; if (! $item) { return false; } return app(MarketPurchaseService::class)->isPurchased( app(MarketPurchaseService::class)->itemKey($item), app(MarketPurchaseService::class)->itemType($item) ); } public function getMarketConfiguredProperty(): bool { return (bool) config('market.url'); } }