no message
This commit is contained in:
parent
874689c6bf
commit
2ca3e04221
@ -72,6 +72,33 @@ class DialogController extends AbstractController
|
|||||||
return Base::retSuccess('success', $item);
|
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
|
'text' => $text
|
||||||
];
|
];
|
||||||
//
|
//
|
||||||
if ($dialog->type == 'group') {
|
return WebSocketDialogMsg::sendMsg($dialog_id, 'text', $msg, $user->userid, $extra_int, $extra_str);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -260,11 +283,7 @@ class DialogController extends AbstractController
|
|||||||
$msg = $fileData;
|
$msg = $fileData;
|
||||||
$msg['size'] *= 1024;
|
$msg['size'] *= 1024;
|
||||||
//
|
//
|
||||||
if ($dialog->type == 'group') {
|
return WebSocketDialogMsg::sendMsg($dialog_id, 'file', $msg, $user->userid, $extra_int, $extra_str);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,10 +35,13 @@ class WebSocketDialog extends AbstractModel
|
|||||||
* 格式化对话
|
* 格式化对话
|
||||||
* @param WebSocketDialog $dialog
|
* @param WebSocketDialog $dialog
|
||||||
* @param int $userid 会员ID
|
* @param int $userid 会员ID
|
||||||
* @return WebSocketDialog
|
* @return self|null
|
||||||
*/
|
*/
|
||||||
public static function formatData(WebSocketDialog $dialog, $userid)
|
public static function formatData(WebSocketDialog $dialog, $userid)
|
||||||
{
|
{
|
||||||
|
if (empty($dialog)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
// 最后消息
|
// 最后消息
|
||||||
$last_msg = WebSocketDialogMsg::whereDialogId($dialog->id)->orderByDesc('id')->first();
|
$last_msg = WebSocketDialogMsg::whereDialogId($dialog->id)->orderByDesc('id')->first();
|
||||||
$dialog->last_msg = $last_msg;
|
$dialog->last_msg = $last_msg;
|
||||||
@ -128,12 +131,12 @@ class WebSocketDialog extends AbstractModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取聊天室对话
|
* 获取对话
|
||||||
* @param int $userid 会员ID
|
* @param int $userid 会员ID
|
||||||
* @param int $dialog_id 会话ID(即 聊天室ID)
|
* @param int $dialog_id 会话ID
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function checkGroupDialog($userid, $dialog_id)
|
public static function checkDialog($userid, $dialog_id)
|
||||||
{
|
{
|
||||||
if ($userid == 0) {
|
if ($userid == 0) {
|
||||||
return self::whereId($dialog_id)->first();
|
return self::whereId($dialog_id)->first();
|
||||||
@ -141,7 +144,6 @@ class WebSocketDialog extends AbstractModel
|
|||||||
return self::select(['web_socket_dialogs.*'])
|
return self::select(['web_socket_dialogs.*'])
|
||||||
->join('web_socket_dialog_users', 'web_socket_dialog_users.dialog_id', '=', 'web_socket_dialogs.id')
|
->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.id', $dialog_id)
|
||||||
->where('web_socket_dialogs.type', 'group')
|
|
||||||
->where('web_socket_dialog_users.userid', $userid)
|
->where('web_socket_dialog_users.userid', $userid)
|
||||||
->first();
|
->first();
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 给会员添加并发送消息
|
* 发送消息
|
||||||
* @param int $dialog_id 会话ID(即 聊天室ID)
|
* @param int $dialog_id 会话ID(即 聊天室ID)
|
||||||
* @param string $type 消息类型
|
* @param string $type 消息类型
|
||||||
* @param array $msg 发送的消息
|
* @param array $msg 发送的消息
|
||||||
@ -138,7 +138,7 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
* @param string $extra_str
|
* @param string $extra_str
|
||||||
* @return array
|
* @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([
|
$dialogMsg = self::createInstance([
|
||||||
'userid' => $sender ?: User::token2userid(),
|
'userid' => $sender ?: User::token2userid(),
|
||||||
@ -149,9 +149,9 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
'extra_str' => $extra_str,
|
'extra_str' => $extra_str,
|
||||||
]);
|
]);
|
||||||
return AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) {
|
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)) {
|
if (empty($dialog)) {
|
||||||
return Base::retError('不是聊天室成员');
|
return Base::retError('获取会话失败');
|
||||||
}
|
}
|
||||||
$dialog->last_at = Carbon::now();
|
$dialog->last_at = Carbon::now();
|
||||||
$dialog->save();
|
$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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,12 @@
|
|||||||
:delay="600"
|
:delay="600"
|
||||||
:disabled="tooltipDisabled"
|
:disabled="tooltipDisabled"
|
||||||
:transfer="transfer">
|
:transfer="transfer">
|
||||||
<div slot="content">
|
<div slot="content" class="common-avatar-transfer">
|
||||||
<p>{{$L('昵称')}}: {{user.nickname}}</p>
|
<p>{{$L('昵称')}}: {{user.nickname}}</p>
|
||||||
<p>{{$L('职位/职称')}}: {{user.profession || '-'}}</p>
|
<p>{{$L('职位/职称')}}: {{user.profession || '-'}}</p>
|
||||||
|
<div v-if="userId != userid" class="avatar-icons">
|
||||||
|
<Icon type="ios-chatbubbles" @click="openDialog"/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="avatar-wrapper">
|
<div class="avatar-wrapper">
|
||||||
<div :class="['avatar-box', user.online ? 'online' : '']">
|
<div :class="['avatar-box', user.online ? 'online' : '']">
|
||||||
@ -55,7 +58,7 @@
|
|||||||
this.getData()
|
this.getData()
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["userOnline"]),
|
...mapState(["userId", "userOnline"]),
|
||||||
|
|
||||||
showImg() {
|
showImg() {
|
||||||
const {userimg} = this.user
|
const {userimg} = this.user
|
||||||
@ -99,6 +102,12 @@
|
|||||||
this.user = user;
|
this.user = user;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
openDialog() {
|
||||||
|
this.$store.state.method.setStorage('messengerDialogId', 0)
|
||||||
|
this.$store.commit("openDialogUser", this.userid);
|
||||||
|
this.goForward({path: '/manage/messenger'});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<div class="dialog-avatar">
|
<div class="dialog-avatar">
|
||||||
<UserAvatar :userid="item.userid" :tooltip-disabled="item.userid == userId" :size="30"/>
|
<UserAvatar :userid="item.userid" :tooltip-disabled="item.userid == userId" :size="30"/>
|
||||||
</div>
|
</div>
|
||||||
<DialogView :msg-data="item" dialog-type="group"/>
|
<DialogView :msg-data="item" :dialog-type="dialogDetail.type"/>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,8 +16,9 @@
|
|||||||
:key="key"
|
:key="key"
|
||||||
:class="{active: dialog.id == dialogId}"
|
:class="{active: dialog.id == dialogId}"
|
||||||
@click="openDialog(dialog)">
|
@click="openDialog(dialog)">
|
||||||
<Icon v-if="dialog.type=='group'" class="group-avatar" type="ios-people" />
|
<Icon v-if="dialog.type=='group'" class="icon-avatar" type="ios-people" />
|
||||||
<UserAvatar v-else-if="dialog.dialog_user" :userid="dialog.dialog_user.userid" :size="46"/>
|
<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-box">
|
||||||
<div class="dialog-title">
|
<div class="dialog-title">
|
||||||
<span>{{dialog.name}}</span>
|
<span>{{dialog.name}}</span>
|
||||||
|
27
resources/assets/js/store/mutations.js
vendored
27
resources/assets/js/store/mutations.js
vendored
@ -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
|
* @param state
|
||||||
|
36
resources/assets/sass/main.scss
vendored
36
resources/assets/sass/main.scss
vendored
@ -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 {
|
.common-user-transfer {
|
||||||
.user-input-option {
|
.user-input-option {
|
||||||
@ -1065,20 +1090,19 @@ body {
|
|||||||
&.active {
|
&.active {
|
||||||
background-color: #F4F5F7;
|
background-color: #F4F5F7;
|
||||||
}
|
}
|
||||||
.common-avatar {
|
.user-avatar,
|
||||||
|
.icon-avatar {
|
||||||
|
width: 46px;
|
||||||
|
height: 46px;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.group-avatar {
|
.icon-avatar {
|
||||||
width: 46px;
|
|
||||||
height: 46px;
|
|
||||||
line-height: 46px;
|
line-height: 46px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
background-color: #61B2F9;
|
background-color: #61B2F9;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
flex-grow: 0;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
}
|
||||||
.dialog-box {
|
.dialog-box {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user