ShowHelperTrait.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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\Show;
  7. /**
  8. * 详情页辅助特性
  9. *
  10. * 提供文件模块后台控制器的详情页构建功能的具体实现
  11. */
  12. trait ShowHelperTrait
  13. {
  14. /**
  15. * 显示文件路径
  16. *
  17. * @param string $field 字段名
  18. * @param string $label 标签名
  19. * @return Show\Field
  20. */
  21. public function fieldFilePath(string $field = 'path', string $label = '文件路径'): Show\Field
  22. {
  23. return $this->show->field($field, $label);
  24. }
  25. /**
  26. * 显示文件原始名称
  27. *
  28. * @param string $field 字段名
  29. * @param string $label 标签名
  30. * @return Show\Field
  31. */
  32. public function fieldFileOriginalName(string $field = 'o_name', string $label = '原始名称'): Show\Field
  33. {
  34. return $this->show->field($field, $label);
  35. }
  36. /**
  37. * 显示文件大小
  38. *
  39. * @param string $field 字段名
  40. * @param string $label 标签名
  41. * @return Show\Field
  42. */
  43. public function fieldFileSize(string $field = 'fsize', string $label = '文件大小'): Show\Field
  44. {
  45. return $this->show->field($field, $label)->as(function ($value) {
  46. return $this->formatFileSize($value);
  47. });
  48. }
  49. /**
  50. * 显示文件类型
  51. *
  52. * @param string $field 字段名
  53. * @param string $label 标签名
  54. * @return Show\Field
  55. */
  56. public function fieldFileType(string $field = 'type1', string $label = '文件类型'): Show\Field
  57. {
  58. return $this->show->field($field, $label);
  59. }
  60. /**
  61. * 显示文件状态
  62. *
  63. * @param string $field 字段名
  64. * @param string $label 标签名
  65. * @return Show\Field
  66. */
  67. public function fieldFileStatus(string $field = 'status', string $label = '文件状态'): Show\Field
  68. {
  69. return $this->show->field($field, $label)->as(function ($value) {
  70. return FILE_STATUS::getAll()[$value] ?? '未知';
  71. });
  72. }
  73. /**
  74. * 显示文件可见性
  75. *
  76. * @param string $field 字段名
  77. * @param string $label 标签名
  78. * @return Show\Field
  79. */
  80. public function fieldFileVisibility(string $field = 'private', string $label = '文件可见性'): Show\Field
  81. {
  82. return $this->show->field($field, $label)->as(function ($value) {
  83. return $value ? FILE_VISIBILITY::getAll()[FILE_VISIBILITY::PRIVATE->value] : FILE_VISIBILITY::getAll()[FILE_VISIBILITY::PUBLIC->value];
  84. });
  85. }
  86. /**
  87. * 显示存储磁盘
  88. *
  89. * @param string $field 字段名
  90. * @param string $label 标签名
  91. * @return Show\Field
  92. */
  93. public function fieldStorageDisk(string $field = 'storage_disk', string $label = '存储磁盘'): Show\Field
  94. {
  95. return $this->show->field($field, $label);
  96. }
  97. /**
  98. * 显示存储状态
  99. *
  100. * @param string $field 字段名
  101. * @param string $label 标签名
  102. * @return Show\Field
  103. */
  104. public function fieldStorageStatus(string $field = 'status', string $label = '存储状态'): Show\Field
  105. {
  106. return $this->show->field($field, $label)->as(function ($value) {
  107. return STORAGE_STATUS::getAll()[$value] ?? '未知';
  108. });
  109. }
  110. /**
  111. * 显示关联类型
  112. *
  113. * @param string $field 字段名
  114. * @param string $label 标签名
  115. * @return Show\Field
  116. */
  117. public function fieldRelationType(string $field = 're_type', string $label = '关联类型'): Show\Field
  118. {
  119. return $this->show->field($field, $label);
  120. }
  121. /**
  122. * 显示关联ID
  123. *
  124. * @param string $field 字段名
  125. * @param string $label 标签名
  126. * @return Show\Field
  127. */
  128. public function fieldRelationId(string $field = 're_id', string $label = '关联ID'): Show\Field
  129. {
  130. return $this->show->field($field, $label);
  131. }
  132. /**
  133. * 显示文件预览
  134. *
  135. * @param string $field 字段名
  136. * @param string $label 标签名
  137. * @return Show\Field
  138. */
  139. public function fieldFilePreview(string $field = 'path', string $label = '文件预览'): Show\Field
  140. {
  141. return $this->show->field($field, $label)->as(function ($path) {
  142. $extension = pathinfo($path, PATHINFO_EXTENSION);
  143. $url = $this->getFileUrl($this->id);
  144. if (in_array(strtolower($extension), ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'])) {
  145. return "<img src='{$url}' style='max-width:200px;max-height:200px;' />";
  146. } elseif (in_array(strtolower($extension), ['mp4', 'webm', 'ogg'])) {
  147. return "<video src='{$url}' controls style='max-width:200px;max-height:200px;'></video>";
  148. } elseif (in_array(strtolower($extension), ['mp3', 'wav', 'ogg'])) {
  149. return "<audio src='{$url}' controls></audio>";
  150. } else {
  151. return "<a href='{$url}' target='_blank'>下载文件</a>";
  152. }
  153. })->unescape();
  154. }
  155. /**
  156. * 显示图片预览
  157. *
  158. * @param string $field 字段名
  159. * @param string $label 标签名
  160. * @return Show\Field
  161. */
  162. public function fieldImagePreview(string $field = 'path', string $label = '图片预览'): Show\Field
  163. {
  164. return $this->show->field($field, $label)->image();
  165. }
  166. /**
  167. * 格式化文件大小
  168. *
  169. * @param int $size 文件大小(字节)
  170. * @return string
  171. */
  172. protected function formatFileSize(int $size): string
  173. {
  174. $units = ['B', 'KB', 'MB', 'GB', 'TB'];
  175. $i = 0;
  176. while ($size >= 1024 && $i < count($units) - 1) {
  177. $size /= 1024;
  178. $i++;
  179. }
  180. return round($size, 2) . ' ' . $units[$i];
  181. }
  182. }