VideoCommentService.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. $model = $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. $isRead = isset($params['is_read'])? $params['is_read'] : 0;
  79. $isRead = $isRead>0? $isRead : 0;
  80. if ($isRead > 0) {
  81. $query->where('a.is_read', $isRead);
  82. }
  83. })
  84. ->where(function ($query) use ($params) {
  85. $keyword = isset($params['kw']) ? $params['kw'] : '';
  86. if ($keyword) {
  87. $query->where('a.content','like',"%{$keyword}%");
  88. }
  89. });
  90. $countModel = clone $model;
  91. $total = $countModel->count('a.id');
  92. $list = $model->where(function ($query) use ($params) {
  93. $replyId = isset($params['reply_id']) ? $params['reply_id'] : -1;
  94. if ($replyId >= 0) {
  95. $query->where('a.reply_id', $replyId);
  96. }
  97. })->selectRaw($field)
  98. ->orderByRaw($order)
  99. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  100. $list = $list ? $list->toArray() : [];
  101. if ($list) {
  102. foreach ($list['data'] as $k=> &$item) {
  103. $item['time_text'] = isset($item['create_time']) && $item['create_time']? dateFormat($item['create_time']) : '';
  104. $member = isset($item['member'])? $item['member'] : [];
  105. if($member){
  106. $member['avatar'] = isset($member['avatar'])? get_image_url($member['avatar']) : get_image_url('/images/member/logo.png');
  107. }
  108. $item['member'] = $member;
  109. $isLike = RedisService::get("caches:videos:comment_{$userId}_{$item['id']}");
  110. $item['is_like'] = $isLike? 1 : 0;
  111. $replyData = $this->getReplyList($item['id'], $userId, $pageSize);
  112. $item['reply_count'] = isset($replyData['total'])? $replyData['total'] : 0;
  113. $item['reply_list'] = isset($replyData['list'])? $replyData['list'] : [];
  114. $item['albums'] = $item['albums']? get_images_preview($item['albums']) : [];
  115. $item['reply_show'] = (rand(100,500)>200 || $k==0) && $item['reply_count']>0? 1 : 0;
  116. }
  117. }
  118. return [
  119. 'pageSize' => $pageSize,
  120. 'all_total' => $total,
  121. 'total' => isset($list['total']) ? $list['total'] : 0,
  122. 'list' => isset($list['data']) ? $list['data'] : []
  123. ];
  124. }
  125. /**
  126. * 回复列表
  127. * @param $replyId
  128. * @param $userId
  129. * @param int $pageSize
  130. * @return array|mixed
  131. */
  132. public function getReplyList($replyId, $userId, $pageSize=12)
  133. {
  134. $cacheKey = "caches:videos:comment_reply_list_{$replyId}_{$userId}_{$pageSize}";
  135. $datas = RedisService::get($cacheKey);
  136. if($datas){
  137. return $datas;
  138. }
  139. $model = $this->model->with(['member'])
  140. ->from('video_comments as a')
  141. ->where(['a.reply_id'=> $replyId,'a.status'=>1,'a.mark'=>1])
  142. ->select(['a.*'])
  143. ->orderBy('a.create_time','desc')
  144. ->orderBy('a.id','desc');
  145. $countModel = clone $model;
  146. $total = $countModel->count('a.id');
  147. $datas = $model->limit($pageSize)->get();
  148. $datas = $datas? $datas->toArray() : [];
  149. if($datas){
  150. foreach ($datas as &$item){
  151. $item['time_text'] = isset($item['create_time']) && $item['create_time']? dateFormat($item['create_time']) : '';
  152. $member = isset($item['member'])? $item['member'] : [];
  153. if($member){
  154. $member['avatar'] = isset($member['avatar'])? get_image_url($member['avatar']) : get_image_url('/images/member/logo.png');
  155. }
  156. $item['member'] = $member;
  157. $isLike = RedisService::get("caches:videos:comment_{$userId}_{$item['id']}");
  158. $item['is_like'] = $isLike? 1 : 0;
  159. $item['albums'] = $item['albums']? get_images_preview($item['albums']) : [];
  160. }
  161. RedisService::set($cacheKey, ['total'=> $total,'list'=> $datas], rand(30,60));
  162. }
  163. return ['total'=> $total,'list'=> $datas];
  164. }
  165. /**
  166. * 发布评论
  167. * @param $userId
  168. * @param $params
  169. * @return bool
  170. */
  171. public function publish($userId, $params)
  172. {
  173. $albums = isset($params['albums'])? get_format_images($params['albums']) : '';
  174. $videoId = isset($params['video_id'])? intval($params['video_id']) : 0;
  175. $data = [
  176. 'user_id'=> $userId,
  177. 'reply_id'=> isset($params['reply_id'])? intval($params['reply_id']) : 0,
  178. 'video_id'=> $videoId,
  179. 'reply_to_uid'=> isset($params['reply_to_uid'])? intval($params['reply_to_uid']) : 0,
  180. 'albums'=> $albums,
  181. 'content'=> isset($params['content'])? trim($params['content']) : '',
  182. 'create_time'=> time(),
  183. 'update_time'=> time(),
  184. 'status'=> 1,
  185. 'mark'=> 1,
  186. ];
  187. if($this->model->insertGetId($data)){
  188. VideoModel::where(['id'=> $videoId])->update(['comment_num'=>DB::raw("comment_num + 1"),'update_time'=>time()]);
  189. $this->error = 2942;
  190. return ['total'=> (int)VideoModel::where(['id'=> $videoId])->value('comment_num')];
  191. }
  192. $this->error = 2943;
  193. return ['total'=> (int)VideoModel::where(['id'=> $videoId])->value('comment_num')];
  194. }
  195. /**
  196. * 点赞
  197. * @param $userId
  198. * @param $params
  199. * @return bool
  200. */
  201. public function like($userId, $params)
  202. {
  203. $id = isset($params['id'])? $params['id'] : 0;
  204. $status = isset($params['status'])? $params['status'] : 1;
  205. $cacheKey = "caches:videos:comment_{$userId}_{$id}";
  206. if(RedisService::get($cacheKey)){
  207. return false;
  208. }
  209. if(!$info = $this->model->where(['id'=> $id,'mark'=>1])->select(['id','like_num'])->first()){
  210. $this->error = 2941;
  211. return false;
  212. }
  213. $updateData = ['update_time'=>time()];
  214. $updateData['like_num'] = ($status == 1 ? $info['like_num']+1 : max(0, $info['like_num']-1));
  215. if ($this->model->where(['id' => $id, 'mark' => 1])->update($updateData)) {
  216. if($status == 1){
  217. RedisService::set($cacheKey, $info, 7 * 86400);
  218. }else{
  219. RedisService::clear($cacheKey);
  220. }
  221. $this->error = 1002;
  222. return true;
  223. }
  224. RedisService::clear($cacheKey);
  225. $this->error = 1003;
  226. return false;
  227. }
  228. /**
  229. * 删除
  230. * @param $id
  231. * @return bool
  232. */
  233. public function deleteRow($id)
  234. {
  235. $videoId = $this->model->where(['id'=> $id])->value('video_id');
  236. $count = $this->model->where(['id'=> $id])->orWhere(['reply_id'=> $id])->count('id');
  237. $this->model->where(['id'=> $id])->orWhere(['reply_id'=> $id])->delete();
  238. try {
  239. $this->model->where(['reply_id'=> $id])->delete();
  240. if($videoId>0){
  241. VideoModel::where(['id'=> $videoId])->update(['comment_num'=>DB::raw("comment_num - {$count}"),'update_time'=>time()]);
  242. }
  243. } catch (\Exception $exception){
  244. }
  245. return ['total'=> (int)VideoModel::where(['id'=> $videoId])->value('comment_num')];
  246. }
  247. }