mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-07-01 15:32:48 +08:00
128 lines
4.7 KiB
PHP
128 lines
4.7 KiB
PHP
<?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;
|
||
}
|
||
}
|