GridHelperTrait.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. namespace App\Module\File\AdminControllers\Helper;
  3. use App\Module\File\Enums\FILE_STATUS;
  4. use App\Module\File\Enums\FILE_VISIBILITY;
  5. use App\Module\File\Enums\STORAGE_STATUS;
  6. use Dcat\Admin\Grid;
  7. use Dcat\Admin\Grid\Column;
  8. /**
  9. * 列表页辅助特性
  10. *
  11. * 提供文件模块后台控制器的列表页构建功能的具体实现
  12. */
  13. trait GridHelperTrait
  14. {
  15. /**
  16. * 添加文件路径列
  17. *
  18. * @param string $field 字段名
  19. * @param string $label 标签名
  20. * @param int $limit 限制长度
  21. * @return Column
  22. */
  23. public function columnFilePath(string $field = 'path', string $label = '文件路径', int $limit = 30): Column
  24. {
  25. return $this->grid->column($field, $label)->limit($limit);
  26. }
  27. /**
  28. * 添加文件原始名称列
  29. *
  30. * @param string $field 字段名
  31. * @param string $label 标签名
  32. * @param int $limit 限制长度
  33. * @return Column
  34. */
  35. public function columnFileOriginalName(string $field = 'o_name', string $label = '原始名称', int $limit = 30): Column
  36. {
  37. return $this->grid->column($field, $label)->limit($limit);
  38. }
  39. /**
  40. * 添加文件大小列
  41. *
  42. * @param string $field 字段名
  43. * @param string $label 标签名
  44. * @return Column
  45. */
  46. public function columnFileSize(string $field = 'fsize', string $label = '文件大小'): Column
  47. {
  48. return $this->grid->column($field, $label)->display(function ($value) {
  49. return $this->formatFileSize($value);
  50. });
  51. }
  52. /**
  53. * 添加文件类型列
  54. *
  55. * @param string $field 字段名
  56. * @param string $label 标签名
  57. * @return Column
  58. */
  59. public function columnFileType(string $field = 'type1', string $label = '文件类型'): Column
  60. {
  61. return $this->grid->column($field, $label);
  62. }
  63. /**
  64. * 添加文件状态列
  65. *
  66. * @param string $field 字段名
  67. * @param string $label 标签名
  68. * @return Column
  69. */
  70. public function columnFileStatus(string $field = 'status', string $label = '文件状态'): Column
  71. {
  72. return $this->grid->column($field, $label)
  73. ->using(FILE_STATUS::getAll())
  74. ->label([
  75. FILE_STATUS::NORMAL->value => 'success',
  76. FILE_STATUS::DELETED->value => 'danger',
  77. ]);
  78. }
  79. /**
  80. * 添加文件可见性列
  81. *
  82. * @param string $field 字段名
  83. * @param string $label 标签名
  84. * @return Column
  85. */
  86. public function columnFileVisibility(string $field = 'private', string $label = '文件可见性'): Column
  87. {
  88. return $this->grid->column($field, $label)
  89. ->display(function ($value) {
  90. return $value ? FILE_VISIBILITY::getAll()[FILE_VISIBILITY::PRIVATE->value] : FILE_VISIBILITY::getAll()[FILE_VISIBILITY::PUBLIC->value];
  91. })
  92. ->label([
  93. 0 => 'info',
  94. 1 => 'warning',
  95. ]);
  96. }
  97. /**
  98. * 添加存储磁盘列
  99. *
  100. * @param string $field 字段名
  101. * @param string $label 标签名
  102. * @return Column
  103. */
  104. public function columnStorageDisk(string $field = 'storage_disk', string $label = '存储磁盘'): Column
  105. {
  106. return $this->grid->column($field, $label);
  107. }
  108. /**
  109. * 添加存储状态列
  110. *
  111. * @param string $field 字段名
  112. * @param string $label 标签名
  113. * @return Column
  114. */
  115. public function columnStorageStatus(string $field = 'status', string $label = '存储状态'): Column
  116. {
  117. return $this->grid->column($field, $label)
  118. ->using(STORAGE_STATUS::getAll())
  119. ->label([
  120. STORAGE_STATUS::DISABLED->value => 'danger',
  121. STORAGE_STATUS::ENABLED->value => 'success',
  122. ]);
  123. }
  124. /**
  125. * 添加关联类型列
  126. *
  127. * @param string $field 字段名
  128. * @param string $label 标签名
  129. * @return Column
  130. */
  131. public function columnRelationType(string $field = 're_type', string $label = '关联类型'): Column
  132. {
  133. return $this->grid->column($field, $label);
  134. }
  135. /**
  136. * 添加关联ID列
  137. *
  138. * @param string $field 字段名
  139. * @param string $label 标签名
  140. * @return Column
  141. */
  142. public function columnRelationId(string $field = 're_id', string $label = '关联ID'): Column
  143. {
  144. return $this->grid->column($field, $label);
  145. }
  146. /**
  147. * 添加文件预览列
  148. *
  149. * @param string $field 字段名
  150. * @param string $label 标签名
  151. * @return Column
  152. */
  153. public function columnFilePreview(string $field = 'path', string $label = '文件预览'): Column
  154. {
  155. return $this->grid->column($field, $label)->display(function ($path) {
  156. $extension = pathinfo($path, PATHINFO_EXTENSION);
  157. $url = $this->getFileUrl($this->id);
  158. if (in_array(strtolower($extension), ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'])) {
  159. return "<img src='{$url}' style='max-width:50px;max-height:50px;' />";
  160. } elseif (in_array(strtolower($extension), ['mp4', 'webm', 'ogg'])) {
  161. return "<i class='fa fa-file-video-o'></i>";
  162. } elseif (in_array(strtolower($extension), ['mp3', 'wav', 'ogg'])) {
  163. return "<i class='fa fa-file-audio-o'></i>";
  164. } elseif (in_array(strtolower($extension), ['pdf'])) {
  165. return "<i class='fa fa-file-pdf-o'></i>";
  166. } elseif (in_array(strtolower($extension), ['doc', 'docx'])) {
  167. return "<i class='fa fa-file-word-o'></i>";
  168. } elseif (in_array(strtolower($extension), ['xls', 'xlsx'])) {
  169. return "<i class='fa fa-file-excel-o'></i>";
  170. } elseif (in_array(strtolower($extension), ['ppt', 'pptx'])) {
  171. return "<i class='fa fa-file-powerpoint-o'></i>";
  172. } elseif (in_array(strtolower($extension), ['zip', 'rar', '7z'])) {
  173. return "<i class='fa fa-file-archive-o'></i>";
  174. } elseif (in_array(strtolower($extension), ['txt'])) {
  175. return "<i class='fa fa-file-text-o'></i>";
  176. } else {
  177. return "<i class='fa fa-file-o'></i>";
  178. }
  179. })->unescape();
  180. }
  181. /**
  182. * 添加图片预览列
  183. *
  184. * @param string $field 字段名
  185. * @param string $label 标签名
  186. * @return Column
  187. */
  188. public function columnImagePreview(string $field = 'path', string $label = '图片预览'): Column
  189. {
  190. return $this->grid->column($field, $label)->image('', 50, 50);
  191. }
  192. /**
  193. * 添加文件操作列
  194. *
  195. * @return Column
  196. */
  197. public function columnFileActions(): Column
  198. {
  199. return $this->grid->column('操作')->display(function () {
  200. $url = $this->getFileUrl($this->id);
  201. return "<a href='{$url}' target='_blank' class='btn btn-sm btn-primary'>下载</a>";
  202. })->unescape();
  203. }
  204. /**
  205. * 格式化文件大小
  206. *
  207. * @param int $size 文件大小(字节)
  208. * @return string
  209. */
  210. protected function formatFileSize(int $size): string
  211. {
  212. $units = ['B', 'KB', 'MB', 'GB', 'TB'];
  213. $i = 0;
  214. while ($size >= 1024 && $i < count($units) - 1) {
  215. $size /= 1024;
  216. $i++;
  217. }
  218. return round($size, 2) . ' ' . $units[$i];
  219. }
  220. }