momentCon = $moment; $this->userCon = $userCon; } /** * 动态列表 * @param Request $request [description] * @return [type] [description] */ public function moments(Request $request) { try { $user = $this->getMyUserinfo(); $other_user_id = request()->input('user_id'); if ($user) { // $is_blacklist = LinkingBlacklist::where('other_user_id', $user->id)->where('user_id', $other_user_id)->count() ? 1 : 0; // if($is_blacklist) return $this->success('ok', []); if ($request->input('user_id')) { $moments = $this->momentCon->userMoments($request->user_id); } else { $moments = $this->momentCon->momentsV2(15, 'user', $user->belief); if ($request->page == 1) { $last_moment_id = Redis::get($user->id . 'last_see_moment'); foreach ($moments as $m) { if ($m->id > $last_moment_id) { Redis::set($user->id . 'last_see_moment', $m->id); break; } } } } } else { $moments = $this->momentCon->moments(15, 'tourist'); } return $this->success('ok', $moments); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取动态列表失败,请稍后再试'); } } public function momentsV2(Request $request) { try { $user = auth()->user(); $user_vote_id = UserVote::where('user_id', $user->id)->pluck('vote_id')->toArray(); $votes = Vote::with('option')->whereNotIn('id', $user_vote_id)->where('is_show', 1)->orderByRaw("RAND()")->limit(3)->get()->toArray(); // 手动分页 $limit = 15 - count($votes); $comment_count = DB::table('comments')->where('commentable_type', 'App\\Models\\Moment')->groupBy('commentable_id')->selectRaw('commentable_id as moment_id, count(*) as comment_count'); $moments = DB::table('moments as m') ->leftJoin('moment_topics as mt', 'm.topic_id', '=', 'mt.id') ->leftJoin('votes as v', 'm.vote_id', '=', 'v.id') ->leftJoin('users as u', 'm.user_id', '=', 'u.id') ->leftJoin('profile_courtships as pc', 'm.user_id', '=', 'pc.user_id') ->leftJoinSub($comment_count, 'ufutx_mc', function ($join) { $join->on('m.id', 'mc.moment_id'); }) ->whereNotExists(function ($sql) { $date = date('Y-m-d H:i:s'); $sql->select(DB::raw(1))->from('system_blacklists as sb')->whereRaw('ufutx_sb.user_id = ufutx_m.user_id ')->where('sb.start_time', '<', $date)->where('sb.end_time', '>', $date)->whereNull('sb.deleted_at'); }) ->whereNotExists(function ($sql) use ($user) { $sql->select(DB::raw(1))->from('unlike_moment_logs as uml')->whereRaw('ufutx_uml.moment_id = ufutx_m.id')->where('uml.user_id', $user->id); }) ->whereNotExists(function ($sql) use ($user) { $sql->select(DB::raw(1))->from('linking_blacklists as lb')->whereRaw('ufutx_lb.other_user_id = ufutx_m.user_id')->where('lb.user_id', $user->id)->whereNull('lb.deleted_at'); }) ->whereNotExists(function ($sql) use ($user) { $sql->select(DB::raw(1))->from('linking_blacklists as olb')->whereRaw('ufutx_olb.user_id = ufutx_m.user_id')->where('olb.other_user_id', $user->id)->whereNull('olb.deleted_at'); }); if ($request->is_hot == 0) {//设置为热门动态的不区分信仰 if ($user->belief == '基督教') { $moments = $moments->where('u.belief', $user->belief); } else { $moments = $moments->where('u.belief', '!=', '基督教'); } } if ($request->input('topic_id')) { $moments = $moments->where('topic_id', $request->topic_id); } if ($request->input('is_hot')) { $moments = $moments->where('m.is_hot', $request->is_hot); } $moments = $moments->where('m.is_audited', 1)->where('m.is_show', 1)->whereNull('u.deleted_at')->whereNull('m.deleted_at')->where('u.hidden_profile', 'NONE')->selectRaw('ufutx_m.*, ufutx_u.nickname as u_nickname, ufutx_u.is_photo_audited as is_photo_audited, ufutx_u.photo as u_photo,ufutx_u.app_avatar as u_app_avatar, ufutx_u.sex as u_sex,ufutx_u.belief as u_belief, ufutx_u.type as u_type, ufutx_pc.birthday as u_birthday, ufutx_pc.stature as u_stature,ufutx_pc.degree as u_degree, ufutx_mt.name as mt_name, ufutx_v.title as v_title')->orderBy('is_top', 'desc')->orderBy('id', 'desc')->paginate($limit); foreach ($moments->items() as &$moment) { // $this->momentDetail($moment,$user); $this->momentCon->momentDetailV2($moment, $user); } if ($request->versions != 'v5.4.14' || $request->topic_id) { return $this->success('ok', $moments); } $moments = $moments->toArray(); foreach ($moments['data'] as &$val) { $val->type = 'moment'; } //动态里面插入投票 foreach ($votes as $key => $vote) { $vote = $this->momentCon->vote($vote['id']); $vote = [$vote]; switch ($key) { case 0: if ($moments['to'] > 1) { array_splice($moments['data'], 2, 0, $vote); } break; case 1: if ($moments['to'] > 6) { array_splice($moments['data'], 8, 0, $vote); } break; case 2: if ($moments['to'] > 13) { array_splice($moments['data'], 15, 0, $vote); } break; default: break; } } return $this->success('ok', $moments); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } public function voteOption(Request $request, $option_id) { try { $vote_id = VoteOption::where('id', $option_id)->value('vote_id'); $has_vote = UserVote::where('user_id', auth()->id())->where('vote_id', $vote_id)->count(); if ($has_vote) { return $this->failure('您已投票'); } $user_id = auth()->id(); $user_vote = new UserVote(); $user_vote->user_id = $user_id; $user_vote->vote_id = $vote_id; $user_vote->option_id = $option_id; $user_vote->save(); $vote = $this->momentCon->vote($vote_id); return $this->success('ok', $vote); } catch (\Exception $e) { $this->getError($e); return $this->failure('投票失败'); } } public function commentVote(Request $request, $vote_id) { try { if (empty($request->comment)) { return $this->failure('评论不能为空'); } \DB::beginTransaction(); $vote = Vote::find($vote_id); if (empty($vote)) { return $this->failure('投票不存在'); } $result = $this->momentCon->commentModel($vote); if ($request->reply_id) { $result->reply_id = $request->reply_id; $result->save(); } //同步到动态 if ($request->sync_to_moment) { $request->merge(['content' => $request->comment, 'vote_id' => $vote_id]); //发布动态 $moment = $this->momentCon->addMoment(auth()->id()); } $result->user = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->commented_id)->first(); $result->replyer = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->reply_id)->first(); if (empty($result)) throw new \Exception("评论失败", 1); \DB::commit(); return $this->success('ok', $result); } catch (\Exception $e) { \DB::rollback(); $this->getError($e); return $this->failure('评论动态失败,请稍后再试'); } } //投票详情 public function vote(Request $request, $vote_id) { try { $is_set = Vote::where('id', $vote_id)->count(); if (empty($is_set)) { return $this->failure('投票不存在'); } $vote = $this->momentCon->vote($vote_id); return $this->success('ok', $vote); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取投票详情失败,请稍后再试'); } } /** * 发表动态 * @param Request $request [description] */ public function addMoment(Request $request) { try { $user = auth()->user(); if (empty($user)) { return $this->fail('profile', 2, '', '未登录', '你的账号还没登录'); } // if ($user->id == 130163) { $check = RestrictMomentUser::query()->where('user_id', $user->id)->first(); if ($check) { $config_value = Configs::query()->where('key', 'restrict_moment_num')->value('value') ?: 1; $start_time = date('Y-m-d 00:00:00'); $end_time = date('Y-m-d 23:59:59'); $send_num = Moment::query()->where('user_id', $user->id) ->whereBetween('created_at', [$start_time, $end_time]) ->whereNull('deleted_at') ->count(); if (($send_num + 1) > $config_value) { return $this->failure('频繁发动态今天暂被限制'); } } // } $res = $this->momentCon->addMomentV2($user, 'MP'); if (empty($res)) throw new \Exception("发布动态失败", 1); if (is_array($res) && $res['code']) return $this->failure($res['msg']); $res['data']['topic_give'] = ['state' => 0, 'msg' => '']; return $this->success('ok', $res['data']); } catch (\Exception $e) { $this->getError($e); return $this->failure('发布动态的失败'); } } /** * 动态详情 * @param Request $request [description] * @param [type] $moment_id [description] * @return [type] [description] */ public function moment(Request $request, $moment_id) { try { $moment = $this->momentCon->moment($moment_id); if (is_array($moment) && $moment['code'] == 1) return $this->failure($moment['msg']); if (!empty($moment->topic)) { $moment->topic->quote_num = Moment::where('topic_id', $moment->topic_id)->where(function ($sql) { $sql->where('is_audited', 1) ->orWhere(function ($query) { $query->where('user_id', auth()->id())->where('is_audited', 0); }); })->count(); } if (empty($moment)) throw new \Exception("动态详情失败", 1); if (is_array($moment) && $moment['code']) return $this->failure($moment['msg']); $comments = $this->momentCon->momentComments($moment->id, $limit = 0, $nopage = 0); //通知已读 $where = [ 'user_id' => auth()->id(), 'type' => 'moment', 'status' => 0 ]; $unread_ids = Notice::query()->where($where)->pluck('id'); if ($unread_ids) { Notice::whereIn('id', $unread_ids)->update(['status' => 1]); } return $this->success('ok', compact('moment', 'comments')); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取动态详情失败,请稍后再试'); } } //评论列表 public function comments(Request $request) { try { $result = $this->momentCon->comments($request); return $this->success('ok', $result); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取评论失败,请稍后再试'); } } //删除动态评论 public function delComment(Request $request) { try { $user = auth()->user(); $comment_id = $request->comment_id; $moment_id = $request->moment_id; $vote_id = $request->vote_id; $moment = Moment::find($moment_id); $comment = Comment::find($comment_id); if (!$comment) { return $this->failure('动态不存在或已删除'); } $vote = Vote::find($vote_id); if ($user->id != $moment->user_id && $user->id != $comment->commented_id) { return $this->failure('只能删除自己发布的评论'); } if ($request->moment_id) { $moment->comments()->where(function ($sql) use ($comment_id) { $sql->where('id', $comment_id); })->delete(); } if ($request->vote_id) { $vote->comments()->where(function ($sql) use ($comment_id) { $sql->where('id', $comment_id); })->delete(); } return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } /** * 删除动态 * @param [type] $moment_id [description] * @return [type] [description] */ public function deleteMoment($moment_id) { try { $moment = $this->momentCon->deleteMoment($moment_id); if (empty($moment)) throw new \Exception("删除动态失败", 1); if ($moment && is_array($moment) && $moment['code']) return $this->failure($moment['msg']); return $this->success('ok', $moment); } catch (\Exception $e) { $this->getError($e); return $this->failure('删除动态失败,请稍后再试'); } } //点赞投票 public function likeVote(Request $request, $vote_id) { try { $vote = Vote::find($vote_id); if (empty($vote)) { return $this->failure('投票不存在'); } $result = $this->momentCon->likeModel($vote); if (empty($result)) throw new \Exception("点赞失败", 1); if (is_array($result) && $result['code']) return $this->failure($result['msg']); $isLker = $result['isLker']; return $this->success('ok', compact('isLker')); } catch (\Exception $e) { $this->getError($e); return $this->failure('点赞动态失败,请稍后再试'); } } /** * 点赞动态 * @param Request $request [description] * @param [type] $momment_id [description] * @return [type] [description] */ public function likeMoment(Request $request, $moment_id) { $user = auth()->user(); try { // 被拉黑用户的用户无法点赞 $moment = Moment::find($moment_id); if (empty($moment)) return $this->failure('该动态已被删除'); $result = $this->userCon->isBlacklist($user->id, $moment->user_id); if ($result) { if ($result == 1) return $this->failure('您已经被对方拉入黑名单'); if ($result == 2) return $this->failure('您已经将对方拉入黑名单'); } $result = $this->momentCon->likeMoment($moment_id); if (empty($result)) throw new \Exception("点赞失败", 1); if (is_array($result) && $result['code']) return $this->failure($result['msg']); $isLkerMoment = $result['isLkerMoment']; return $this->success('ok', compact('isLkerMoment')); } catch (\Exception $e) { $this->getError($e); return $this->failure('点赞动态失败,请稍后再试'); }//点赞 $this->moment->likeMoment($user->id, $moment_id); return $this->success('ok'); } /** * 评论动态 * @param Request $request [description] * @param [type] $moment_id [description] * @return [type] [description] */ public function commentMoment(Request $request, $moment_id) { try { if (empty($request->comment)) { return $this->failure('评论不能为空'); } //敏感词汇过滤 $result = \CommonUtilsService::checkoutTextArray([$request->comment]); if ($result['code'] == 1) { return $this->failure($result['cause']); } $result = $this->momentCon->commentMoment($moment_id); if (is_array($result) && array_key_exists('code', $result)) { return $this->failure($result['msg']); } if ($request->reply_id) { $result->reply_id = $request->reply_id; $result->save(); } $result->user = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->commented_id)->first(); $result->replyer = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->reply_id)->first(); if (empty($result)) throw new \Exception("评论失败", 1); return $this->success('ok', $result); } catch (\Exception $e) { $this->getError($e); return $this->failure('评论动态失败,请稍后再试'); } } /** * 动态话题列表 * @param Request $request [description] * @return [type] [description] */ public function topics(Request $request) { try { $user = null; if (Auth::guard('api')->check()) { $topics = $this->momentCon->topicsV2($request); $user = auth()->user(); } else { $topics = $this->momentCon->topicsV2($request, 'tourist'); } foreach ($topics as $topic) { $topic->quote_num = $topic->moment_count; $topic->is_participated = 0; if ($user) { if ($topic->moment_topics_activities) { $topic->is_participated = 0; $other_type = RankHistory::TOPICACTIVITIESPARTGIVE . '_' . $topic->id; $superCount = $user->getSuperCount($user->id, RankHistory::TOPICACTIVITIESPARTGIVE, $other_type); if ($superCount >= 1) { $topic->is_participated = 1; } } } } if (empty($topics)) throw new \Exception("获取话题列表失败", 1); return $this->success('ok', $topics); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取话题列表失败,请稍后再试'); } } public function topic(Request $request, $topic_id) { try { $user = auth()->user(); //不喜欢的动态id $unlike_moment_id = UnlikeMomentLog::where('user_id', $user->id)->pluck('moment_id')->toArray(); //没有用户的动态id $has_no_user_moment_id = Moment::doesntHave('user')->pluck('id')->toArray(); $topic = MomentTopic::where('id', $topic_id) ->with([ 'momentTopicsActivities' => function ($q) { $date = date('Y-m-d H:i:s'); $q->where('start_time', '<=', $date); $q->where('end_time', '>=', $date); } ]) ->withCount([ 'moment' => function ($query) use ($unlike_moment_id, $has_no_user_moment_id) { $query->where(function ($sql) use ($unlike_moment_id, $has_no_user_moment_id) { $sql->where('is_audited', 1)->whereNotIn('id', $unlike_moment_id)->whereNotIn('id', $has_no_user_moment_id); }) ->orWhere(function ($sql) { $sql->where('user_id', auth()->id())->where('is_audited', 0); }); } ])->first(); if ($user) { $topic->is_participated = 0; $other_type = RankHistory::TOPICACTIVITIESPARTGIVE . '_' . $topic_id; $superCount = $user->getSuperCount($user->id, RankHistory::TOPICACTIVITIESPARTGIVE, $other_type); if ($superCount >= 1) { $topic->is_participated = 1; } } if (empty($topic)) { return $this->failure('话题不存在'); } $topic->quote_num = $topic->moment_count; return $this->success('ok', $topic); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取话题列表失败,请稍后再试'); } } /** * 举报动态 * @param Request $request [description] * @param [type] $moment_id [description] * @return [type] [description] */ public function complaintMoment(Request $request, $moment_id) { try { $result = $this->momentCon->complaintMoment($moment_id); if (empty($result)) throw new \Exception("举报动态失败", 1); if ($result && is_array($result) && $result['code']) return $this->failure($result['msg']); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure('举报动态失败,请稍后再试'); } } public function liker(Request $request) { try { $result = $this->momentCon->liker($request); return $this->success('ok', $result); } catch (\Exception $e) { $this->getError($e); return $this->failure('获取点赞列表失败,请稍后再试'); } } public function momentLikers(Request $request, $moment_id) { try { $users = $this->momentCon->momentLikers($moment_id); if (empty($users)) throw new \Exception("点赞列表失败", 1); if (is_array($users) && $users['code']) return $this->failure($users['msg']); return $this->success('ok', $users); } catch (\Exception $e) { $this->getError($e); return $this->failure("获取点赞列表失败,请稍后再试"); } } public function unlikeMoment(Request $request, $moment_id) { try { $result = $this->momentCon->unlikeMoment($moment_id); if (empty($result)) throw new \Exception("不感兴趣失败", 1); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure('操作失败,请稍后再试'); } } //点赞评论 public function likeComment(Request $request, $comment_id) { try { $comment = Comment::find($comment_id); if (empty($comment)) { return $this->failure('评论不存在'); } $result = $this->momentCon->likeModel($comment); if (empty($result)) throw new \Exception("点赞失败", 1); if (is_array($result) && $result['code']) return $this->failure($result['msg']); $isLker = $result['isLker']; return $this->success('ok', compact('isLker')); } catch (\Exception $e) { $this->getError($e); return $this->failure('点赞评论失败,请稍后再试'); } } /** * 用户动态列表 * @param Request $request [description] * @param [type] $user_id [description] * @return [type] [description] */ public function userMoments(Request $request, $user_id) { $moments = $this->moment->userMoments($user_id); return $this->success('ok', $moments); } public function complaintLabels(Request $request) { $labels = ['信息虚假', '侵权抄袭', '广告软文', '政治敏感', '色情低俗', '内容引起不适']; return $this->success('ok', $labels); } //动态首页(判断是否动态管理员、是否有更新) public function momentHome(Request $request) { $user = $this->getMyUserinfo(); if (!empty($user)) { $is_moment_admin = RoleUser::where('role_id', 21)->where('user_id', $user->id)->count() ? 1 : 0; $last_moment_id = Redis::get($user->id . 'last_see_moment'); $belief = $user->belief; $new_moment_id = Moment::where('is_audited', 1) ->where('is_show', 1) ->whereNull('aliyun_video_id') ->whereHas('user', function ($q) use ($belief) { $q->where('hidden_profile', 'NONE'); if ($belief) { if ($belief == '基督教') { $q->where('belief', $belief); } else { $q->where('belief', '<>', '基督教'); } } }) ->orderBy('id', 'desc') ->value('id'); $has_new_moment = $new_moment_id > $last_moment_id ? 1 : 0; $is_subscribe = $user->is_subscribe; $is_approved = $user->is_approved; $is_real_approved = $user->is_real_approved; $is_profile = $user->isCompletedProfile('mp_other_info'); $is_audited = AreaUser::where('user_id', $user->id)->where('area_id', 1)->orderBy('id', 'desc')->value('is_audited'); if ($is_audited === null || $is_audited == -1) { $is_audited = 2; } $has_apply_area = $is_audited === null ? 2 : $is_audited; //基本资料 $is_base_info = $this->userCon->isCompleteBaseInfo($user); } else { $is_moment_admin = 0; $has_new_moment = 0; $is_subscribe = 0; $is_approved = 0; $is_profile = 0; $has_apply_area = 0; $is_real_approved = 0; $is_base_info = 0; } $activities_is_start = 0; $start_time = 1623427200; $end_time = 1624204800; $present_time = time(); if ($present_time > $start_time && $present_time < $end_time) { $activities_is_start = 1; } return $this->success('ok', compact('is_moment_admin', 'has_new_moment', 'is_subscribe', 'is_approved', 'is_profile', 'has_apply_area', 'is_real_approved', 'activities_is_start', 'is_base_info')); } }