no message

This commit is contained in:
kuaifan 2021-06-06 22:58:01 +08:00
parent 874689c6bf
commit 2ca3e04221
8 changed files with 112 additions and 69 deletions

View File

@ -72,6 +72,33 @@ class DialogController extends AbstractController
return Base::retSuccess('success', $item);
}
/**
* 打开会话
*
* @apiParam {Number} userid 对话会员ID
*/
public function open__user()
{
$user = User::authE();
if (Base::isError($user)) {
return $user;
} else {
$user = User::IDE($user['data']);
}
//
$userid = intval(Request::input('userid'));
//
$dialog = WebSocketDialog::checkUserDialog($user->userid, $userid);
if (empty($dialog)) {
return Base::retError('打开会话失败');
}
$data = WebSocketDialog::formatData(WebSocketDialog::find($dialog->id), $user->userid);
if (empty($data)) {
return Base::retError('打开会话错误');
}
return Base::retSuccess('success', $data);
}
/**
* 消息列表
*
@ -162,11 +189,7 @@ class DialogController extends AbstractController
'text' => $text
];
//
if ($dialog->type == 'group') {
return WebSocketDialogMsg::addGroupMsg($dialog_id, 'text', $msg, $user->userid, $extra_int, $extra_str);
} else {
return WebSocketDialogMsg::addUserMsg($dialog_id, 'text', $msg, $user->userid, $extra_int, $extra_str);
}
return WebSocketDialogMsg::sendMsg($dialog_id, 'text', $msg, $user->userid, $extra_int, $extra_str);
}
/**
@ -260,11 +283,7 @@ class DialogController extends AbstractController
$msg = $fileData;
$msg['size'] *= 1024;
//
if ($dialog->type == 'group') {
return WebSocketDialogMsg::addGroupMsg($dialog_id, 'file', $msg, $user->userid, $extra_int, $extra_str);
} else {
return WebSocketDialogMsg::addUserMsg($dialog_id, 'file', $msg, $user->userid, $extra_int, $extra_str);
}
return WebSocketDialogMsg::sendMsg($dialog_id, 'file', $msg, $user->userid, $extra_int, $extra_str);
}
}

View File

@ -35,10 +35,13 @@ class WebSocketDialog extends AbstractModel
* 格式化对话
* @param WebSocketDialog $dialog
* @param int $userid 会员ID
* @return WebSocketDialog
* @return self|null
*/
public static function formatData(WebSocketDialog $dialog, $userid)
{
if (empty($dialog)) {
return null;
}
// 最后消息
$last_msg = WebSocketDialogMsg::whereDialogId($dialog->id)->orderByDesc('id')->first();
$dialog->last_msg = $last_msg;
@ -128,12 +131,12 @@ class WebSocketDialog extends AbstractModel
}
/**
* 获取聊天室对话
* 获取对话
* @param int $userid 会员ID
* @param int $dialog_id 会话ID(即 聊天室ID
* @param int $dialog_id 会话ID
* @return self
*/
public static function checkGroupDialog($userid, $dialog_id)
public static function checkDialog($userid, $dialog_id)
{
if ($userid == 0) {
return self::whereId($dialog_id)->first();
@ -141,7 +144,6 @@ class WebSocketDialog extends AbstractModel
return self::select(['web_socket_dialogs.*'])
->join('web_socket_dialog_users', 'web_socket_dialog_users.dialog_id', '=', 'web_socket_dialogs.id')
->where('web_socket_dialogs.id', $dialog_id)
->where('web_socket_dialogs.type', 'group')
->where('web_socket_dialog_users.userid', $userid)
->first();
}

View File

@ -129,7 +129,7 @@ class WebSocketDialogMsg extends AbstractModel
}
/**
* 给会员添加并发送消息
* 发送消息
* @param int $dialog_id 会话ID 聊天室ID
* @param string $type 消息类型
* @param array $msg 发送的消息
@ -138,7 +138,7 @@ class WebSocketDialogMsg extends AbstractModel
* @param string $extra_str
* @return array
*/
public static function addGroupMsg($dialog_id, $type, $msg, $sender = 0, $extra_int = 0, $extra_str = '')
public static function sendMsg($dialog_id, $type, $msg, $sender = 0, $extra_int = 0, $extra_str = '')
{
$dialogMsg = self::createInstance([
'userid' => $sender ?: User::token2userid(),
@ -149,9 +149,9 @@ class WebSocketDialogMsg extends AbstractModel
'extra_str' => $extra_str,
]);
return AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) {
$dialog = WebSocketDialog::checkGroupDialog($dialogMsg->userid, $dialog_id);
$dialog = WebSocketDialog::checkDialog($dialogMsg->userid, $dialog_id);
if (empty($dialog)) {
return Base::retError('不是聊天室成员');
return Base::retError('获取会话失败');
}
$dialog->last_at = Carbon::now();
$dialog->save();
@ -167,43 +167,4 @@ class WebSocketDialogMsg extends AbstractModel
});
}
/**
* 给会员添加并发送消息
* @param int $userid 接收的会员ID
* @param string $type 消息类型
* @param array $msg 发送的消息
* @param int $sender 发送的会员ID默认自己0为系统
* @param int $extra_int
* @param string $extra_str
* @return array
*/
public static function addUserMsg($userid, $type, $msg, $sender = 0, $extra_int = 0, $extra_str = '')
{
$dialogMsg = self::createInstance([
'userid' => $sender ?: User::token2userid(),
'type' => $type,
'msg' => $msg,
'read' => 0,
'extra_int' => $extra_int,
'extra_str' => $extra_str,
]);
return AbstractModel::transaction(function () use ($userid, $msg, $dialogMsg) {
$dialog = WebSocketDialog::checkUserDialog($dialogMsg->userid, $userid);
if (empty($dialog)) {
return Base::retError('创建对话失败');
}
$dialog->last_at = Carbon::now();
$dialog->save();
$dialogMsg->send = 1;
$dialogMsg->dialog_id = $dialog->id;
$dialogMsg->save();
//
$task = new WebSocketDialogMsgTask($userid, $dialogMsg->toArray());
Task::deliver($task);
//
return Base::retSuccess('发送成功', $dialogMsg);
});
}
}

View File

@ -4,9 +4,12 @@
:delay="600"
:disabled="tooltipDisabled"
:transfer="transfer">
<div slot="content">
<div slot="content" class="common-avatar-transfer">
<p>{{$L('昵称')}}: {{user.nickname}}</p>
<p>{{$L('职位/职称')}}: {{user.profession || '-'}}</p>
<div v-if="userId != userid" class="avatar-icons">
<Icon type="ios-chatbubbles" @click="openDialog"/>
</div>
</div>
<div class="avatar-wrapper">
<div :class="['avatar-box', user.online ? 'online' : '']">
@ -55,7 +58,7 @@
this.getData()
},
computed: {
...mapState(["userOnline"]),
...mapState(["userId", "userOnline"]),
showImg() {
const {userimg} = this.user
@ -99,6 +102,12 @@
this.user = user;
}
});
},
openDialog() {
this.$store.state.method.setStorage('messengerDialogId', 0)
this.$store.commit("openDialogUser", this.userid);
this.goForward({path: '/manage/messenger'});
}
}
};

View File

@ -19,7 +19,7 @@
<div class="dialog-avatar">
<UserAvatar :userid="item.userid" :tooltip-disabled="item.userid == userId" :size="30"/>
</div>
<DialogView :msg-data="item" dialog-type="group"/>
<DialogView :msg-data="item" :dialog-type="dialogDetail.type"/>
</li>
</ul>
</div>

View File

@ -16,8 +16,9 @@
:key="key"
:class="{active: dialog.id == dialogId}"
@click="openDialog(dialog)">
<Icon v-if="dialog.type=='group'" class="group-avatar" type="ios-people" />
<UserAvatar v-else-if="dialog.dialog_user" :userid="dialog.dialog_user.userid" :size="46"/>
<Icon v-if="dialog.type=='group'" class="icon-avatar" type="ios-people" />
<div v-else-if="dialog.dialog_user" class="user-avatar"><UserAvatar :userid="dialog.dialog_user.userid" :size="46"/></div>
<Icon v-else class="icon-avatar" type="md-person" />
<div class="dialog-box">
<div class="dialog-title">
<span>{{dialog.name}}</span>

View File

@ -253,6 +253,33 @@ export default {
});
},
/**
* 打开个人对话
* @param state
* @param userid
*/
openDialogUser(state, userid) {
$A.apiAjax({
url: 'dialog/open/user',
data: {
userid,
},
success: ({ret, data, msg}) => {
if (ret === 1) {
let index = state.dialogList.findIndex(({id}) => id == data.id);
if (index > -1) {
state.dialogList.splice(index, 1, data);
} else {
state.dialogList.unshift(data)
}
this.commit('getDialogMsgList', data.id);
} else {
$A.modalError(msg);
}
}
});
},
/**
* 获取对话消息
* @param state

View File

@ -505,6 +505,31 @@ body {
}
}
}
.common-avatar-transfer {
padding: 4px 2px;
> p {
padding: 1px 2px;
}
.avatar-icons {
margin-top: 12px;
border-top: 1px solid #F4F4F5;
padding: 8px 0 2px;
display: flex;
align-items: center;
> i {
cursor: pointer;
font-size: 22px;
margin-right: 12px;
color: #F4F4F5;
&:last-child {
margin-right: 0;
}
&:hover {
color: #ffffff;
}
}
}
}
.common-user-transfer {
.user-input-option {
@ -1065,20 +1090,19 @@ body {
&.active {
background-color: #F4F5F7;
}
.common-avatar {
.user-avatar,
.icon-avatar {
width: 46px;
height: 46px;
flex-grow: 0;
flex-shrink: 0;
}
.group-avatar {
width: 46px;
height: 46px;
.icon-avatar {
line-height: 46px;
border-radius: 50%;
font-size: 26px;
background-color: #61B2F9;
color: #ffffff;
flex-grow: 0;
flex-shrink: 0;
}
.dialog-box {
flex: 1;