posts_id, 0)); $user_id = $request->uid; if(_empty_($posts_id) || _empty_($user_id)){ return $this->fail(200001); } $posts_id = _abs($posts_id); if(!UserUtils::is_user_can_speak($user_id)){ return $this->fail(200043, [ 'title' => '禁言中,无法言论', 'content' => '是否前往解除限制', 'confirmText' => '去解除', 'target_type' => 6, 'target_id' => '/pagesA/mine/unlock/unlock?user_id='.$user_id ], '您当前处于禁言期间,无法言论'); } $user = WxUser::find($user_id); if(_empty_($user)){ return $this->fail(200000, [], '用户不存在'); } // if(mb_strlen( str_replace( [Settings::get('default_user_name', '微信用户'), '微信用户', '普通用户'], '', $user->user_name )) != mb_strlen($user->user_name)){ // return $this->fail(200041); // } if(Settings::get('sticky_comment_force_bind_phone', 0, true) == 1){ if(_empty_($user->phone) && _empty_($__MINI_GLOBAL_CURRENT_PLAYER_ID__)){ return $this->fail(200043, [ 'title' => '未绑定手机号', 'content' => '前往绑定', 'confirmText' => '去绑定', 'target_type' => 6, 'target_id' => '/pagesA/mine/editmine/editmine?phone=1' ], '未绑定手机号'); } } if(Settings::get('sticky_comment_force_real_name', 0, true) == 1){ if(_empty_($user->real_name) && _empty_($__MINI_GLOBAL_CURRENT_PLAYER_ID__)){ return $this->fail(200043, [ 'title' => '未实名认证', 'content' => '您还没有实名认证,是否前往认证', 'confirmText' => '去认证', 'target_type' => 6, 'target_id' => '/pagesA/mine/realname/realname' ], '未实名认证'); } } $force_university = Settings::get('sticky_comment_force_university', [], true); if(!_empty_($force_university)){ if(_empty_($user->university)){ return $this->fail(200043, [ 'title' => '未学生认证', 'content' => '您还没有学生认证,是否前往认证', 'confirmText' => '去认证', 'target_type' => 6, 'target_id' => '/pagesA/attestation/attestation' ], '未学生认证'); }else{ if(!in_array('-1', $force_university)){ $student_certify = WxUserStudentCertify::find($user->id); if($student_certify){ if(!in_array($student_certify->sid, $force_university)){ return $this->fail(200000, [], '仅“'.Settings::get('sticky_comment_force_university_tip', '', true).'”可发布'); } } } } } if(Settings::get('sticky_comment_force_subscribe_mp', 0, true) == 1){ if(_empty_($user->weixin_mp_openid) && _empty_($__MINI_GLOBAL_CURRENT_PLAYER_ID__)){ $weapp = new WeApp('mp'); $mpServicer = $weapp->getMpServicer(); try { $url = $mpServicer->getQrCodeWithPara(0, 'user:bind:'.$user->id); }catch (\Exception $e){ return $this->fail(200006, [], '生成公众号二维码失败,请检查[全局配置-支付-微信-公众号]'); } if($url){ $qrCode = QrCode::format('png')->size(300)->generate($url); $image = Image::make($qrCode); $image->resizeCanvas(300, 300 + 60, 'bottom', false, '#ffffff'); // 增加高度,保持宽高比,背景色为白色 $mp_app_name = Settings::get('mp_app_name', ''); $text_tip = '关注'.$mp_app_name.'公众号,可以更方便通知到您'; if(mb_strlen($mp_app_name) > 4){ $text_tip = '关注'.$mp_app_name.'公众号'; } $image->text($text_tip, 150, 40, function($font){ $font->file(public_path('storage/font/DingTalk_JinBuTi_Regular.ttf')); // 字体文件路径 $font->size(13); // 字体大小 $font->color('#000000'); // 字体颜色 $font->align('center'); // 水平对齐 $font->valign('top'); // 垂直对齐 }); $base64 = 'data:image/png;base64,' . base64_encode($image->encode('png')->getEncoded()); return $this->fail(200043, [ 'title' => '未关注公众号,无法实时获取通知', 'content' => '前往关注', 'confirmText' => '去关注', 'target_type' => 26, 'target_id' => $base64 ], '未关注公众号'); } } } if(Cache::has('user:comment:cahce:'.$user_id)){ return $this->fail(200027); } _limit_user('add:comment', $user_id, 16); $reply_user_id = $request->input('reply_user_id', 0); $comment_id = $request->input('comment_id', ''); $comment_content = trim($request->comment_content ?? ''); $comment_img_url = trim($request->comment_img_url); if(_empty_($request->giveCoin)){ $giveCoin = 0; }else{ $giveCoin = (int)($request->giveCoin); } $is_anonymous = _empty_default_($request->input('is_anonymous', 0), 0) == 1 ? 1 : 0; if($is_anonymous == 1 && Settings::get('app_vip_anonymous_only', 0) == 1){ if($user->is_member){ }else{ return $this->fail(200043, [ 'title' => '仅会员可用', 'content' => '匿名属于会员特权,是否前往开通', 'confirmText' => '前往开通', 'target_type' => 6, 'target_id' => '/pagesA/mine/members/members' ], '仅会员可用'); } } $device = in_array($request->header('device',''), ['app', 'h5', 'mp', 'pc']) ? $request->header('device','') : ''; if($giveCoin == 0){ if(_empty_($comment_content) && _empty_($comment_img_url)){ return $this->fail(200001, [], '评论没有文字及图片'); } if(UserUtils::user_permissions_check_by_config($user_id, 'audit_comment_white_list')){ $need_manual_review = false; }else{ // 百度审核 $need_manual_review = true; $is_audit_comment = Settings::get('is_audit_comment', 0); if ($is_audit_comment == 2) { $filter_result = BaiduUtils::text_filter($comment_content); if($filter_result){ if($filter_result['hit_level'] == 2){ // 不合规 return $this->fail(200016, ['tip'=>$filter_result['tip_list'], 'hit_word'=>$filter_result['hit_word']]); }else if($filter_result['hit_level'] == 0){ // 审核通过 $need_manual_review = false; } } }else if($is_audit_comment == 0){ $need_manual_review = true; }else{ $need_manual_review = false; } } // 0:审核中,1:审核通过,2:驳回 $comment_state = 1; if($need_manual_review){ $comment_state = 0; } }else{ $res_arr = UserUtils::give_coins($user_id, $giveCoin, $posts_id, $comment_id, $reply_user_id); if($res_arr['code'] != 200){ return $this->fail($res_arr['code'], [], $res_arr['msg']); } $comment_state = 1; $comment_content = ' 投了'.$giveCoin.'枚'.Settings::get('app_coin_name', '硬币'). ''; } $r = WxCommentRepositores::add($posts_id, $comment_id,$reply_user_id, $user_id, $comment_content, $comment_img_url, $comment_state, $device, $is_anonymous); if($r){ if($comment_img_url){ Utils::image_state_change([$comment_img_url], 1); } Redis::sadd('realtime:post:set', $posts_id); Redis::sadd('post:popular:comment:set', $posts_id); Cache::put('user:comment:cahce:'.$user_id, 1, 10); UserInputSafeCheckJob::dispatch($user_id, $comment_content); $tmplIds = []; if($device == 'mp'){ $comment_reply_id = Settings::get('mini_template_message_comment_reply', ''); if(!_empty_($comment_reply_id)){ $tmplIds[] = $comment_reply_id; } } if($comment_state == 1){ if($giveCoin > 0){ SubscribeMessageJob::dispatch('gicecoin', $r); return $this->success(['comment_id'=>$r, 'tip'=>$res_arr['msg']]); }else{ CalculateCommentLikesNumJob::dispatch($r); if($comment_id && $comment_id > 0){ CalculateCommentLikesNumJob::dispatch($comment_id); } $circle_id = WxPost::where('id', $posts_id)->value('circle_id'); if($circle_id && $circle_id > 0){ ImitateCircleJoinStepJob::dispatch($circle_id, mini_rand(1, 100) <= 30 ? mini_rand(1, 2) : 0)->delay(now()->addMinutes(mini_rand(1, 20))); } SubscribeMessageJob::dispatch('comment_add', $r); if($comment_id > 0){ SubscribeMessageJob::dispatch('comment_reply', $r); } $msg = UserUtils::reward_user_coin($user_id, 'comment'); if($msg){ UserUtils::assistant_notice($user_id, '您的评论(id:'.$r.')审核已通过,并获得评论奖励:'.$msg); return $this->success(['comment_id'=>$r, 'tip'=>'您的评论审核已通过,并获得评论奖励:'.$msg, 'tmplIds'=>$tmplIds]); }else{ return $this->success(['comment_id'=>$r, 'tip'=>'您的评论审核已通过', 'tmplIds'=>$tmplIds]); } } }else{ // UserUtils::assistant_notice('admin', '有新发布的评论待审核,(id:进入笔记)'); UserUtils::assistant_notice_review(102, $r); } return $this->success(['comment_id'=>$r, 'tip'=>'评论成功,我们将尽快为您审核', 'tmplIds'=>$tmplIds]); }else{ return $this->fail(200002); } } /** * 通过笔记获取评论列表 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function getCommentByPostsId(Request $request) { $posts_id = $request->posts_id; $uid = $request->uid; $comments = WxCommentRepositores::getCommentByPostsId($posts_id, $uid); return $this->success($comments); } /** * 通过评论id获取评论列表 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function getCommentByCommentId(Request $request) { $uid = $request->uid; $comment_id = $request->comment_id; $begin_id = $request->begin_id; if(_empty_($begin_id)){ $begin_id = 0; } $childData = WxComment::where('comment_id', $comment_id)->where('comment_state', 1)->where('id', '>', $begin_id) ->orderBy('id', 'asc')->simplePaginate(10, FieldUtils::commentInfoColums()); if($childData){ $childData->map(function ($item) use ($uid) { $imgList = array(); $item->comment_img_url = Utils::imgWithStyle($item->comment_img_url); if($item->comment_img_url){ array_push($imgList, ['img_url' => $item->comment_img_url]); } $item->is_like = WxCommentLike::where('comment_id', $item->id)->where('user_id', $uid)->exists(); $item->like_count = WxCommentLike::where('comment_id', $item->id)->count(); $item->imgList = $imgList; $item->user = UserUtils::get_cached_user($item->user_id); $item->comment_content_raw = strip_tags(_mini_phone(_mini_emoji(_mini_aite_replace($item->comment_content, true), true), true)); $sub_allowable = []; if($uid > 0){ if($uid != $item->user_id) { $sub_allowable[] = [ 'text' => '举报', 'type' => 'report', 'id' => $item->id, 'icon' => 'mini-icon mini-jinggao' ]; } if($uid == $item->user_id || UserUtils::is_mini_admin($uid)){ $sub_allowable[] = [ 'text' => '删除', 'type' => 'delete', 'id' => $item->id, 'icon' => 'mini-icon2 mini-shanchu' ]; } } $sub_allowable[] = [ 'text' => '复制', 'type' => 'copy', 'id' => $item->id, 'raw' => $item->comment_content_raw, 'icon' => 'mini-icon mini-fuzhi' ]; $item->allowable = $sub_allowable; CommentUtils::anonymousProcess($item); }); $childData->append(['format_time', 'ip_address']); return $this->success($childData); } return $this->fail(200003, [], '没有更多回复了'); } /** * 点赞评论 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function commentAddLike(Request $request) { $uid = $request->uid; $comment_id = $request->comment_id; if(_empty_($comment_id)){ return $this->fail(200001); } $res = CommentUtils::comment_like($uid, $comment_id); if($res > 0){ return $this->success([],416003); } return $this->fail(200006); } /** * 删除评论 * @param Request $request */ public function delComment(Request $request) { $commentId = $request->id; $uid = $request->uid; $WxComment = WxComment::where('id',$commentId)->first(); $posts_id = $WxComment->posts_id; if(_empty_($WxComment)){ return $this->fail(200003); } $comment_user_id = $WxComment->user_id; // 权限验证 if(!UserUtils::is_mini_admin($uid) && !($uid == $comment_user_id)){ return $this->fail(200000, [], '删个屁啊,你都没有权限删除'); } $comment_img_url = $WxComment->value('comment_img_url'); if(false && $uid == $comment_user_id){ WxComment::where('id', $commentId) ->update(['comment_content' => '(该评论已被自己删除)','comment_img_url' => '']); }else{ WxComment::where('id',$commentId)->forceDelete(); Cache::forget('post:commentCount:'.$posts_id); } // WxComment::where('comment_id',$commentId)->delete(); if($comment_img_url){ Utils::image_state_change([$comment_img_url], 0); } $popular_comment = json_decode(Cache::get('post:popular:comment:'.$posts_id, '[]'), true); if(_array_key($popular_comment, 'id', 0) == $WxComment->id){ Cache::forget('post:popular:comment:'.$posts_id); Redis::sadd('post:popular:comment:set', $posts_id); } return $this->success(); } /** * 置顶评论 * @param Request $request */ public function stickyComment(Request $request) { $commentId = $request->id; $uid = $request->uid; // 权限验证 管理员+文章作者 if(!UserUtils::is_mini_admin($uid) && !(CommentUtils::get_comment_post_author($commentId) == $uid)){ return $this->fail(200000, [], '你既不是管理员,也不是文章作者,你置顶个什么劲'); } $comment = WxComment::find($commentId); if($comment){ if($comment->is_sticky){ $comment->is_sticky = 0; $r = $comment->save(); }else{ $comment->is_sticky = 1; $r = $comment->save(); } }else{ return $this->fail(200003); } if($r){ return $this->success(); }else{ return $this->fail(200002); } } }