HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/my.esfyn.top/Modules/System/Service/RoleService.php
<?php


namespace Modules\System\Service;


use Illuminate\Support\Facades\Route;

class RoleService
{

    protected $nodes = [];
    protected $tree = [];

    protected function roleNode()
    {
        $routes = Route::getRoutes()->get();

        collect($routes)->each(function ($route) use (&$nodes) {
            if (in_array('admin.auth', $route->middleware())) {
                list($module, $group) = explode('/', $route->uri());
                $nodes[$module][$group][] = $route->uri();
            }
        });

        return $nodes;
    }

    public function toTree($roleNodes, $nodes = [], $rootId = 1, $parentKey = '')
    {

        $nodes = $nodes ?: $this->roleNode();

        if (is_array($nodes)) {

            $nodes = is_string(array_values($nodes)[0]) ? array_values(array_unique($nodes)) : $nodes;

            return array_map(function ($item, $key) use ($rootId, $parentKey, $roleNodes) {

                return [
                    'title' => $this->nodeTitle($item, $parentKey, $key),
                    'type' => $rootId,
                    'spread' => true,
                    'children' => $this->toTree($roleNodes, $item, ($rootId + 1), $key),
                    'id' => is_string($item) ? $item : '',
                    'field' => is_string($item) ? 'nodes[]' : '',
                    'checked' => is_string($item) && in_array($item, $roleNodes)
                ];
            }, $nodes, array_keys($nodes));
        }

    }

    protected function nodeTitle($item, $parentKey, $key)
    {
        $config = array_merge(config('role'), (config('role_ext') ?? []));

        if (is_string($item)) {
            $title = $config[$item] ?? $item;
        } else {
            $title = empty($parentKey)
                ? $config[$key]
                : (
                    $config["{$parentKey}.{$key}"] ?? "{$parentKey}.{$key}"
                );
        }

        return $title;
    }

    /**
     * 判断管理员是否有权限
     * @param $node
     * @return bool
     */
    public function adminHasAuth($node)
    {
        $roleId = system_admin_role_id();

        if ($roleId !== 1) {

            $roleNodes = app('system')->getRoleNodes($roleId);
            foreach ($roleNodes as &$rn) {
                $rn = "/" . ltrim($rn, "/");
            }

            if (!in_array($node, $roleNodes)) {
                return false;
            }
        }

        return true;
    }
}