xielin vor 5 Jahren
Ursprung
Commit
44cb3ebadd

+ 61 - 1
app/Http/Controllers/V1/CircleController.php

@@ -15,6 +15,7 @@ use App\Repositories\Circle\CircleRepository;
 use App\Traits\UserTrait;
 use App\Transformers\Circle\ArticleListTransformer;
 use App\Transformers\Circle\CircleMemberTransformer;
+use App\Transformers\Circle\CommentTransformer;
 use App\Transformers\Circle\DetailTransformer;
 use App\Transformers\Circle\MessageListTransformer;
 use App\Transformers\Circle\QuestionTransformer;
@@ -235,8 +236,19 @@ class CircleController extends Controller
         return jsonSuccess($data);
     }
 
+    /**
+     * 提问列表
+     * @param Request $request
+     * @return array
+     */
     public function messageList(Request $request)
     {
+        $userInfo = $this->getUserInfo();
+        if ($userInfo) {
+            $uid = $userInfo['uid'];
+        } else {
+            $uid = 0;
+        }
         $validator = Validator::make($request->all(), [
             'id' => 'required|exists:interest_circles'
         ]);
@@ -245,7 +257,7 @@ class CircleController extends Controller
         }
         $list = $this->circleMessageRepository->lists($request->all());
         $fractal = new Manager();
-        $resource = new Collection($list, new MessageListTransformer());
+        $resource = new Collection($list, new MessageListTransformer($uid));
         $resource->setPaginator(new IlluminatePaginatorAdapter($list));
         $data = $fractal->createData($resource)->toArray();
 
@@ -266,4 +278,52 @@ class CircleController extends Controller
         }
         return $this->circleMessageRepository->create($request->all());
     }
+
+    /**
+     * 评论&回复
+     */
+    public function comment(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'circle_id' => 'required|integer',
+            'msg_id' => 'required|integer',
+            'content' => 'required|string|max:150',
+        ]);
+        if ($validator->fails()) {
+            return jsonError($validator->errors()->first());
+        }
+        return $this->circleMessageRepository->createComment($request->all());
+    }
+
+    /**
+     * 评论列表
+     */
+    public function commentList(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'msg_id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return jsonError($validator->errors()->first());
+        }
+        $exists = $this->circleMessageRepository->detail($request['msg_id']);
+        if (!$exists) {
+            return jsonError('内容飞走了');
+        }
+        $userInfo = $this->getUserInfo();
+        if ($userInfo) {
+            $uid = $userInfo['uid'];
+        }else{
+            $uid = 0;
+        }
+        $list = $this->circleMessageRepository->commentList($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($list, new CommentTransformer($request['msg_id'], $uid));
+        $resource->setPaginator(new IlluminatePaginatorAdapter($list));
+        $data = $fractal->createData($resource)->toArray();
+
+        $commentCount = $this->circleMessageRepository->getCommentCount($request['msg_id']);
+        return jsonSuccess($data, '成功', ['comment_count' => $commentCount]);
+    }
+
 }

+ 135 - 1
app/Repositories/Circle/CircleMessageRepository.php

@@ -28,6 +28,7 @@ use Illuminate\Support\Facades\Redis;
 class CircleMessageRepository
 {
     use UserTrait;
+
     public function __construct(InterestCircle $interestCircle,
                                 InterestCircleMessage $interestCircleMessage,
                                 InterestCircleMessageImg $interestCircleMessageImg,
@@ -44,6 +45,16 @@ class CircleMessageRepository
         $this->detectionService = $detectionService;
     }
 
+    /**
+     * 查询单个提问
+     * @param $id
+     * @return mixed
+     */
+    public function detail($id)
+    {
+        return $this->interestCircleMessage->find($id);
+    }
+
     /**
      * 提问列表
      */
@@ -142,7 +153,7 @@ class CircleMessageRepository
                 }
                 $this->interestCircleMessageImg->insert($imgData);
             }
-            $this->interestCircle->where('id',$request['circle_id'])->increment('message_count');
+            $this->interestCircle->where('id', $request['circle_id'])->increment('message_count');
             DB::commit();
             Log::info('message_create:' . $message->id . ',post_author:' . $message->uid . ',author_ip:' . getClientIp());
             return jsonSuccess();
@@ -152,4 +163,127 @@ class CircleMessageRepository
             return jsonError('发布提问失败,请重试');
         }
     }
+
+    /**
+     * 评论&回复
+     * @param $request
+     * @return array
+     */
+    public function createComment($request)
+    {
+        $userInfo = $this->getUserInfo();
+//        $userInfo['sns_status']=1;
+//        $userInfo['uid']=268;
+//        $userInfo['username']='测试用户';
+//        $userInfo['avatar']='';
+        if (empty($userInfo)) {
+            return jsonError('获取用户信息失败');
+        }
+
+        if (!$userInfo['sns_status']) {
+            return jsonError('您已被禁言');
+        }
+        $isBlack = $this->interestCircleUser->where('circle_id', $request['circle_id'])
+            ->where('uid', $userInfo['uid'])
+            ->where('is_black', 1)->exists();
+        if ($isBlack) {
+            return jsonError('当前状态无法提问,请联系管理员');
+        }
+        $oneHourTime = Carbon::now()->addHours(-1)->toDateTimeString();
+        $oneHourCommentCount = $this->interestCircleMessageComment->where('uid', $userInfo['uid'])->where('created_at', '>', $oneHourTime)->count();
+        if ($oneHourCommentCount > 59) {
+            return jsonError('回复了这么多,休息休息,喝口水吧!');
+        }
+
+        $detectionTextResult = $this->detectionService->checkText($request['content']);
+        if ($detectionTextResult['code'] < 0) {
+            return jsonError('内容违规,请修正哦');
+        }
+
+        $post = $this->interestCircleMessage->find($request['msg_id']);
+        if (!$post) {
+            return jsonError('获取提问信息失败');
+        }
+        $data = [
+            'uid' => $userInfo['uid'],
+            'msg_id' => $request['msg_id'],
+            'parent_id' => 0,
+            'username' => $userInfo['username'],
+            'reply_uid' => 0,
+            'reply_username' => '',
+            'avatar' => $userInfo['avatar'] ?? '',
+            'content' => $request['content'],
+            'is_delete' => 0,
+        ];
+        if (isset($request['parent_id']) && $request['parent_id'] != 0) {
+            $comment = $this->interestCircleMessageComment->find($request['parent_id']);
+            if (!$comment || $comment->msg_id != $post->id) {
+                return jsonError('获取评论信息失败');
+            }
+            if ($comment->parent_id) {
+                return jsonError('只能回复评论');
+            }
+            if ($comment->is_delete) {
+                return jsonError('不能回复已删除评论');
+            }
+            $data['parent_id'] = $request['parent_id'];
+
+            if (isset($request['reply_uid']) && isset($request['reply_username'])) {
+                $data['reply_uid'] = $request['reply_uid'];
+                $data['reply_username'] = $request['reply_username'];
+            } else {
+                $data['reply_uid'] = 0;
+                $data['reply_username'] = '';
+            }
+        }
+
+        DB::beginTransaction();
+        try {
+            $newComment = $this->interestCircleMessageComment->create($data);
+
+            if ($newComment->parent_id) {
+                $this->interestCircleMessageComment->where('id', $newComment->parent_id)->increment('reply_count');
+            }
+
+            DB::commit();
+            if ($newComment->parent_id) {
+                Redis::DEL('circle_message_new_reply_' . $newComment->parent_id);
+            } else {
+                Redis::DEL('circle_message_new_comment_' . $newComment->post_id);
+            }
+            return jsonSuccess(['id' => $newComment->id], '评论成功');
+
+        } catch (QueryException $exception) {
+            DB::rollBack();
+            Log::debug('评论内容失败:' . $exception->getMessage());
+            return jsonError('评论内容失败,请重试');
+        }
+    }
+
+    /**
+     * 评论列表
+     */
+    public function commentList($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+
+        return $this->interestCircleMessageComment
+            ->where('msg_id', $request['msg_id'])
+            ->where('parent_id', 0)
+            ->orderBy('id', 'desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 提问评论数
+     */
+    public function getCommentCount($id)
+    {
+        $commentCount = 0;
+        $post = $this->interestCircleMessage->find($id);
+        if ($post) {
+            $commentCount = $this->interestCircleMessageComment->where('msg_id', $id)->count();
+        }
+        return $commentCount;
+    }
 }

+ 86 - 0
app/Transformers/Circle/CommentTransformer.php

@@ -0,0 +1,86 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/15
+ * Time: 16:40
+ */
+namespace  App\Transformers\Circle;
+
+use App\Models\InterestCircleMessageComment;
+use App\Models\PostComment;
+use App\Traits\PostTrait;
+use App\Traits\UserTrait;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+use League\Fractal\TransformerAbstract;
+
+class CommentTransformer extends TransformerAbstract
+{
+    use UserTrait;
+    use PostTrait;
+    public function __construct($msgId, $uid)
+    {
+        $this->msgId = $msgId;
+        $this->uid = $uid;
+    }
+
+    public function transform(InterestCircleMessageComment $interestCircleMessageComment)
+    {
+        $reply = [];
+        $replyKey = 'circle_message_new_reply_'.$interestCircleMessageComment['id'];
+        $replyData = Redis::GET($replyKey);
+        if($replyData){
+            $reply = json_decode($replyData);
+            foreach($reply as &$item){
+                $item->created_at = Carbon::parse($item->created_at)->diffForHumans();
+            }
+        }else{
+            $replies = InterestCircleMessageComment::where('parent_id', $interestCircleMessageComment['id'])->orderBy('id', 'desc')->limit(2)->get();
+            $redisReply = [];
+            foreach($replies as $val){
+                $userComment = $this->userInfo($val->uid);
+                $replyUsername = '';
+                if($val->reply_uid){
+                    $userReply = $this->userInfo($val->reply_uid);
+                    $replyUsername = $userReply['username'];
+                }
+                $reply[] = [
+                    'id' => $val->id,
+                    'uid' => $val->uid,
+                    'username' => $userComment['username'],
+                    'avatar' => $userComment['avatar'],
+                    'reply_username' => $replyUsername,
+                    'content' => $val->is_delete?'该评论已被删除':$val->content,
+                    'created_at' => Carbon::parse($val->created_at)->diffForHumans(),
+                    'is_delete' => $val->is_delete,
+                ];
+                $redisReply[] = [
+                    'id' => $val->id,
+                    'uid' => $val->uid,
+                    'username' => $userComment['username'],
+                    'avatar' => $userComment['avatar'],
+                    'reply_username' => $replyUsername,
+                    'content' => $val->is_delete?'该评论已被删除':$val->content,
+                    'created_at' => $val->created_at,
+                    'is_delete' => $val->is_delete,
+                ];
+            }
+            Redis::SET($replyKey, json_encode($redisReply));
+            Redis::EXPIRE($replyKey, 604800);
+        }
+        $user = $this->userInfo($interestCircleMessageComment['uid']);
+        return [
+            'id' => $interestCircleMessageComment['id'],
+            'uid' => $interestCircleMessageComment['uid'],
+            'username' => $user['username'],
+            'avatar' => $user['avatar'],
+            'content' => $interestCircleMessageComment['is_delete']?'该评论已被删除':$interestCircleMessageComment['content'],
+            'created_at' => Carbon::parse($interestCircleMessageComment['created_at'])->diffForHumans(),
+            'reply_count' => $interestCircleMessageComment['reply_count'],
+            'reply' => $reply,
+            'is_delete' => $interestCircleMessageComment['is_delete'],
+        ];
+    }
+}

+ 23 - 18
app/Transformers/Circle/MessageListTransformer.php

@@ -11,6 +11,8 @@ namespace App\Transformers\Circle;
 
 use App\Models\InterestCircle;
 use App\Models\InterestCircleMessage;
+use App\Models\InterestCircleMessageComment;
+use App\Models\InterestCircleMessageRecord;
 use App\Models\Post;
 use App\Traits\PostTrait;
 use App\Traits\UserTrait;
@@ -22,11 +24,16 @@ class MessageListTransformer extends TransformerAbstract
 {
     use UserTrait;
 
+    public function __construct($uid)
+    {
+        $this->uid = $uid;
+    }
+
     public function transform(InterestCircleMessage $interestCircleMessage)
     {
         $user = $this->userInfo($interestCircleMessage['uid']);
         $imgs = [];
-        foreach($interestCircleMessage->imgs as $img){
+        foreach ($interestCircleMessage->imgs as $img) {
             $imgs[] = $img['img'];
         }
         return [
@@ -37,48 +44,47 @@ class MessageListTransformer extends TransformerAbstract
             'imgs' => $imgs,
             'good' => $interestCircleMessage['good'],
             'bad' => $interestCircleMessage['bad'],
+            'action' => $this->getAction($this->uid,$interestCircleMessage['id']),
             'comment_count' => $interestCircleMessage['comment_count'],
             'comment' => $this->getNewComment($interestCircleMessage['id']),
         ];
     }
 
+    public function getAction($uid, $msgId)
+    {
+        $info = InterestCircleMessageRecord::where([['uid', $uid], ['msg_id', $msgId]])->first();
+        $status = 0;
+        if ($info && $info->action == 1) {
+            $status = 1;
+        } elseif ($info && $info->action == -1) {
+            $status = -1;
+        }
+        return $status;
+    }
+
     //获取内容最新评论
     public function getNewComment($id, $uid = 0)
     {
         $comment = [];
-        $key = 'comment_like_' . $id;
-        $commentKey = 'post_new_comment_' . $id;
+        $commentKey = 'circle_message_new_comment_' . $id;
         $commentData = Redis::GET($commentKey);
         if ($commentData) {
             $comment = json_decode($commentData, true);
             foreach ($comment as &$item) {
-                $isLike = 0;
-                if ($uid) {
-                    $isLike = Redis::ZSCORE($key, $uid . '_' . $item['id']) ? 1 : 0;
-                }
                 $item['uid'] = intval($item['uid']);
-                $item['is_like'] = $isLike;
-                $item['like_count'] = Redis::ZCOUNT($key, $item['id'], $item['id']);
                 $item['reply_count'] = 0;
                 $item['reply'] = [];
             }
         } else {
-            $comments = PostComment::where('post_id', $id)->where('parent_id', 0)->where('is_delete', 0)->orderBy('like_count', 'desc')->orderBy('id', 'desc')->limit(2)->get();
+            $comments = InterestCircleMessageComment::where('msg_id', $id)->where('parent_id', 0)->where('is_delete', 0)->orderBy('id', 'desc')->limit(2)->get();
             foreach ($comments as $item) {
                 $userComment = $this->userInfo($item->uid);
-                $isLike = 0;
-                if ($uid) {
-                    $isLike = Redis::ZSCORE($key, $uid . '_' . $item->id) ? 1 : 0;
-                }
-                $likeCount = Redis::ZCOUNT($key, $item->id, $item->id);
                 $comment[] = [
                     'id' => $item->id,
                     'uid' => intval($userComment['uid']),
                     'username' => $userComment['username'],
                     'content' => $item->is_delete ? '该评论已被删除' : $item->content,
                     'is_delete' => $item->is_delete,
-                    'is_like' => $isLike,
-                    'like_count' => $likeCount,
                     'reply_count' => 0,
                     'reply' => [],
                 ];
@@ -86,7 +92,6 @@ class MessageListTransformer extends TransformerAbstract
             Redis::SET($commentKey, json_encode($comment));
             Redis::EXPIRE($commentKey, 300);
         }
-        sortArrByField($comment, 'like_count', true);
         return $comment;
     }
 }

+ 9 - 3
routes/api.php

@@ -81,7 +81,10 @@ $api->version('v1', [
     $api->get('circle/question', 'CircleController@getQuestion');
     //圈子精华文章列表
     $api->get('circle/articles', 'CircleController@articleList');
-
+    //圈子提问列表
+    $api->get('circle/messages', 'CircleController@messageList');
+    //圈子提问评论列表
+    $api->get('circle/comments', 'CircleController@commentList');
     //登录+验签
     $api->group(['middleware' => ['chxq_jwt_auth','chxq_sign']], function ($api) {
         //发布内容
@@ -130,9 +133,12 @@ $api->version('v1', [
         $api->delete('circle/join', 'CircleController@exitCircle');
         //圈子成员
         $api->get('circle/members', 'CircleController@memberList');
+        //创建提问
+        $api->post('circle/message', 'CircleController@messageCreate');
+        //创建提问评论
+        $api->post('circle/comment', 'CircleController@comment');
     });
-    //创建提问
-    $api->post('circle/message', 'CircleController@messageCreate');
+
 
     //分享/邀请首页
     $api->get('starDetail', 'BeanDetailController@starDetail');