From 4c51e52a30ae0d560878c5a06832e69fcfd500be Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sun, 6 Jun 2021 01:38:40 +0800 Subject: [PATCH] no message --- app/Http/Controllers/Api/DialogController.php | 55 ++++++ app/Models/User.php | 12 ++ app/Models/WebSocketDialog.php | 23 +++ app/Models/WebSocketDialogMsg.php | 1 + app/Models/WebSocketDialogMsgRead.php | 2 + app/Tasks/WebSocketDialogMsgTask.php | 2 + resources/assets/js/pages/manage.vue | 18 +- .../pages/manage/components/ProjectDialog.vue | 14 +- resources/assets/js/pages/manage/dialog.vue | 166 +++++++++++++++++- resources/assets/js/pages/manage/project.vue | 4 +- resources/assets/js/routes.js | 5 + resources/assets/js/store/mutations.js | 32 ++-- resources/assets/js/store/state.js | 4 +- resources/assets/sass/main.scss | 152 ++++++++++++++++ resources/assets/sass/scrollbar.scss | 2 +- 15 files changed, 453 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index e2c8ce05..df22ba7a 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -17,6 +17,61 @@ use Request; */ class DialogController extends AbstractController { + /** + * 对话列表 + * + * @apiParam {Number} [page] 当前页,默认:1 + * @apiParam {Number} [pagesize] 每页显示数量,默认:100,最大:200 + */ + public function lists() + { + $user = User::authE(); + if (Base::isError($user)) { + return $user; + } else { + $user = User::IDE($user['data']); + } + // + $list = WebSocketDialog::select(['web_socket_dialogs.*']) + ->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id') + ->where('u.userid', $user->userid) + ->orderByDesc('web_socket_dialogs.last_at') + ->paginate(Base::getPaginate(200, 100)); + $list->transform(function (WebSocketDialog $item) use ($user) { + return WebSocketDialog::formatData($item, $user->userid); + }); + // + return Base::retSuccess('success', $list); + } + + /** + * 单个对话信息 + * + * @apiParam {Number} dialog_id 对话ID + */ + public function one() + { + $user = User::authE(); + if (Base::isError($user)) { + return $user; + } else { + $user = User::IDE($user['data']); + } + // + $dialog_id = intval(Request::input('dialog_id')); + // + $item = WebSocketDialog::select(['web_socket_dialogs.*']) + ->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id') + ->where('web_socket_dialogs.id', $dialog_id) + ->where('u.userid', $user->userid) + ->first(); + if ($item) { + $item = WebSocketDialog::formatData($item, $user->userid); + } + // + return Base::retSuccess('success', $item); + } + /** * 消息列表 * diff --git a/app/Models/User.php b/app/Models/User.php index e7df0a36..998f9658 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -375,6 +375,18 @@ class User extends AbstractModel return $_A["__static_userid2basic_" . $userid] = ($userInfo ?: []); } + + /** + * userid 获取 昵称 + * @param $userid + * @return string + */ + public static function userid2nickname($userid) + { + $basic = self::userid2basic($userid); + return $basic ? $basic->nickname : ''; + } + /** * 更新首字母 * @param $userid diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 9b1f4e90..7763898d 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -31,6 +31,29 @@ use App\Module\Base; */ class WebSocketDialog extends AbstractModel { + /** + * 格式化对话 + * @param WebSocketDialog $dialog + * @param int $userid 会员ID + * @return WebSocketDialog + */ + public static function formatData(WebSocketDialog $dialog, $userid) + { + // 最后消息 + $last_msg = WebSocketDialogMsg::whereDialogId($dialog->id)->orderByDesc('id')->first(); + $dialog->last_msg = $last_msg; + // 未读信息 + $dialog->unread = WebSocketDialogMsgRead::whereDialogId($dialog->id)->whereUserid($userid)->whereReadAt(null)->count(); + // 对方信息 + $dialog->dialog_user = null; + if ($dialog->type === 'user') { + $dialog_user = WebSocketDialogUser::whereDialogId($dialog->id)->where('userid', '!=', $userid)->first(); + $dialog->name = User::userid2nickname($dialog_user->userid); + $dialog->dialog_user = $dialog_user; + } + return $dialog; + } + /** * 创建聊天室 * @param string $name 聊天室名称 diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 78a235d1..899acf5e 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -99,6 +99,7 @@ class WebSocketDialogMsg extends AbstractModel $msgRead = WebSocketDialogMsgRead::whereMsgId($this->id)->whereUserid($userid)->lockForUpdate()->first(); if (empty($msgRead)) { $msgRead = WebSocketDialogMsgRead::createInstance([ + 'dialog_id' => $this->dialog_id, 'msg_id' => $this->id, 'userid' => $userid, ]); diff --git a/app/Models/WebSocketDialogMsgRead.php b/app/Models/WebSocketDialogMsgRead.php index caa4ff95..45cf0a21 100644 --- a/app/Models/WebSocketDialogMsgRead.php +++ b/app/Models/WebSocketDialogMsgRead.php @@ -7,12 +7,14 @@ namespace App\Models; * * @package App\Models * @property int $id + * @property int|null $dialog_id 对话ID * @property int|null $msg_id 消息ID * @property int|null $userid 发送会员ID * @property string|null $read_at 阅读时间 * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead newQuery() * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead query() + * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead whereDialogId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead whereMsgId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgRead whereReadAt($value) diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index 43763185..0ebdd64e 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -35,12 +35,14 @@ class WebSocketDialogMsgTask extends AbstractTask $userids = is_array($this->userid) ? $this->userid : [$this->userid]; $msgId = intval($this->dialogMsgArray['id']); $send = intval($this->dialogMsgArray['send']); + $dialogId = intval($this->dialogMsgArray['dialog_id']); if (empty($userids) || empty($msgId)) { return; } $pushIds = []; foreach ($userids AS $userid) { $msgRead = WebSocketDialogMsgRead::createInstance([ + 'dialog_id' => $dialogId, 'msg_id' => $msgId, 'userid' => $userid, ]); diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 4870ee8b..dd37b440 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -7,17 +7,21 @@