sms = $sms; $this->commonUtil = new CommonUtilsService(); $this->userCon = new \App\Services\UserService(); } /** * 动态列表 * @return [type] [description] */ public function moments($limit = 15, $type = 'user') { $moments = Moment::with([ 'topic' => function ($query) { $query->where('is_show', 1); }, 'vote:id,title', 'user' ]) ->whereHas('user', function ($q) { $q->where('hidden_profile', 'NONE'); })->orderBy('is_top', 'desc'); ; // if(request()->input('order_comment')){ // $comments = \DB::select("SELECT * from ufutx_moments as m LEFT JOIN (SELECT commentable_id as moment_id, COUNT(*) as comment_count FROM `ufutx_comments` WHERE commentable_type = 'App\\Models\\Moment' GROUP BY commentable_id ) as c on c.moment_id = m.id ORDER BY `c`.`comment_count` DESC"); // } $topic_id = request()->input('topic_id', 0); $is_hot = request()->input('is_hot'); $user_id = request()->input('user_id'); if ($topic_id) { $moments = $moments->where('topic_id', $topic_id); } if ($type == 'tourist') { $arrs = [616, 58859, 161, 12441, 3480]; $moments = $moments->wherein('user_id', $arrs); } // //小程序屏蔽视频动态 // $prefix = (request()->route()->getAction())['prefix']; // if ($prefix == 'api') { // // $vote_moment_id = Moment::where('vote_id', '!=', 0)->pluck('id')->toArray(); // // $moments = $moments->whereNotIn('id', $vote_moment_id); // $moments = $moments->where('vote_id', 0); // } $result = strstr(request()->route()->uri(), 'api/admin/moments'); if ($result) {//后台 $moments = $moments->orderBy('is_top', 'desc'); $belief = request()->input('belief'); if (!empty($belief)) { $moments = $moments->whereHas('user', function ($sql) use ($belief) { $sql->where('hidden_profile', 'NONE'); if ($belief == '基督教') { $sql->where('belief', $belief); } else { $sql->where('belief', '<>', '基督教'); } }); } $is_audited = request()->input('is_audited'); if (is_numeric($is_audited)) { $moments = $moments->where('is_audited', $is_audited); } $is_show = request()->input('is_show', 1); if (is_numeric($is_show)) { $moments = $moments->where('is_show', $is_show); } } else {//app、小程序 //过滤已校验出敏感词的动态id $key = 'sensitive_moment'; if (Cache::has($key)) { $source_ids = Cache::get($key); } else { $source_ids = VerifyLog::where('source_type', 'moment')->pluck('source_id')->toArray(); Cache::add($key, $source_ids, 60 * 5); } $moments = $moments->whereNotIn('id', $source_ids); $moments = $moments->where(function ($sql) { $sql->where('is_audited', 1) ->orWhere(function ($query) { $query->where('user_id', auth()->id())->where('is_audited', 0); }); })->where(function ($query) { $query->where('is_show', 1) ->orWhere(function ($query) { $query->where('user_id', auth()->id())->where('is_show', 0); }); }); $moments = $moments->doesntHave('unlinkLogs'); } $keyword = request()->input('keyword'); if ($keyword) { $moments = $moments->where(function ($sql) use ($keyword) { $sql->where('content', 'like', '%' . $keyword . '%')->orWhere('id', $keyword) ->orWhereHas('user', function ($query) use ($keyword) { $query->where('nickname', 'like', '%' . $keyword . '%') ->orWhere('id', $keyword) ->orWhere('mobile', 'like', '%' . $keyword . '%'); }); }); } if (is_numeric($is_hot) && $is_hot) { $moments = $moments->where('is_hot', $is_hot); } if (is_numeric($user_id) && $user_id) { $moments = $moments->where('user_id', $user_id); } $is_app_route = strstr(request()->route()->uri(), 'api/app/moments'); if ($is_app_route) { $last_id = clone $moments; $last_id = $last_id->where('created_at', '<', '2021-01-01 00:00:00') ->orderBy('id', 'desc') ->limit(1) ->value('id'); $moments = $moments->orderBy('id', 'desc')->paginate($limit); foreach ($moments->items() as $item) { if ($item->id == $last_id) $item->last_id = 1; $item = $this->momentDetail($item); if (!empty($item->user) && !empty($item->user->mobile)) { unset($item->user->mobile); } } } else { $moments = $moments->orderBy('id', 'desc')->paginate($limit); foreach ($moments->items() as $item) { $item = $this->momentDetail($item, $type); } } return $moments; } /** * 动态列表 * @return [type] [description] */ public function momentsV2($limit = 15, $type = 'user', $belief = null) { $moments = Moment::with([ 'topic' => function ($query) { $query->where('is_show', 1); }, 'vote:id,title', 'user' ]) ->whereHas('user', function ($q) use ($belief) { $q->where('hidden_profile', 'NONE'); if ($belief) { if ($belief == '基督教') { $q->where('belief', $belief); } else { $q->where('belief', '<>', '基督教'); } } }) ->orderBy('is_top', 'desc'); $topic_id = request()->input('topic_id', 0); $is_hot = request()->input('is_hot'); $user_id = request()->input('user_id'); $versions = request()->input('versions'); if ($topic_id) { $moments = $moments->where('topic_id', $topic_id); } if ($type == 'tourist') { $arrs = [616, 58859, 161, 12441, 3480]; $moments = $moments->wherein('user_id', $arrs); } $result = strstr(request()->route()->uri(), 'api/admin/moments'); if ($result) {//后台 $is_audited = request()->input('is_audited'); if (is_numeric($is_audited)) { $moments = $moments->where('is_audited', $is_audited); } $is_show = request()->input('is_show'); if (is_numeric($is_show)) { $moments = $moments->where('is_show', $is_show); } } else {//app、小程序 //过滤已校验出敏感词的动态id $key = 'sensitive_moment'; if (Cache::has($key)) { $source_ids = Cache::get($key); } else { $source_ids = VerifyLog::where('source_type', 'moment')->pluck('source_id')->toArray(); Cache::add($key, $source_ids, 60 * 5); } $moments = $moments->whereNotIn('id', $source_ids)->where(function ($sql) { $sql->where('is_audited', 1) ->orWhere(function ($query) { $query->where('user_id', auth()->id())->where('is_audited', 0); }); })->where(function ($query) { $query->where('is_show', 1) ->orWhere(function ($query) { $query->where('user_id', auth()->id())->where('is_show', 0); }); }); $moments = $moments->doesntHave('unlinkLogs'); } $keyword = request()->input('keyword'); if ($keyword) { $moments = $moments->where(function ($sql) use ($keyword) { $sql->where('content', 'like', '%' . $keyword . '%') ->orWhereHas('user', function ($query) use ($keyword) { $query->where('nickname', 'like', '%' . $keyword . '%') ->orWhere('mobile', 'like', '%' . $keyword . '%'); }); }); } if (is_numeric($is_hot) && $is_hot) { $moments = $moments->where('is_hot', $is_hot); } if (is_numeric($user_id) && $user_id) { $moments = $moments->where('user_id', $user_id); } $is_app_route = strstr(request()->route()->uri(), 'api/app/moments'); if ($is_app_route) { $last_id = clone $moments; $last_id = $last_id->where('created_at', '<', '2021-01-01 00:00:00') ->orderBy('id', 'desc') ->limit(1) ->value('id'); $moments = $moments->orderBy('id', 'desc')->paginate($limit); foreach ($moments->items() as $item) { if ($item->id == $last_id) $item->last_id = 1; $item = $this->momentDetail($item); } } else { $moments = $moments->orderBy('id', 'desc')->paginate($limit); foreach ($moments->items() as $item) { $item = $this->momentDetail($item, $type); } } return $moments; } /** * 动态列表 按评论降序 * @return [type] [description] */ public function momentsV3($limit = 15, $type = 'user') { $page = request()->input('page', 1);//第几页 $size = request()->input('size', 15);//每页数量 $sql = "SELECT * from ufutx_moments as m LEFT JOIN (SELECT commentable_id as moment_id, COUNT(*) as comment_count FROM `ufutx_comments` WHERE commentable_type = 'App\\\\Models\\\\Moment' GROUP BY commentable_id ) as `c` on c.moment_id = m.id ORDER BY c.comment_count DESC limit " . ($page - 1) * $size . ',15'; $results = DB::select($sql); $q = "SELECT * from ufutx_moments as m LEFT JOIN (SELECT followable_id as moment_id, COUNT(*) as like_count FROM `ufutx_followables` WHERE followable_type = 'App\\\\Models\\\\Moment' GROUP BY followable_id ) as `f` on f.moment_id = m.id ORDER BY f.like_count DESC"; $querys = DB::select($q); foreach ($results as $result) { $user = User::where('id', $result->user_id)->select('id', 'nickname', 'app_avatar', 'circle_avatar', 'mobile')->first(); $result->user = $user; $result->photos = json_decode($result->photos, true); $result->like_count = 0; foreach ($querys as $query) { if ($result->moment_id == $query->moment_id) { $result->like_count = $query->like_count; } } } return $results; } /** * 动态列表 按点赞降序 * @return [type] [description] */ public function momentsV4($limit = 15, $type = 'user') { $page = request()->input('page', 1);//第几页 $size = request()->input('size', 15);//每页数量 $sql = "SELECT * from ufutx_moments as m LEFT JOIN (SELECT commentable_id as moment_id, COUNT(*) as comment_count FROM `ufutx_comments` WHERE commentable_type = 'App\\\\Models\\\\Moment' GROUP BY commentable_id ) as `c` on c.moment_id = m.id ORDER BY c.comment_count DESC"; $results = DB::select($sql); $q = "SELECT * from ufutx_moments as m LEFT JOIN (SELECT followable_id as moment_id, COUNT(*) as like_count FROM `ufutx_followables` WHERE followable_type = 'App\\\\Models\\\\Moment' GROUP BY followable_id ) as `f` on f.moment_id = m.id ORDER BY f.like_count DESC limit " . ($page - 1) * $size . ',15'; $querys = DB::select($q); foreach ($querys as $query) { $user = User::where('id', $query->user_id)->select('id', 'nickname', 'app_avatar', 'circle_avatar', 'mobile')->first(); $query->user = $user; $query->photos = json_decode($query->photos, true); $query->comment_count = 0; foreach ($results as $result) { if ($query->moment_id == $result->moment_id) { $query->comment_count = $result->comment_count; } } } return $querys; } /** * 发表动态 */ public function addMoment($user_id, $channel = 'APP') { try { //查看是否被禁言 $date = date('Y-m-d H:i:s'); $history = BannedHistory::where('user_id', $user_id)->where('type', 'moment')->first(); if (!empty($history)) { if ($history->end_time >= $date && $history->start_time <= $date) { return ['code' => 1, 'msg' => '你被禁止发动态至' . $history->end_time]; } } $content = request()->input('content'); //敏感词汇过滤 $result = \CommonUtilsService::textContentCecurity([$content]); if ($result && $result['result']) { return ['code' => 1, 'msg' => '您填写的内容【' . $result['context'] . "】:" . $result['result'] . ",请重新输入"]; } $photos = request()->input('photos') ?: []; $aliyun_video_id = request()->input('aliyun_video_id') == 'null' ? '' : request()->input('aliyun_video_id'); $topic_id = request()->input('topic_id') ?: 0; $location_longitude = request()->input('location_longitude'); $location_latitude = request()->input('location_latitude'); $address = request()->input('address'); $is_anonymised = request()->input('is_anonymised', 0); $vote_id = request()->input('vote_id', 0); $is_hot = request()->input('is_hot') ?: 0; if ($is_anonymised) return ['code' => 1, 'msg' => '暂不支持匿名发表']; //获取视频信息 if (!empty($aliyun_video_id)) { $result = $this->getVodInfo($aliyun_video_id); if (is_array($result)) { $video_height = $result['Mezzanine']['Height']; $video_width = $result['Mezzanine']['Width']; } } $moment = auth()->user()->moments()->create([ 'user_id' => $user_id, 'content' => $content, 'photos' => json_encode($photos), 'aliyun_video_id' => $aliyun_video_id, 'video_height' => !empty($video_height) ? $video_height : 0, 'video_width' => !empty($video_width) ? $video_width : 0, 'topic_id' => $topic_id, 'location_latitude' => $location_latitude, 'location_longitude' => $location_longitude, 'address' => $address, 'is_anonymised' => $is_anonymised, 'vote_id' => $vote_id, 'channel' => $channel, 'is_hot' => $is_hot, 'is_audited' => 1, ]); return $moment; } catch (\Exception $e) { $this->getError($e); return false; } return; } /**发表动态 领取会员 */ public function addMomentV2($user, $channel = 'APP') { try { //code 1 成功 2 失败 3 成功但是*** $res_data = ['code' => 1, 'msg' => '异常']; //查看是否被禁言 $date = date('Y-m-d H:i:s'); $history = BannedHistory::where('user_id', $user->id)->where('type', 'moment')->first(); if (!empty($history)) { if ($history->end_time >= $date && $history->start_time <= $date) { return ['code' => 1, 'msg' => '你被禁止发动态至' . $history->end_time]; } } if ($user->is_photo_audited != 1) { return ['code' => 1, 'msg' => "头像未通过审核,禁止发布动态"]; } if ($user->is_real_approved != 1) { return ['code' => 1, 'msg' => "真人认证未通过审核,禁止发布动态"]; } $content = request()->input('content'); $photos = request()->input('photos') ?: []; if ($user->id != 69938) { //排除小天使账号 //敏感词汇过滤 $result = \CommonUtilsService::checkoutTextArray([$content]); if ($result['code'] == 1) { return ['code' => 1, 'msg' => $result['cause']]; } if (count($photos)) { $result = \CommonUtilsService::imageContentCecurity($photos); if ($result && isset($result['result'])) return ['code' => 1, 'msg' => $result['result']]; ; } } $aliyun_video_id = request()->input('aliyun_video_id') == 'null' ? '' : request()->input('aliyun_video_id'); $topic_id = request()->input('topic_id') ?: 0; $location_longitude = request()->input('location_longitude'); $location_latitude = request()->input('location_latitude'); $address = request()->input('address'); $is_anonymised = request()->input('is_anonymised', 0); $vote_id = request()->input('vote_id', 0); $is_hot = request()->input('is_hot') ?: 0; if ($is_anonymised) return ['code' => 1, 'msg' => '暂不支持匿名发表']; $aliyun_video_state = 0; //获取视频信息 if (!empty($aliyun_video_id)) { $result = $this->getVodInfo($aliyun_video_id); if (is_array($result)) { $video_height = $result['Mezzanine']['Height']; $video_width = $result['Mezzanine']['Width']; } $aliyun_video_state = 1; } $data['code'] = 0; $data['msg'] = ''; $data['data'] = ['moment' => '', 'give_hint' => 0]; if ($topic_id > 0) { $momentTopic = MomentTopic::with('momentTopicsActivities') ->where('id', $topic_id)->first(); if (!$momentTopic) { return ['code' => 1, 'msg' => '话题不存在']; } if ($momentTopic->momentTopicsActivities) { $presentTime = time(); if ( strlen($content) >= $momentTopic->momentTopicsActivities->tc_moment_content_count && (count($photos) >= $momentTopic->momentTopicsActivities->tc_moment_photos_count || $aliyun_video_state == 1) && $presentTime >= strtotime($momentTopic->momentTopicsActivities->start_time) && $presentTime <= strtotime($momentTopic->momentTopicsActivities->end_time) ) { if ($momentTopic->momentTopicsActivities->award_member_days >= 1) { $other_type = RankHistory::TOPICACTIVITIESPARTGIVE . '_' . $topic_id; $superCount = $user->getSuperCount($user->id, RankHistory::TOPICACTIVITIESPARTGIVE, $other_type); // dd($superCount); if ($superCount == 0) { $data['data']['give_hint'] = 1; $user->addSuperRank($momentTopic->momentTopicsActivities->award_member_days, $month = 0, $type = RankHistory::TOPICACTIVITIESPARTGIVE, $other_type); } } } } } $moment = auth()->user()->moments()->create([ 'user_id' => $user->id, 'content' => $content, 'photos' => json_encode($photos), 'aliyun_video_id' => $aliyun_video_id, 'video_height' => !empty($video_height) ? $video_height : 0, 'video_width' => !empty($video_width) ? $video_width : 0, 'topic_id' => $topic_id, 'location_latitude' => $location_latitude, 'location_longitude' => $location_longitude, 'address' => $address, 'is_anonymised' => $is_anonymised, 'vote_id' => $vote_id, 'channel' => $channel, 'is_hot' => $is_hot, 'is_audited' => 1, ]); $data['data']['moment'] = $moment; //给关注的人发送公众号消息推送 $targe_user_ids = Followable::where('followable_id', $user->id)->where('relation', 'follow')->pluck('user_id')->toArray(); foreach ($targe_user_ids as $key => $targe_user_id) { if ($user->id == 59505) break; if ($targe_user_id == $user->id) continue; $targe_user = User::find($targe_user_id); if (empty($targe_user)) continue; $param = $this->getAddMomentParam($user, $targe_user);//user被关注 targe_user主动关注(接收通知) if (empty($param)) continue; SendTemplateMsg::dispatch($param)->onQueue('template_message'); } return $data; } catch (\Exception $e) { $this->getError($e); return false; } return; } public function getAddMomentParam($user, $targe_user) { $openid = $targe_user->wechat ? $targe_user->wechat->official_openid : null; if (empty($openid)) { $openid = $targe_user->viewer ? $targe_user->viewer->openid : null; } //关注时间 $foll = Followable::where('user_id', $targe_user->id)->where('followable_id', $user->id)->where('relation', 'follow')->first(); $foll_time = $foll->created_at->toDateTimeString(); if ($openid) { $param["touser"] = $openid; $param['template_id'] = config('wechat.tpls.follow_user_add_moment'); $param['url'] = env('APP_URL') . '/h5'; $param['miniprogram'] = [ 'appid' => config('wechat.mini_program.app_id'), 'pagepath' => 'pages/home/PersonalDynamic?id=' . $user->id, ]; $param['data'] = [ "first" => '您关注的会员发布动态啦!', 'keyword1' => $user->nickname, 'keyword2' => !empty($foll_time) ? date('Y-m-d H:i', strtotime($foll_time)) : date('Y-m-d H:i'),//关注时间 'remark' => '记得跟Ta互动一下哦!' ]; return $param; } return []; } public function sendMomentNotice($type, $moment, $user, $moment_user) { if ($type == 'like') { $first = '您的动态被人点赞了!'; } elseif ($type == 'comment') { $first = '您的动态被人评论了!'; } elseif ($type == 'reply_comment') { $first = '您的动态被人回复了!'; } else { return; } //公众号通知 $param["touser"] = $moment_user->wechat ? $moment_user->wechat->official_openid : null; $param['template_id'] = config('wechat.tpls.follow_user_add_moment'); $param['url'] = env('APP_URL') . '/h5'; $param['miniprogram'] = [ 'appid' => config('wechat.mini_program.app_id'), 'pagepath' => 'pages/dynamic/feedDetail?id=' . $moment->id, ]; $param['data'] = [ "first" => $first, 'keyword1' => $user->nickname, 'keyword2' => date("Y-m-d H:i:s"),//关注时间 'remark' => '记得跟Ta互动一下哦!' ]; SendTemplateMsg::dispatch($param)->onQueue('template_message'); } /** * 动态详情 * @param [type] $moment_id [description] * @return [type] [description] */ public function moment($moment_id) { try { $moment = Moment::with('user.profileCourtship', 'topic', 'user:id,sex,nickname,photo,app_avatar,mobile,belief', 'vote:id,title')->where('id', $moment_id)->first(); if (empty($moment)) return ['code' => 1, 'msg' => '该动态已被删除']; $moment = $this->momentDetail($moment); return $moment; } catch (\Exception $e) { $this->getError($e); return false; } } public function momentDetail($moment, $type = 'user') { try { //点赞数 $momentLikerCount = $this->momentLikerCount($moment); $moment->momentLikerCount = $momentLikerCount; //评论数 $momentCommentCount = $this->momentCommentCount($moment); $moment->momentCommentCount = $momentCommentCount; //视频 $play_url = ''; $cover_url = ''; if ($moment->aliyun_video_id) { $result = \AliyunService::getPlayInfo($moment->aliyun_video_id, $play_domain = 'vod-mp.ufutx.com'); if (empty($result)) throw new \Exception("获取播放地址失败", 1); $play_url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL']; $cover_url = $result['VideoBase']['CoverURL'] ?? ''; } $moment->cover_url = $cover_url; $moment->play_url = $play_url; unset($moment->user); $moment->isLkerMoment = 0; //是否点赞 if ($type != 'tourist') { $moment->isLkerMoment = $this->isLkerMoment($moment); } //是否是自己的动态 $moment->is_self = auth()->id() == $moment->user_id ? 1 : 0; $user = $moment->user; if (!empty($user)) { $moment->user->age = \App\Facades\CommonUtilsService::getAge($user->profileCourtship ? $user->profileCourtship->birthday : null); $moment->user->photo = $user->userAvatar(); } else { $moment->user->age = null; $moment->user->photo = null; } if ($user && $user->profileCourtship) { $moment->user->city = $user->profileCourtship->city; $moment->user->stature = $user->profileCourtship->stature; $moment->user->degree = $user->profileCourtship->degree; $moment->user->year = substr($user->profileCourtship->birthday, 2, 2) . '年'; } else { $moment->user->city = null; $moment->user->stature = null; $moment->user->degree = null; $moment->user->year = null; } $photo_arr = []; $photos = json_decode($moment->photos, true); if (is_array($photos) && count($photos)) { $moment->original_photos = json_decode($moment->photos); foreach ($photos as $photo) { if (!is_array($photo)) { $result = strstr($photo, '?'); $photo = $result ? $photo . '&x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_d2F0ZXIucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMjA,x_10,y_10' : $photo . '?x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_d2F0ZXIucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMjA,x_10,y_10'; $photo_arr[] = $photo; } } $moment->photos = $photo_arr; } else { $moment->photos = $photos; } unset($moment->user->mobile, $moment->user->mobile); //工作人员标签 $moment->work_user_tag = TestUser::where('status', 0)->where('user_id', $moment->user_id)->value('tag'); return $moment; } catch (\Exception $e) { $this->getError($e); return false; } } public function momentDetailV2($moment, $user) { $moment->u_photo = ($moment->is_photo_audited == -1 ? 'https://image.fulllinkai.com/202207/04/1fa9a906b956efa26852fb685a845fff.png' : $moment->u_photo) ?: $moment->u_app_avatar; $photos = []; $moment->original_photos = json_decode($moment->photos, true); if (is_array($moment->original_photos) && count($moment->original_photos)) { foreach ($moment->original_photos as $photo) { $result = strstr($photo, '?'); // $photo = $result?$photo.'&x-oss-process=style/scale1':$photo.'?x-oss-process=style/scale1'; $photo = $result ? $photo . '&x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_d2F0ZXIucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMjA,x_10,y_10' : $photo . '?x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_d2F0ZXIucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMjA,x_10,y_10'; $photos[] = $photo; } } $moment->photos = $photos; $moment->u_age = \CommonUtilsService::getAge($moment->u_birthday) ?: 0; $moment->u_year = substr($moment->u_birthday, 2, 2) . '年'; $moment->is_self = $user->id == $moment->user_id ? 1 : 0; //点赞数 评论数 是否点赞 $moment->comment_count = DB::table('comments')->where('commentable_id', $moment->id)->where('commentable_type', 'App\\Models\\Moment')->groupBy('commentable_id')->count(); $moment->like_count = DB::table('followables')->where('followable_id', $moment->id)->where('followable_type', 'App\\Models\\Moment')->where('relation', 'like')->groupBy('followable_id')->count(); $moment->is_like = DB::table('followables')->where('user_id', $user->id)->where('followable_id', $moment->id)->where('followable_type', 'App\\Models\\Moment')->where('relation', 'like')->exists(); //视频 $moment->cover_url = ''; $moment->play_url = ''; if ($moment->aliyun_video_id) { $result = \AliyunService::getPlayInfo($moment->aliyun_video_id); if (!empty($result)) { $moment->play_url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL']; $moment->cover_url = $result['VideoBase']['CoverURL'] ?? ''; } } //工作人员标签 $moment->work_user_tag = TestUser::where('status', 0)->where('user_id', $moment->user_id)->value('tag'); return $moment; } /** * 删除动态 * @param [type] $moment_id [description] * @return [type] [description] */ public function deleteMoment($moment_id) { try { $moment = Moment::find($moment_id); if (empty($moment)) return ['code' => 1, 'msg' => '该动态已被删除']; $is_moment_admin = RoleUser::where('role_id', 21)->where('user_id', auth()->id())->count() ? 1 : 0; if ($moment->user_id != auth()->id() && $is_moment_admin != 1) return ['code' => 1, 'msg' => '暂无权限删除该动态']; $moment->delete(); return true; } catch (\Exception $e) { $this->getError($e); return false; } } /** * 点赞动态 * @param [type] $user_id [description] * @param [type] $moment_id [description] * @return [type] [description] */ public function likeMoment($moment_id) { try { $user = auth()->user(); $moment = Moment::find($moment_id); if (empty($moment)) return ['code' => 1, 'msg' => '该动态已被删除']; $black_ids = LinkingBlacklist::where('user_id', $moment->user_id)->pluck('other_user_id')->toArray(); if (in_array($user->id, $black_ids)) return ['code' => 1, 'msg' => '你已被该用户拉黑,无法点赞']; if ($user->hasLiked($moment)) { //取消点赞 $user->unlike($moment); //更新缓存 $moment->updateCacheMomentLikeNum('SUB'); return ['code' => 0, 'isLkerMoment' => false]; } else { //点赞 $user->like($moment); $moment->updateCacheMomentLikeNum('ADD'); if ($user->id != $moment->user_id) { //通知 $moment_user_id = $moment->user_id; $content = $user->nickname . '点赞了你的动态'; $userService = new UserService($this->sms); $userService->sendNotice($moment_user_id, $user->id, 'moment', $content, $content, $moment_id); // $result = $this->sendAttachMsg($moment_id, 'moment', $content, $user->id, $moment->user_id, $user->app_avatar); SendIMPushMsg::dispatch($moment_id, 'moment', $content, $user->id, $moment->user_id, $user->app_avatar)->onQueue('love'); //公众号通知 $this->sendMomentNotice('like', $moment, $user, $moment->user); } return ['code' => 0, 'isLkerMoment' => true]; } } catch (\Exception $e) { $this->getError($e); return false; } } public function sendAttachMsg($type_id, $type, $content, $from, $to, $image) { $body = "点击查看>>"; //发送评论自定义系统消息 $im_service = new IMService(); $attach = ["myattach" => $content, $type . '_id' => $type_id]; $payload = [ "apsField" => [ "alert" => [ "title" => $content, "body" => $body, ], "mutable-content" => 1 ], "hwField" => [ "click_action" => [ "type" => 1, "intent" => "intent://com.huawei.codelabpush/deeplink?id=" . $type_id . "&customType=" . $type . "#Intent;scheme=pushscheme;launchFlags=0x4000000;end", ], "title" => $content, "body" => $body, ], "oppoField" => [ "click_action_type" => 1, "click_action_activity" => "com.oppo.codelabpush.intent.action.test", "action_parameters" => [ "id" => $type_id, "customType" => "moment", ], ], "apnsText" => $body, "pushTitle" => $content, "customType" => $type, "content" => $body, "media_image" => $image, "media_type" => 'image', "id" => $type_id, "type" => $type, 'passThrough' => 1, ]; $result = $im_service->sendAttachMsg($from, 0, $to, json_encode($attach), $content, $payload); return true; } /** * 是否点赞动态 * @param [type] $user_id [description] * @param [type] $moment_id [description] * @return boolean [description] */ public function isLkerMoment($moment) { return Auth::guard('api')->user()->hasLiked($moment); } /** * 动态点赞者 * @param [type] $moment_id [description] * @return [type] [description] */ public function momentLikerCount($moment) { $count = $moment->likers->count(); return $count; } /** * 动态点赞者 * @param [type] $moment_id [description] * @return [type] [description] */ public function momentLikers($moment_id) { try { $moment = Moment::find($moment_id); if (empty($moment)) return ['code' => 1, 'msg' => '该动态已被删除']; $users = $moment->likers()->orderBy('followables.created_at', 'desc')->select('id', 'nickname', 'sex', 'photo', 'app_avatar', 'type', 'is_photo_audited')->get(); $moment->updateCacheMomentLikeNumV2(count($users)); foreach ($users as $user) { $user->photo = $user->userAvatar(); $user->like_time = $user->pivot->created_at->toDateTimeString(); unset($user->pivot, $user->app_avatar); } return $users; } catch (\Exception $e) { $this->getError($e); return false; } } /** * 评论动态 * @param [type] $request [description] * @param [type] $user_id [description] * @param [type] $moment_id [description] * @return [type] [description] */ public function commentMoment($moment_id) { try { $user = auth()->user(); $moment = Moment::find($moment_id); if (empty($moment)) return ['code' => 1, 'msg' => '该动态已删除']; $comment = request()->input('comment'); $reply_id = request()->input('reply_id'); $result = $this->userCon->isBlacklist($user->id, $moment->user_id); if ($result) { if ($result == 1) return ['code' => 1, 'msg' => '您已经被对方拉入黑名单']; if ($result == 2) return ['code' => 1, 'msg' => '您已经将对方拉入黑名单']; } $black_ids = LinkingBlacklist::where('user_id', $moment->user_id)->pluck('other_user_id')->toArray(); if (in_array($user->id, $black_ids)) return ['code' => 1, 'msg' => '你已被该用户拉黑,无法评论']; //未完善资料 $res = $this->userCon->isCompleteProfile($user->id); if (empty($res)) return ['code' => 1, 'msg' => '评论失败,请先完善资料']; $comment = $user->comment($moment, $comment); if ($user->id != $moment->user_id) { //通知 $moment_user_id = $moment->user_id; $content = $user->nickname . '评论了你的动态'; $userService = new UserService($this->sms); $userService->sendNotice($moment_user_id, $user->id, 'moment', $content, $content, $moment_id); $rec_user_id = $moment->user_id; //发送评论自定义系统消息 // $result = $this->sendAttachMsg($moment_id, 'moment', $content, $user->id, $moment->user_id, $user->app_avatar); SendIMPushMsg::dispatch($moment_id, 'moment', $content, $user->id, $rec_user_id, $user->app_avatar)->onQueue('love'); $this->sendMomentNotice('comment', $moment, $user, $moment->user); } if ($reply_id) { //通知 $content = $user->nickname . '回复了你的评论'; $userService = new UserService($this->sms); $userService->sendNotice($reply_id, $user->id, 'moment', $content, $content, $moment_id); $rec_user_id = $reply_id; //发送评论自定义系统消息 // $result = $this->sendAttachMsg($moment_id, 'moment', $content, $user->id, $reply_id, $user->app_avatar); SendIMPushMsg::dispatch($moment_id, 'moment', $content, $user->id, $rec_user_id, $user->app_avatar)->onQueue('love'); if ($user->id != $moment->user_id) { $this->sendMomentNotice('reply_comment', $moment, $user, $moment->user); } } $moment->updateCacheMomentCommentNum('ADD'); return $comment; } catch (\Exception $e) { $this->getError($e); return false; } } /** * 动态评论列表 * @param [type] $moment_id [description] * @return [type] [description] */ public function momentComments($moment_id, $limit = 0, $nopage = 0) { $moment = Moment::find($moment_id); $comments = $moment->comments(); if ($nopage) { $comments = $comments->limit($limit)->orderBy('id', 'desc')->get(); } else { $comments = $comments->orderBy('id', 'desc')->paginate(); } foreach ($comments as $comment) { $comment->user = User::where('id', $comment->commented_id)->select('id', 'nickname', 'app_avatar', 'photo', 'sex')->first(); if ($comment->user) { $comment->user->photo = $comment->user->userAvatar(); } } return $comments; } /** * 动态评论数量 * @param [type] $moment_id [description] * @return [type] [description] */ public function momentCommentCount($moment) { $count = $moment->comments()->count(); return $count; } /** * 用户动态列表 * @param [type] $user_id [description] * @return [type] [description] */ public function userMoments($user_id) { $moments = Moment::where('user_id', $user_id)->with('user.profileCourtship', 'topic', 'user', 'vote:id,title')->orderBy('id', 'desc')->paginate(); foreach ($moments as $moment) { $this->momentDetail($moment); } return $moments; } /** * 话题列表 * @return [type] [description] */ public function topics($request, $type = 'user') { try { $unlike_moment_id = []; if ($type == 'user') { $user_id = Auth::guard('api')->user()->id; //不喜欢的动态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(); $topics = MomentTopic::where('is_show', 1) ->with([ 'momentTopicsActivities' => function ($q) { $date = date('Y-m-d H:i:s'); $q->where('start_time', '<=', $date); $q->where('end_time', '>=', $date); } ]) ->orderBy('sort', 'desc')->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); }); } ]); $date = date('Y-m-d H:i:s'); $topics = $topics->where('start_time', '<=', $date); $topics = $topics->where('end_time', '>', $date); if ($request->keyword) { $topics = $topics->where('name', 'like', '%' . $request->keyword . '%')->orderBy('is_hot', 'desc'); } if ($request->is_hot) { $topics = $topics->where('is_hot', 1); } //比较版本号 // $ios_version = $request->header('app-version', '1.0.0'); // $and_version = $request->header('version-name', '1.0.0'); // if(!$this->contrastVersion($ios_version, '1.3.8') && !$this->contrastVersion($and_version, '1.3.13')){ // $topics = $topics->orderBy('id', 'desc')->get(); // }else{ // $topics = $topics->orderBy('id', 'desc')->paginate(); // } if ($request->input('nopage')) { $topics = $topics->orderBy('sort', 'desc')->get(); } else { $topics = $topics->orderBy('sort', 'desc')->paginate(); } return $topics; } catch (\Exception $e) { return false; } } /** * 话题列表 * @return [type] [description] */ public function topicsV2($request, $type = 'user') { try { $user_id = null; $unlike_moment_id = []; $belief = null; if ($type == 'user') { $user = Auth::guard('api')->user(); $user_id = $user->id; $belief = $user->belief; //不喜欢的动态id // $unlike_moment_id = UnlikeMomentLog::where('user_id', $user_id)->pluck('moment_id')->toArray(); } $topics = MomentTopic::where('is_show', 1)->orderBy('sort', 'desc') ->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, $belief, $user_id) { $query->whereHas('user', function ($q) use ($belief) { $q->where('hidden_profile', 'NONE'); if ($belief) { if ($belief == '基督教') { $q->where('belief', $belief); } else { $q->where('belief', '<>', '基督教'); } } }); $query->where(function ($sql) use ($unlike_moment_id, $belief) { $sql->where('is_audited', 1); // ->whereNotIn('id', $unlike_moment_id); })->orWhere(function ($sql) { $sql->where('user_id', auth()->id())->where('is_audited', 0); }); if ($user_id) { $query->whereDoesntHave("unlikeMoments", function ($sql) use ($user_id) { $sql->where("user_id", $user_id); }); } } ]); $date = date('Y-m-d H:i:s'); $topics = $topics->where('start_time', '<=', $date); $topics = $topics->where('end_time', '>', $date); if ($request->keyword) { $topics = $topics->where('name', 'like', '%' . $request->keyword . '%')->orderBy('is_hot', 'desc'); } if ($request->is_hot) { $topics = $topics->where('is_hot', 1); } if ($request->input('nopage')) { $topics = $topics->orderBy('id', 'desc')->get(); } else { $topics = $topics->orderBy('id', 'desc')->paginate(); } return $topics; } catch (\Exception $e) { return false; } } //比较版本号 public function contrastVersion($version, $other_version) { $version = explode('.', $version); $other_version = explode('.', $other_version); if ($version[0] > $other_version[0]) { return true; } if ($version[0] < $other_version[0]) { return false; } if ($version[0] == $other_version[0]) { if ($version[1] > $other_version[1]) { return true; } if ($version[1] < $other_version[1]) { return false; } if ($version[1] == $other_version[1]) { if ($version[2] > $other_version[2]) { return true; } else { return false; } } } } /** * 举报动态 * @param [type] $moment_id [description] * @return [type] [description] */ public function complaintMoment($moment_id) { try { $moment = Moment::find($moment_id); $label = request()->input('label'); $content = request()->input('content'); $photos = json_encode(request()->input('photos', [])); if (empty($label)) return ['code' => 1, 'msg' => '请选择举报类型']; if (empty($moment)) return ['code' => 1, 'msg' => '要举报的动态不存在']; if (request()->input('photos', []) == [] || empty(request()->input('photos', []))) { return $this->failure('请提供举报截图'); } ComplaintHistory::create([ 'user_id' => auth()->id(), 'complaint_id' => $moment_id, 'type' => 'moment', 'content' => $content, 'label' => $label, 'photos' => $photos ]); //通知人 $user = auth()->user(); $mobiles = Redis::smembers('repot_notice_mobile'); $param['message'] = $user->nickname . ' 举报了动态:' . $moment->content; foreach ($mobiles as $mobile) { $param['mobile'] = $mobile; SendEasySms::dispatch($param)->onQueue('love'); } return true; } catch (\Exception $e) { $this->getError($e); return false; } } public function auditedMoment($moment_id) { try { \DB::beginTransaction(); $moment = Moment::find($moment_id); $is_audited = request()->input('is_audited', 0); $reason = request()->input('reason'); $moment->is_audited = $is_audited; $moment->reason = $reason; $moment->save(); $result = $this->sendMomentCoin($moment); if (empty($result)) throw new \Exception("赠送福币失败", 1); // if($moment->topic_id){ // Topic::where('id', $moment->topic_id)->increment('quote_num'); // } \DB::commit(); return $moment; } catch (\Exception $e) { \DB::rollback(); $this->getError($e); return false; } } public function sendMomentCoin($moment) { try { $start_time = date('Y-m-d 00:00:00'); $end_time = $moment->created_at->toDateTimeString(); //是否是当天首次发布 $count = Moment::where('user_id', $moment->user_id)->where(function ($sql) { $sql->whereNotNull('aliyun_video_id')->orWhere('photos', '<>', '[]'); })->whereBetween('created_at', [$start_time, $end_time])->count(); if ($count != 1) return true; //审核通过,赠送福币 $user = User::find($moment->user_id); if (empty($user)) throw new \Exception("没有发布者", 1); $coin = 0; if (count(json_decode($moment->photos, true))) { $coin = 2; } elseif ($moment->aliyun_video_id) { $coin = 4; } $log = CoinLog::where([ 'user_id' => $user->id, 'type' => 'RECMOMENT', 'type_id' => $moment->id, ])->first(); if ($coin && $moment->is_audited == 1 && empty($log)) { $user->updateCoinInfo('add', $coin, 'other'); $user->addCoinLog('RECMOMENT', $moment->id, $coin); //通知 } return true; } catch (\Exception $e) { $this->getError($e); return false; } } public function unlikeMoment($moment_id) { try { $user = auth()->user(); $user->unlikeMomentLogs()->create([ 'moment_id' => $moment_id, ]); return true; } catch (\Exception $e) { $this->getError($e); return false; } } //评论详情 public function comments($request) { $user = auth()->user(); switch ($request->type) { case 'moment': $type = 'App\Models\Moment'; break; case 'vote': $type = 'App\Models\App\Vote'; break; default: $type = 'App\Models\Moment'; break; } if ($request->nopage) { $comments = Comment::select('id', 'commentable_id', 'commentable_type', 'commented_id', 'reply_id', 'commented_type', 'comment', 'created_at', 'updated_at')->where('commentable_id', $request->id)->where('commentable_type', $type)->where('commented_type', 'App\Models\User')->orderBy('id', 'desc')->get(); } else { $comments = Comment::select('id', 'commentable_id', 'commentable_type', 'commented_id', 'reply_id', 'commented_type', 'comment', 'created_at', 'updated_at')->where('commentable_id', $request->id)->where('commentable_type', $type)->where('commented_type', 'App\Models\User')->orderBy('id', 'desc')->paginate(); } foreach ($comments as $comment) { if (!empty($comment)) { //是不是本人评论 $comment->publish = $comment->commented_id == $user->id ? 1 : 0; $comment->user = User::select('id', 'nickname', 'app_avatar', 'photo', 'circle_avatar', 'sex', 'type', 'is_photo_audited')->where('id', $comment->commented_id)->first(); $comment->replyer = User::select('id', 'nickname', 'app_avatar', 'photo', 'circle_avatar', 'sex', 'type', 'is_photo_audited')->where('id', $comment->reply_id)->first(); $comment->likerCount = $this->modelLikeCount($comment); $comment->isLker = $this->isLkerModel($comment); } } return $comments; } //点赞者 public function liker($request) { switch ($request->type) { case 'moment': $result = $this->momentLikers($request->id); break; case 'vote': $vote = Vote::find($request->id); if (empty($vote)) throw new \Exception("投票不存在", 1); $result = $this->modelLikers($vote); break; default: $result = $this->momentLikers($request->id); break; } return $result; } //带投票的动态 public function momentVotes($request) { $user_id = auth()->id(); $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); $moments = $this->moments($limit); $moments = $moments->toArray(); foreach ($moments['data'] as &$val) { $val['type'] = 'moment'; } //动态里面插入投票 foreach ($votes as $key => $vote) { $vote = $this->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 $moments; } //投票 public function vote($vote_id) { $user_id = auth()->id(); $vote = Vote::with('option')->where('id', $vote_id)->first(); //点赞数 $vote->momentLikerCount = $this->modelLikeCount($vote); //评论数 $vote->momentCommentCount = $this->modelCommentCount($vote); //是否点赞 $vote->isLkerMoment = $this->isLkerModel($vote); //总投票数 $vote_user_count = UserVote::where('vote_id', $vote_id)->count(); //是否投票过 $has_vote = UserVote::where('vote_id', $vote_id)->where('user_id', $user_id)->first(); $vote->is_vote = !empty($has_vote) ? 1 : 0; $vote->type = 'vote'; if (!empty($has_vote)) { foreach ($vote->option as &$val) { $count = UserVote::where('option_id', $val->id)->count(); $val->rate = sprintf("%.3f", $count / $vote_user_count); $val->count = $count; $val->checked = $val->id == $has_vote->option_id ? 1 : 0; } } return $vote; } //某个对象的点赞数 public function modelLikeCount($model) { $count = $model->likers ? $model->likers->count() : 0; return $count; } public function modelCommentCount($model) { $count = $model->comments()->count(); return $count; } public function isLkerModel($model) { return auth()->user()->hasLiked($model); } //点赞对象 public function likeModel($model) { try { $user = auth()->user(); if ($user->hasLiked($model)) { //取消点赞 $user->unlike($model); return ['code' => 0, 'isLker' => false]; } else { //点赞 $user->like($model); //消息推送 switch ($model->commentable_type) { case 'App\Models\App\Vote': $notice_model = Vote::find($model->commentable_id); break; case 'App\Models\Moment': $notice_model = Moment::find($model->commentable_id); $black_ids = LinkingBlacklist::where('user_id', $notice_model->user_id)->pluck('other_user_id')->toArray(); if (in_array($user->id, $black_ids)) return ['code' => 1, 'msg' => '你已被该用户拉黑,无法点赞']; break; default: break; } if (!empty($notice_model)) { $this->interactNotice($model, $notice_model, 'like'); } return ['code' => 0, 'isLker' => true]; } } catch (\Exception $e) { $this->getError($e); return false; } } //评论对象 public function commentModel($model) { try { $user = auth()->user(); $comment = request()->input('comment'); $reply_id = request()->input('reply_id'); $comment = $user->comment($model, $comment); if ($reply_id) { $this->interactNotice($comment, $model, 'reply'); } return $comment; } catch (\Exception $e) { $this->getError($e); return false; } } //对象点赞者 public function modelLikers($model) { try { $users = $model->likers()->orderBy('followables.created_at', 'desc')->select('id', 'nickname', 'sex', 'photo', 'app_avatar')->get(); foreach ($users as $user) { $user->photo = $user->userAvatar(); $user->like_time = $user->pivot->created_at->toDateTimeString(); unset($user->pivot, $user->app_avatar); } return $users; } catch (\Exception $e) { $this->getError($e); return false; } } //评论互动通知 public function interactNotice($model, $notice_model, $type) { $user = auth()->user(); $table = str_replace('s', '', $notice_model->getTable()); switch ($type) { case 'like': $type = '点赞'; if ($user->id != $model->commented_id) { //通知 $content = $user->nickname . $type . '了你的评论'; $userService = new UserService($this->sms); $userService->sendNotice($model->commented_id, $user->id, $table, $content, $content, $model->commentable_id); //发送评论自定义系统消息 // $result = $this->sendAttachMsg($model->commentable_id, $table, $content, $user->id, $model->commented_id, $user->app_avatar); SendIMPushMsg::dispatch($model->commentable_id, $table, $content, $user->id, $model->commented_id, $user->app_avatar)->onQueue('love'); } break; case 'reply': $type = '回复'; $reply_id = request()->input('reply_id'); if ($user->id != $reply_id) { //通知 $content = $user->nickname . $type . '了你的评论'; $userService = new UserService($this->sms); $userService->sendNotice($reply_id, $user->id, $table, $content, $content, $model->commentable_id); //发送评论自定义系统消息 // $result = $this->sendAttachMsg($model->commentable_id, $table, $content, $user->id, $reply_id, $user->app_avatar); SendIMPushMsg::dispatch($model->commentable_id, $table, $content, $user->id, $reply_id, $user->app_avatar)->onQueue('love'); } break; default: break; } return true; } //获取阿里云点播视频信息 public function getVodInfo($video_id) { $access_key_id = config('aliyun.aliyun_vod_access_key_id'); $access_key_secret = config('aliyun.aliyun_vod_access_key_secret'); AlibabaCloud::accessKeyClient($access_key_id, $access_key_secret) ->regionId('cn-shanghai') ->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product('vod') // ->scheme('https') // https | http ->version('2017-03-21') ->action('GetMezzanineInfo') ->method('POST') ->host('vod.cn-shanghai.aliyuncs.com') ->options([ 'query' => [ 'RegionId' => "cn-shanghai", 'VideoId' => $video_id, 'AdditionType' => "video", ], ]) ->request(); return $result->toArray(); } catch (ClientException $e) { $this->getError($e); return false; } catch (ServerException $e) { $this->getError($e); return false; } } public function sendNotice($user_id, $send_user_id, $type, $content, $message = '', $type_id = 0) { $data = [ 'user_id' => $user_id, 'send_user_id' => $send_user_id, 'type' => $type, 'type_id' => $type_id, 'content' => $content, 'message' => $message, 'status' => 0, ]; $notice = Notice::where('user_id', $user_id)->where('send_user_id', $send_user_id)->where('type', $type)->where('type_id', $type_id)->orderBy('id', 'desc')->first(); if ($notice && $type == 'follow') { $notice->update($data); } else { $notice = Notice::create($data); } return $notice; } /**根据动态话题的ID,判断是否存在话题活动,如果存在,则领取会员天数 */ public function participateMomentToplicActivities($moment) { $topic_id = $moment->topic_id; } }