Menu.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace fast;
  3. use app\admin\library\Auth;
  4. use fast\Tree;
  5. use think\Config;
  6. use think\Db;
  7. /**
  8. * 菜单
  9. */
  10. class Menu
  11. {
  12. protected static $instance;
  13. //默认配置
  14. protected $config = [];
  15. public function __construct($options = [])
  16. {
  17. if ($config = Config::get('menu'))
  18. {
  19. $this->config = array_merge($this->config, $config);
  20. }
  21. $this->config = array_merge($this->config, is_array($options) ? $options : []);
  22. }
  23. /**
  24. * 单例
  25. * @param array $options 参数
  26. * @return Menu
  27. */
  28. public static function instance($options = [])
  29. {
  30. if (is_null(self::$instance))
  31. {
  32. self::$instance = new static($options);
  33. }
  34. return self::$instance;
  35. }
  36. /**
  37. * 导入节点数据
  38. * @param array $treearr
  39. * @param int $pid
  40. * @param string $module
  41. */
  42. public function import($treearr, $pid = 0, $module = NULL)
  43. {
  44. $module = is_null($module) ? Config::user('request.modulename') : $module;
  45. foreach ($treearr as $key => & $v)
  46. {
  47. $controller = strtolower($v['controller']) . ($v['childlist'] ? "_folder" : '');
  48. $icon = isset($v['icon']) ? $v['icon'] : (stripos($v['name'], '_') !== FALSE ? $v['childlist'] ? 'folder' : 'circle-o' : strtolower($v['name']));
  49. $actionkeys = array_keys($v['actionlist']);
  50. $action = '-' . ($v['actionlist'] ? reset($actionkeys) : '');
  51. $values = array(
  52. 'name' => $v['name'],
  53. 'weigh' => $key,
  54. 'pid' => $pid,
  55. 'module' => $module,
  56. 'controller' => $controller,
  57. 'action' => $action,
  58. 'icon' => $icon,
  59. 'type' => 'menu',
  60. 'status' => 'normal'
  61. );
  62. $id = Db::table("node")->data($values)->insert();
  63. $v['id'] = $id;
  64. }
  65. unset($v);
  66. foreach ($treearr as $k => $v)
  67. {
  68. if ($v['childlist'])
  69. {
  70. $this->import($v['childlist'], $v['id'], $module);
  71. }
  72. else
  73. {
  74. $i = 0;
  75. foreach ($v['actionlist'] as $m => $n)
  76. {
  77. $values = array(
  78. 'name' => $n ? $n : $m,
  79. 'weigh' => $i,
  80. 'pid' => $v['id'],
  81. 'module' => $module,
  82. 'controller' => strtolower($v['controller']),
  83. 'action' => $m,
  84. 'icon' => 'circle-o',
  85. 'type' => 'file',
  86. 'status' => 'normal'
  87. );
  88. Db::table("node")->data($values)->insert();
  89. $i++;
  90. }
  91. }
  92. }
  93. }
  94. /**
  95. * 获取左侧菜单栏
  96. *
  97. * @param array $params URL对应的badge数据
  98. * @return string
  99. */
  100. public function sidebar($params = [])
  101. {
  102. $colorArr = ['red', 'green', 'yellow', 'blue', 'teal', 'orange', 'purple'];
  103. $colorNums = count($colorArr);
  104. $badgeList = [];
  105. // 生成菜单的badge
  106. foreach ($params as $k => $v)
  107. {
  108. if (stripos($k, '/') === false)
  109. {
  110. $url = '/admin/' . $k;
  111. }
  112. else
  113. {
  114. $url = url($k);
  115. }
  116. if (is_array($v))
  117. {
  118. $nums = isset($v[0]) ? $v[0] : 0;
  119. $color = isset($v[1]) ? $v[1] : $colorArr[(is_numeric($nums) ? $nums : strlen($nums)) % $colorNums];
  120. $class = isset($v[2]) ? $v[2] : 'label';
  121. }
  122. else
  123. {
  124. $nums = $v;
  125. $color = $colorArr[(is_numeric($nums) ? $nums : strlen($nums)) % $colorNums];
  126. $class = 'label';
  127. }
  128. //必须nums大于0才显示
  129. if ($nums)
  130. {
  131. $badgeList[$url] = '<small class="' . $class . ' pull-right bg-' . $color . '">' . $nums . '</small>';
  132. }
  133. }
  134. // 读取管理员当前拥有的权限节点
  135. $userRule = Auth::instance()->getRuleList();
  136. $select_id = 0;
  137. $dashboard = rtrim(url('dashboard/'), '/');
  138. // 必须将结果集转换为数组
  139. $ruleList = collection(model('AuthRule')->where('ismenu', 1)->order('weigh', 'desc')->cache("__menu__")->select())->toArray();
  140. foreach ($ruleList as $k => &$v)
  141. {
  142. if (!in_array($v['name'], $userRule))
  143. continue;
  144. $select_id = $v['name'] == $dashboard ? $v['id'] : $select_id;
  145. $v['url'] = $v['name'];
  146. $v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
  147. }
  148. // 构造菜单数据
  149. Tree::instance()->init($ruleList);
  150. $menu = Tree::instance()->getTreeMenu(0, '<li class="@class"><a href="@url" addtabs="@id" url="@url"><i class="@icon"></i> <span>@title</span> <span class="pull-right-container">@caret @badge</span></a> @childlist</li>', $select_id, '', 'ul', 'class="treeview-menu"');
  151. return $menu;
  152. }
  153. }