添加开始游戏前,进行连接检测
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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 || [];
|
||||||
|
|||||||
20
src/util.js
20
src/util.js
@@ -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) => {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user