From 26fb271a541b8e1cea8b2420ab4316387e5c8a47 Mon Sep 17 00:00:00 2001 From: commie Date: Mon, 6 Apr 2026 03:36:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=8B=E5=8F=8B=E5=9C=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/controller/FriendCircleController.php | 11 +- app/api/controller/MomentsController.php | 392 +++++++++--------- 2 files changed, 206 insertions(+), 197 deletions(-) diff --git a/app/api/controller/FriendCircleController.php b/app/api/controller/FriendCircleController.php index abc7458..1c0fdf8 100755 --- a/app/api/controller/FriendCircleController.php +++ b/app/api/controller/FriendCircleController.php @@ -40,7 +40,7 @@ class FriendCircleController extends BaseController{ 'top_unread_items' =>[], 'unread_item_ids' =>[], 'unread_count' =>0, - 'settings' => Db::name('friend_circle_setting')->where('user_id',$user_id)->order('id','desc')->findOrEmpty() + 'settings' => Db::name('user_extend')->where('user_id',$user_id)->findOrEmpty() ]; return $this->success('ok',$json); }else{ @@ -52,7 +52,7 @@ class FriendCircleController extends BaseController{ $res = $this->newcount($request); $response = $res->rawBody(); $json = json_decode($response,true); - $json['data']['settings'] = Db::name('friend_circle_setting')->where('user_id',$user_id)->order('id','desc')->findOrEmpty(); + $json['data']['settings'] = Db::name('user_extend')->where('user_id',$user_id)->findOrEmpty(); // [ // 'bg' => '', // ]; @@ -425,11 +425,8 @@ class FriendCircleController extends BaseController{ return $this->fail( $res); } - Db::name('friend_circle_setting')->replace()->insert([ - 'user_id' => $user->id, - 'bg' => $res[0]['file_name'], - 'allow_days'=>0, - 'created_at'=>0 + Db::name('user_extend')->where('user_id',$user->id)->save([ + 'moments_banner' => $res[0]['file_name'] ]); //$result->ss = cdnurl($result->url); //P($result); diff --git a/app/api/controller/MomentsController.php b/app/api/controller/MomentsController.php index fc7a5f5..2ea5a9b 100644 --- a/app/api/controller/MomentsController.php +++ b/app/api/controller/MomentsController.php @@ -1,5 +1,6 @@ [], - 'unread_item_ids' =>[], - 'unread_count' =>0, - 'settings' => Db::name('user_extend')->where('user_id',$user_id)->field('moments_allow_view_days,moments_banner')->findOrEmpty() - ]; - return $this->success('ok',$json); - }else{ - $user = \support\Jwt::getUser(); - if (!$user) { - return $this->fail('请先登录'); - } - $userID = $user->userID; - $res = $this->newcount($request); - $response = $res->rawBody(); - $json = json_decode($response,true); - $json['data']['settings'] = Db::name('user_extend')->where('user_id',$user->id)->field('moments_allow_view_days,moments_banner')->findOrEmpty(); - $top_unread_items = FriendCircleModel::whereIn('id',$json['data']['unread_item_ids']) - ->with(['user' => function($query) { - $query->field($this->user_display_fields); - }]) - ->order('id', 'desc') - ->limit(0,3) - ->select(); - $json['data']['top_unread_items'] = $top_unread_items ?: []; - $res->withBody(json_encode($json)); - return $res; + protected function getUserSettings(int $user_id): array + { + $result = Db::name('user_extend') + ->where('user_id', $user_id) + ->field('moments_allow_view_days,moments_banner') + ->findOrEmpty(); + return $result; + } + + protected function processAvatar($data): void + { + if (is_array($data)) { + if (!empty($data['avatar'])) { + $data['avatar'] = cdnurl($data['avatar']); + } + } elseif (is_object($data) && !empty($data->avatar)) { + $data->avatar = cdnurl($data->avatar); } } + + function info(Request $request): Response + { + $userID = Input('userID'); + if ($userID) { + $user_id = \support\Encrypt::userIDDecode($userID); + $json = [ + 'top_unread_items' => [], + 'unread_item_ids' => [], + 'unread_count' => 0, + 'settings' => $this->getUserSettings($user_id) + ]; + return $this->success('ok', $json); + } + + $user = \support\Jwt::getUser(); + if (!$user) { + return $this->fail('请先登录'); + } + + $res = $this->newcount($request); + $response = $res->rawBody(); + $json = json_decode($response, true); + $json['data']['settings'] = $this->getUserSettings($user->id); + + $top_unread_items = FriendCircleModel::whereIn('id', $json['data']['unread_item_ids']) + ->with(['user' => function ($query) { + $query->field($this->user_display_fields); + }]) + ->order('id', 'desc') + ->limit(0, 3) + ->select(); + $json['data']['top_unread_items'] = $top_unread_items ?: []; + $res->withBody(json_encode($json)); + return $res; + } + /** * @Apidoc\Title("列表") * @Apidoc\Method("GET") * @Apidoc\Query("userID", type="string", require=false, desc="用户userID,不传则获取所有") - * @Apidoc\Query("page", type="int", require=true, desc="页码",default=1) - * @Apidoc\Query("limit", type="int", require=true, desc="分页大小",default=10) + * @Apidoc\Query("page", type="int", require=true, desc="页码", default=1) + * @Apidoc\Query("limit", type="int", require=true, desc="分页大小", default=10) */ function list(Request $request): Response { @@ -78,97 +89,84 @@ class MomentsController extends BaseController{ $page = (int)Input('page', 1); $limit = (int)Input('limit', 10); $userID = Input('userID'); + $query = FriendCircleModel::where('status', 1) - ->with(['user' => function($query) { + ->with(['user' => function ($query) { $query->field($this->user_display_fields); }]) ->order('created_at', 'desc'); - if($userID){ - // 如果指定了用户ID,只获取该用户的朋友圈 + + if ($userID) { $user_id = \support\Encrypt::userIDDecode($userID); - $query->where('user_id',$user_id); - }else{ - $current_userID = \support\Encrypt::userIDencode($current_user_id); - $query->whereIn('user_id',$this->getFriendUserIds($current_userID)); + $query->where('user_id', $user_id); + } else { + $current_userID = $current_user_id > 0 ? \support\Encrypt::userIDencode($current_user_id) : ''; + $friendIds = $this->getFriendUserIds($current_userID); + if (empty($friendIds)) { + return $this->success('ok', []); + } + $query->whereIn('user_id', $friendIds); } - + $list = $query->paginate([ 'list_rows' => $limit, 'page' => $page, ]); - if(!$userID){ - cache('circle_last_read_id_'.$current_user_id,$list[0]['id']); + + if (!$userID && $list->count() > 0) { + cache('circle_last_read_id_' . $current_user_id, $list[0]['id']); } - - - // 处理每条朋友圈数据 - $items = $list->items(); - $list->each(function($item) use ($current_user_id){ - // 获取点赞列表 + + $list->each(function ($item) use ($current_user_id) { $likes = Db::name('friend_circle_like')->alias('f') - ->join('user u','u.id=f.user_id') + ->join('user u', 'u.id=f.user_id') ->where('f.circle_id', $item->id) ->field('f.*,u.userID,u.avatar,u.nickname') ->order('f.created_at', 'desc') ->limit(20) ->select(); $likes = $likes ? $likes->toArray() : []; - // 检查当前用户是否已点赞 + $is_liked = false; if ($current_user_id > 0) { - $is_liked = null !== array_find($likes,function($item)use($current_user_id){ - return $item['user_id'] == $current_user_id; + $is_liked = null !== array_find($likes, function ($like) use ($current_user_id) { + return $like['user_id'] == $current_user_id; }); - // FriendCircleLikeModel::where('circle_id', $item->id) - // ->where('user_id', $current_user_id) - // ->count() > 0; } - - - // 获取评论列表(最新10条) + $comments = FriendCircleCommentModel::where('circle_id', $item->id) ->where('status', 1) - ->with(['user' => function($query) { + ->with(['user' => function ($query) { $query->field($this->user_display_fields); - }, 'replyUser' => function($query) { + }, 'replyUser' => function ($query) { $query->field($this->user_display_fields); }]) ->order('created_at', 'asc') ->limit(10) ->select(); - - // 格式化数据 + $item->is_liked = $is_liked; $item->likes = $likes; $item->comments = $comments; - - // 处理图片URL + if (!empty($item->files)) { $files = is_array($item->files) ? $item->files : json_decode($item->files, true); - if (is_array($files)) { - $item->files = array_map(function($file) { - return cdnurl($file); - }, $files); - } else { - $item->files = []; - } + $item->files = is_array($files) ? array_map('cdnurl', $files) : []; } else { $item->files = []; } - - // 处理用户头像 + if ($item->user && $item->user->avatar) { $item->user->avatar = cdnurl($item->user->avatar); } - - // 处理点赞用户头像 - foreach ($item->likes as $like) { - if ($like->user) { - $like->avatar = cdnurl($like->avatar); + + foreach ($item->likes as &$like) { + if (!empty($like['avatar'])) { + $like['avatar'] = cdnurl($like['avatar']); } } - - // 处理评论用户头像 + unset($like); + foreach ($item->comments as $comment) { if ($comment->user && $comment->user->avatar) { $comment->user->avatar = cdnurl($comment->user->avatar); @@ -177,16 +175,17 @@ class MomentsController extends BaseController{ $comment->replyUser->avatar = cdnurl($comment->replyUser->avatar); } } + return $item; }); - + return $this->success('ok', $list); } - + /** * @Apidoc\Title("最近更新的数量") * @Apidoc\Method("POST") - * @Apidoc\Param("last_see", type="string",require=false, desc="最近查看的时间戳") + * @Apidoc\Param("last_see", type="string", require=false, desc="最近查看的时间戳") */ function newcount(Request $request): Response { @@ -194,28 +193,28 @@ class MomentsController extends BaseController{ if (!$user) { return $this->fail('请先登录'); } + $user_id = $user->id; - $circle_last_read_id = cache('circle_last_read_id_'.$user_id) ?: 0; + $circle_last_read_id = cache('circle_last_read_id_' . $user_id) ?: 0; $userID = \support\Encrypt::userIDencode($user_id); - // 统计从上次查看时间到现在新增的朋友圈数量 + $unread_item_ids = FriendCircleModel::where('status', 1) - ->whereIn('user_id',$this->getFriendUserIds($userID)) + ->whereIn('user_id', $this->getFriendUserIds($userID)) ->where('id', '>', $circle_last_read_id) ->order('id', 'desc') ->column('id'); - - + return $this->success('ok', [ 'unread_count' => count($unread_item_ids), - 'unread_item_ids'=>$unread_item_ids + 'unread_item_ids' => $unread_item_ids ]); } - + /** * @Apidoc\Title("发布朋友圈") * @Apidoc\Method("POST") - * @Apidoc\Param("body", type="string",require=false, desc="内容") - * @Apidoc\Param("files", type="string",require=false, desc="图片列表(JSON数组)") + * @Apidoc\Param("body", type="string", require=false, desc="内容") + * @Apidoc\Param("files", type="string", require=false, desc="图片列表(JSON数组)") */ function create(Request $request): Response { @@ -223,18 +222,16 @@ class MomentsController extends BaseController{ if (!$user) { return $this->fail('请先登录'); } - + $body = $request->post('content', ''); $files = $request->post('files', ''); $address = $request->post('address', ''); $releaseType = $request->post('releaseType', ''); - // 验证内容 + if (empty($body)) { return $this->fail('什么内容都木有啊'); } - - - // 处理图片列表 + $files_array = []; if (!empty($files)) { if (is_string($files)) { @@ -242,18 +239,16 @@ class MomentsController extends BaseController{ } elseif (is_array($files)) { $files_array = $files; } - + if (!is_array($files_array)) { return $this->fail('图片列表格式错误'); } - - // 限制图片数量 + if (count($files_array) > 9) { return $this->fail('最多只能上传9张图片'); } } - - // 创建朋友圈动态 + $circle = FriendCircleModel::create([ 'user_id' => $user->id, 'releaseType' => $releaseType, @@ -262,16 +257,16 @@ class MomentsController extends BaseController{ 'address' => $address, 'status' => 1, ]); - - return $this->success('发布成功', ['id' => $circle->id,'data' => $circle]); + + return $this->success('发布成功', ['id' => $circle->id, 'data' => $circle]); } - + /** * @Apidoc\Title("发表评论") * @Apidoc\Method("POST") - * @Apidoc\Param("body", type="string",require=true, desc="内容") - * @Apidoc\Param("id", type="int",require=true, desc="朋友圈动态ID") - * @Apidoc\Param("reply_userID", type="string",require=false, desc="回复的用户userID(回复评论时使用)") + * @Apidoc\Param("body", type="string", require=true, desc="内容") + * @Apidoc\Param("id", type="int", require=true, desc="朋友圈动态ID") + * @Apidoc\Param("reply_userID", type="string", require=false, desc="回复的用户userID(回复评论时使用)") */ function comment(Request $request): Response { @@ -279,41 +274,39 @@ class MomentsController extends BaseController{ if (!$user) { return $this->fail('请先登录'); } - + $body = $request->post('body', ''); $circle_id = (int)$request->post('id'); - $reply_userID = (int)$request->post('reply_userID'); - + $reply_userID = $request->post('reply_userID', ''); + if (empty($body)) { return $this->fail('评论内容不能为空'); } - + if ($circle_id <= 0) { return $this->fail('朋友圈动态ID错误'); } - - // 检查朋友圈动态是否存在 + $circle = FriendCircleModel::where('id', $circle_id) ->where('status', 1) ->find(); - + if (!$circle) { return $this->fail('朋友圈动态不存在'); } - - // 如果回复评论,检查被回复的用户是否存在 + $reply_user_id = 0; - if ($reply_userID ) { - $reply_user_id = \support\Encrypt::userIDDecode($reply_userID); + if (!empty($reply_userID)) { + $reply_user_id = (int)\support\Encrypt::userIDDecode($reply_userID); } - if ($reply_user_id>0 ) { + + if ($reply_user_id > 0) { $reply_user = UserModel::where('id', $reply_user_id)->find(); if (!$reply_user) { return $this->fail('被回复的用户不存在'); } } - - // 创建评论 + $comment = FriendCircleCommentModel::create([ 'circle_id' => $circle_id, 'user_id' => $user->id, @@ -321,24 +314,25 @@ class MomentsController extends BaseController{ 'body' => $body, 'status' => 1, ]); - - // 更新朋友圈评论数 + $circle->comment_count = FriendCircleCommentModel::where('circle_id', $circle_id) ->where('status', 1) ->count(); $circle->save(); - $comment->user = Db::name('user')->field($this->user_display_fields)->where('id',$comment->user_id)->find(); - $comment->replyUser=null; - if($comment->reply_user_id){ - $comment->replyUser = Db::name('user')->field($this->user_display_fields)->where('id',$comment->reply_user_id)->find(); + + $comment->user = Db::name('user')->field($this->user_display_fields)->where('id', $comment->user_id)->find(); + $comment->replyUser = null; + if ($comment->reply_user_id) { + $comment->replyUser = Db::name('user')->field($this->user_display_fields)->where('id', $comment->reply_user_id)->find(); } + return $this->success('评论成功', $comment); } - + /** * @Apidoc\Title("点赞") * @Apidoc\Method("POST") - * @Apidoc\Param("id", type="int",require=true, desc="朋友圈动态ID") + * @Apidoc\Param("id", type="int", require=true, desc="朋友圈动态ID") */ function like(Request $request): Response { @@ -346,112 +340,130 @@ class MomentsController extends BaseController{ if (!$user) { return $this->fail('请先登录'); } - + $circle_id = (int)$request->post('id', 0); - + if ($circle_id <= 0) { return $this->fail('朋友圈动态ID错误'); } - - // 检查朋友圈动态是否存在 + $circle = FriendCircleModel::where('id', $circle_id) ->where('status', 1) ->find(); - + if (!$circle) { return $this->fail('朋友圈动态不存在'); } - - // 检查是否已点赞 + $like = FriendCircleLikeModel::where('circle_id', $circle_id) ->where('user_id', $user->id) ->find(); - + if ($like) { - // 取消点赞 $like->delete(); $circle->like_count = max(0, $circle->like_count - 1); $circle->save(); return $this->success('取消点赞成功', ['is_liked' => false]); - } else { - // 添加点赞 - FriendCircleLikeModel::create([ - 'circle_id' => $circle_id, - 'user_id' => $user->id, - ]); - $circle->like_count = $circle->like_count + 1; - $circle->save(); - return $this->success('点赞成功', ['is_liked' => true]); } + + FriendCircleLikeModel::create([ + 'circle_id' => $circle_id, + 'user_id' => $user->id, + ]); + $circle->like_count = $circle->like_count + 1; + $circle->save(); + return $this->success('点赞成功', ['is_liked' => true]); } - protected function getFriendUserIds($userID):array{ + + protected function getFriendUserIds($userID): array + { if (!$userID) { return []; } - $cache_key = 'friend_id_list_'.$userID; + + $cache_key = 'friend_id_list_' . $userID; $result = cache($cache_key) ?: []; - if(count($result) === 0){ + + if (count($result) === 0) { $res = request()->IM->friend->getFriendList($userID); - $friendsInfo = $res['friendsInfo']; - foreach($friendsInfo as $k=>$v){ - array_push($result,\support\Encrypt::userIDDecode($v['friendUser']['userID'])); + $friendsInfo = $res['friendsInfo'] ?? []; + foreach ($friendsInfo as $v) { + $result[] = \support\Encrypt::userIDDecode($v['friendUser']['userID']); } - cache($cache_key,$result,3600); + cache($cache_key, $result, 3600); } + $result[] = \support\Encrypt::userIDDecode($userID); return $result; } + /** * 删除朋友圈 * @Apidoc\Method("POST") - * @Apidoc\Param("id", type="int",require=true, desc="朋友圈动态ID") + * @Apidoc\Param("id", type="int", require=true, desc="朋友圈动态ID") * @return Response */ - function delete(Request $request): Response{ - $id = $request->post('id'); + function delete(Request $request): Response + { + $id = (int)$request->post('id'); $user = \support\Jwt::getUser(); if (!$user) { return $this->fail('请先登录'); } - if($id){ - FriendCircleModel::where('id',$id)->where('user_id',$user->id)->delete(); + + if ($id > 0) { + FriendCircleModel::where('id', $id)->where('user_id', $user->id)->delete(); } + return $this->success('删除成功'); } + /** * 设置朋友圈背景 * @param Request $request * @return Response */ - function upload_bg(Request $request){ + function upload_bg(Request $request): Response + { return $this->setBanner($request); } + /** * 设置朋友圈背景 * @Apidoc\Method("POST") - * @Apidoc\Param("file", type="File",require=true, desc="文件") + * @Apidoc\Param("file", type="File", require=true, desc="文件") * @return Response */ - function setBanner(Request $request){ + function setBanner(Request $request): Response + { try { $user = \support\Jwt::getUser(); if (!$user) { return $this->fail('请先登录'); } + $res = $this->_upload($request); - if(is_string($res)){ - return $this->fail( $res); + if (is_string($res)) { + return $this->fail($res); } - - Db::name('user_extend')->where('user_id',$user->id)->save([ - 'moments_banner' => $res[0]['file_name'], + + $exist = Db::name('user_extend')->where('user_id', $user->id)->find(); + if ($exist) { + Db::name('user_extend') + ->where('user_id', $user->id) + ->update(['moments_banner' => $res[0]['file_name']]); + } else { + Db::name('user_extend')->insert([ + 'user_id' => $user->id, + 'moments_banner' => $res[0]['file_name'], + ]); + } + + return $this->success(__('successful'), [ + 'url' => $res[0]['file_name'] ]); - return $this->success(__('successful'),[ - 'url'=>$res[0]['file_name'] - ]); - }catch (\Exception $e){ + } catch (\Exception $e) { return $this->error($e->getMessage()); } } - -} \ No newline at end of file +}