RestoreBackupAction.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Module\Cleanup\AdminControllers\Actions;
  3. use App\Module\Cleanup\Services\CleanupService;
  4. use Dcat\Admin\Actions\RowAction;
  5. use Dcat\Admin\Actions\Response;
  6. use Illuminate\Http\Request;
  7. /**
  8. * 恢复备份Action
  9. *
  10. * 用于从备份恢复数据
  11. */
  12. class RestoreBackupAction extends RowAction
  13. {
  14. /**
  15. * 按钮标题
  16. */
  17. protected $title = '恢复数据';
  18. /**
  19. * 处理请求
  20. */
  21. public function handle(Request $request)
  22. {
  23. try {
  24. $backupId = $this->getKey();
  25. $restoreMode = $request->input('restore_mode', 'append');
  26. $selectedTables = $request->input('selected_tables', []);
  27. // 调用服务恢复备份
  28. $result = CleanupService::restoreBackup($backupId, [
  29. 'restore_mode' => $restoreMode,
  30. 'selected_tables' => $selectedTables,
  31. ]);
  32. if (!$result['success']) {
  33. return $this->response()
  34. ->error('恢复失败:' . $result['message']);
  35. }
  36. $data = $result['data'];
  37. return $this->response()
  38. ->success('数据恢复成功!')
  39. ->detail("
  40. 恢复模式:{$data['restore_mode_name']}<br>
  41. 恢复表数:{$data['restored_tables']}<br>
  42. 恢复记录数:" . number_format($data['restored_records']) . "<br>
  43. 执行时间:{$data['execution_time']}秒
  44. ");
  45. } catch (\Exception $e) {
  46. return $this->response()
  47. ->error('恢复失败:' . $e->getMessage());
  48. }
  49. }
  50. /**
  51. * 确认对话框
  52. */
  53. public function confirm()
  54. {
  55. return [
  56. '确认恢复数据?',
  57. '⚠️ 数据恢复操作不可逆,请谨慎操作!',
  58. [
  59. 'restore_mode' => [
  60. 'type' => 'select',
  61. 'label' => '恢复模式',
  62. 'options' => [
  63. 'append' => '追加模式(保留现有数据)',
  64. 'replace' => '替换模式(清空后恢复)',
  65. 'merge' => '合并模式(智能合并)',
  66. ],
  67. 'default' => 'append',
  68. 'required' => true,
  69. ],
  70. 'selected_tables' => [
  71. 'type' => 'checkbox',
  72. 'label' => '选择表',
  73. 'options' => [], // 这里应该动态获取备份中的表列表
  74. 'help' => '不选择则恢复所有表',
  75. ]
  76. ]
  77. ];
  78. }
  79. /**
  80. * 权限检查
  81. */
  82. public function allowed()
  83. {
  84. $row = $this->row;
  85. return $row->backup_status == 2; // 只有已完成的备份可以恢复
  86. }
  87. /**
  88. * 渲染按钮
  89. */
  90. public function render()
  91. {
  92. return <<<HTML
  93. <a href="javascript:void(0);" class="btn btn-warning btn-xs" data-action="{$this->getHandleRoute()}">
  94. <i class="fa fa-undo"></i> {$this->title}
  95. </a>
  96. HTML;
  97. }
  98. }