diff --git a/src/main/java/cn/stylefeng/guns/modular/system/index/service/IndexService.java b/src/main/java/cn/stylefeng/guns/modular/system/index/service/IndexService.java
index be363626..c180f69c 100644
--- a/src/main/java/cn/stylefeng/guns/modular/system/index/service/IndexService.java
+++ b/src/main/java/cn/stylefeng/guns/modular/system/index/service/IndexService.java
@@ -65,6 +65,9 @@ public class IndexService {
// 获取人员姓名
renderMap.put("name", simpleUserInfo.getRealName());
+ // 获取登录用户ws-url
+ renderMap.put("wsUrl", loginUser.getWsUrl());
+
// 未读消息数量
MessageParam messageParam = new MessageParam();
messageParam.setReadFlag(MessageReadFlagEnum.UNREAD.getCode());
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index ea7cbe37..a2656620 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -4,7 +4,7 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/guns?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
username: root
- password: 123456
+ password: root
# 连接池大小根据实际情况调整
max-active: 100
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 9816c4f4..7d9d403f 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -21,6 +21,7 @@ spring:
serialization:
indent_output: false
flyway:
+ enabled: true
locations: classpath:db/migration
# 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移
baseline-on-migrate: true
@@ -67,3 +68,6 @@ prometheus:
url: http://localhost:9090/api/v1/
# 非必须配置项
instance:
+web-socket:
+ open: true
+ ws-url: ws://localhost:${server.port}/message/websocket/{userId}
diff --git a/src/main/webapp/assets/common/js/common.js b/src/main/webapp/assets/common/js/common.js
index 93948d5f..7ae84737 100644
--- a/src/main/webapp/assets/common/js/common.js
+++ b/src/main/webapp/assets/common/js/common.js
@@ -151,7 +151,8 @@ layui.config({
HttpRequest: '../../expand/module/HttpRequest/HttpRequest',
func: '../../expand/module/func/func',
dict: '../../expand/module/dict/dict',
- gunsSelect: '../../expand/module/gunsSelect/gunsSelect'
+ gunsSelect: '../../expand/module/gunsSelect/gunsSelect',
+ ws: '../../expand/module/webSocket/webSocket'
}).use(['layer', 'admin'], function () {
var $ = layui.jquery;
diff --git a/src/main/webapp/assets/expand/module/webSocket/webSocket.js b/src/main/webapp/assets/expand/module/webSocket/webSocket.js
new file mode 100644
index 00000000..be271fb9
--- /dev/null
+++ b/src/main/webapp/assets/expand/module/webSocket/webSocket.js
@@ -0,0 +1,169 @@
+/**
+ * webSocket简单封装
+ *
+ * @author liuhanqing
+ * @date 2021/1/25 22:47
+ */
+layui.define(['jquery', 'layer'], function (exports) {
+ var $ = layui.$;
+ var layer = layui.layer;
+
+ var ws = function (param) {
+ var _self = this;
+ var emptyFun = function (data) {
+ console.log(data)
+ };
+ _self.version = "1.0";//版本
+ _self.reCount = param.reCount ? param.reCount : 5;//重连次数
+ _self.lockReconnect = false; //重连标识
+ _self.heartCheckHandler = null; //心跳检测
+ _self.wsReconnectHandler = null; //重连处理器
+ var WebSocket = window.WebSocket || window.MozWebSocket || 0;
+ if (!WebSocket) {
+ _self.result = 0;
+ _self.msg = "您的浏览器不支持WebSocket";
+ (param.connectErr || emptyFun)(_self.msg);
+ return;
+ }
+
+ var func = {};
+ var msgList = [];//等待发送的信息
+
+ // 连接方法
+ _self.connect = function () {
+ try {
+ func.WebSocket = new WebSocket(param.wsUrl);
+ if (func.WebSocket) {
+ _self.initEventHandle()
+ }
+ } catch (e) {
+ (param.connectErr || emptyFun)(e);
+ _self.lockReconnect = false;
+ _self.reconnect()
+ }
+ }
+
+ // 心跳检测
+ _self.heartCheck = function () {
+ // 15s 发送心跳
+ _self.heartCheckHandler && clearTimeout(_self.heartCheckHandler);
+ _self.heartCheckHandler = setTimeout(function () {
+ try {
+ // 发送心跳检测
+ _self.send("&")
+ } catch (e) {
+ (param.connectErr || emptyFun)(e);
+ _self.lockReconnect = false;
+ _self.reconnect()
+ }
+ setTimeout(_self.heartCheck, 15000)
+ }, 15000)
+ }
+
+ // 重新连接方法
+ _self.reconnect = function () {
+ if (_self.lockReconnect || _self.reCount <= 0) {
+ return;
+ }
+ _self.lockReconnect = true;
+ // 没连接上1s 后重试
+ _self.wsReconnectHandler && clearTimeout(_self.wsReconnectHandler);
+ _self.wsReconnectHandler = setTimeout(function () {
+ _self.reCount--;
+ _self.connect();
+ _self.lockReconnect = false;
+ }, 1000)
+ }
+
+ // 发送消息方法
+ _self.send = function (msg) {
+ var state = func.WebSocket.readyState;
+ if (state > 1) {
+ console.log("连接已经失败,状态码为:" + state);
+ return false
+ }
+ if (state == 0) {//未连接
+ msgList.push(msg);
+ }
+ if (state == 1) {//已经连接成功
+ func.WebSocket.send(msg);
+ }
+ if (typeof param.WsSend === 'function') {
+ param.wsSend(msg);
+ }
+
+ }
+
+ // 关闭连接方法
+ _self.close = function (event) {
+ try {
+ func.WebSocket.close();
+ } catch (e) {
+ (param.connectErr || emptyFun)(e);
+ }
+
+ }
+
+ // 绑定ws事件
+ _self.initEventHandle = function () {
+ try {
+ func.WebSocket.onopen = function (event) {
+ _self.reCount = 5;
+ _self.heartCheck();
+ for (var i = 0; i < msgList.length; i++) {
+ func.WebSocket.send(msgList[i]);
+ msgList.shift();
+ }
+ //console.log("onopen");
+ //console.log(event);
+ if (typeof param.onWsOpen === 'function') {
+ param.onWsOpen(event);
+ }
+ }
+
+ func.WebSocket.onmessage = function (event) {
+ //console.log("onmessage");
+ //console.log(event);
+ (param.onWsMessage || emptyFun)(event);
+ }
+
+ func.WebSocket.onclose = function (event) {
+
+ _self.lockReconnect = false;
+ _self.reconnect()
+ msgList = [];
+ if (typeof param.onWsClose === 'function') {
+ param.onWsClose(event);
+ }
+ }
+
+ func.WebSocket.onerror = function (event) {
+
+ _self.lockReconnect = false;
+ _self.reconnect()
+ msgList = [];
+
+ if (typeof param.onWsError === 'function') {
+ param.onWsError(event);
+ } else {
+ console.log(e);
+ console.log("连接错误");
+ }
+ }
+ } catch (e) {
+ console.log(e)
+ }
+ }
+
+
+ _self.connect();
+
+ }
+ var initFunc = {
+ render: function (options) {
+ var inst = new ws(options)
+ return inst;
+ }
+ };
+ exports('ws', initFunc);
+});
diff --git a/src/main/webapp/assets/modular/system/index/message.js b/src/main/webapp/assets/modular/system/index/message.js
index 6b9aadc7..fe619d52 100644
--- a/src/main/webapp/assets/modular/system/index/message.js
+++ b/src/main/webapp/assets/modular/system/index/message.js
@@ -20,6 +20,7 @@ layui.use(['element', 'admin', 'HttpRequest', 'func'], function () {
var httpRequest = new HttpRequest(Feng.ctxPath + "/sysMessage/allMessageReadFlag", 'get', function (data) {
$('#messageClearBtn').parents('.layui-tab-item').addClass('show-empty');
$('#msgCount').html(0);
+ $('#messageDot').hide();
Feng.success("标记已读成功!");
}, function (data) {
Feng.error("标记已读失败!" + data.responseJSON.message);
diff --git a/src/main/webapp/pages/index.html b/src/main/webapp/pages/index.html
index 0038fb09..82674252 100644
--- a/src/main/webapp/pages/index.html
+++ b/src/main/webapp/pages/index.html
@@ -36,19 +36,23 @@