diff --git a/java-mall-app-shop-admin/App.vue b/java-mall-app-shop-admin/App.vue index a0c6377..ae6d063 100644 --- a/java-mall-app-shop-admin/App.vue +++ b/java-mall-app-shop-admin/App.vue @@ -8,7 +8,9 @@ import { GetShopBaseInfo } from "@/api/shop.js"; export default { data() { return { - version: "", + version: "", + lastPlayTime: 0, // 记录最后一次播放语音的时间戳 + playInterval: 20000 // 20秒的间隔限制 }; }, onLaunch: function () { @@ -30,18 +32,26 @@ export default { computed: { ...mapState("user", ["uid", "userInfo"]), }, - onShow: function () { - this.globalData.isAppActive = true; +onShow: function () { + this.globalData.isAppActive = true; + const globalConnName = 'globalSocket'; + if (this.userInfo && Object.keys(this.userInfo).length > 0) { + // 检查指定的全局连接是否已连接,未连接则重建 + if (!webSocketManager.isConnected(globalConnName)) { + this.connectSocket(this.userInfo); // 这里的connectSocket应该会创建名为globalConnName的连接 + } + } else { + // 用户未登录时关闭所有全局连接 webSocketManager.closeAllGlobalConnections(); - setTimeout(() => { - if (this.userInfo && Object.keys(this.userInfo).length > 0) { - this.connectSocket(this.userInfo); - } - }); - }, + } + // 重新注册推送监听 + this.initPushListener(); +}, + + onHide: function () { this.globalData.isAppActive = false; - webSocketManager.closeAllGlobalConnections(); + // webSocketManager.closeAllGlobalConnections(); }, globalData: { isAppActive: false, @@ -69,6 +79,39 @@ export default { ); }); }, + // 新增推送监听初始化方法 + initPushListener() { + const _self = this; + // 先移除旧监听再添加新监听,避免重复注册 + uni.offPushMessage(); + uni.onPushMessage(async (res) => { + console.log("收到推送消息:", res); + + // 检查用户登录状态,未登录直接返回 + if (!_self.userInfo || Object.keys(_self.userInfo).length === 0) { + console.log("用户未登录,忽略推送"); + return; + } + + if (res.data) { + if (!_self.globalData.isAppActive) { + if (res.type == "click") { + _self.handlePushClick(res.data.payload); + } else { + let shopRes = await GetShopBaseInfo(); + if (shopRes.data.ringtone_is_enable === 1) { + _self.handlePushSound(res.data); + uni.setStorageSync("pendingPushData", res.data); + uni.createPushMessage(res.data); + } + } + } else { + console.log("应用已打开,直接处理消息"); + _self.$store.dispatch("push/setPush", res.data); + } + } + }); + }, async initAppOrderPush() { uni.getPushClientId({ success: (res) => { @@ -149,6 +192,12 @@ export default { async handlePushSound(pushData) { console.log(pushData.payload); try { + const currentTime = Date.now(); + // 检查是否在10秒内已经播放过语音 + if (currentTime - this.lastPlayTime < this.playInterval) { + console.log("10秒内已播放过语音,本次不播放"); + return; // 10秒内不重复播放 + } // 获取category决定使用哪种声音 const category = pushData.payload.category; var AUDIO = uni.createInnerAudioContext(); @@ -169,7 +218,7 @@ export default { AUDIO.play(); break; } - + this.lastPlayTime = currentTime; // 更新最后播放时间戳 // 处理播放错误 AUDIO.onError((res) => { console.error("播放声音失败:", res); diff --git a/java-mall-app-shop-admin/utils/socket.js b/java-mall-app-shop-admin/utils/socket.js index 0ab2c3b..e78d0ea 100644 --- a/java-mall-app-shop-admin/utils/socket.js +++ b/java-mall-app-shop-admin/utils/socket.js @@ -182,6 +182,18 @@ class WebSocketManager { this.connections = {}; this.globalConnections = []; } + + // 新增:判断指定名称的连接是否处于连接状态 + isConnected(connectionName) { + // 获取指定名称的连接实例 + const connection = this.connections[connectionName]; + if (!connection) return false; + + // 检查连接状态:WebsocketUtil的is_open_socket为true,且socketTask的readyState为1(连接中) + return connection.is_open_socket && + connection.socketTask && + connection.socketTask.readyState === 1; + } } // 导出单例实例