From 3728b1d3a0a9ccc88d77d538af31b12997191513 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 17 Jun 2022 08:14:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 23 ++++++-- app/Http/Controllers/Api/UsersController.php | 4 +- app/Models/WebSocketDialogMsg.php | 14 +++-- ...24_web_socket_dialog_msgs_add_reply_id.php | 34 ++++++++++++ resources/assets/js/functions/utils.js | 26 +++++++++ .../manage/components/ChatInput/index.vue | 23 +++++++- .../pages/manage/components/DialogUpload.vue | 7 ++- .../js/pages/manage/components/DialogView.vue | 30 +++++++++-- .../pages/manage/components/DialogWrapper.vue | 48 ++++++++++++++--- .../assets/js/pages/manage/messenger.vue | 26 ++------- resources/assets/sass/dark.scss | 5 ++ .../sass/pages/components/chat-input.scss | 53 +++++++++++++++++++ .../sass/pages/components/dialog-wrapper.scss | 42 +++++++++++++++ resources/assets/sass/pages/page-manage.scss | 5 -- .../assets/sass/pages/page-messenger.scss | 4 +- 15 files changed, 288 insertions(+), 56 deletions(-) create mode 100644 database/migrations/2022_06_17_070224_web_socket_dialog_msgs_add_reply_id.php diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index ea20062db..ed1e2421d 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -264,6 +264,7 @@ class DialogController extends AbstractController * @apiName msg__sendtext * * @apiParam {Number} dialog_id 对话ID + * @apiParam {Number} [reply_id] 回复ID * @apiParam {String} text 消息内容 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) @@ -284,10 +285,14 @@ class DialogController extends AbstractController } // $dialog_id = Base::getPostInt('dialog_id'); + $reply_id = Base::getPostInt('reply_id'); $text = trim(Base::getPostValue('text')); // WebSocketDialog::checkDialog($dialog_id); // + if ($reply_id > 0 && !WebSocketDialogMsg::whereId($reply_id)->whereDialogId($dialog_id)->exists()) { + return Base::retError('回复的消息不存在'); + } $text = WebSocketDialogMsg::formatMsg($text, $dialog_id); $strlen = mb_strlen($text); if ($strlen < 1) { @@ -317,10 +322,10 @@ class DialogController extends AbstractController 'height' => -1, 'ext' => 'htm', ]; - return WebSocketDialogMsg::sendMsg($dialog_id, 'file', $fileData, $user->userid); + return WebSocketDialogMsg::sendMsg($dialog_id, $reply_id, 'file', $fileData, $user->userid); } // - return WebSocketDialogMsg::sendMsg($dialog_id, 'text', ['text' => $text], $user->userid); + return WebSocketDialogMsg::sendMsg($dialog_id, $reply_id, 'text', ['text' => $text], $user->userid); } /** @@ -332,6 +337,7 @@ class DialogController extends AbstractController * @apiName msg__sendrecord * * @apiParam {Number} dialog_id 对话ID + * @apiParam {Number} [reply_id] 回复ID * @apiParam {String} base64 语音base64 * @apiParam {Number} duration 语音时长(毫秒) * @@ -344,9 +350,13 @@ class DialogController extends AbstractController $user = User::auth(); // $dialog_id = Base::getPostInt('dialog_id'); + $reply_id = Base::getPostInt('reply_id'); // WebSocketDialog::checkDialog($dialog_id); // + if ($reply_id > 0 && !WebSocketDialogMsg::whereId($reply_id)->whereDialogId($dialog_id)->exists()) { + return Base::retError('回复的消息不存在'); + } $path = "uploads/chat/" . date("Ym") . "/" . $dialog_id . "/"; $base64 = Base::getPostValue('base64'); $duration = Base::getPostInt('duration'); @@ -363,7 +373,7 @@ class DialogController extends AbstractController $recordData = $data['data']; $recordData['size'] *= 1024; $recordData['duration'] = $duration; - return WebSocketDialogMsg::sendMsg($dialog_id, 'record', $recordData, $user->userid); + return WebSocketDialogMsg::sendMsg($dialog_id, $reply_id, 'record', $recordData, $user->userid); } } @@ -376,6 +386,7 @@ class DialogController extends AbstractController * @apiName msg__sendfile * * @apiParam {Number} dialog_id 对话ID + * @apiParam {Number} [reply_id] 回复ID * @apiParam {Number} [image_attachment] 图片是否也存到附件 * @apiParam {String} [filename] post-文件名称 * @apiParam {String} [image64] post-base64图片(二选一) @@ -390,10 +401,14 @@ class DialogController extends AbstractController $user = User::auth(); // $dialog_id = Base::getPostInt('dialog_id'); + $reply_id = Base::getPostInt('reply_id'); $image_attachment = Base::getPostInt('image_attachment'); // $dialog = WebSocketDialog::checkDialog($dialog_id); // + if ($reply_id > 0 && !WebSocketDialogMsg::whereId($reply_id)->whereDialogId($dialog_id)->exists()) { + return Base::retError('回复的消息不存在'); + } $path = "uploads/chat/" . date("Ym") . "/" . $dialog_id . "/"; $image64 = Base::getPostValue('image64'); $fileName = Base::getPostValue('filename'); @@ -438,7 +453,7 @@ class DialogController extends AbstractController } } // - $result = WebSocketDialogMsg::sendMsg($dialog_id, 'file', $fileData, $user->userid); + $result = WebSocketDialogMsg::sendMsg($dialog_id, $reply_id, 'file', $fileData, $user->userid); if (Base::isSuccess($result)) { if (isset($task)) { $result['data']['task_id'] = $task->id; diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 6e94b197a..fda1a0058 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -859,7 +859,7 @@ class UsersController extends AbstractController } $dialog = WebSocketDialog::checkUserDialog($user->userid, $userid); if ($dialog) { - $res = WebSocketDialogMsg::sendMsg($dialog->id, 'meeting', $data, $user->userid); + $res = WebSocketDialogMsg::sendMsg($dialog->id, 0, 'meeting', $data, $user->userid); if (Base::isSuccess($res)) { $msgs[] = $res['data']; } @@ -909,7 +909,7 @@ class UsersController extends AbstractController } $dialog = WebSocketDialog::checkUserDialog($user->userid, $userid); if ($dialog) { - $res = WebSocketDialogMsg::sendMsg($dialog->id, 'meeting', $data, $user->userid); + $res = WebSocketDialogMsg::sendMsg($dialog->id, 0, 'meeting', $data, $user->userid); if (Base::isSuccess($res)) { $msgs[] = $res['data']; } diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 45d18f0bc..2c2013b95 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -22,6 +22,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property array|mixed $emoji emoji回复 * @property int|null $read 已阅数量 * @property int|null $send 发送数量 + * @property int|null $reply_id 回复ID * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $deleted_at @@ -39,6 +40,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereMsg($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereRead($value) + * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereReplyId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereSend($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereType($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereUpdatedAt($value) @@ -239,7 +241,7 @@ class WebSocketDialogMsg extends AbstractModel } $dialog = WebSocketDialog::checkUserDialog($sender, $userid); if ($dialog) { - $res = self::sendMsg($dialog->id, $this->type, $this->getOriginal('msg'), $sender); + $res = self::sendMsg($dialog->id, 0, $this->type, $this->getOriginal('msg'), $sender); if (Base::isSuccess($res)) { $msgs[] = $res['data']; } @@ -420,28 +422,30 @@ class WebSocketDialogMsg extends AbstractModel /** * 发送消息 * @param int $dialog_id 会话ID(即 聊天室ID) + * @param int $reply_id 回复ID * @param string $type 消息类型 * @param array $msg 发送的消息 * @param int $sender 发送的会员ID(默认自己,0为系统) * @return array */ - public static function sendMsg($dialog_id, $type, $msg, $sender = 0) + public static function sendMsg($dialog_id, $reply_id, $type, $msg, $sender = 0) { $dialogMsg = self::createInstance([ + 'dialog_id' => $dialog_id, + 'reply_id' => $reply_id, 'userid' => $sender ?: User::userid(), 'type' => $type, 'msg' => $msg, 'read' => 0, ]); - AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) { - $dialog = WebSocketDialog::find($dialog_id); + AbstractModel::transaction(function () use ($dialogMsg) { + $dialog = WebSocketDialog::find($dialogMsg->dialog_id); if (empty($dialog)) { throw new ApiException('获取会话失败'); } $dialog->last_at = Carbon::now(); $dialog->save(); $dialogMsg->send = 1; - $dialogMsg->dialog_id = $dialog->id; $dialogMsg->dialog_type = $dialog->type; $dialogMsg->save(); }); diff --git a/database/migrations/2022_06_17_070224_web_socket_dialog_msgs_add_reply_id.php b/database/migrations/2022_06_17_070224_web_socket_dialog_msgs_add_reply_id.php new file mode 100644 index 000000000..01fa8f7c6 --- /dev/null +++ b/database/migrations/2022_06_17_070224_web_socket_dialog_msgs_add_reply_id.php @@ -0,0 +1,34 @@ +bigInteger('reply_id')->nullable()->default(0)->after('send')->comment('回复ID'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('web_socket_dialog_msgs', function (Blueprint $table) { + $table->dropColumn("reply_id"); + }); + } +} diff --git a/resources/assets/js/functions/utils.js b/resources/assets/js/functions/utils.js index 3cfb6e818..bde360a6c 100755 --- a/resources/assets/js/functions/utils.js +++ b/resources/assets/js/functions/utils.js @@ -76,6 +76,32 @@ module.exports = { return list; }, + /** + * 消息简单描述 + * @param data + * @returns {string|*} + */ + msgSimpleDesc(data) { + if ($A.isJson(data)) { + switch (data.type) { + case 'text': + return $A.getMsgTextPreview(data.msg.text) + case 'record': + return `[${$A.L('语音')}]` + case 'meeting': + return `[${$A.L('会议')}] ${data.msg.name}` + case 'file': + if (data.msg.type == 'img') { + return `[${$A.L('图片')}]` + } + return `[${$A.L('文件')}] ${data.msg.name}` + default: + return `[${$A.L('未知的消息')}]` + } + } + return ''; + }, + /** * 阻止滑动穿透 * @param el diff --git a/resources/assets/js/pages/manage/components/ChatInput/index.vue b/resources/assets/js/pages/manage/components/ChatInput/index.vue index 7d22c66a6..f137811c5 100755 --- a/resources/assets/js/pages/manage/components/ChatInput/index.vue +++ b/resources/assets/js/pages/manage/components/ChatInput/index.vue @@ -1,6 +1,13 @@