no message
This commit is contained in:
parent
7405c5bba8
commit
b78e30c2f0
@ -44,6 +44,9 @@ class DialogController extends AbstractController
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
$list = WebSocketDialogMsg::whereDialogId($dialog_id)->orderByDesc('id')->paginate(Base::getPaginate(100, 50));
|
$list = WebSocketDialogMsg::whereDialogId($dialog_id)->orderByDesc('id')->paginate(Base::getPaginate(100, 50));
|
||||||
|
$list->transform(function (WebSocketDialogMsg $item) {
|
||||||
|
return $item->sendSuccess();
|
||||||
|
});
|
||||||
//
|
//
|
||||||
return Base::retSuccess('success', $list);
|
return Base::retSuccess('success', $list);
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,26 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
return Base::json2array($value);
|
return Base::json2array($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标记已送达 同时 告诉发送人已送达
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function sendSuccess()
|
||||||
|
{
|
||||||
|
if (empty($this->send)) {
|
||||||
|
$this->send = 1;
|
||||||
|
$this->save();
|
||||||
|
PushTask::push([
|
||||||
|
'userid' => $this->userid,
|
||||||
|
'msg' => [
|
||||||
|
'type' => 'dialog',
|
||||||
|
'data' => $this->toArray(),
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 给会员添加并发送消息
|
* 给会员添加并发送消息
|
||||||
* @param int $dialog_id 会话ID(即 聊天室ID)
|
* @param int $dialog_id 会话ID(即 聊天室ID)
|
||||||
@ -89,6 +109,7 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
'userid' => $userids,
|
'userid' => $userids,
|
||||||
'msg' => [
|
'msg' => [
|
||||||
'type' => 'dialog',
|
'type' => 'dialog',
|
||||||
|
'msgId' => $dialogMsg->id,
|
||||||
'data' => $dialogMsg->toArray(),
|
'data' => $dialogMsg->toArray(),
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
@ -131,6 +152,7 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
'userid' => $userid,
|
'userid' => $userid,
|
||||||
'msg' => [
|
'msg' => [
|
||||||
'type' => 'dialog',
|
'type' => 'dialog',
|
||||||
|
'msgId' => $dialogMsg->id,
|
||||||
'data' => $dialogMsg->toArray(),
|
'data' => $dialogMsg->toArray(),
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
@ -6,6 +6,7 @@ namespace App\Services;
|
|||||||
|
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Models\WebSocket;
|
use App\Models\WebSocket;
|
||||||
|
use App\Models\WebSocketDialogMsg;
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
use App\Tasks\PushTask;
|
use App\Tasks\PushTask;
|
||||||
use Cache;
|
use Cache;
|
||||||
@ -104,7 +105,6 @@ class WebSocketService implements WebSocketHandlerInterface
|
|||||||
//
|
//
|
||||||
$msg = Base::json2array($frame->data);
|
$msg = Base::json2array($frame->data);
|
||||||
$type = $msg['type']; // 消息类型
|
$type = $msg['type']; // 消息类型
|
||||||
$to = $msg['to']; // 发给谁
|
|
||||||
$msgId = $msg['msgId']; // 消息ID(用于回调)
|
$msgId = $msg['msgId']; // 消息ID(用于回调)
|
||||||
$data = $msg['data']; // 消息详情
|
$data = $msg['data']; // 消息详情
|
||||||
//
|
//
|
||||||
@ -114,7 +114,8 @@ class WebSocketService implements WebSocketHandlerInterface
|
|||||||
* 收到回执
|
* 收到回执
|
||||||
*/
|
*/
|
||||||
case 'receipt':
|
case 'receipt':
|
||||||
|
$dialogMsg = WebSocketDialogMsg::whereId(intval($msgId))->first();
|
||||||
|
$dialogMsg && $dialogMsg->sendSuccess();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
@ -4,8 +4,12 @@
|
|||||||
<div v-if="msgData.type == 'text'" class="message-content" v-html="textMsg(msgData.msg.text)"></div>
|
<div v-if="msgData.type == 'text'" class="message-content" v-html="textMsg(msgData.msg.text)"></div>
|
||||||
<div v-else class="message-content message-unknown">{{$L("未知的消息类型")}}</div>
|
<div v-else class="message-content message-unknown">{{$L("未知的消息类型")}}</div>
|
||||||
|
|
||||||
<div v-if="msgData.created_at" class="message-time">{{formatTime(msgData.created_at)}}</div>
|
<div v-if="msgData.created_at" class="message-foot">
|
||||||
<div v-else class="message-time"><Loading/></div>
|
<div class="time">{{formatTime(msgData.created_at)}}</div>
|
||||||
|
<Icon v-if="msgData.send" class="done-all" type="md-done-all" />
|
||||||
|
<Icon v-else class="done" type="md-checkmark" />
|
||||||
|
</div>
|
||||||
|
<div v-else class="message-foot"><Loading/></div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
11
resources/assets/js/store/mutations.js
vendored
11
resources/assets/js/store/mutations.js
vendored
@ -284,25 +284,26 @@ export default {
|
|||||||
/**
|
/**
|
||||||
* 发送 websocket 消息
|
* 发送 websocket 消息
|
||||||
* @param state
|
* @param state
|
||||||
* @param params {type, to, data, callback}
|
* @param params {type, data, callback, msgId}
|
||||||
*/
|
*/
|
||||||
wsSend(state, params) {
|
wsSend(state, params) {
|
||||||
if (!state.method.isJson(params)) {
|
if (!state.method.isJson(params)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const {type, to, data, callback} = params;
|
const {type, data, callback} = params;
|
||||||
|
let msgId = params.msgId || 0;
|
||||||
if (!state.ws) {
|
if (!state.ws) {
|
||||||
typeof callback === "function" && callback(null, false)
|
typeof callback === "function" && callback(null, false)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (typeof callback === "function") {
|
if (typeof callback === "function") {
|
||||||
params.msgId = state.method.randomString(16)
|
msgId = state.method.randomString(16)
|
||||||
state.wsCall[params.msgId] = callback;
|
state.wsCall[msgId] = callback;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
state.ws.send(JSON.stringify({
|
state.ws.send(JSON.stringify({
|
||||||
type,
|
type,
|
||||||
to,
|
msgId,
|
||||||
data
|
data
|
||||||
}));
|
}));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
24
resources/assets/sass/main.scss
vendored
24
resources/assets/sass/main.scss
vendored
@ -697,9 +697,9 @@ body {
|
|||||||
.message-unknown {
|
.message-unknown {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
.message-time {
|
.message-foot {
|
||||||
color: #bbbbbb;
|
display: flex;
|
||||||
font-size: 12px;
|
align-items: center;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
height: 21px;
|
height: 21px;
|
||||||
line-height: 21px;
|
line-height: 21px;
|
||||||
@ -708,6 +708,18 @@ body {
|
|||||||
width: 10px;
|
width: 10px;
|
||||||
height: 10px;
|
height: 10px;
|
||||||
}
|
}
|
||||||
|
.time {
|
||||||
|
color: #bbbbbb;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.done,
|
||||||
|
.done-all {
|
||||||
|
display: none;
|
||||||
|
margin-left: 4px;
|
||||||
|
transform: scale(0.9);
|
||||||
|
font-size: 12px;
|
||||||
|
color: #87d068;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&.loading {
|
&.loading {
|
||||||
@ -736,6 +748,12 @@ body {
|
|||||||
background-color: #2d8cf0;
|
background-color: #2d8cf0;
|
||||||
border-radius: 6px 6px 0 6px;
|
border-radius: 6px 6px 0 6px;
|
||||||
}
|
}
|
||||||
|
.message-foot {
|
||||||
|
.done,
|
||||||
|
.done-all {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user