Files
ulthon_admin/extend/base/common/command/admin/menu/AdminMenuExportBase.php
2026-03-26 20:22:34 +08:00

128 lines
4.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace base\common\command\admin\menu;
use app\admin\model\SystemMenu;
use app\common\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
/**
* admin:menu:export command - 导出菜单
*/
class AdminMenuExportBase extends Command
{
protected function configure()
{
parent::configure();
// 指令配置
$this->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;
}
}