GetMenuById.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Module\System\Models\AdminMenu;
  4. use Illuminate\Console\Command;
  5. use Illuminate\Support\Facades\Route;
  6. use Illuminate\Support\Str;
  7. /**
  8. * 获取菜单详情命令
  9. *
  10. * 根据菜单ID获取菜单项的详细信息,包括子菜单和URI有效性检查
  11. */
  12. class GetMenuById extends Command
  13. {
  14. /**
  15. * The name and signature of the console command.
  16. *
  17. * @var string
  18. */
  19. protected $signature = 'admin:get-menu {id : 菜单项ID} {--delete : 是否删除该菜单项}';
  20. /**
  21. * The console command description.
  22. *
  23. * @var string
  24. */
  25. protected $description = '获取特定ID的菜单项详细信息';
  26. /**
  27. * Execute the console command.
  28. *
  29. * @return int
  30. */
  31. public function handle()
  32. {
  33. $id = $this->argument('id');
  34. // 获取菜单项
  35. $menu = AdminMenu::find($id);
  36. if (!$menu) {
  37. $this->error("未找到ID为{$id}的菜单项");
  38. return 1;
  39. }
  40. $this->info("菜单项详细信息:");
  41. $this->table(
  42. ['属性', '值'],
  43. [
  44. ['ID', $menu->id],
  45. ['标题', $menu->title],
  46. ['URI', $menu->uri],
  47. ['父ID', $menu->parent_id],
  48. ['排序', $menu->order],
  49. ['图标', $menu->icon],
  50. ['显示', $menu->show ? '是' : '否'],
  51. ['创建时间', $menu->created_at],
  52. ['更新时间', $menu->updated_at]
  53. ]
  54. );
  55. // 获取子菜单
  56. $childMenus = AdminMenu::where('parent_id', $menu->id)->get();
  57. if ($childMenus->isNotEmpty()) {
  58. $this->info("\n子菜单:");
  59. $table = [];
  60. foreach ($childMenus as $childMenu) {
  61. $table[] = [
  62. 'id' => $childMenu->id,
  63. 'title' => $childMenu->title,
  64. 'uri' => $childMenu->uri,
  65. 'order' => $childMenu->order,
  66. 'show' => $childMenu->show ? '是' : '否'
  67. ];
  68. }
  69. $this->table(['ID', '标题', 'URI', '排序', '显示'], $table);
  70. } else {
  71. $this->info("\n没有子菜单");
  72. }
  73. // 检查URI是否有效
  74. if (!empty($menu->uri)) {
  75. $this->info("\n检查URI是否有效:");
  76. // 获取所有路由
  77. $routes = Route::getRoutes();
  78. $routeUris = [];
  79. foreach ($routes as $route) {
  80. if (Str::startsWith($route->uri(), 'admin/')) {
  81. $routeUris[] = str_replace('admin/', '', $route->uri());
  82. }
  83. }
  84. // 获取所有模块的控制器
  85. $modules = [
  86. 'Activity', 'Article', 'Farm', 'File', 'Fund', 'Game', 'GameItems',
  87. 'OAuth', 'Pet', 'Sms', 'System', 'Task', 'Team', 'User'
  88. ];
  89. $controllerUris = [];
  90. foreach ($modules as $module) {
  91. $controllerDir = app_path("Module/{$module}/AdminControllers");
  92. if (!is_dir($controllerDir)) {
  93. continue;
  94. }
  95. $controllers = array_filter(scandir($controllerDir), function($file) {
  96. return !in_array($file, ['.', '..']) &&
  97. pathinfo($file, PATHINFO_EXTENSION) === 'php' &&
  98. !Str::contains($file, 'Helper');
  99. });
  100. foreach ($controllers as $controller) {
  101. $controllerName = pathinfo($controller, PATHINFO_FILENAME);
  102. $uri = $this->getControllerUri($controllerName);
  103. $controllerUris[] = $uri;
  104. }
  105. }
  106. $uri = ltrim($menu->uri, '/');
  107. $isValidRoute = false;
  108. $isValidController = false;
  109. // 检查路由
  110. foreach ($routeUris as $routeUri) {
  111. if (Str::startsWith($routeUri, $uri) || $routeUri === $uri) {
  112. $isValidRoute = true;
  113. break;
  114. }
  115. }
  116. // 检查控制器
  117. foreach ($controllerUris as $controllerUri) {
  118. if ($controllerUri === $uri) {
  119. $isValidController = true;
  120. break;
  121. }
  122. }
  123. if ($isValidRoute) {
  124. $this->info(" - 路由: 有效");
  125. } else {
  126. $this->error(" - 路由: 无效");
  127. }
  128. if ($isValidController) {
  129. $this->info(" - 控制器: 有效");
  130. } else {
  131. $this->error(" - 控制器: 无效");
  132. }
  133. if (!$isValidRoute && !$isValidController) {
  134. $this->error(" - URI无效,可能会导致404错误");
  135. // 删除菜单项
  136. if ($this->option('delete') || $this->confirm('是否要删除此菜单项?')) {
  137. // 更新子菜单的父ID
  138. foreach ($childMenus as $childMenu) {
  139. $childMenu->parent_id = $menu->parent_id;
  140. $childMenu->save();
  141. $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$menu->parent_id}");
  142. }
  143. // 删除菜单项
  144. $menu->delete();
  145. $this->info(" - 已删除菜单项: ID = {$menu->id}, 标题 = {$menu->title}, URI = {$menu->uri}");
  146. }
  147. }
  148. }
  149. return 0;
  150. }
  151. /**
  152. * 根据控制器名称猜测URI
  153. *
  154. * @param string $controllerName
  155. * @return string
  156. */
  157. protected function getControllerUri(string $controllerName): string
  158. {
  159. // 移除Controller后缀
  160. $name = str_replace('Controller', '', $controllerName);
  161. // 转换为kebab-case
  162. $uri = Str::kebab($name);
  163. return $uri;
  164. }
  165. }