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)
 | |
|         ];
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |