MenusService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace app\shop\service;
  3. use think\Config;
  4. /**
  5. * 商家后台菜单业务
  6. */
  7. class MenusService
  8. {
  9. // 存放实例
  10. static public $instance;
  11. // 商家后台权限
  12. private $auth;
  13. /**
  14. * 公有化获取实例方法
  15. */
  16. public static function getInstance()
  17. {
  18. if (!(self::$instance instanceof MenusService)) {
  19. self::$instance = new self;
  20. }
  21. return self::$instance;
  22. }
  23. /**
  24. * 私有化构造方法
  25. */
  26. private function __construct()
  27. {
  28. $this->auth = AuthService::getInstance();
  29. }
  30. /**
  31. * 私有化克隆方法
  32. */
  33. private function __clone()
  34. {
  35. }
  36. /**
  37. * 一级菜单
  38. */
  39. private function first(&$menus, $routeUri, $group)
  40. {
  41. foreach ($menus as $key => &$first) :
  42. // 一级菜单索引url
  43. $indexData = $this->getMenusIndexUrls($first, 1);
  44. // 权限验证
  45. $first['index'] = $this->getAuthUrl($indexData);
  46. if ($first['index'] === false) {
  47. unset($menus[$key]);
  48. continue;
  49. }
  50. // 菜单聚焦
  51. $first['active'] = $key === $group;
  52. // 遍历:二级菜单
  53. if (isset($first['submenu'])) {
  54. $this->second($first['submenu'], $routeUri);
  55. }
  56. endforeach;
  57. }
  58. /**
  59. * 二级菜单
  60. */
  61. public function second(&$menus, $routeUri)
  62. {
  63. foreach ($menus as $key => &$second) :
  64. // 二级菜单索引url
  65. $indexData = $this->getMenusIndexUrls($second, 2);
  66. // 权限验证
  67. $second['index'] = $this->getAuthUrl($indexData);
  68. if ($second['index'] === false) {
  69. unset($menus[$key]);
  70. continue;
  71. }
  72. // 二级菜单所有uri
  73. $secondUris = [];
  74. // 遍历:三级菜单
  75. if (isset($second['submenu'])) {
  76. $this->third($second['submenu'], $routeUri, $secondUris);
  77. } else {
  78. if (isset($second['uris']))
  79. $secondUris = array_merge($secondUris, $second['uris']);
  80. else
  81. $secondUris[] = $second['index'];
  82. }
  83. // 二级菜单:active
  84. !isset($second['active']) && $second['active'] = in_array($routeUri, $secondUris);
  85. endforeach;
  86. // 删除空数组
  87. $menus = array_filter($menus);
  88. }
  89. /**
  90. * 三级菜单
  91. */
  92. private function third(&$menus, $routeUri, &$secondUris)
  93. {
  94. foreach ($menus as $key => &$third):
  95. // 三级菜单索引url
  96. $indexData = $this->getMenusIndexUrls($third, 3);
  97. // 权限验证
  98. $third['index'] = $this->getAuthUrl($indexData);
  99. if ($third['index'] === false) {
  100. unset($menus[$key]);
  101. continue;
  102. }
  103. // 三级菜单所有uri
  104. $thirdUris = [];
  105. if (isset($third['uris'])) {
  106. $secondUris = array_merge($secondUris, $third['uris']);
  107. $thirdUris = array_merge($thirdUris, $third['uris']);
  108. } else {
  109. $secondUris[] = $third['index'];
  110. $thirdUris[] = $third['index'];
  111. }
  112. $third['active'] = in_array($routeUri, $thirdUris);
  113. endforeach;
  114. }
  115. /**
  116. * 获取指定菜单下的所有索引url
  117. */
  118. private function getMenusIndexUrls($menus, $level = 1)
  119. {
  120. // 判断是否存在url
  121. if (!isset($menus['index']) && !isset($menus['submenu'])) {
  122. return [];
  123. }
  124. $data = [];
  125. if (isset($menus['index']) && !empty($menus['index'])) {
  126. $data[] = $menus['index'];
  127. }
  128. if (isset($menus['submenu']) && !empty($menus['submenu'])) {
  129. foreach ($menus['submenu'] as $submenu) {
  130. $submenuIndex = $this->getMenusIndexUrls($submenu, ++$level);
  131. !is_null($submenuIndex) && $data = array_merge($data, $submenuIndex);
  132. }
  133. }
  134. return array_unique($data);
  135. }
  136. /**
  137. * 取出通过权限验证urk作为index
  138. */
  139. private function getAuthUrl($urls)
  140. {
  141. // 取出通过权限验证urk作为index
  142. foreach ($urls as $url) {
  143. if ($this->auth->checkPrivilege($url)) return $url;
  144. }
  145. return false;
  146. }
  147. }