DataXw.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace app\data\model;
  3. use FFMpeg\Coordinate\TimeCode;
  4. use FFMpeg\FFMpeg;
  5. use think\admin\Model;
  6. use think\db\Query;
  7. use think\helper\Str;
  8. use voku\helper\HtmlDomParser;
  9. /**
  10. * @method static|Query show()
  11. */
  12. class DataXw extends Model
  13. {
  14. protected $append=[
  15. 'user',
  16. ];
  17. protected $type=[
  18. 'has_video'=>'bool',
  19. ];
  20. public static function onBeforeWrite(self $model)
  21. {
  22. // return true;
  23. $model['has_video']=Str::contains($model['content'],'</video>');
  24. if($model['has_video']){
  25. $html=HtmlDomParser::str_get_html($model['content']);
  26. $src = $html->findOne('video')->src;
  27. if(!$src){
  28. $src=$html->findOne('video source')->src;
  29. }
  30. if($src) {
  31. $pro = FFMpeg::create([
  32. 'ffmpeg.binaries' => root_path() . 'extend/bin/ffmpeg',
  33. 'ffprobe.binaries' => root_path() . 'extend/bin/ffprobe'
  34. ]);
  35. $video = $pro->open($src);
  36. $dir = public_path();
  37. $filename = 'upload/v-c/' . session_create_id() . '.png';
  38. !is_dir($dir . 'upload/v-c/') && @mkdir($dir . 'upload/v-c/', 0744, true);
  39. $vcPath = $dir . $filename;
  40. $video->frame(TimeCode::fromSeconds(1))->save($vcPath);
  41. $model['vc'] = request()->domain() . '/' . $filename;
  42. }
  43. }
  44. }
  45. public function comments()
  46. {
  47. return $this->hasMany(DataXwComment::class,'xw_id');
  48. }
  49. public function likes()
  50. {
  51. return $this->hasMany(DataXwLike::class,'xw_id');
  52. }
  53. public function category()
  54. {
  55. return $this->belongsTo(DataXwCategory::class,'category_id');
  56. }
  57. public function scopeShow(Query $query){
  58. $query->where('status',1);
  59. }
  60. public function getImagesAttr($images,$model){
  61. if(!Str::startsWith(request()->baseUrl(),'/data/api')){
  62. return $images;
  63. }
  64. if(!$images){
  65. return $model['vc']??'';
  66. }
  67. return $images;
  68. }
  69. public function getUserAttr(){
  70. static $config;
  71. is_null($config) && $config=sysconf('config_xw.')?:[];
  72. return [
  73. 'avatar'=>$config['user_avatar']??request()->domain().('/static/images/adminlogo.jpg'),
  74. 'username'=>$config['username']??'官方账号',
  75. ];
  76. }
  77. public function isLiked($user){
  78. if(!$user){
  79. return 0;
  80. }
  81. return $this->likes()->where('user_id',$user['id'])->value('id')?1:0;
  82. }
  83. public function makeLike($user){
  84. if($user && !$this->isLiked($user)){
  85. $this->likes()->save([
  86. 'user_id'=>$user['id']
  87. ]);
  88. return '点赞成功';
  89. }else{
  90. $this->likes()->where(['user_id'=>$user['id']])->delete();
  91. return '取消成功';
  92. }
  93. }
  94. }