diff --git a/src/apis.js b/src/apis.js
index 406bb13..271a3af 100644
--- a/src/apis.js
+++ b/src/apis.js
@@ -1,5 +1,12 @@
const BASE_URL = "http://120.79.241.5:8000/api/shoot";
+function getAuthHeader() {
+ const token = uni.getStorageSync("token");
+ return {
+ Authorization: `Bearer ${token}`,
+ };
+}
+
// 获取全局配置
export const getAppConfig = () => {
return new Promise((resolve, reject) => {
@@ -75,6 +82,8 @@ export const loginAPI = (nickName, avatarUrl, code) => {
success: (res) => {
const { code, data } = res.data;
if (code === 0) {
+ uni.setStorageSync("token", data.token);
+ uni.setStorageSync("tokenExpire", data.expires + Date.now());
resolve(data);
}
},
@@ -88,3 +97,76 @@ export const loginAPI = (nickName, avatarUrl, code) => {
});
});
};
+
+export const bindDeviceAPI = (device) => {
+ return new Promise((resolve, reject) => {
+ uni.request({
+ url: `${BASE_URL}/user/device/bindDevice`,
+ method: "POST",
+ header: getAuthHeader(),
+ data: {
+ device,
+ },
+ success: (res) => {
+ const { code, data } = res.data;
+ if (code === 0) {
+ resolve(data);
+ }
+ },
+ fail: (err) => {
+ reject(err);
+ uni.showToast({
+ title: "获取数据失败",
+ icon: "none",
+ });
+ },
+ });
+ });
+};
+
+export const getMyDeviceAPI = () => {
+ return new Promise((resolve, reject) => {
+ uni.request({
+ url: `${BASE_URL}/user/device/getBinding?deviceId=9ZF9oVXs`,
+ // url: `${BASE_URL}/user/device/getBindings`,
+ method: "GET",
+ header: getAuthHeader(),
+ success: (res) => {
+ resolve(res.data);
+ },
+ fail: (err) => {
+ reject(err);
+ uni.showToast({
+ title: "获取数据失败",
+ icon: "none",
+ });
+ },
+ });
+ });
+};
+
+export const createPractiseAPI = (arrows) => {
+ return new Promise((resolve, reject) => {
+ uni.request({
+ url: `${BASE_URL}/user/practice/create`,
+ method: "POST",
+ header: getAuthHeader(),
+ data: {
+ arrows,
+ },
+ success: (res) => {
+ const { code, data } = res.data;
+ if (code === 0) {
+ resolve(data);
+ }
+ },
+ fail: (err) => {
+ reject(err);
+ uni.showToast({
+ title: "获取数据失败",
+ icon: "none",
+ });
+ },
+ });
+ });
+};
\ No newline at end of file
diff --git a/src/components/BowTarget.vue b/src/components/BowTarget.vue
index 791e239..5c2ceea 100644
--- a/src/components/BowTarget.vue
+++ b/src/components/BowTarget.vue
@@ -1,6 +1,6 @@
@@ -37,7 +50,19 @@ defineProps({
}}
-
+
+
+
+
@@ -50,9 +75,29 @@ defineProps({
width: calc(100% - 30px);
margin: 15px;
}
-.container > image {
+.target {
+ position: relative;
+}
+.target > image:last-child {
width: 100%;
}
+@keyframes pumpIn {
+ from {
+ transform: scale(2);
+ }
+ to {
+ transform: scale(1);
+ }
+}
+.pump-in {
+ animation: pumpIn 0.3s ease-out forwards;
+ transform-origin: center center;
+}
+.hit {
+ position: absolute;
+ width: 20px;
+ height: 20px;
+}
.header {
width: 100%;
display: flex;
diff --git a/src/components/CoachComment.vue b/src/components/CoachComment.vue
index f9cd383..c19ceba 100644
--- a/src/components/CoachComment.vue
+++ b/src/components/CoachComment.vue
@@ -6,10 +6,6 @@ const props = defineProps({
type: Boolean,
default: false,
},
- content: {
- type: String,
- default: false,
- },
onClose: {
type: Function,
default: () => {},
@@ -38,7 +34,7 @@ const props = defineProps({
diff --git a/src/components/IconButton.vue b/src/components/IconButton.vue
index ebfbb54..bc466dd 100644
--- a/src/components/IconButton.vue
+++ b/src/components/IconButton.vue
@@ -14,7 +14,7 @@ const props = defineProps({
},
width: {
type: Number,
- default: "22",
+ default: 22,
},
});
diff --git a/src/components/ScorePanel2.vue b/src/components/ScorePanel2.vue
index d5f46c5..3d8a36b 100644
--- a/src/components/ScorePanel2.vue
+++ b/src/components/ScorePanel2.vue
@@ -1,5 +1,4 @@
diff --git a/src/constants.js b/src/constants.js
new file mode 100644
index 0000000..0d57da0
--- /dev/null
+++ b/src/constants.js
@@ -0,0 +1,3 @@
+export const MESSAGETYPES = {
+ ShootSyncMeArrowID: parseInt("0x789b6b0d"),
+};
diff --git a/src/pages/equipment-debug.vue b/src/pages/equipment-debug.vue
index dbdffee..44a653b 100644
--- a/src/pages/equipment-debug.vue
+++ b/src/pages/equipment-debug.vue
@@ -3,38 +3,17 @@ import Guide from "@/components/Guide.vue";
import BowTarget from "@/components/BowTarget.vue";
import SButton from "@/components/SButton.vue";
import Container from "@/components/Container.vue";
+import { getMyDeviceAPI } from "@/apis";
-// 扫描二维码方法
-const handleScan = () => {
- console.log('开始扫码');
- // 调用扫码API
- uni.scanCode({
- // 只支持扫码二维码
- onlyFromCamera: true,
- scanType: ['qrCode'],
- success: (res) => {
- // res.result 为二维码内容
- console.log('扫码结果:', res.result);
- uni.showToast({
- title: '扫码成功',
- icon: 'success'
- });
- // 这里可以处理扫码后的业务逻辑
- },
- fail: (err) => {
- console.error('扫码失败:', err);
- uni.showToast({
- title: '扫码失败',
- icon: 'error'
- });
- }
- });
+const getMyDevice = async () => {
+ const result = await getMyDeviceAPI();
+ console.log("我的设备:", result);
};
-
+
- 准备好了直接开始
- 扫码
+
+ 获取我的设备
diff --git a/src/pages/practise-one.vue b/src/pages/practise-one.vue
index e97f9ba..6300201 100644
--- a/src/pages/practise-one.vue
+++ b/src/pages/practise-one.vue
@@ -1,36 +1,66 @@
-
+
-
+
-
+
+ 准备好了,直接开始
diff --git a/src/pages/user.vue b/src/pages/user.vue
index 1d98f99..07d3da2 100644
--- a/src/pages/user.vue
+++ b/src/pages/user.vue
@@ -60,7 +60,7 @@ const toRankIntroPage = () => {
:onClick="toOrderPage"
/>
- 已完成
+ 已完成
未完成
已赠送6个月会员
diff --git a/src/static/hit-icon.png b/src/static/hit-icon.png
new file mode 100644
index 0000000..e280aa7
Binary files /dev/null and b/src/static/hit-icon.png differ
diff --git a/src/store.js b/src/store.js
index bcd7b44..ea2f1e2 100644
--- a/src/store.js
+++ b/src/store.js
@@ -8,7 +8,11 @@ export default defineStore("store", {
id: "",
nickName: "游客",
avatarUrl: "../static/avatar.png",
- trio: false, // 是否完成新手试炼
+ trio: 0, // 大于1表示完成了新手引导
+ },
+ device: {
+ id: "",
+ deviceName: "",
},
}),
@@ -24,6 +28,10 @@ export default defineStore("store", {
updateUser(user) {
this.user = user;
},
+ updateDevice(deviceId, deviceName) {
+ this.device.id = deviceId;
+ this.device.deviceName = deviceName;
+ },
},
// 开启数据持久化
@@ -32,7 +40,7 @@ export default defineStore("store", {
strategies: [
{
storage: uni.getStorageSync,
- paths: ["user"], // 只持久化用户信息
+ paths: ["user", "device"], // 只持久化用户信息
},
],
},
diff --git a/src/websocket.js b/src/websocket.js
index 145eacc..c559149 100644
--- a/src/websocket.js
+++ b/src/websocket.js
@@ -1,31 +1,18 @@
-// utils/websocket.js
-
let socket = null;
-let messageCallback = null;
+let heartbeatInterval = null;
/**
- * 连接 WebSocket
- * @param {String} url WebSocket 地址
- * @param {Function} onMessage 消息回调
+ * 建立 WebSocket 连接
*/
-function connectWebSocket(token, onMessage) {
- messageCallback = onMessage;
-
+function createWebSocket(token, onMessage) {
socket = uni.connectSocket({
url: `ws://120.79.241.5:8000/socket?authorization=${token}`,
- success: () => {
- console.log("连接建立成功");
- },
- fail: (err) => {
- console.error("连接失败", err);
- },
+ success: () => console.log("websocket 连接成功"),
});
// 接收消息
uni.onSocketMessage((res) => {
- if (messageCallback) {
- messageCallback(res.data);
- }
+ if (onMessage) onMessage(res.data);
});
// 错误处理
@@ -36,39 +23,46 @@ function connectWebSocket(token, onMessage) {
// 关闭处理
uni.onSocketClose(() => {
console.log("WebSocket 已关闭");
- socket = null;
});
+
+ // 启动心跳
+ startHeartbeat();
}
-/**
- * 发送消息
- * @param {String} msg 要发送的消息内容
- */
-function sendWebSocketMessage(msg) {
- if (socket && uni.sendSocketMessage) {
- uni.sendSocketMessage({
- data: msg,
- fail: (err) => {
- console.error("发送消息失败", err);
- },
- });
- } else {
- console.warn("WebSocket 未连接");
- }
-}
-
-/**
- * 关闭连接
- */
function closeWebSocket() {
- if (socket) {
- uni.closeSocket();
- socket = null;
+ if (socket) socket.close();
+}
+
+/**
+ * 启动心跳
+ */
+function startHeartbeat() {
+ stopHeartbeat(); // 防止重复启动
+
+ heartbeatInterval = setInterval(() => {
+ if (socket && uni.sendSocketMessage) {
+ console.log("ping");
+ uni.sendSocketMessage({
+ data: "ping",
+ fail: (err) => {
+ console.error("发送心跳失败", err);
+ },
+ });
+ }
+ }, 5000);
+}
+
+/**
+ * 停止心跳
+ */
+function stopHeartbeat() {
+ if (heartbeatInterval) {
+ clearInterval(heartbeatInterval);
+ heartbeatInterval = null;
}
}
export default {
- connectWebSocket,
- sendWebSocketMessage,
+ createWebSocket,
closeWebSocket,
};