CleanupBackupController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php
  2. namespace App\Module\Cleanup\AdminControllers;
  3. use App\Module\Cleanup\Models\CleanupBackup;
  4. use App\Module\Cleanup\Repositories\CleanupBackupRepository;
  5. use App\Module\Cleanup\Enums\BACKUP_TYPE;
  6. use App\Module\Cleanup\Enums\COMPRESSION_TYPE;
  7. use App\Module\Cleanup\Enums\BACKUP_STATUS;
  8. use UCore\DcatAdmin\AdminController;
  9. use Dcat\Admin\Form;
  10. use Dcat\Admin\Grid;
  11. use Dcat\Admin\Show;
  12. use Dcat\Admin\Layout\Content;
  13. /**
  14. * 备份管理控制器
  15. *
  16. * @route /admin/cleanup/backups
  17. */
  18. class CleanupBackupController extends AdminController
  19. {
  20. /**
  21. * 页面标题
  22. */
  23. protected $title = '备份管理';
  24. /**
  25. * 数据仓库
  26. */
  27. protected function repository()
  28. {
  29. return CleanupBackupRepository::class;
  30. }
  31. /**
  32. * 列表页面
  33. */
  34. protected function grid(): Grid
  35. {
  36. return Grid::make(new CleanupBackupRepository(), function (Grid $grid) {
  37. // 基础设置
  38. $grid->column('id', 'ID')->sortable();
  39. $grid->column('backup_name', '备份名称')->sortable();
  40. // 关联信息
  41. $grid->column('plan.plan_name', '关联计划')->sortable();
  42. $grid->column('task.task_name', '关联任务')->sortable();
  43. // 备份类型
  44. $grid->column('backup_type', '备份类型')->using([
  45. 1 => 'SQL',
  46. 2 => 'JSON',
  47. 3 => 'CSV',
  48. ])->label([
  49. 1 => 'primary',
  50. 2 => 'info',
  51. 3 => 'warning',
  52. ])->sortable();
  53. // 压缩类型
  54. $grid->column('compression_type', '压缩类型')->using([
  55. 1 => '无压缩',
  56. 2 => 'GZIP',
  57. 3 => 'ZIP',
  58. ])->sortable();
  59. // 备份状态
  60. $grid->column('backup_status', '备份状态')->using([
  61. 1 => '进行中',
  62. 2 => '已完成',
  63. 3 => '已失败',
  64. ])->label([
  65. 1 => 'info',
  66. 2 => 'success',
  67. 3 => 'danger',
  68. ])->sortable();
  69. // 大小信息
  70. $grid->column('backup_size', '备份大小')->display(function ($value) {
  71. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  72. })->sortable();
  73. $grid->column('original_size', '原始大小')->display(function ($value) {
  74. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  75. })->sortable();
  76. // 统计信息
  77. $grid->column('tables_count', '表数量')->sortable();
  78. $grid->column('records_count', '记录数量')->display(function ($value) {
  79. return number_format($value);
  80. })->sortable();
  81. // 时间信息
  82. $grid->column('started_at', '开始时间')->sortable();
  83. $grid->column('completed_at', '完成时间')->sortable();
  84. $grid->column('expires_at', '过期时间')->sortable();
  85. // 筛选器
  86. $grid->filter(function (Grid\Filter $filter) {
  87. $filter->equal('backup_type', '备份类型')->select([
  88. 1 => 'SQL',
  89. 2 => 'JSON',
  90. 3 => 'CSV',
  91. ]);
  92. $filter->equal('compression_type', '压缩类型')->select([
  93. 1 => '无压缩',
  94. 2 => 'GZIP',
  95. 3 => 'ZIP',
  96. ]);
  97. $filter->equal('backup_status', '备份状态')->select([
  98. 1 => '进行中',
  99. 2 => '已完成',
  100. 3 => '已失败',
  101. ]);
  102. $filter->equal('plan_id', '关联计划')->select(
  103. \App\Module\Cleanup\Models\CleanupPlan::pluck('plan_name', 'id')->toArray()
  104. );
  105. $filter->like('backup_name', '备份名称');
  106. $filter->between('backup_size', '备份大小');
  107. $filter->between('created_at', '创建时间')->datetime();
  108. $filter->between('expires_at', '过期时间')->datetime();
  109. });
  110. // 行操作
  111. $grid->actions(function (Grid\Displayers\Actions $actions) {
  112. $row = $actions->row;
  113. if ($row->backup_status == 2) { // 已完成
  114. $actions->append(new \App\Module\Cleanup\AdminControllers\Actions\DownloadBackupAction());
  115. $actions->append(new \App\Module\Cleanup\AdminControllers\Actions\RestoreBackupAction());
  116. }
  117. $actions->append(new \App\Module\Cleanup\AdminControllers\Actions\ViewBackupFilesAction());
  118. if ($row->backup_status != 1) { // 非进行中状态可以删除
  119. $actions->append(new \App\Module\Cleanup\AdminControllers\Actions\DeleteBackupAction());
  120. }
  121. });
  122. // 批量操作
  123. $grid->batchActions([
  124. new \App\Module\Cleanup\AdminControllers\Actions\BatchDeleteBackupAction(),
  125. ]);
  126. // 工具栏
  127. $grid->tools([
  128. new \App\Module\Cleanup\AdminControllers\Actions\CleanExpiredBackupsAction(),
  129. ]);
  130. // 设置每页显示数量
  131. $grid->paginate(20);
  132. // 默认排序
  133. $grid->model()->orderBy('created_at', 'desc');
  134. });
  135. }
  136. /**
  137. * 详情页面
  138. */
  139. protected function detail($id): Show
  140. {
  141. return Show::make($id, new CleanupBackupRepository(), function (Show $show) {
  142. $show->field('id', 'ID');
  143. $show->field('backup_name', '备份名称');
  144. $show->field('plan.plan_name', '关联计划');
  145. $show->field('task.task_name', '关联任务');
  146. $show->field('backup_type', '备份类型')->using([
  147. 1 => 'SQL',
  148. 2 => 'JSON',
  149. 3 => 'CSV',
  150. ]);
  151. $show->field('compression_type', '压缩类型')->using([
  152. 1 => '无压缩',
  153. 2 => 'GZIP',
  154. 3 => 'ZIP',
  155. ]);
  156. $show->field('backup_status', '备份状态')->using([
  157. 1 => '进行中',
  158. 2 => '已完成',
  159. 3 => '已失败',
  160. ]);
  161. $show->field('backup_path', '备份路径');
  162. // 大小信息
  163. $show->field('backup_size', '备份大小')->display(function ($value) {
  164. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  165. });
  166. $show->field('original_size', '原始大小')->display(function ($value) {
  167. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  168. });
  169. // 统计信息
  170. $show->field('tables_count', '表数量');
  171. $show->field('records_count', '记录数量')->display(function ($value) {
  172. return number_format($value);
  173. });
  174. $show->field('backup_hash', '备份哈希');
  175. $show->field('backup_config', '备份配置')->json();
  176. // 时间信息
  177. $show->field('started_at', '开始时间');
  178. $show->field('completed_at', '完成时间');
  179. $show->field('expires_at', '过期时间');
  180. $show->field('error_message', '错误信息');
  181. $show->field('created_by', '创建者ID');
  182. $show->field('created_at', '创建时间');
  183. $show->field('updated_at', '更新时间');
  184. // 显示备份文件
  185. $show->relation('files', '备份文件', function ($model) {
  186. $grid = new Grid(new \App\Module\Cleanup\Models\CleanupBackupFile());
  187. $grid->model()->where('backup_id', $model->id);
  188. $grid->column('table_name', '表名');
  189. $grid->column('file_name', '文件名');
  190. $grid->column('file_size', '文件大小')->display(function ($value) {
  191. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  192. });
  193. $grid->column('backup_type', '备份类型')->using([
  194. 1 => 'SQL',
  195. 2 => 'JSON',
  196. 3 => 'CSV',
  197. ]);
  198. $grid->column('compression_type', '压缩类型')->using([
  199. 1 => '无压缩',
  200. 2 => 'GZIP',
  201. 3 => 'ZIP',
  202. ]);
  203. $grid->column('created_at', '创建时间');
  204. $grid->disableActions();
  205. $grid->disableCreateButton();
  206. $grid->disableFilter();
  207. $grid->disablePagination();
  208. return $grid;
  209. });
  210. // 显示SQL备份内容(如果是SQL备份)
  211. if ($show->getModel()->backup_type == 1) {
  212. $show->relation('sqlBackups', 'SQL备份内容', function ($model) {
  213. $grid = new Grid(new \App\Module\Cleanup\Models\CleanupSqlBackup());
  214. $grid->model()->where('backup_id', $model->id);
  215. $grid->column('table_name', '表名');
  216. $grid->column('records_count', '记录数量')->display(function ($value) {
  217. return number_format($value);
  218. });
  219. $grid->column('content_size', '内容大小')->display(function ($value) {
  220. return \App\Module\Cleanup\Helpers\FormatHelper::formatBytes($value);
  221. });
  222. $grid->column('created_at', '创建时间');
  223. $grid->disableActions();
  224. $grid->disableCreateButton();
  225. $grid->disableFilter();
  226. $grid->disablePagination();
  227. return $grid;
  228. });
  229. }
  230. });
  231. }
  232. /**
  233. * 表单(只读,备份不允许手动创建/编辑)
  234. */
  235. protected function form(): Form
  236. {
  237. return Form::make(new CleanupBackupRepository(), function (Form $form) {
  238. $form->display('id', 'ID');
  239. $form->display('backup_name', '备份名称');
  240. $form->display('plan.plan_name', '关联计划');
  241. $form->display('task.task_name', '关联任务');
  242. $form->display('backup_type', '备份类型')->using([
  243. 1 => 'SQL',
  244. 2 => 'JSON',
  245. 3 => 'CSV',
  246. ]);
  247. $form->display('compression_type', '压缩类型')->using([
  248. 1 => '无压缩',
  249. 2 => 'GZIP',
  250. 3 => 'ZIP',
  251. ]);
  252. $form->display('backup_status', '备份状态')->using([
  253. 1 => '进行中',
  254. 2 => '已完成',
  255. 3 => '已失败',
  256. ]);
  257. $form->display('backup_path', '备份路径');
  258. $form->display('backup_size', '备份大小');
  259. $form->display('original_size', '原始大小');
  260. $form->display('tables_count', '表数量');
  261. $form->display('records_count', '记录数量');
  262. $form->display('backup_hash', '备份哈希');
  263. $form->display('started_at', '开始时间');
  264. $form->display('completed_at', '完成时间');
  265. $form->display('expires_at', '过期时间');
  266. $form->display('error_message', '错误信息');
  267. $form->display('created_at', '创建时间');
  268. $form->display('updated_at', '更新时间');
  269. // 禁用所有操作
  270. $form->disableCreatingCheck();
  271. $form->disableEditingCheck();
  272. $form->disableViewCheck();
  273. });
  274. }
  275. }