| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace App\Module\Cleanup\AdminControllers\Actions;
- use App\Module\Cleanup\Services\CleanupService;
- use Dcat\Admin\Actions\RowAction;
- use Dcat\Admin\Actions\Response;
- use Illuminate\Http\Request;
- /**
- * 恢复备份Action
- *
- * 用于从备份恢复数据
- */
- class RestoreBackupAction extends RowAction
- {
- /**
- * 按钮标题
- */
- protected $title = '恢复数据';
- /**
- * 处理请求
- */
- public function handle(Request $request)
- {
- try {
- $backupId = $this->getKey();
- $restoreMode = $request->input('restore_mode', 'append');
- $selectedTables = $request->input('selected_tables', []);
-
- // 调用服务恢复备份
- $result = CleanupService::restoreBackup($backupId, [
- 'restore_mode' => $restoreMode,
- 'selected_tables' => $selectedTables,
- ]);
-
- if (!$result['success']) {
- return $this->response()
- ->error('恢复失败:' . $result['message']);
- }
-
- $data = $result['data'];
-
- return $this->response()
- ->success('数据恢复成功!')
- ->detail("
- 恢复模式:{$data['restore_mode_name']}<br>
- 恢复表数:{$data['restored_tables']}<br>
- 恢复记录数:" . number_format($data['restored_records']) . "<br>
- 执行时间:{$data['execution_time']}秒
- ");
-
- } catch (\Exception $e) {
- return $this->response()
- ->error('恢复失败:' . $e->getMessage());
- }
- }
- /**
- * 确认对话框
- */
- public function confirm()
- {
- return [
- '确认恢复数据?',
- '⚠️ 数据恢复操作不可逆,请谨慎操作!',
- [
- 'restore_mode' => [
- 'type' => 'select',
- 'label' => '恢复模式',
- 'options' => [
- 'append' => '追加模式(保留现有数据)',
- 'replace' => '替换模式(清空后恢复)',
- 'merge' => '合并模式(智能合并)',
- ],
- 'default' => 'append',
- 'required' => true,
- ],
- 'selected_tables' => [
- 'type' => 'checkbox',
- 'label' => '选择表',
- 'options' => [], // 这里应该动态获取备份中的表列表
- 'help' => '不选择则恢复所有表',
- ]
- ]
- ];
- }
- /**
- * 权限检查
- */
- public function allowed()
- {
- $row = $this->row;
- return $row->backup_status == 2; // 只有已完成的备份可以恢复
- }
- /**
- * 渲染按钮
- */
- public function render()
- {
- return <<<HTML
- <a href="javascript:void(0);" class="btn btn-warning btn-xs" data-action="{$this->getHandleRoute()}">
- <i class="fa fa-undo"></i> {$this->title}
- </a>
- HTML;
- }
- }
|