From 5fdd5adef8b2acd1855e85505ef31127714e4f18 Mon Sep 17 00:00:00 2001 From: weifashi <605403358@qq.com> Date: Mon, 4 Dec 2023 18:45:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20=E8=BD=AC=E5=8F=91=E6=B6=88=E6=81=AF?= =?UTF-8?q?=20-=20=E6=B7=BB=E5=8A=A0=E6=9D=A5=E6=BA=90=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 12 +- app/Models/WebSocketDialogMsg.php | 40 +- ..._web_socket_dialog_msgs_add_forward_id.php | 38 ++ language/original-web.txt | 4 + resources/assets/js/components/UserSelect.vue | 392 ++++++++++-------- .../js/pages/manage/components/DialogItem.vue | 6 +- .../js/pages/manage/components/DialogView.vue | 12 + .../pages/manage/components/DialogWrapper.vue | 35 +- .../assets/sass/components/user-select.scss | 20 + .../sass/pages/components/dialog-wrapper.scss | 45 ++ 10 files changed, 416 insertions(+), 188 deletions(-) create mode 100644 database/migrations/2023_12_04_070224_web_socket_dialog_msgs_add_forward_id.php diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index fd908b771..aa911edbe 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -1358,9 +1358,11 @@ class DialogController extends AbstractController * @apiGroup dialog * @apiName msg__forward * - * @apiParam {Number} msg_id 消息ID - * @apiParam {Array} dialogids 转发给的对话ID - * @apiParam {Array} userids 转发给的成员ID + * @apiParam {Number} msg_id 消息ID + * @apiParam {Array} dialogids 转发给的对话ID + * @apiParam {Array} userids 转发给的成员ID + * @apiParam {Number} show_source 是否显示原发送者信息 + * @apiParam {Array} leave_message 转发留言 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -1373,6 +1375,8 @@ class DialogController extends AbstractController $msg_id = intval(Request::input("msg_id")); $dialogids = Request::input('dialogids'); $userids = Request::input('userids'); + $show_source = intval(Request::input("show_source")); + $leave_message = Request::input('leave_message'); // if (empty($dialogids) && empty($userids)) { return Base::retError("请选择转发对话或成员"); @@ -1384,7 +1388,7 @@ class DialogController extends AbstractController } WebSocketDialog::checkDialog($msg->dialog_id); // - return $msg->forwardMsg($dialogids, $userids, $user); + return $msg->forwardMsg($dialogids, $userids, $user, $show_source, $leave_message); } /** diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index e369bdf4c..4a28a2d33 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -72,6 +72,7 @@ class WebSocketDialogMsg extends AbstractModel protected $appends = [ 'percentage', 'reply_data', + 'forward_data', ]; protected $hidden = [ @@ -114,6 +115,21 @@ class WebSocketDialogMsg extends AbstractModel return $this->appendattrs['reply_data']; } + /** + * 转发消息详情 + * @return WebSocketDialogMsg|null + */ + public function getForwardDataAttribute() + { + if (!isset($this->appendattrs['forward_data'])) { + $this->appendattrs['forward_data'] = null; + if ($this->forward_id > 0) { + $this->appendattrs['forward_data'] = self::find($this->forward_id, ['id', 'userid', 'type', 'msg'])?->cancelAppend() ?: null; + } + } + return $this->appendattrs['forward_data']; + } + /** * 消息格式化 * @param $value @@ -369,11 +385,13 @@ class WebSocketDialogMsg extends AbstractModel * @param array|int $dialogids * @param array|int $userids * @param User $user 发送的会员 + * @param int $showSource 是否显示原发送者信息 + * @param string $leaveMessage 转发留言 * @return mixed */ - public function forwardMsg($dialogids, $userids, $user) + public function forwardMsg($dialogids, $userids, $user, $showSource = 1, $leaveMessage = '') { - return AbstractModel::transaction(function() use ($dialogids, $user, $userids) { + return AbstractModel::transaction(function() use ($dialogids, $user, $userids, $showSource, $leaveMessage) { $originalMsg = Base::json2array($this->getRawOriginal('msg')); $msgs = []; $already = []; @@ -382,11 +400,14 @@ class WebSocketDialogMsg extends AbstractModel $dialogids = [$dialogids]; } foreach ($dialogids as $dialogid) { - $res = self::sendMsg(null, $dialogid, $this->type, $originalMsg, $user->userid); + $res = self::sendMsg('forward-'.( $showSource ? 1 : 0).'-'.($this->forward_id ?: $this->id), $dialogid, $this->type, $originalMsg, $user->userid); if (Base::isSuccess($res)) { $msgs[] = $res['data']; $already[] = $dialogid; } + if($leaveMessage){ + self::sendMsg(null, $dialogid, 'text', ['text' => $leaveMessage], $user->userid); + } } } if ($userids) { @@ -399,10 +420,13 @@ class WebSocketDialogMsg extends AbstractModel } $dialog = WebSocketDialog::checkUserDialog($user, $userid); if ($dialog && !in_array($dialog->id, $already)) { - $res = self::sendMsg(null, $dialog->id, $this->type, $originalMsg, $user->userid); + $res = self::sendMsg('forward-'.( $showSource ? 1 : 0).'-'.($this->forward_id ?: $this->id), $dialog->id, $this->type, $originalMsg, $user->userid); if (Base::isSuccess($res)) { $msgs[] = $res['data']; } + if($leaveMessage){ + self::sendMsg(null, $dialog->id, 'text', ['text' => $leaveMessage], $user->userid); + } } } } @@ -772,6 +796,7 @@ class WebSocketDialogMsg extends AbstractModel * - reply-98:回复消息ID=98 * - update-99:更新消息ID=99(标记修改) * - change-99:更新消息ID=99(不标记修改) + * - forward-99:转发消息ID=99 * @param int $dialog_id 会话ID(即 聊天室ID) * @param string $type 消息类型 * @param array $msg 发送的消息 @@ -812,6 +837,7 @@ class WebSocketDialogMsg extends AbstractModel $update_id = preg_match("/^update-(\d+)$/", $action, $match) ? $match[1] : 0; $change_id = preg_match("/^change-(\d+)$/", $action, $match) ? $match[1] : 0; $reply_id = preg_match("/^reply-(\d+)$/", $action, $match) ? $match[1] : 0; + $forward_id = preg_match("/^forward-(\d+)-(\d+)$/", $action, $match) ? $match[2] : 0; $sender = $sender === null ? User::userid() : $sender; // $dialog = WebSocketDialog::find($dialog_id); @@ -862,6 +888,10 @@ class WebSocketDialogMsg extends AbstractModel if ($reply_id && !self::whereId($reply_id)->increment('reply_num')) { throw new ApiException('回复的消息不存在'); } + // 转发 + if ($forward_id && !self::whereId($forward_id)->increment('forward_num')) { + throw new ApiException('转发的消息不存在'); + } // $dialogMsg = self::createInstance([ 'dialog_id' => $dialog_id, @@ -873,6 +903,8 @@ class WebSocketDialogMsg extends AbstractModel 'link' => $link, 'msg' => $msg, 'read' => 0, + 'forward_id' => $forward_id, + 'forward_show' => $forward_id ? $match[1] : 1, ]); AbstractModel::transaction(function () use ($dialog, $dialogMsg) { $dialog->last_at = Carbon::now(); diff --git a/database/migrations/2023_12_04_070224_web_socket_dialog_msgs_add_forward_id.php b/database/migrations/2023_12_04_070224_web_socket_dialog_msgs_add_forward_id.php new file mode 100644 index 000000000..76a7222fa --- /dev/null +++ b/database/migrations/2023_12_04_070224_web_socket_dialog_msgs_add_forward_id.php @@ -0,0 +1,38 @@ +bigInteger('forward_id')->nullable()->default(0)->after('reply_id')->comment('转发ID'); + $table->bigInteger('forward_num')->nullable()->default(0)->after('forward_id')->comment('被转发多少次'); + $table->boolean('forward_show')->nullable()->default(1)->after('forward_num')->comment('是否显示转发的来源'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('web_socket_dialog_msgs', function (Blueprint $table) { + $table->dropColumn("forward_id"); + $table->dropColumn("forward_num"); + $table->dropColumn("forward_show"); + }); + } +} diff --git a/language/original-web.txt b/language/original-web.txt index 397843d56..75e3d8673 100644 --- a/language/original-web.txt +++ b/language/original-web.txt @@ -1420,3 +1420,7 @@ APP推送 任务协助人 搜索项目名称 服务器版本过低,请升级服务器。 + +不显示原发送者信息 +转发给: +留言 diff --git a/resources/assets/js/components/UserSelect.vue b/resources/assets/js/components/UserSelect.vue index fe2d02b5a..c643f681f 100755 --- a/resources/assets/js/components/UserSelect.vue +++ b/resources/assets/js/components/UserSelect.vue @@ -21,7 +21,7 @@