MenuPermissionService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace App\Services;
  3. use App\Models\MenuPermission;
  4. use Filament\Facades\Filament;
  5. use Filament\Navigation\NavigationItem;
  6. class MenuPermissionService
  7. {
  8. /**
  9. * 过滤当前用户的菜单项
  10. */
  11. public static function filterUserNavigationItems(array $items): array
  12. {
  13. $user = Filament::getCurrentPanel()->auth()->user();
  14. if (!$user) {
  15. return $items;
  16. }
  17. $userId = $user->teacher_id ?? $user->id;
  18. return array_filter($items, function ($item) use ($userId) {
  19. $url = $item->getUrl();
  20. $menuKey = self::extractMenuKeyFromUrl($url);
  21. if (!$menuKey) {
  22. return true; // 如果无法识别菜单键,默认显示
  23. }
  24. return MenuPermission::isMenuVisible($userId, $menuKey);
  25. });
  26. }
  27. /**
  28. * 从URL中提取菜单键
  29. */
  30. private static function extractMenuKeyFromUrl(string $url): ?string
  31. {
  32. // 提取URL中的路径作为菜单键
  33. $path = parse_url($url, PHP_URL_PATH);
  34. if (!$path) {
  35. return null;
  36. }
  37. // 移除开头的斜杠并获取第一段路径
  38. $path = ltrim($path, '/');
  39. $segments = explode('/', $path);
  40. // 获取第一个路径段作为菜单键
  41. $menuKey = $segments[0] ?? null;
  42. // 特殊处理一些路径
  43. $menuMappings = [
  44. 'admin' => null, // 跳过admin前缀
  45. 'dashboard' => 'dashboard',
  46. 'exam-history' => 'exam-history',
  47. 'exam-analysis' => 'exam-analysis',
  48. 'ocr-paper-grading' => 'ocr-paper-grading',
  49. 'intelligent-exam-generation' => 'intelligent-exam-generation',
  50. 'knowledge-graph' => 'knowledge-graph',
  51. 'student-management' => 'student-management',
  52. 'teacher-management' => 'teacher-management',
  53. ];
  54. return $menuMappings[$menuKey] ?? $menuKey;
  55. }
  56. /**
  57. * 为新用户初始化默认菜单权限
  58. */
  59. public static function initializeDefaultMenus(string $userId): void
  60. {
  61. $defaultMenus = [
  62. 'dashboard' => ['label' => '仪表盘', 'group' => '管理', 'sort' => 0],
  63. 'exam-history' => ['label' => '考试历史', 'group' => '管理', 'sort' => 1],
  64. 'exam-analysis' => ['label' => '考试分析', 'group' => '分析', 'sort' => 2],
  65. 'ocr-paper-grading' => ['label' => 'OCR试卷批改', 'group' => '工具', 'sort' => 3],
  66. 'intelligent-exam-generation' => ['label' => '智能出卷', 'group' => '工具', 'sort' => 4],
  67. 'knowledge-graph' => ['label' => '知识图谱', 'group' => '分析', 'sort' => 5],
  68. 'student-management' => ['label' => '学生管理', 'group' => '管理', 'sort' => 6],
  69. 'teacher-management' => ['label' => '老师管理', 'group' => '管理', 'sort' => 7],
  70. ];
  71. foreach ($defaultMenus as $key => $data) {
  72. MenuPermission::updateOrCreate(
  73. [
  74. 'user_id' => $userId,
  75. 'menu_key' => $key,
  76. ],
  77. [
  78. 'menu_label' => $data['label'],
  79. 'menu_group' => $data['group'],
  80. 'is_visible' => true,
  81. 'sort_order' => $data['sort'],
  82. ]
  83. );
  84. }
  85. }
  86. /**
  87. * 获取用户的菜单统计信息
  88. */
  89. public static function getUserMenuStats(string $userId): array
  90. {
  91. $stats = MenuPermission::where('user_id', $userId)
  92. ->selectRaw('COUNT(*) as total')
  93. ->selectRaw('SUM(CASE WHEN is_visible = 1 THEN 1 ELSE 0 END) as visible')
  94. ->selectRaw('SUM(CASE WHEN is_visible = 0 THEN 1 ELSE 0 END) as hidden')
  95. ->first();
  96. return [
  97. 'total' => $stats->total ?? 0,
  98. 'visible' => $stats->visible ?? 0,
  99. 'hidden' => $stats->hidden ?? 0,
  100. ];
  101. }
  102. }