TemporaryController.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. namespace App\Module\File\AdminControllers;
  3. use App\Module\File\AdminControllers\Helper\FilterHelper;
  4. use App\Module\File\AdminControllers\Helper\FormHelper;
  5. use App\Module\File\AdminControllers\Helper\GridHelper;
  6. use App\Module\File\AdminControllers\Helper\ShowHelper;
  7. use App\Module\File\Models\FileTemp;
  8. use App\Module\File\Services\TemporaryService;
  9. use Dcat\Admin\Form;
  10. use Dcat\Admin\Grid;
  11. use Dcat\Admin\Show;
  12. use Spatie\RouteAttributes\Attributes\Resource;
  13. use UCore\DcatAdmin\AdminController;
  14. /**
  15. * 临时文件管理控制器
  16. */
  17. #[Resource('file-temporaries', names: 'dcat.admin.file-temporaries')]
  18. class TemporaryController extends AdminController
  19. {
  20. /**
  21. * 页面标题
  22. *
  23. * @var string
  24. */
  25. protected $title = '临时文件管理';
  26. /**
  27. * 临时文件服务
  28. *
  29. * @var TemporaryService
  30. */
  31. protected $service;
  32. /**
  33. * 构造函数
  34. */
  35. public function __construct()
  36. {
  37. $this->service = new TemporaryService();
  38. }
  39. /**
  40. * 列表页面
  41. *
  42. * @return Grid
  43. */
  44. protected function grid()
  45. {
  46. return Grid::make(new FileTemp(), function (Grid $grid) {
  47. $helper = new GridHelper($grid, $this);
  48. $helper->columnId();
  49. $grid->column('key', '文件键名');
  50. $grid->column('ext', '文件扩展名');
  51. $grid->column('expire_time', '过期时间')->sortable();
  52. $helper->columnCreatedAt();
  53. $helper->columnUpdatedAt();
  54. // 添加查看按钮
  55. $grid->column('view', '操作')->display(function () {
  56. $content = $this->service->get($this->key);
  57. if ($content) {
  58. $previewUrl = route('admin.temporary.preview', ['key' => $this->key]);
  59. return "<a href='{$previewUrl}' target='_blank' class='btn btn-sm btn-primary'>查看</a>";
  60. } else {
  61. return "<span class='text-muted'>已过期</span>";
  62. }
  63. })->unescape();
  64. // 添加清理过期文件按钮
  65. $grid->tools(function (Grid\Tools $tools) {
  66. $tools->append('<a href="' . route('admin.temporary.cleanup') . '" class="btn btn-primary btn-sm"><i class="feather icon-trash"></i> 清理过期文件</a>');
  67. });
  68. // 筛选器
  69. $grid->filter(function (Grid\Filter $filter) {
  70. $filter->equal('id', 'ID');
  71. $filter->like('key', '文件键名');
  72. $filter->equal('ext', '文件扩展名');
  73. $filter->between('expire_time', '过期时间')->datetime();
  74. $filter->between('created_at', '创建时间')->datetime();
  75. });
  76. });
  77. }
  78. /**
  79. * 详情页面
  80. *
  81. * @param mixed $id
  82. * @return Show
  83. */
  84. protected function detail($id)
  85. {
  86. return Show::make($id, new FileTemp(), function (Show $show) {
  87. $helper = new ShowHelper($show, $this);
  88. $helper->fieldId();
  89. $show->field('key', '文件键名');
  90. $show->field('ext', '文件扩展名');
  91. $show->field('expire_time', '过期时间');
  92. $helper->fieldCreatedAt();
  93. $helper->fieldUpdatedAt();
  94. // 添加查看按钮
  95. $show->html(function () use ($show) {
  96. $content = $this->service->get($this->key);
  97. if ($content) {
  98. $previewUrl = route('admin.temporary.preview', ['key' => $this->key]);
  99. return "<a href='{$previewUrl}' target='_blank' class='btn btn-primary'>查看内容</a>";
  100. } else {
  101. return "<span class='text-muted'>已过期</span>";
  102. }
  103. });
  104. });
  105. }
  106. /**
  107. * 表单页面
  108. *
  109. * @return Form
  110. */
  111. protected function form()
  112. {
  113. return Form::make(new FileTemp(), function (Form $form) {
  114. $form->display('id');
  115. $form->text('key', '文件键名')->required()->help('唯一的文件键名,用于获取临时文件');
  116. $form->text('ext', '文件扩展名')->required()->help('文件扩展名,如txt, json, xml等');
  117. $form->textarea('content', '文件内容')->required()->help('临时文件的内容');
  118. $form->datetime('expire_time', '过期时间')->required()->help('文件过期时间,过期后将被自动清理');
  119. $form->display('created_at');
  120. $form->display('updated_at');
  121. // 保存前回调
  122. $form->saving(function (Form $form) {
  123. if ($form->isCreating()) {
  124. // 创建临时文件
  125. $key = $form->key;
  126. $ext = $form->ext;
  127. $content = $form->content;
  128. $expireTime = $form->expire_time;
  129. // 使用临时文件服务保存
  130. $this->service->save($ext, $content, $key, strtotime($expireTime) - time());
  131. // 阻止表单继续保存,因为服务已经保存了数据
  132. return false;
  133. }
  134. if ($form->isEditing()) {
  135. // 更新临时文件
  136. $key = $form->key;
  137. $content = $form->content;
  138. $expireTime = $form->expire_time;
  139. // 使用临时文件服务更新
  140. $this->service->update($key, $content, strtotime($expireTime) - time());
  141. }
  142. });
  143. });
  144. }
  145. /**
  146. * 预览临时文件
  147. *
  148. * @param string $key
  149. * @return \Illuminate\Http\Response
  150. */
  151. public function preview($key)
  152. {
  153. $temp = FileTemp::where('key', $key)->first();
  154. if (!$temp) {
  155. return response('临时文件不存在', 404);
  156. }
  157. $content = $this->service->get($key);
  158. if (!$content) {
  159. return response('临时文件已过期', 404);
  160. }
  161. $ext = $temp->ext;
  162. // 根据扩展名设置响应类型
  163. $contentType = 'text/plain';
  164. switch ($ext) {
  165. case 'json':
  166. $contentType = 'application/json';
  167. break;
  168. case 'xml':
  169. $contentType = 'application/xml';
  170. break;
  171. case 'html':
  172. $contentType = 'text/html';
  173. break;
  174. case 'css':
  175. $contentType = 'text/css';
  176. break;
  177. case 'js':
  178. $contentType = 'application/javascript';
  179. break;
  180. }
  181. return response($content)->header('Content-Type', $contentType);
  182. }
  183. /**
  184. * 清理过期文件
  185. *
  186. * @return \Illuminate\Http\RedirectResponse
  187. */
  188. public function cleanup()
  189. {
  190. $count = $this->service->cleanup();
  191. admin_success("清理成功", "已清理 {$count} 个过期临时文件");
  192. return redirect()->route('dcat.admin.temporaries.index');
  193. }
  194. }