| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- declare(strict_types=1);
- namespace SixShop\System\Controller;
- use SixShop\Core\Helper;
- use SixShop\System\Enum\ExtensionStatusEnum;
- use SixShop\System\ExtensionManager;
- use think\App;
- use think\facade\Event;
- use think\paginator\driver\Bootstrap;
- use think\Response;
- use function SixShop\Core\extension_path;
- use function SixShop\Core\success_response;
- class ExtensionController
- {
- public function index(ExtensionManager $extensionManager): Response
- {
- $extensionList = $extensionManager->getExtensionList();
- $data = [
- 'total' => count($extensionList),
- 'enabled' => 0,
- 'disabled' => 0,
- 'installed' => 0,
- 'uninstalled' => 0,
- 'category_map' => $extensionManager->getCategoryMap(),
- ];
- // 获取ExtensionService实例,用于检查菜单状态
- $extensionService = new \app\common\service\ExtensionService();
- foreach ($extensionList as &$extension) {
- // 检查每个扩展是否已有菜单
- try {
- $extension['has_menu'] = $extensionService->hasExtensionMenu($extension['id']);
- } catch (\Exception $e) {
- $extension['has_menu'] = false;
- }
- match ($extension['status']) {
- ExtensionStatusEnum::ENABLED => $data['enabled']++,
- ExtensionStatusEnum::DISABLED => $data['disabled']++,
- ExtensionStatusEnum::UNINSTALLED => $data['uninstalled']++,
- default => null,
- };
- }
- $data['installed'] = $data['total'] - $data['uninstalled'];
- return Helper::page_response(new Bootstrap(array_values($extensionList), $data['total'], 1, $data['total']), $data);
- }
- public function read(string $id, ExtensionManager $extensionManager): Response
- {
- $data = $extensionManager->getInfo($id);
- $filePath = Helper::extension_path($id) . '/README.md';
- if (file_exists($filePath)) {
- $data['markdown'] = file_get_contents($filePath);
- } else {
- // 处理文件不存在的情况
- $data['markdown'] = '无文档请补充文档README.md';
- }
- $data['migrations'] = $extensionManager->migrations($id);
- $extensionManager->refresh($id);
- return Helper::success_response($data);
- }
- public function install(string $id, ExtensionManager $extensionManager): Response
- {
- Event::trigger('before_install_extension', $id);
- $extensionManager->install($id);
- Event::trigger('after_install_extension', $id);
- return Helper::success_response();
- }
- public function uninstall(string $id, ExtensionManager $extensionManager): Response
- {
- Event::trigger('before_uninstall_extension', $id);
- Event::trigger('before_uninstall_' . $id . '_extension');
- $extensionManager->uninstall($id);
- Event::trigger('after_uninstall_extension', $id);
- Event::trigger('after_uninstall_' . $id . '_extension');
- return Helper::success_response();
- }
- public function enable(string $id, ExtensionManager $extensionManager): Response
- {
- $extensionManager->enable($id);
- Event::trigger('after_enable_extension', $id);
- return Helper::success_response();
- }
- public function disable(string $id, ExtensionManager $extensionManager): Response
- {
- $extensionManager->disable($id);
- Event::trigger('after_disable_extension', $id);
- return Helper::success_response();
- }
- public function normal(App $app): Response
- {
- $extensionPath = Helper::extension_path();
- $extensionDirs = array_diff(scandir($extensionPath), ['.', '..']);
- $options = [];
- foreach ($extensionDirs as $item) {
- if (!is_dir($extensionPath . $item)) {
- continue;
- }
- $infoFile = $extensionPath . $item . '/info.php';
- if (is_file($infoFile)) {
- $info = require $infoFile;
- if (!($info['is_core'] ?? false)) {
- $options[] = [
- 'value' => $info['id'],
- 'label' => $info['name'],
- ];
- }
- }
- }
- return success_response($options);
- }
- public function vue(string $extension, string $file, ExtensionManager $extensionManager): Response
- {
- $filePath = extension_path($extension) . 'resource/admin/' . $file . '.vue';
- if (file_exists($filePath)) {
- return response(file_get_contents($filePath))
- ->header(['Content-Type' => 'text/plain;charset=utf-8']);
- } else {
- // 文件不存在时返回404
- return response('文件不存在:' . $filePath, 404)
- ->header(['Content-Type' => 'text/plain;charset=utf-8']);
- }
- }
- }
|