CheckAllAdminMenus.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Module\System\Models\AdminMenu;
  4. use Illuminate\Console\Command;
  5. use Illuminate\Support\Str;
  6. class CheckAllAdminMenus extends Command
  7. {
  8. /**
  9. * The name and signature of the console command.
  10. *
  11. * @var string
  12. */
  13. protected $signature = 'admin:check-all-menus';
  14. /**
  15. * The console command description.
  16. *
  17. * @var string
  18. */
  19. protected $description = '检查所有模块的后台控制器是否都有对应的菜单项';
  20. /**
  21. * Execute the console command.
  22. *
  23. * @return int
  24. */
  25. public function handle()
  26. {
  27. $this->info("开始检查所有模块的后台控制器...");
  28. $modules = [
  29. 'Activity', 'Article', 'Farm', 'File', 'Fund', 'Game', 'GameItems',
  30. 'OAuth', 'Pet', 'Sms', 'System', 'Task', 'Team', 'User'
  31. ];
  32. $missingMenus = [];
  33. $totalControllers = 0;
  34. $totalMenus = 0;
  35. foreach ($modules as $module) {
  36. $this->info("\n检查{$module}模块的后台控制器...");
  37. $controllerDir = app_path("Module/{$module}/AdminControllers");
  38. if (!is_dir($controllerDir)) {
  39. $this->warn(" - 未找到AdminControllers目录");
  40. continue;
  41. }
  42. $controllers = array_filter(scandir($controllerDir), function($file) {
  43. return !in_array($file, ['.', '..']) &&
  44. pathinfo($file, PATHINFO_EXTENSION) === 'php' &&
  45. !Str::contains($file, 'Helper');
  46. });
  47. $moduleControllers = 0;
  48. $moduleMenus = 0;
  49. foreach ($controllers as $controller) {
  50. $controllerName = pathinfo($controller, PATHINFO_FILENAME);
  51. $uri = $this->getControllerUri($controllerName);
  52. $totalControllers++;
  53. $moduleControllers++;
  54. // 检查菜单项是否存在
  55. $menuExists = AdminMenu::where('uri', $uri)->exists();
  56. if ($menuExists) {
  57. $totalMenus++;
  58. $moduleMenus++;
  59. $this->info(" - {$controllerName} => {$uri} [✓]");
  60. } else {
  61. $missingMenus[] = [
  62. 'module' => $module,
  63. 'controller' => $controllerName,
  64. 'uri' => $uri
  65. ];
  66. $this->error(" - {$controllerName} => {$uri} [✗]");
  67. }
  68. }
  69. $this->info(" {$module}模块: {$moduleMenus}/{$moduleControllers} 个控制器有对应的菜单项");
  70. }
  71. $this->info("\n总计: {$totalMenus}/{$totalControllers} 个控制器有对应的菜单项");
  72. if (count($missingMenus) > 0) {
  73. $this->info("\n缺失的菜单项:");
  74. foreach ($missingMenus as $menu) {
  75. $this->warn(" - {$menu['module']}模块: {$menu['controller']} => {$menu['uri']}");
  76. }
  77. if ($this->confirm('是否要修复这些缺失的菜单项?')) {
  78. foreach ($modules as $module) {
  79. $this->call('admin:fix-menus', ['module' => $module]);
  80. }
  81. }
  82. } else {
  83. $this->info("\n所有控制器都有对应的菜单项!");
  84. }
  85. return 0;
  86. }
  87. /**
  88. * 获取控制器的URI
  89. *
  90. * @param string $controllerName
  91. * @return string
  92. */
  93. protected function getControllerUri(string $controllerName): string
  94. {
  95. // 移除Controller后缀
  96. $name = str_replace('Controller', '', $controllerName);
  97. // 转换为kebab-case
  98. $uri = Str::kebab($name);
  99. return $uri;
  100. }
  101. }