setName('admin:role:permission:assign') ->addOption('role-id', null, Option::VALUE_REQUIRED, '角色ID') ->addOption('nodes', null, Option::VALUE_REQUIRED, '权限节点列表(逗号分隔)') ->setDescription('给角色分配权限'); } protected function execute(Input $input, Output $output) { $roleId = $input->getOption('role-id'); $nodesParam = $input->getOption('nodes'); if (empty($roleId)) { $output->error('角色ID不能为空'); return false; } if (empty($nodesParam)) { $output->error('权限节点不能为空'); return false; } try { $auth = SystemAuth::find($roleId); if (empty($auth)) { $output->error('角色ID ' . $roleId . ' 不存在'); return false; } $nodes = $this->parseNodes($nodesParam); if (empty($nodes)) { $output->error('权限节点列表为空'); return false; } $validNodes = $this->validateNodes($nodes); $invalidNodes = array_diff($nodes, $validNodes); if (!empty($invalidNodes)) { $invalidCount = count($invalidNodes); $output->error("[错误] 发现 {$invalidCount} 个无效的权限节点:"); foreach (array_values($invalidNodes) as $node) { $output->error(" - {$node}"); } $output->writeln(''); } if (empty($validNodes)) { $output->error("有效权限节点数: 0"); $output->error("分配失败"); return false; } $existingNodes = SystemAuthNode::where('auth_id', $roleId) ->column('node'); $newNodes = array_diff($validNodes, $existingNodes); if (empty($newNodes)) { $output->info('所有权限节点已存在,无需重复分配'); return true; } $authNodes = []; foreach ($newNodes as $node) { $authNodes[] = [ 'auth_id' => $roleId, 'node' => $node, ]; } (new SystemAuthNode())->saveAll($authNodes); $output->info('权限分配成功'); $output->info('角色ID: ' . $roleId); $output->info('新增的权限节点: ' . implode(', ', $newNodes)); $output->info('该角色总权限节点数: ' . (count($existingNodes) + count($newNodes))); } catch (\Throwable $e) { $output->error('分配权限失败: ' . $e->getMessage()); return false; } return true; } protected function parseNodes(string $nodesParam): array { $nodes = explode(',', $nodesParam); $nodes = array_map('trim', $nodes); $nodes = array_filter($nodes); return array_values($nodes); } protected function validateNodes(array $nodes): array { $nodeService = new NodeService(); $allNodes = $nodeService->getNodeParis(); $validNodes = []; foreach ($nodes as $node) { if (isset($allNodes[$node])) { $validNodes[] = $node; } } return $validNodes; } }