添加开始游戏前,进行连接检测

This commit is contained in:
kron
2025-06-28 22:44:30 +08:00
parent 77691c411a
commit 21b3e38ff0
9 changed files with 41 additions and 21 deletions

View File

@@ -1,24 +1,23 @@
<script setup> <script setup>
import { watch, onMounted, onUnmounted } from "vue"; import { watch } from "vue";
import { onShow } from "@dcloudio/uni-app"; import { onShow } from "@dcloudio/uni-app";
import websocket from "@/websocket"; import websocket from "@/websocket";
import useStore from "@/store"; import useStore from "@/store";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
const store = useStore(); const store = useStore();
const { user } = storeToRefs(store); const { user } = storeToRefs(store);
const { updateConnect, updateUser } = store; const { updateUser } = store;
watch( watch(
() => user.value.id, () => user.value.id,
(newVal) => { (newVal) => {
const token = uni.getStorageSync("token"); const token = uni.getStorageSync("token");
if (newVal && token) { if (newVal && token) {
websocket.createWebSocket(token, updateConnect, (content) => { websocket.createWebSocket(token, (content) => {
uni.$emit("socket-inbox", content); uni.$emit("socket-inbox", content);
}); });
} }
if (!newVal) { if (!newVal) {
updateConnect(false);
websocket.closeWebSocket(); websocket.closeWebSocket();
} }
}, },

View File

@@ -15,6 +15,7 @@ import PlayersRow from "@/components/PlayersRow.vue";
import SModal from "@/components/SModal.vue"; import SModal from "@/components/SModal.vue";
import ScreenHint from "@/components/ScreenHint.vue"; import ScreenHint from "@/components/ScreenHint.vue";
import { getRoomAPI, destroyRoomAPI, exitRoomAPI, startRoomAPI } from "@/apis"; import { getRoomAPI, destroyRoomAPI, exitRoomAPI, startRoomAPI } from "@/apis";
import { checkConnection } from "@/util";
import { MESSAGETYPES, roundsName, getMessageTypeName } from "@/constants"; import { MESSAGETYPES, roundsName, getMessageTypeName } from "@/constants";
import useStore from "@/store"; import useStore from "@/store";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
@@ -279,6 +280,7 @@ const exitRoom = async () => {
}; };
onMounted(() => { onMounted(() => {
checkConnection();
uni.$on("socket-inbox", onReceiveMessage); uni.$on("socket-inbox", onReceiveMessage);
}); });

View File

@@ -11,7 +11,7 @@ import Container from "@/components/Container.vue";
import Avatar from "@/components/Avatar.vue"; import Avatar from "@/components/Avatar.vue";
import BowPower from "@/components/BowPower.vue"; import BowPower from "@/components/BowPower.vue";
import { createPractiseAPI } from "@/apis"; import { createPractiseAPI } from "@/apis";
import { generateCanvasImage } from "@/util"; import { generateCanvasImage, checkConnection } from "@/util";
import { MESSAGETYPES } from "@/constants"; import { MESSAGETYPES } from "@/constants";
import useStore from "@/store"; import useStore from "@/store";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
@@ -72,6 +72,7 @@ async function onReceiveMessage(messages = []) {
} }
onMounted(() => { onMounted(() => {
checkConnection();
uni.$on("socket-inbox", onReceiveMessage); uni.$on("socket-inbox", onReceiveMessage);
}); });

View File

@@ -17,7 +17,7 @@ import { storeToRefs } from "pinia";
const store = useStore(); const store = useStore();
const { updateConfig, updateUser, updateDevice, updateRank } = store; const { updateConfig, updateUser, updateDevice, updateRank } = store;
// 使用storeToRefs用于UI里显示保持响应性 // 使用storeToRefs用于UI里显示保持响应性
const { user, device, remoteConnect, rankData } = storeToRefs(store); const { user, device, rankData } = storeToRefs(store);
const showModal = ref(false); const showModal = ref(false);
const isIos = ref(true); const isIos = ref(true);

View File

@@ -9,7 +9,7 @@ import SButton from "@/components/SButton.vue";
import Avatar from "@/components/Avatar.vue"; import Avatar from "@/components/Avatar.vue";
import BowPower from "@/components/BowPower.vue"; import BowPower from "@/components/BowPower.vue";
import { createPractiseAPI, getHomeData } from "@/apis"; import { createPractiseAPI, getHomeData } from "@/apis";
import { generateCanvasImage } from "@/util"; import { generateCanvasImage, checkConnection } from "@/util";
import { MESSAGETYPES, roundsName } from "@/constants"; import { MESSAGETYPES, roundsName } from "@/constants";
import useStore from "@/store"; import useStore from "@/store";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
@@ -62,6 +62,7 @@ async function onComplete() {
} }
onMounted(() => { onMounted(() => {
checkConnection();
uni.$on("socket-inbox", onReceiveMessage); uni.$on("socket-inbox", onReceiveMessage);
}); });

View File

@@ -9,7 +9,7 @@ import SButton from "@/components/SButton.vue";
import Avatar from "@/components/Avatar.vue"; import Avatar from "@/components/Avatar.vue";
import BowPower from "@/components/BowPower.vue"; import BowPower from "@/components/BowPower.vue";
import { createPractiseAPI, getHomeData } from "@/apis"; import { createPractiseAPI, getHomeData } from "@/apis";
import { generateCanvasImage } from "@/util"; import { generateCanvasImage, checkConnection } from "@/util";
import { MESSAGETYPES } from "@/constants"; import { MESSAGETYPES } from "@/constants";
import useStore from "@/store"; import useStore from "@/store";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
@@ -66,6 +66,7 @@ async function onComplete() {
} }
onMounted(() => { onMounted(() => {
checkConnection();
uni.$on("socket-inbox", onReceiveMessage); uni.$on("socket-inbox", onReceiveMessage);
}); });

View File

@@ -12,7 +12,6 @@ const defaultUser = {
export default defineStore("store", { export default defineStore("store", {
// 状态 // 状态
state: () => ({ state: () => ({
remoteConnect: false,
user: defaultUser, user: defaultUser,
device: { device: {
deviceId: "", deviceId: "",
@@ -37,9 +36,6 @@ export default defineStore("store", {
updateRank(data = {}) { updateRank(data = {}) {
this.rankData = { rank: data.rank || [], ringRank: data.ringRank || [] }; this.rankData = { rank: data.rank || [], ringRank: data.ringRank || [] };
}, },
updateConnect(connect) {
this.remoteConnect = connect;
},
updateUser(user = {}) { updateUser(user = {}) {
this.user = { ...defaultUser, ...user }; this.user = { ...defaultUser, ...user };
const rankInfos = this.config.randInfos || []; const rankInfos = this.config.randInfos || [];

View File

@@ -1,3 +1,23 @@
import websocket from "@/websocket";
export const checkConnection = () => {
uni.sendSocketMessage({
data: JSON.stringify({ event: "ping", data: {} }),
fail: () => {
const token = uni.getStorageSync("token");
if (!token) return;
uni.showToast({
title: "连接中...",
icon: "none",
});
// 如果发送失败,说明连接已断开,需要重新连接
websocket.createWebSocket(token, (content) => {
uni.$emit("socket-inbox", content);
});
},
});
};
export const debounce = (fn, delay = 300) => { export const debounce = (fn, delay = 300) => {
let timer = null; let timer = null;
return async (...args) => { return async (...args) => {

View File

@@ -13,14 +13,18 @@ const RECONNECT_CONFIG = {
/** /**
* 建立 WebSocket 连接 * 建立 WebSocket 连接
*/ */
function createWebSocket(token, onUpdate, onMessage) { function createWebSocket(token, onMessage) {
const url = `wss://api.shelingxingqiu.com/socket?authorization=${token}`; const url = `wss://api.shelingxingqiu.com/socket?authorization=${token}`;
socket = uni.connectSocket({ socket = uni.connectSocket({
url, url,
success: () => { success: () => {
console.log("websocket 连接成功"); console.log("websocket 连接成功");
onUpdate(true);
reconnectCount = 0; // 重置重连次数 reconnectCount = 0; // 重置重连次数
// 启动心跳
startHeartbeat();
},
fail: () => {
reconnect(onMessage);
}, },
}); });
@@ -38,19 +42,15 @@ function createWebSocket(token, onUpdate, onMessage) {
uni.onSocketClose((result) => { uni.onSocketClose((result) => {
console.log("WebSocket 已关闭", result); console.log("WebSocket 已关闭", result);
onUpdate(false);
stopHeartbeat(); stopHeartbeat();
reconnect(onUpdate, onMessage); reconnect(onMessage);
}); });
// 启动心跳
startHeartbeat();
} }
/** /**
* 重连机制 * 重连机制
*/ */
function reconnect(onUpdate, onMessage) { function reconnect(onMessage) {
if (reconnectCount >= RECONNECT_CONFIG.MAX_COUNT) return; if (reconnectCount >= RECONNECT_CONFIG.MAX_COUNT) return;
reconnectTimer && clearTimeout(reconnectTimer); reconnectTimer && clearTimeout(reconnectTimer);
@@ -64,7 +64,7 @@ function reconnect(onUpdate, onMessage) {
); );
reconnectTimer = setTimeout(() => { reconnectTimer = setTimeout(() => {
console.log("reconnecting..."); console.log("reconnecting...");
createWebSocket(token, onUpdate, onMessage); createWebSocket(token, onMessage);
reconnectCount++; reconnectCount++;
}, delay); }, delay);
} }