ExtensionController.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\System\Controller;
  4. use SixShop\Core\Helper;
  5. use SixShop\System\Enum\ExtensionStatusEnum;
  6. use SixShop\System\ExtensionManager;
  7. use think\App;
  8. use think\facade\Event;
  9. use think\paginator\driver\Bootstrap;
  10. use think\Response;
  11. use function SixShop\Core\extension_path;
  12. use function SixShop\Core\success_response;
  13. class ExtensionController
  14. {
  15. public function index(ExtensionManager $extensionManager): Response
  16. {
  17. $extensionList = $extensionManager->getExtensionList();
  18. $data = [
  19. 'total' => count($extensionList),
  20. 'enabled' => 0,
  21. 'disabled' => 0,
  22. 'installed' => 0,
  23. 'uninstalled' => 0,
  24. 'category_map' => $extensionManager->getCategoryMap(),
  25. ];
  26. // 获取ExtensionService实例,用于检查菜单状态
  27. $extensionService = new \app\common\service\ExtensionService();
  28. foreach ($extensionList as &$extension) {
  29. // 检查每个扩展是否已有菜单
  30. try {
  31. $extension['has_menu'] = $extensionService->hasExtensionMenu($extension['id']);
  32. } catch (\Exception $e) {
  33. $extension['has_menu'] = false;
  34. }
  35. match ($extension['status']) {
  36. ExtensionStatusEnum::ENABLED => $data['enabled']++,
  37. ExtensionStatusEnum::DISABLED => $data['disabled']++,
  38. ExtensionStatusEnum::UNINSTALLED => $data['uninstalled']++,
  39. default => null,
  40. };
  41. }
  42. $data['installed'] = $data['total'] - $data['uninstalled'];
  43. return Helper::page_response(new Bootstrap(array_values($extensionList), $data['total'], 1, $data['total']), $data);
  44. }
  45. public function read(string $id, ExtensionManager $extensionManager): Response
  46. {
  47. $data = $extensionManager->getInfo($id);
  48. $filePath = Helper::extension_path($id) . '/README.md';
  49. if (file_exists($filePath)) {
  50. $data['markdown'] = file_get_contents($filePath);
  51. } else {
  52. // 处理文件不存在的情况
  53. $data['markdown'] = '无文档请补充文档README.md';
  54. }
  55. $data['migrations'] = $extensionManager->migrations($id);
  56. $extensionManager->refresh($id);
  57. return Helper::success_response($data);
  58. }
  59. public function install(string $id, ExtensionManager $extensionManager): Response
  60. {
  61. Event::trigger('before_install_extension', $id);
  62. $extensionManager->install($id);
  63. Event::trigger('after_install_extension', $id);
  64. return Helper::success_response();
  65. }
  66. public function uninstall(string $id, ExtensionManager $extensionManager): Response
  67. {
  68. Event::trigger('before_uninstall_extension', $id);
  69. Event::trigger('before_uninstall_' . $id . '_extension');
  70. $extensionManager->uninstall($id);
  71. Event::trigger('after_uninstall_extension', $id);
  72. Event::trigger('after_uninstall_' . $id . '_extension');
  73. return Helper::success_response();
  74. }
  75. public function enable(string $id, ExtensionManager $extensionManager): Response
  76. {
  77. $extensionManager->enable($id);
  78. Event::trigger('after_enable_extension', $id);
  79. return Helper::success_response();
  80. }
  81. public function disable(string $id, ExtensionManager $extensionManager): Response
  82. {
  83. $extensionManager->disable($id);
  84. Event::trigger('after_disable_extension', $id);
  85. return Helper::success_response();
  86. }
  87. public function normal(App $app): Response
  88. {
  89. $extensionPath = Helper::extension_path();
  90. $extensionDirs = array_diff(scandir($extensionPath), ['.', '..']);
  91. $options = [];
  92. foreach ($extensionDirs as $item) {
  93. if (!is_dir($extensionPath . $item)) {
  94. continue;
  95. }
  96. $infoFile = $extensionPath . $item . '/info.php';
  97. if (is_file($infoFile)) {
  98. $info = require $infoFile;
  99. if (!($info['is_core'] ?? false)) {
  100. $options[] = [
  101. 'value' => $info['id'],
  102. 'label' => $info['name'],
  103. ];
  104. }
  105. }
  106. }
  107. return success_response($options);
  108. }
  109. public function vue(string $extension, string $file, ExtensionManager $extensionManager): Response
  110. {
  111. $filePath = extension_path($extension) . 'resource/admin/' . $file . '.vue';
  112. if (file_exists($filePath)) {
  113. return response(file_get_contents($filePath))
  114. ->header(['Content-Type' => 'text/plain;charset=utf-8']);
  115. } else {
  116. // 文件不存在时返回404
  117. return response('文件不存在:' . $filePath, 404)
  118. ->header(['Content-Type' => 'text/plain;charset=utf-8']);
  119. }
  120. }
  121. }