From 3d4d715471aadb6cdbd72097e83ac6092346d062 Mon Sep 17 00:00:00 2001 From: gzydong <837215079@qq.com> Date: Wed, 21 Jul 2021 23:31:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{UnreadTalk.php => UnreadTalkCache.php} | 2 +- app/Controller/Api/V1/TalkController.php | 15 +++--- .../Api/V1/TalkMessageController.php | 4 +- app/Controller/Api/V1/UsersController.php | 4 +- app/Service/Message/FormatMessageService.php | 54 +++++++++++-------- app/Service/Message/ReceiveHandleService.php | 4 +- .../Message/SubscribeHandleService.php | 1 - app/Service/TalkListService.php | 4 +- 8 files changed, 49 insertions(+), 39 deletions(-) rename app/Cache/{UnreadTalk.php => UnreadTalkCache.php} (97%) diff --git a/app/Cache/UnreadTalk.php b/app/Cache/UnreadTalkCache.php similarity index 97% rename from app/Cache/UnreadTalk.php rename to app/Cache/UnreadTalkCache.php index f96dd88..690df55 100644 --- a/app/Cache/UnreadTalk.php +++ b/app/Cache/UnreadTalkCache.php @@ -9,7 +9,7 @@ use App\Cache\Repository\HashRedis; * * @package App\Cache */ -class UnreadTalk extends HashRedis +class UnreadTalkCache extends HashRedis { public $name = 'unread-talk'; diff --git a/app/Controller/Api/V1/TalkController.php b/app/Controller/Api/V1/TalkController.php index c6ca1ca..3901347 100644 --- a/app/Controller/Api/V1/TalkController.php +++ b/app/Controller/Api/V1/TalkController.php @@ -12,7 +12,7 @@ namespace App\Controller\Api\V1; use App\Cache\LastMessage; use App\Cache\Repository\LockRedis; -use App\Cache\UnreadTalk; +use App\Cache\UnreadTalkCache; use App\Constants\TalkMessageType; use App\Constants\TalkModeConstant; use App\Model\Talk\TalkList; @@ -61,7 +61,7 @@ class TalkController extends CController $user_id = $this->uid(); // 读取用户的未读消息列表 - if ($list = UnreadTalk::getInstance()->reads($user_id)) { + if ($list = UnreadTalkCache::getInstance()->reads($user_id)) { foreach ($list as $friend_id => $num) { $this->talkListService->create($user_id, $friend_id, TalkModeConstant::PRIVATE_CHAT); } @@ -85,8 +85,11 @@ class TalkController extends CController ]); $user_id = $this->uid(); - $lock = 'talk:list:' . $user_id . '-' . $params['receiver_id'] . '-' . $params['talk_type']; - if (!LockRedis::getInstance()->lock($lock, 10)) { + $string = join('-', [$user_id, $params['receiver_id'], $params['talk_type'], md5($request->getHeaderLine('user-agent'))]); + $lock = 'talk:list:' . $string; + + // 防止前端并发请求 + if (!LockRedis::getInstance()->lock($lock, 60)) { return $this->response->fail('创建失败!'); } @@ -111,7 +114,7 @@ class TalkController extends CController $userInfo = User::where('id', $data['receiver_id'])->first(['nickname', 'avatar']); $data['avatar'] = $userInfo->avatar; $data['name'] = $userInfo->nickname; - $data['unread_num'] = UnreadTalk::getInstance()->read($data['receiver_id'], $user_id); + $data['unread_num'] = UnreadTalkCache::getInstance()->read($data['receiver_id'], $user_id); $data['remark_name'] = $service->getFriendRemark($user_id, (int)$data['receiver_id']); } else if ($result['talk_type'] == TalkModeConstant::GROUP_CHAT) { $groupInfo = Group::where('id', $data['receiver_id'])->first(['group_name', 'avatar']); @@ -201,7 +204,7 @@ class TalkController extends CController // 设置好友消息未读数 if ($params['talk_type'] == TalkModeConstant::PRIVATE_CHAT) { - UnreadTalk::getInstance()->reset((int)$params['receiver_id'], $this->uid()); + UnreadTalkCache::getInstance()->reset((int)$params['receiver_id'], $this->uid()); } return $this->response->success(); diff --git a/app/Controller/Api/V1/TalkMessageController.php b/app/Controller/Api/V1/TalkMessageController.php index 8548358..a7dc8ce 100644 --- a/app/Controller/Api/V1/TalkMessageController.php +++ b/app/Controller/Api/V1/TalkMessageController.php @@ -2,7 +2,7 @@ namespace App\Controller\Api\V1; -use App\Cache\UnreadTalk; +use App\Cache\UnreadTalkCache; use App\Constants\TalkEventConstant; use App\Constants\TalkModeConstant; use App\Event\TalkEvent; @@ -312,7 +312,7 @@ class TalkMessageController extends CController if ($receive_user_ids) { foreach ($receive_user_ids as $v) { - UnreadTalk::getInstance()->increment($user_id, $v['id']); + UnreadTalkCache::getInstance()->increment($user_id, $v['id']); } } diff --git a/app/Controller/Api/V1/UsersController.php b/app/Controller/Api/V1/UsersController.php index eb87d8e..70e2db3 100644 --- a/app/Controller/Api/V1/UsersController.php +++ b/app/Controller/Api/V1/UsersController.php @@ -129,12 +129,12 @@ class UsersController extends CController } /** - * 通过手机号查找用户 + * 通过用户ID查找用户 * @RequestMapping(path="search-user", methods="post") * * @return ResponseInterface */ - public function searchUserInfo() + public function search() { $params = $this->request->inputs(['user_id']); $this->validate($params, ['user_id' => 'required|integer']); diff --git a/app/Service/Message/FormatMessageService.php b/app/Service/Message/FormatMessageService.php index 40c2508..d124bd6 100644 --- a/app/Service/Message/FormatMessageService.php +++ b/app/Service/Message/FormatMessageService.php @@ -24,31 +24,33 @@ class FormatMessageService private function formatTalkMessage(array $data): array { $message = [ - "id" => 0, // 消息记录ID - "talk_type" => 1, // 消息来源[1:好友私信;2:群聊] - "msg_type" => 1, // 消息类型 - "user_id" => 0, // 发送者用户ID - "receiver_id" => 0, // 接收者ID[好友ID或群ID] + "id" => 0, // 消息记录ID + "talk_type" => 1, // 消息来源[1:好友私信;2:群聊] + "msg_type" => 1, // 消息类型 + "user_id" => 0, // 发送者用户ID + "receiver_id" => 0, // 接收者ID[好友ID或群ID] // 发送消息人的信息 - "nickname" => "",// 用户昵称 - "avatar" => "",// 用户头像 - "group_name" => "",// 群组名称 - "group_avatar" => "",// 群组头像 + "nickname" => '', // 用户昵称 + "avatar" => '', // 用户头像 + "group_name" => '', // 群组名称 + "group_avatar" => '', // 群组头像 // 不同的消息类型 - "file" => [], - "code_block" => [], - "forward" => [], - "invite" => [], - "vote" => [], + "file" => [], // 文件消息 + "code_block" => [], // 代码消息 + "forward" => [], // 转发消息 + "invite" => [], // 邀请消息 + "vote" => [], // 投票消息 // 消息创建时间 - "content" => '',// 文本消息 - "created_at" => "", + "content" => '', // 文本消息 + "created_at" => '', // 发送时间 // 消息属性 - "is_revoke" => 0, // 消息是否撤销 + "is_revoke" => 0, // 消息是否撤销 + "is_mark" => 0, // 消息是否重要 + "is_read" => 0, // 消息是否已读 ]; return array_merge($message, array_intersect_key($data, $message)); @@ -62,7 +64,7 @@ class FormatMessageService */ public function handleChatRecords(array $rows) { - if (empty($rows)) return []; + if (!$rows) return []; $files = $codes = $forwards = $invites = $votes = []; foreach ($rows as $value) { @@ -106,6 +108,7 @@ class FormatMessageService $forwards = TalkRecordsForward::whereIn('record_id', $forwards)->get(['record_id', 'records_id', 'text'])->keyBy('record_id')->toArray(); } + // 查询投票消息 if ($votes) { $votes = TalkRecordsVote::whereIn('record_id', $votes)->get([ 'id', 'record_id', 'title', 'answer_mode', 'status', 'answer_option', 'answer_num', 'answered_num' @@ -120,14 +123,16 @@ class FormatMessageService $rows[$k]['vote'] = []; switch ($row['msg_type']) { - case TalkMessageType::FILE_MESSAGE:// 文件消息 + // 文件消息 + case TalkMessageType::FILE_MESSAGE: $rows[$k]['file'] = $files[$row['id']] ?? []; if ($rows[$k]['file']) { $rows[$k]['file']['file_url'] = get_media_url($rows[$k]['file']['save_dir']); } break; - case TalkMessageType::FORWARD_MESSAGE:// 会话记录消息 + // 会话记录消息 + case TalkMessageType::FORWARD_MESSAGE: if (isset($forwards[$row['id']])) { $rows[$k]['forward'] = [ 'num' => substr_count($forwards[$row['id']]['records_id'], ',') + 1, @@ -136,7 +141,8 @@ class FormatMessageService } break; - case TalkMessageType::CODE_MESSAGE:// 代码块消息 + // 代码块消息 + case TalkMessageType::CODE_MESSAGE: $rows[$k]['code_block'] = $codes[$row['id']] ?? []; if ($rows[$k]['code_block']) { $rows[$k]['code_block']['code'] = htmlspecialchars_decode($rows[$k]['code_block']['code']); @@ -144,7 +150,8 @@ class FormatMessageService } break; - case TalkMessageType::VOTE_MESSAGE:// 投票消息 + // 投票消息 + case TalkMessageType::VOTE_MESSAGE: $options = []; foreach ($votes[$row['id']]['answer_option'] as $k2 => $value) { $options[] = [ @@ -161,7 +168,8 @@ class FormatMessageService ]; break; - case TalkMessageType::GROUP_INVITE_MESSAGE:// 入群消息/退群消息 + // 入群消息/退群消息 + case TalkMessageType::GROUP_INVITE_MESSAGE: if (isset($invites[$row['id']])) { $rows[$k]['invite'] = [ 'type' => $invites[$row['id']]['type'], diff --git a/app/Service/Message/ReceiveHandleService.php b/app/Service/Message/ReceiveHandleService.php index d356bd3..5ca3596 100644 --- a/app/Service/Message/ReceiveHandleService.php +++ b/app/Service/Message/ReceiveHandleService.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace App\Service\Message; use App\Cache\LastMessage; -use App\Cache\UnreadTalk; +use App\Cache\UnreadTalkCache; use App\Constants\TalkEventConstant; use App\Constants\TalkMessageType; use App\Constants\TalkModeConstant; @@ -76,7 +76,7 @@ class ReceiveHandleService // 判断是否私信 if ($result->talk_type == TalkModeConstant::PRIVATE_CHAT) { - UnreadTalk::getInstance()->increment($result->user_id, $result->receiver_id); + UnreadTalkCache::getInstance()->increment($result->user_id, $result->receiver_id); } // 缓存最后一条聊天消息 diff --git a/app/Service/Message/SubscribeHandleService.php b/app/Service/Message/SubscribeHandleService.php index f321345..d1316eb 100644 --- a/app/Service/Message/SubscribeHandleService.php +++ b/app/Service/Message/SubscribeHandleService.php @@ -100,7 +100,6 @@ class SubscribeHandleService // 客户端ID去重 if (!$fds = array_unique($fds)) return; - $result = TalkRecords::leftJoin('users', 'users.id', '=', 'talk_records.user_id') ->where('talk_records.id', $record_id) ->first([ diff --git a/app/Service/TalkListService.php b/app/Service/TalkListService.php index a4b209a..883aa86 100644 --- a/app/Service/TalkListService.php +++ b/app/Service/TalkListService.php @@ -4,7 +4,7 @@ namespace App\Service; use App\Cache\LastMessage; use App\Cache\ServerRunID; -use App\Cache\UnreadTalk; +use App\Cache\UnreadTalkCache; use App\Constants\TalkModeConstant; use App\Model\Talk\TalkList; use Carbon\Carbon; @@ -140,7 +140,7 @@ class TalkListService if ($item['talk_type'] == TalkModeConstant::PRIVATE_CHAT) { $data['name'] = $item['nickname']; $data['avatar'] = $item['user_avatar']; - $data['unread_num'] = UnreadTalk::getInstance()->read($item['receiver_id'], $user_id); + $data['unread_num'] = UnreadTalkCache::getInstance()->read($item['receiver_id'], $user_id); $data['is_online'] = container()->get(SocketClientService::class)->isOnlineAll($item['receiver_id'], $runIdAll); $data['remark_name'] = container()->get(UserFriendService::class)->getFriendRemark($user_id, $item['receiver_id']); } else if (TalkModeConstant::GROUP_CHAT) {