352 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			352 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace app\api\logic; | ||
|  | 
 | ||
|  | 
 | ||
|  | use app\common\basics\Logic; | ||
|  | use app\common\enum\CommunityCommentEnum; | ||
|  | use app\common\enum\CommunityLikeEnum; | ||
|  | use app\common\model\community\CommunityArticle; | ||
|  | use app\common\model\community\CommunityComment; | ||
|  | use app\common\model\community\CommunityLike; | ||
|  | use app\common\server\ConfigServer; | ||
|  | use app\common\server\UrlServer; | ||
|  | use think\facade\Db; | ||
|  | 
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * 种草社区评论 | ||
|  |  * Class CommunityCommentLogic | ||
|  |  * @package app\api\logic | ||
|  |  */ | ||
|  | class CommunityCommentLogic extends Logic | ||
|  | { | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 评论列表 | ||
|  |      * @param $get | ||
|  |      * @param $page | ||
|  |      * @param $size | ||
|  |      * @return array | ||
|  |      * @throws \think\db\exception\DataNotFoundException | ||
|  |      * @throws \think\db\exception\DbException | ||
|  |      * @throws \think\db\exception\ModelNotFoundException | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/9 14:22 | ||
|  |      */ | ||
|  |     public static function getCommentLists($user_id, $get, $page, $size) | ||
|  |     { | ||
|  |         $where = [ | ||
|  |             'del' => 0, | ||
|  |             'pid' => 0, | ||
|  |             'article_id' => $get['article_id'] ?? 0, | ||
|  |             'status' => CommunityCommentEnum::STATUS_SUCCESS | ||
|  |         ]; | ||
|  |         $count = CommunityComment::where($where)->count(); | ||
|  |         $lists = CommunityComment::with(['user']) | ||
|  |             ->where($where) | ||
|  |             ->append(['child']) | ||
|  |             ->order(['like' => 'desc', 'id' => 'desc']) | ||
|  |             ->page($page, $size) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         $article_data = self::getArticleData($get['article_id']); | ||
|  |         $article = $article_data['article']; | ||
|  |         // 当前文章所有评论人
 | ||
|  |         $reply_user = $article_data['reply_user']; | ||
|  | 
 | ||
|  |         $likes = CommunityLike::where([ | ||
|  |             'user_id' => $user_id, | ||
|  |             'type' => CommunityLikeEnum::TYPE_COMMENT | ||
|  |         ])->column('relation_id'); | ||
|  | 
 | ||
|  |         foreach ($lists as $key => $item) { | ||
|  |             $comment = self::formatComment($item, $article, $reply_user, $likes); | ||
|  |             $comment = self::getCommentChildMore($comment); | ||
|  |             $lists[$key] = self::isSecondComment($comment); | ||
|  |         } | ||
|  | 
 | ||
|  |         $result = [ | ||
|  |             'list' => $lists, | ||
|  |             'page' => $page, | ||
|  |             'size' => $size, | ||
|  |             'count' => $count, | ||
|  |             'more' => is_more($count, $page, $size) | ||
|  |         ]; | ||
|  |         return $result; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 文章信息 | ||
|  |      * @param $article_id | ||
|  |      * @return array | ||
|  |      * @throws \think\db\exception\DataNotFoundException | ||
|  |      * @throws \think\db\exception\DbException | ||
|  |      * @throws \think\db\exception\ModelNotFoundException | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/9 14:41 | ||
|  |      */ | ||
|  |     public static function getArticleData($article_id) | ||
|  |     { | ||
|  |         $article = CommunityArticle::with(['user'])->findOrEmpty($article_id); | ||
|  | 
 | ||
|  |         // 当前文章所有评论人
 | ||
|  |         $reply_user = CommunityComment::with(['user']) | ||
|  |             ->field('id,user_id,pid') | ||
|  |             ->where('article_id', $article_id) | ||
|  |             ->select() | ||
|  |             ->toArray(); | ||
|  | 
 | ||
|  |         return [ | ||
|  |             'article' => $article, | ||
|  |             'reply_user' => $reply_user, | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 格式评论数据 | ||
|  |      * @param $comment | ||
|  |      * @param $author | ||
|  |      * @return mixed | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/7 16:02 | ||
|  |      */ | ||
|  |     public static function formatComment($comment, $article, $reply_user = [], $likes = []) | ||
|  |     { | ||
|  |         $author = $article['user_id']; | ||
|  |         $comment['avatar'] = UrlServer::getFileUrl($comment['avatar']); | ||
|  |         $comment['is_author'] = 0; | ||
|  |         if ($comment['user_id'] == $author) { | ||
|  |             $comment['is_author'] = 1; | ||
|  |         } | ||
|  | 
 | ||
|  |         $comment['is_like'] = in_array($comment['id'], $likes) ? 1 : 0; | ||
|  |         // 获取回复的上级评论人信息
 | ||
|  |         $comment = self::getRelyData($comment, $article, $reply_user); | ||
|  | 
 | ||
|  |         if (!empty($comment['child'])) { | ||
|  |             foreach ($comment['child'] as $key => $item) { | ||
|  |                 $comment['child'][$key] = self::formatComment($item, $article, $reply_user, $likes); | ||
|  |             } | ||
|  |         } | ||
|  |         return $comment; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 获取评论列表子级大于2的数量 | ||
|  |      * @param $comment | ||
|  |      * @return mixed | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/10 10:34 | ||
|  |      */ | ||
|  |     public static function getCommentChildMore($comment) | ||
|  |     { | ||
|  |         $comment['more'] = 0; | ||
|  |         if (count($comment['child']) > 2) { | ||
|  |             $comment['more'] = count($comment['child']) - 2; | ||
|  |             $comment['child'] = array_splice($comment['child'], 0, 2); | ||
|  |         } | ||
|  |         return $comment; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 是否为二级评论 | ||
|  |      * @param $comment | ||
|  |      * @return mixed | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/10 14:54 | ||
|  |      */ | ||
|  |     public static function isSecondComment($comment) | ||
|  |     { | ||
|  |         if(!empty($comment['child'])) { | ||
|  |             foreach ($comment['child'] as $key => $item) { | ||
|  |                 $is_second = 0; | ||
|  |                 if ($comment['id'] == $item['pid']) { | ||
|  |                     $is_second = 1; | ||
|  |                 } | ||
|  |                 $comment['child'][$key]['is_second'] = $is_second; | ||
|  |             } | ||
|  |         } | ||
|  |         return $comment; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 获取评论回复的上级评论人信息 | ||
|  |      * @param $comment | ||
|  |      * @param $article | ||
|  |      * @param $reply_user | ||
|  |      * @return mixed | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/9 14:18 | ||
|  |      */ | ||
|  |     public static function getRelyData($comment, $article, $reply_user) | ||
|  |     { | ||
|  |         // 回复谁的评论
 | ||
|  |         $comment['reply_id'] = $article['user']['id']; | ||
|  |         $comment['reply_nickname'] = $article['user']['nickname']; | ||
|  |         $comment['reply_avatar'] = UrlServer::getFileUrl($article['user']['avatar']); | ||
|  |         if (!empty($comment['pid'])) { | ||
|  |             foreach ($reply_user as $reply) { | ||
|  |                 if ($reply['id'] == $comment['pid']) { | ||
|  |                     $comment['reply_id'] = $reply['user_id']; | ||
|  |                     $comment['reply_nickname'] = $reply['nickname']; | ||
|  |                     $comment['reply_avatar'] = UrlServer::getFileUrl($reply['avatar']); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         return $comment; | ||
|  |     } | ||
|  | 
 | ||
|  |      | ||
|  |     /** | ||
|  |      * @notes 添加评论 | ||
|  |      * @param $user_id | ||
|  |      * @param $post | ||
|  |      * @return array|false | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/10 11:29 | ||
|  |      */ | ||
|  |     public static function addComment($user_id, $post) | ||
|  |     { | ||
|  |         Db::startTrans(); | ||
|  |         try { | ||
|  | 
 | ||
|  |             $article = CommunityArticle::with(['user' => function($query) { | ||
|  |                 $query->field(['id','nickname', 'avatar']); | ||
|  |             }])->findOrEmpty($post['article_id']); | ||
|  | 
 | ||
|  |             if ($article['status'] != CommunityCommentEnum::STATUS_SUCCESS) { | ||
|  |                 throw new \Exception('暂不可评论'); | ||
|  |             } | ||
|  | 
 | ||
|  |             $data = [ | ||
|  |                 'user_id' => $user_id, | ||
|  |                 'article_id' => $post['article_id'], | ||
|  |                 'pid' => $post['pid'] ?? 0, | ||
|  |                 'comment' => $post['comment'], | ||
|  |                 'status' => CommunityCommentEnum::STATUS_WAIT, | ||
|  |                 'ancestor_relation' => '' | ||
|  |             ]; | ||
|  | 
 | ||
|  |             // 如果是无需审核的,状态直接为已审核
 | ||
|  |             $config = ConfigServer::get('community', 'audit_comment', 1); | ||
|  |             if ($config == 0) { | ||
|  |                 $data['status'] = CommunityCommentEnum::STATUS_SUCCESS; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 上级评论id关系链
 | ||
|  |             if (!empty($post['pid'])) { | ||
|  |                 $relation = CommunityComment::with(['user'])->findOrEmpty($post['pid']); | ||
|  |                 $ancestor = $relation->isEmpty() ? '' : trim($relation['ancestor_relation']); | ||
|  |                 $data['ancestor_relation'] = trim($post['pid'] . ',' . $ancestor, ','); | ||
|  |             } | ||
|  | 
 | ||
|  |             $comment = CommunityComment::create($data); | ||
|  | 
 | ||
|  |             // 增加文章评论数
 | ||
|  |             CommunityArticle::where(['id' => $post['article_id']]) | ||
|  |                 ->inc('comment') | ||
|  |                 ->update(); | ||
|  | 
 | ||
|  |             // 评论信息
 | ||
|  |             $info = CommunityComment::with(['user']) | ||
|  |                 ->withoutField(['ancestor_relation','update_time', 'del']) | ||
|  |                 ->where(['id' => $comment['id']]) | ||
|  |                 ->findOrEmpty() | ||
|  |                 ->toArray(); | ||
|  |             $info['avatar'] = UrlServer::getFileUrl($info['avatar']); | ||
|  |             $info['create_time'] = friend_date(strtotime($info['create_time'])); | ||
|  |             $info['reply_id'] = $relation['user_id'] ?? $article['user_id']; | ||
|  |             $info['reply_nickname'] = $relation['nickname'] ?? $article['user']['nickname']; | ||
|  |             $reply_avatar = !empty($relation['avatar']) ? $relation['avatar'] : $article['user']['avatar']; | ||
|  |             $info['reply_avatar'] = UrlServer::getFileUrl($reply_avatar); | ||
|  |             $info['is_like'] = 0; | ||
|  | 
 | ||
|  |             Db::commit(); | ||
|  |             return [ | ||
|  |                 'msg' => $data['status'] ? '评论成功' : '评论成功,正在审核中', | ||
|  |                 'data' => $info | ||
|  |             ]; | ||
|  | 
 | ||
|  |         } catch (\Exception $e) { | ||
|  |             Db::rollback(); | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 一级评论下的所有评论 | ||
|  |      * @param $get | ||
|  |      * @param $page | ||
|  |      * @param $size | ||
|  |      * @return array | ||
|  |      * @throws \think\db\exception\DataNotFoundException | ||
|  |      * @throws \think\db\exception\DbException | ||
|  |      * @throws \think\db\exception\ModelNotFoundException | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/5/9 14:33 | ||
|  |      */ | ||
|  |     public static function getChildComment($user_id, $get, $page, $size) | ||
|  |     { | ||
|  |         $comment_id = (int)$get['comment_id'] ?? 0; | ||
|  |         $comment = CommunityComment::findOrEmpty($comment_id); | ||
|  |         if ($comment->isEmpty()) { | ||
|  |             return [ | ||
|  |                 'list' => [], | ||
|  |                 'page' => 0, | ||
|  |                 'size' => 0, | ||
|  |                 'count' => 0, | ||
|  |                 'more' => 0 | ||
|  |             ]; | ||
|  |         } | ||
|  | 
 | ||
|  |         $count = CommunityComment::with(['user']) | ||
|  |             ->whereFindInSet('ancestor_relation', $comment_id) | ||
|  |             ->where(['del' => 0, 'status' => CommunityCommentEnum::STATUS_SUCCESS]) | ||
|  |             ->count(); | ||
|  | 
 | ||
|  |         $lists = CommunityComment::with(['user']) | ||
|  |             ->whereFindInSet('ancestor_relation', $comment_id) | ||
|  |             ->where(['del' => 0, 'status' => CommunityCommentEnum::STATUS_SUCCESS]) | ||
|  |             ->order(['like' => 'desc']) | ||
|  |             ->page($page, $size) | ||
|  |             ->select()->toArray(); | ||
|  | 
 | ||
|  |         $likes = CommunityLike::where([ | ||
|  |             'user_id' => $user_id, | ||
|  |             'type' => CommunityLikeEnum::TYPE_COMMENT | ||
|  |         ])->column('relation_id'); | ||
|  | 
 | ||
|  |         $article_data = self::getArticleData($comment['article_id']); | ||
|  |         $article = $article_data['article']; | ||
|  |         // 当前文章所有评论人
 | ||
|  |         $reply_user = $article_data['reply_user']; | ||
|  | 
 | ||
|  |         foreach ($lists as $key => $item) { | ||
|  |             $item['is_second'] = 0; | ||
|  |             if ($item['pid'] == $comment_id) { | ||
|  |                 $item['is_second'] = 1; | ||
|  |             } | ||
|  |             $lists[$key] = self::formatComment($item, $article, $reply_user, $likes); | ||
|  |         } | ||
|  | 
 | ||
|  |         return [ | ||
|  |             'list' => $lists, | ||
|  |             'page' => $page, | ||
|  |             'size' => $size, | ||
|  |             'count' => $count, | ||
|  |             'more' => is_more($count, $page, $size) | ||
|  |         ]; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } |