VideoCommentService.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Api;
  12. use App\Models\MemberCollectModel;
  13. use App\Models\VideoCollectModel;
  14. use App\Models\VideoCommentModel;
  15. use App\Models\VideoModel;
  16. use App\Services\BaseService;
  17. use App\Services\RedisService;
  18. use BN\Red;
  19. use Illuminate\Support\Facades\DB;
  20. /**
  21. * 短视频评论管理-服务类
  22. * @author laravel开发员
  23. * @since 2020/11/11
  24. * @package App\Services\Api
  25. */
  26. class VideoCommentService extends BaseService
  27. {
  28. // 静态对象
  29. protected static $instance = null;
  30. /**
  31. * 构造函数
  32. * @author laravel开发员
  33. * @since 2020/11/11
  34. * MemberCollectService constructor.
  35. */
  36. public function __construct()
  37. {
  38. $this->model = new VideoCommentModel();
  39. }
  40. /**
  41. * 静态入口
  42. * @return static|null
  43. */
  44. public static function make()
  45. {
  46. if (!self::$instance) {
  47. self::$instance = (new static());
  48. }
  49. return self::$instance;
  50. }
  51. /**
  52. * 列表数据
  53. * @param $params
  54. * @param int $pageSize
  55. * @return array
  56. */
  57. public function getDataList($params, $pageSize = 12, $field='', $userId=0)
  58. {
  59. $where = ['a.mark' => 1,'a.status'=>1];
  60. $field = $field? $field : 'lev_a.*';
  61. $sortType = isset($params['sort_type']) ? $params['sort_type'] : 1;
  62. $order = 'a.id desc';
  63. if($sortType == 1){
  64. $order = 'lev_a.like_num desc, lev_a.create_time desc, lev_a.id desc';
  65. }
  66. $list = $this->model->with(['member'])
  67. ->from('video_comments as a')
  68. ->where($where)
  69. ->where(function ($query) use ($params) {
  70. $userId = isset($params['user_id']) ? $params['user_id'] : 0;
  71. if ($userId > 0) {
  72. $query->where('a.user_id', $userId);
  73. }
  74. $videoId = isset($params['video_id']) ? $params['video_id'] : 0;
  75. if ($videoId > 0) {
  76. $query->where('a.video_id', $videoId);
  77. }
  78. $replyId = isset($params['reply_id']) ? $params['reply_id'] : -1;
  79. if ($replyId >= 0) {
  80. $query->where('a.reply_id', $replyId);
  81. }
  82. $isRead = isset($params['is_read'])? $params['is_read'] : 0;
  83. $isRead = $isRead>0? $isRead : 0;
  84. if ($isRead > 0) {
  85. $query->where('a.is_read', $isRead);
  86. }
  87. })
  88. ->where(function ($query) use ($params) {
  89. $keyword = isset($params['kw']) ? $params['kw'] : '';
  90. if ($keyword) {
  91. $query->where('a.content','like',"%{$keyword}%");
  92. }
  93. })
  94. ->selectRaw($field)
  95. ->orderByRaw($order)
  96. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  97. $list = $list ? $list->toArray() : [];
  98. if ($list) {
  99. foreach ($list['data'] as $k=> &$item) {
  100. $item['time_text'] = isset($item['create_time']) && $item['create_time']? dateFormat($item['create_time']) : '';
  101. $member = isset($item['member'])? $item['member'] : [];
  102. if($member){
  103. $member['avatar'] = isset($member['avatar'])? get_image_url($member['avatar']) : '';
  104. }
  105. $item['member'] = $member;
  106. $isLike = RedisService::get("caches:videos:comment_{$userId}_{$item['id']}");
  107. $item['is_like'] = $isLike? 1 : 0;
  108. $replyData = $this->getReplyList($item['id'], $userId, $pageSize);
  109. $item['reply_count'] = isset($replyData['total'])? $replyData['total'] : 0;
  110. $item['reply_list'] = isset($replyData['list'])? $replyData['list'] : [];
  111. $item['albums'] = $item['albums']? get_images_preview($item['albums']) : [];
  112. $item['reply_show'] = rand(100,500)>200 && $k==0 && $item['reply_count']>0? 1 : 0;
  113. }
  114. }
  115. return [
  116. 'pageSize' => $pageSize,
  117. 'total' => isset($list['total']) ? $list['total'] : 0,
  118. 'list' => isset($list['data']) ? $list['data'] : []
  119. ];
  120. }
  121. /**
  122. * 回复列表
  123. * @param $replyId
  124. * @param $userId
  125. * @param int $pageSize
  126. * @return array|mixed
  127. */
  128. public function getReplyList($replyId, $userId, $pageSize=12)
  129. {
  130. $cacheKey = "caches:videos:comment_reply_list_{$replyId}_{$userId}_{$pageSize}";
  131. $datas = RedisService::get($cacheKey);
  132. if($datas){
  133. return $datas;
  134. }
  135. $model = $this->model->with(['member'])
  136. ->from('video_comments as a')
  137. ->where(['a.reply_id'=> $replyId,'a.status'=>1,'a.mark'=>1])
  138. ->select(['a.*'])
  139. ->orderBy('a.create_time','desc')
  140. ->orderBy('a.id','desc');
  141. $countModel = clone $model;
  142. $total = $countModel->count('a.id');
  143. $datas = $model->limit($pageSize)->get();
  144. $datas = $datas? $datas->toArray() : [];
  145. if($datas){
  146. foreach ($datas as &$item){
  147. $item['time_text'] = isset($item['create_time']) && $item['create_time']? dateFormat($item['create_time']) : '';
  148. $member = isset($item['member'])? $item['member'] : [];
  149. if($member){
  150. $member['avatar'] = isset($member['avatar'])? get_image_url($member['avatar']) : '';
  151. }
  152. $item['member'] = $member;
  153. $isLike = RedisService::get("caches:videos:comment_{$userId}_{$item['id']}");
  154. $item['is_like'] = $isLike? 1 : 0;
  155. $item['albums'] = $item['albums']? get_images_preview($item['albums']) : [];
  156. }
  157. RedisService::set($cacheKey, ['total'=> $total,'list'=> $datas], rand(30,60));
  158. }
  159. return ['total'=> $total,'list'=> $datas];
  160. }
  161. /**
  162. * 发布评论
  163. * @param $userId
  164. * @param $params
  165. * @return bool
  166. */
  167. public function publish($userId, $params)
  168. {
  169. $albums = isset($params['albums'])? get_format_images($params['albums']) : '';
  170. $videoId = isset($params['video_id'])? intval($params['video_id']) : 0;
  171. $data = [
  172. 'user_id'=> $userId,
  173. 'reply_id'=> isset($params['reply_id'])? intval($params['reply_id']) : 0,
  174. 'video_id'=> $videoId,
  175. 'reply_to_uid'=> isset($params['reply_to_uid'])? intval($params['reply_to_uid']) : 0,
  176. 'albums'=> $albums,
  177. 'content'=> isset($params['content'])? trim($params['content']) : '',
  178. 'create_time'=> time(),
  179. 'update_time'=> time(),
  180. 'status'=> 1,
  181. 'mark'=> 1,
  182. ];
  183. if($this->model->insertGetId($data)){
  184. VideoModel::where(['id'=> $videoId])->update(['comment_num'=>DB::raw("comment_num + 1"),'update_time'=>time()]);
  185. $this->error = 2942;
  186. return true;
  187. }
  188. $this->error = 2943;
  189. return true;
  190. }
  191. /**
  192. * 点赞
  193. * @param $userId
  194. * @param $params
  195. * @return bool
  196. */
  197. public function like($userId, $params)
  198. {
  199. $id = isset($params['id'])? $params['id'] : 0;
  200. $status = isset($params['status'])? $params['status'] : 1;
  201. $cacheKey = "caches:videos:comment_{$userId}_{$id}";
  202. if(RedisService::get($cacheKey)){
  203. return false;
  204. }
  205. if(!$info = $this->model->where(['id'=> $id,'mark'=>1])->select(['id','like_num'])->first()){
  206. $this->error = 2941;
  207. return false;
  208. }
  209. $updateData['like_num'] = ($status == 1 ? $info['like_num']+1 : max(0, $info['like_num']-1));
  210. if ($this->model->where(['id' => $id, 'mark' => 1])->update($updateData)) {
  211. RedisService::set($cacheKey, $info, 7 * 86400);
  212. $this->error = 1002;
  213. return true;
  214. }
  215. $this->error = 1003;
  216. return false;
  217. }
  218. /**
  219. * 删除
  220. * @param $id
  221. * @return bool
  222. */
  223. public function deleteRow($id)
  224. {
  225. $videoId = $this->model->where(['id'=> $id])->value('video_id');
  226. $this->model->where(['id'=> $id])->delete();
  227. try {
  228. if($videoId>0){
  229. VideoModel::where(['id'=> $videoId])->update(['comment_num'=>DB::raw("comment_num - 1"),'update_time'=>time()]);
  230. }
  231. } catch (\Exception $exception){
  232. }
  233. return true;
  234. }
  235. }