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