[ 'name' => '主页', 'icon' => 'line-md:home-twotone-alt', 'uri' => '/dashboard', 'is_home' => 1, 'children' => [], 'order' => 1, ], 'system' => [ 'name' => '系统管理', 'icon' => 'material-symbols:settings-outline', 'uri' => '/system', 'children' => [ 'admin_users' => [ 'name' => '账号管理', 'icon' => 'ph:user-gear', 'uri' => '/system/admin_users', 'resource' => ['list', 'update'], 'children' => ['change_password' => '修改密码'], ], 'admin_roles' => [ 'name' => '角色管理', 'icon' => 'carbon:user-role', 'uri' => '/system/admin_roles', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [ 'set_menus' => '设置菜单', 'set_permissions' => '设置权限', ], ], 'admin_permissions' => [ 'name' => '权限管理', 'icon' => 'fluent-mdl2:permissions', 'uri' => '/system/admin_permissions', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], 'admin_menus' => [ 'name' => '菜单管理', 'icon' => 'ant-design:menu-unfold-outlined', 'uri' => '/system/admin_menus', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], 'settings' => [ 'name' => '系统设置', 'icon' => 'akar-icons:settings-horizontal', 'uri' => '/system/settings', 'resource' => true, 'children' => [], ], 'keywords' => [ 'name' => '数据字典', 'icon' => 'ph:codesandbox-logo-light', 'uri' => '/system/keywords', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], ], ], ]; $this->handleAdminMenus($data); $this->handleAdminPermissions($data); } public function handleAdminMenus(array $data, ?AdminMenu $parent = null): void { $sort = 0; foreach ($data as $slug => $node) { if (! is_array($node) || ! array_key_exists('uri', $node)) { continue; } $sort++; /** @var \Slowlyo\OwlAdmin\Models\AdminMenu */ $menu = AdminMenu::updateOrCreate([ 'slug' => ($parent->slug ?? 'admin').'.'.$slug, ], [ 'parent_id' => $parent->id ?? 0, 'order' => $sort, 'title' => $node['name'], 'icon' => $node['icon'], 'url' => $node['uri'], 'url_type' => $node['uri_type'] ?? 1, 'visible' => $node['visible'] ?? 1, 'is_home' => $node['is_home'] ?? 0, 'is_full' => $node['is_full'] ?? 0, ]); $this->handleAdminMenus($node['children'] ?? [], $menu); } } protected function handleAdminPermissions(array $data, ?AdminPermission $parent = null) { foreach ($data as $slug => $node) { $permission = AdminPermission::updateOrCreate([ 'slug' => ($parent->slug ?? 'admin').'.'.$slug, ], [ 'parent_id' => $parent->id ?? 0, 'name' => is_array($node) ? $node['name'] : $node, ]); if (! is_array($node)) { continue; } // 资源路由权限 if (array_key_exists('resource', $node)) { $resourceAbilities = []; if (is_array($node['resource'])) { $resourceAbilities = $node['resource']; } elseif ($node['resource'] === true) { $resourceAbilities = array_keys($this->resourceAbilityMap()); } foreach ($resourceAbilities as $resourceAbility) { AdminPermission::updateOrCreate([ 'slug' => $permission->slug.'.'.$resourceAbility, ], [ 'parent_id' => $permission->id, 'name' => $this->resourceAbilityMap()[$resourceAbility], ]); } } $this->handleAdminPermissions($node['children'] ?? [], $permission); } } protected function resourceAbilityMap(): array { return [ 'list' => '列表', 'create' => '新增', 'update' => '编辑', 'delete' => '删除', 'view' => '查看', ]; } }