setName('admin:menu:export') ->setDescription('导出菜单数据') ->addOption('format', null, Option::VALUE_OPTIONAL, '输出格式(text/json)', 'text') ->addOption('output', null, Option::VALUE_OPTIONAL, '输出文件路径(可选)'); } protected function execute(Input $input, Output $output) { // 获取参数 $outputPath = $input->getOption('output'); try { // 1. 查询所有菜单 $menus = SystemMenu::where('delete_time', 0) ->order(['sort' => 'desc', 'id' => 'asc']) ->select() ->hidden(['create_time', 'update_time', 'delete_time']); // 2. 格式化菜单数据 $menuData = []; foreach ($menus as $menu) { $menuData[] = [ 'id' => (int)$menu->id, 'pid' => (int)($menu->pid ?? 0), 'title' => $menu->title ?? '', 'href' => $menu->href ?? '', 'icon' => $menu->icon ?? '', 'sort' => (int)($menu->sort ?? 0), 'auth_node' => $menu->auth_node ?? '', 'status' => (int)($menu->status ?? 0), 'type' => (int)($menu->type ?? 0), ]; } // JSON 模式输出 if ($input->getOption('format') === 'json') { if (!empty($outputPath)) { $jsonData = json_encode($menuData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); if ($jsonData === false) { throw new \RuntimeException('JSON 编码失败'); } $result = file_put_contents($outputPath, $jsonData); if ($result === false) { throw new \RuntimeException('无法写入文件: ' . $outputPath); } } $json = json_encode([ 'success' => true, 'data' => [ 'menus' => $menuData, 'output' => !empty($outputPath) ? $outputPath : null, ], 'warnings' => [], 'metadata' => [ 'count' => count($menuData), 'exported_at' => date('c'), ], ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $output->writeln($json); return true; } // 3. 如果指定了输出路径,写入文件 if (!empty($outputPath)) { $jsonData = json_encode($menuData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); $result = file_put_contents($outputPath, $jsonData); if ($result === false) { $output->error('无法写入文件: ' . $outputPath); return false; } $output->info('成功导出 ' . count($menuData) . ' 个菜单到文件: ' . $outputPath); } else { // 4. 输出结果到控制台 $output->info('成功导出 ' . count($menuData) . ' 个菜单'); // 以表格形式输出菜单数据 $output->writeln('菜单ID | 父菜单ID | 菜单标题 | 菜单路径 | 图标 | 排序 | 权限节点 | 状态 | 类型'); $output->writeln('--------|----------|----------|----------|------|------|----------|------|------'); foreach ($menuData as $menu) { $output->writeln($menu['id'] . ' | ' . $menu['pid'] . ' | ' . $menu['title'] . ' | ' . $menu['href'] . ' | ' . $menu['icon'] . ' | ' . $menu['sort'] . ' | ' . $menu['auth_node'] . ' | ' . $menu['status'] . ' | ' . $menu['type']); } } } catch (\Throwable $e) { $output->error('导出菜单失败: ' . $e->getMessage()); return false; } return true; } }