wg-basic/module-instant-message/src/main/resources/templates/chat-demo.html
2021-09-14 11:43:58 +08:00

186 lines
7.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'}">
<meta charset="UTF-8">
<title>聊天测试</title>
<style>
.websocket-line {padding: 5px 0;}
.websocket-input {width: 234px; height: 23px; border: 1px solid silver; padding: 0 5px;}
.websocket-container {width: 295px;}
.websocket-history-box {height: 400px; border: 1px solid silver; overflow: auto;}
.websocket-box {padding: 5px 0; text-align: right;}
.message {display: inline-block; max-width: 195px; font-size: 13px; margin: 10px; padding: 5px; border-radius: 5px;word-wrap: break-word; word-break: normal;}
.receive-msg-box {}
.receive-msg {background-color: #04b304; color: #FFFFFF;}
.send-msg-box {text-align: right;}
.send-msg {text-align: left; background-color: #c5c5c5; color: #000000; margin: 10px 10px 10px 0;}
.send-status {width: 20px; height: 20px; border-radius: 10px; background-color: red; display: inline-block;text-align: center; color: #FFF; vertical-align: middle;}
</style>
</head>
<body>
<div class="websocket-container">
<div class="websocket-line">
<select id="scheme" style="width: 70px; height: 26px; font-size: 18px;">
<option value="ws://" selected>ws://</option>
<option value="wss://">wss://</option>
</select>
<span id="webSocketUrl" th:text="${webSocketUrl}"></span>
<input id="currentUserId" class="websocket-input" type="hidden" th:value="${currentUserId}"/>
</div>
<div class="websocket-line">
接收用户ID <input id="toUserId" class="websocket-input" type="text" style="width: 198px;" placeholder="输入接收用户ID"/>
</div>
<div class="websocket-line">
<input id="clientName" class="websocket-input" type="text" placeholder="请输入客户端名称"/>
<button id="loginBtn" onclick="login()">登录</button>
<button id="closeBtn" style="display: none;" onclick="closeWebSocket()">关闭</button>
</div>
<div class="websocket-line" style="font-size: 12px;">
状态:<span id="loginStatus">未登录</span>
</div>
<div id="websocketHistoryBox" class="websocket-history-box">
<div class="receive-msg-box">
<div class="message receive-msg">收到</div>
</div>
<div class="send-msg-box">
<span class="send-status" title="用户不存在">!</span> <div class="message send-msg">发送</div>
</div>
</div>
<div id="sendBox" class="websocket-box" style="display: none;">
<input type="text" id="message" class="websocket-input" placeholder="请输入发送内容"/>
<button id="login" onclick="send()">发送</button>
</div>
</div>
<script type="text/javascript" src="assets/js/jquery-3.5.1.min.js"></script>
<script type="text/javascript" src="assets/js/restajax.js"></script>
<script type="text/javascript">
var websocket;
function register(sessionId) {
var registBody = {
id: new Date().getTime(),
type: 100,
from: $('#currentUserId').val(),
to: $('#currentUserId').val(),
body: {
sessionId: sessionId
}
}
websocket.send(JSON.stringify(registBody));
}
function initWebSocket(sessionId) {
if ('WebSocket' in window) {
websocket = new WebSocket($('#scheme').val() + $('#webSocketUrl').html());
console.log("WebSocket连接成功")
} else {
alert('浏览器不支持WebSocket');
return;
}
//连接发生错误的回调方法
websocket.onerror = function () {
console.log('error')
};
//连接成功建立的回调方法
websocket.onopen = function (event) {
console.log('open', event);
// 打开连接注册WebSocket
register(sessionId);
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
var data = JSON.parse(event.data);
// 注册
if(data.type === 100) {
var body = JSON.parse(data.body);
if(body.code === 200) {
$('#loginStatus').html('已连接');
} else {
$('#loginStatus').html(body.msg);
}
} else if(data.type === 101) {
var body = data.body;
$('#websocketHistoryBox').append('<div class="receive-msg-box"><div class="message receive-msg">'+ body +'</div></div>');
autoScrollBottom();
} else if(data.type === 1100) {
var body = JSON.parse(data.body);
$('#'+ data.id).before('<span class="send-status" title="'+ body.msg +'">!</span> ')
}
}
//连接关闭的回调方法
websocket.onclose = function () {
console.log('close')
}
//监听窗口关闭事件当窗口关闭时主动去关闭websocket连接防止连接还没断开就关闭窗口server端会抛异常。
window.onbeforeunload = function () {
websocket.close();
}
}
function login() {
if(!$('#toUserId').val()) {
alert('请输入接收用户ID');
return;
}
if(!$('#clientName').val()) {
alert('请输入客户端名称')
return;
}
restAjax.get(restAjax.path('api/websocket/client/login/{clientName}', [$('#clientName').val()]), {}, null, function(code, data) {
var sessionId = data.data
$('#loginBtn').hide();
$('#closeBtn').show();
$('#clientName').attr('disabled', 'disabled');
$('#toUserId').attr('disabled', 'disabled');
$('#sendBox').show();
initWebSocket(sessionId);
}, function(code, data) {
alert(data.msg);
})
}
function send() {
if(!websocket) {
alert('请开启WebSocket');
return;
}
if(!$('#message').val()) {
alert('请输入内容');
return;
}
var sendId = new Date().getTime();
var sendBody = {
id: sendId,
type: 101,
from: $('#currentUserId').val(),
to: $('#toUserId').val(),
body: $('#message').val()
}
websocket.send(JSON.stringify(sendBody));
$('#websocketHistoryBox').append('<div class="send-msg-box"><div id="'+ sendId +'" class="message send-msg">'+ $('#message').val() +'</div></div>');
$('#message').val('');
autoScrollBottom();
//
}
function closeWebSocket() {
websocket.close();
$('#loginBtn').show();
$('#closeBtn').hide();
$('#clientName').removeAttr('disabled');
$('#toUserId').removeAttr('disabled');
$('#sendBox').hide();
}
function autoScrollBottom() {
var websocketHistoryBox = document.getElementById('websocketHistoryBox');
websocketHistoryBox.scrollTop = websocketHistoryBox.scrollHeight;
}
</script>
</body>
</html>