db()->where('id|pid','=',$pid)->where('status','=',1)->select()->toArray(); } static $list = []; foreach ($cate_array as $key => $value){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级 $value['level'] = $level; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 unset($cate_array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 $this->getTrees($value['id'], $level+1,$cate_array); } } return $list; } /** * 菜单分组语言包 * @param string $name * @return string */ private static function lang(string $name): string { $lang = lang("menus_{$name}"); if (stripos($lang, 'menus_') === 0) { return lang(substr($lang, 6)); } else { return $lang; } } /** * 获取可选菜单节点 * @param boolean $force 强制刷新 * @return array */ public static function getList(bool $force = false): array { $nodes = sysvar('think-library-menus') ?: []; if (empty($force) && count($nodes) > 0) return $nodes; else $nodes = []; foreach (NodeService::getMethods($force) as $node => $method) { if ($method['ismenu']) $nodes[] = ['node' => $node, 'title' => self::lang($method['title'])]; } return sysvar('think-library-menus', $nodes); } /** * 获取系统菜单树数据 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getTree(): array { $menus = $this->db()->where(['status' => 1])->order('sort desc,id asc')->select()->toArray(); if (function_exists('admin_menu_filter')) $menus = call_user_func('admin_menu_filter', $menus); foreach ($menus as &$menu) $menu['title'] = self::lang($menu['title']); return static::filter(DataExtend::arr2tree($menus)); } /** * 后台主菜单权限过滤 * @param array $menus 当前菜单列表 * @return array */ private static function filter(array $menus): array { foreach ($menus as $key => &$menu) { if (!empty($menu['sub'])) { $menu['sub'] = static::filter($menu['sub']); } if (!empty($menu['sub'])) { $menu['url'] = '#'; } elseif (empty($menu['url']) || $menu['url'] === '#' || !(empty($menu['node']) || AdminService::check($menu['node']))) { unset($menus[$key]); } elseif (preg_match('#^(https?:)?//\w+#i', $menu['url'])) { if ($menu['params']) $menu['url'] .= (strpos($menu['url'], '?') === false ? '?' : '&') . $menu['params']; } else { $node = join('/', array_slice(str2arr($menu['url'], '/'), 0, 3)); $menu['url'] = admuri($menu['url']) . ($menu['params'] ? '?' . $menu['params'] : ''); if (!AdminService::check($node)) unset($menus[$key]); } } return $menus; } }