添加激光校准

This commit is contained in:
kron
2025-10-29 15:17:22 +08:00
parent 4ce366864e
commit a6b0d7f28c
6 changed files with 195 additions and 16 deletions

View File

@@ -498,3 +498,11 @@ export const donateAPI = async (amount, name, phone, organizer, advice) => {
advice, advice,
}); });
}; };
export const laserAimAPI = async () => {
return request("POST", "/user/device/laserAim");
};
export const laserCloseAPI = async () => {
return request("POST", "/user/device/closeAim");
};

View File

@@ -3,6 +3,9 @@
{ {
"path": "pages/index" "path": "pages/index"
}, },
{
"path": "pages/calibration"
},
{ {
"path": "pages/point-book" "path": "pages/point-book"
}, },

92
src/pages/calibration.vue Normal file
View File

@@ -0,0 +1,92 @@
<script setup>
import { ref, onMounted } from "vue";
import Container from "@/components/Container.vue";
import SButton from "@/components/SButton.vue";
import { laserAimAPI, laserCloseAPI } from "@/apis";
const guides = [
{
title: "保持5米站距",
src: "https://static.shelingxingqiu.com/attachment/2025-10-29/dduexjgrdx5j4saxvu.png",
},
{
title: "摆出拉弓姿势",
src: "https://static.shelingxingqiu.com/attachment/2025-10-29/dduexjgrd9ziw2yh2c.png",
},
{
title: "调整瞄准器",
src: "https://static.shelingxingqiu.com/attachment/2025-10-29/dduexjgrcxf9wjaiv4.png",
},
];
const onComplete = async () => {
await laserCloseAPI();
uni.setStorageSync("calibration", true);
uni.navigateBack();
};
onMounted(async () => {
await laserAimAPI();
});
</script>
<template>
<Container title="校准智能弓">
<view class="container">
<view v-for="(guide, index) in guides" :key="guide.title" class="guide">
<view>
<text>{{ index + 1 }}</text>
<text>{{ guide.title }}</text>
</view>
<image :src="guide.src" mode="widthFix" />
</view>
<text>请完成以上步骤校准智能弓</text>
<SButton :onClick="onComplete" width="60vw" :rounded="40">
我已校准
</SButton>
</view>
</Container>
</template>
<style scoped>
.container {
display: flex;
flex-direction: column;
align-items: center;
}
.guide {
display: flex;
flex-direction: column;
align-items: center;
font-size: 26rpx;
color: #ffffff;
margin-bottom: 15rpx;
}
.guide > view {
width: 100%;
margin: 25rpx 0;
display: flex;
align-items: center;
}
.guide > view > text:first-child {
font-size: 24rpx;
background: #e89024;
border-radius: 50%;
width: 32rpx;
height: 32rpx;
line-height: 32rpx;
display: block;
text-align: center;
margin-right: 15rpx;
}
.guide > image {
width: 630rpx;
height: 250rpx;
}
.container > text {
font-size: 20rpx;
color: #fff9;
margin: 30rpx;
}
</style>

View File

@@ -1,5 +1,6 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref } from "vue";
import { onShow } from "@dcloudio/uni-app";
import Container from "@/components/Container.vue"; import Container from "@/components/Container.vue";
import ScreenHint from "@/components/ScreenHint.vue"; import ScreenHint from "@/components/ScreenHint.vue";
import SButton from "@/components/SButton.vue"; import SButton from "@/components/SButton.vue";
@@ -13,6 +14,7 @@ const store = useStore();
const { updateDevice } = store; const { updateDevice } = store;
const { user, device } = storeToRefs(store); const { user, device } = storeToRefs(store);
const justBind = ref(false); const justBind = ref(false);
const calibration = ref(false);
// 扫描二维码方法 // 扫描二维码方法
const handleScan = () => { const handleScan = () => {
@@ -104,6 +106,16 @@ const copyEmail = () => {
}, },
}); });
}; };
const goCalibration = () => {
uni.navigateTo({
url: "/pages/calibration",
});
};
onShow(() => {
calibration.value = uni.getStorageSync("calibration");
});
</script> </script>
<template> <template>
@@ -137,7 +149,9 @@ const copyEmail = () => {
<text>已被绑定的弓箭无法再次绑定</text> <text>已被绑定的弓箭无法再次绑定</text>
<view> <view>
<text>如有任何疑问请随时联系</text> <text>如有任何疑问请随时联系</text>
<button hover-class="none" @click="copyEmail">shelingxingqiu@163.com</button> <button hover-class="none" @click="copyEmail">
shelingxingqiu@163.com
</button>
</view> </view>
</view> </view>
</ScreenHint> </ScreenHint>
@@ -161,10 +175,23 @@ const copyEmail = () => {
</ScreenHint> </ScreenHint>
</view> </view>
<view v-if="justBind" class="just-bind"> <view v-if="justBind" class="just-bind">
<view class="device-binded"> <view
class="device-binded"
:style="{ marginBottom: calibration ? '250rpx' : '100rpx' }"
>
<view @click="toDeviceIntroPage"> <view @click="toDeviceIntroPage">
<image src="../static/device-icon.png" mode="widthFix" /> <image src="../static/device-icon.png" mode="widthFix" />
<text>{{ device.deviceName }}</text> <text>{{ device.deviceName }}</text>
<view class="calibration" v-if="calibration">
<button hover-class="none" @click="goCalibration">
<text>重新校准</text>
<image src="../static/enter-arrow-blue.png" mode="widthFix" />
</button>
<view>
<image src="../static/calibration-tip.png" mode="widthFix" />
<text>如有场地/距离变化需重新校准以保证智能弓射箭精准度</text>
</view>
</view>
</view> </view>
<image src="../static/bind-success.png" mode="widthFix" /> <image src="../static/bind-success.png" mode="widthFix" />
<view> <view>
@@ -176,17 +203,30 @@ const copyEmail = () => {
<text>{{ user.nickName }}</text> <text>{{ user.nickName }}</text>
</view> </view>
</view> </view>
<view> <view v-if="!calibration">
<text>恭喜你的弓箭和账号已成功绑定</text> <text>恭喜你的弓箭和账号已成功绑定</text>
<text :style="{ color: '#fed847' }">已赠送6个月射灵世界会员</text> <text :style="{ color: '#fed847' }">已赠送6个月射灵世界会员</text>
<text>赶快进入新手试炼场体验一下吧</text>
</view> </view>
<SButton :onClick="toFristTryPage">进入新手试炼</SButton> <block v-if="calibration">
<view :style="{ marginTop: '15px' }"> <SButton :onClick="toFristTryPage" width="60vw" :rounded="40"
<SButton :onClick="backToHome" backgroundColor="#fff3" color="#fff" >进入新手试炼</SButton
>返回首页</SButton
> >
</view> <view :style="{ marginTop: '15px' }">
<SButton
:onClick="backToHome"
backgroundColor="#fff3"
color="#fff"
width="60vw"
:rounded="40"
>返回首页</SButton
>
</view>
</block>
<block v-else>
<SButton :onClick="goCalibration" width="60vw" :rounded="40">
校准智能弓
</SButton>
</block>
</view> </view>
<view v-if="device.deviceId && !justBind" class="has-device"> <view v-if="device.deviceId && !justBind" class="has-device">
<view class="device-binded"> <view class="device-binded">
@@ -204,7 +244,11 @@ const copyEmail = () => {
<text>{{ user.nickName }}</text> <text>{{ user.nickName }}</text>
</view> </view>
</view> </view>
<SButton :onClick="unbindDevice">解绑</SButton> <view :style="{ marginTop: '100rpx' }">
<SButton :onClick="unbindDevice" width="80vw" :rounded="40"
>解绑</SButton
>
</view>
</view> </view>
</Container> </Container>
</template> </template>
@@ -313,16 +357,17 @@ const copyEmail = () => {
justify-content: center; justify-content: center;
color: #fff; color: #fff;
font-size: 14px; font-size: 14px;
margin: 100px 0; margin-top: 200rpx;
} }
.device-binded > view { .device-binded > view {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
position: relative;
} }
.device-binded > view > image { .device-binded > view > image {
width: 24vw; width: 140rpx;
height: 24vw; height: 140rpx;
margin-bottom: 5px; margin-bottom: 5px;
border-radius: 10px; border-radius: 10px;
} }
@@ -334,7 +379,7 @@ const copyEmail = () => {
text-align: center; text-align: center;
} }
.device-binded > image { .device-binded > image {
width: 16vw; width: 100rpx;
margin: 0 20px; margin: 0 20px;
} }
.has-device, .has-device,
@@ -348,10 +393,41 @@ const copyEmail = () => {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
font-size: 14px; font-size: 14px;
margin: 75px 0; margin-bottom: 100rpx;
} }
.has-device > view:nth-child(2) > text, .has-device > view:nth-child(2) > text,
.just-bind > view:nth-child(2) > text { .just-bind > view:nth-child(2) > text {
margin: 5px; margin: 5px;
} }
.calibration {
position: absolute;
bottom: -145rpx;
left: 20rpx;
}
.calibration > button {
font-size: 22rpx;
color: #287fff;
display: flex;
align-items: center;
margin-bottom: 15rpx;
margin-left: 50rpx;
}
.calibration > button > image {
width: 28rpx;
height: 28rpx;
}
.calibration > view {
position: relative;
font-size: 20rpx;
color: #fff9;
padding-top: 40rpx;
padding-left: 35rpx;
width: 300rpx;
}
.calibration > view > image {
position: absolute;
top: 0;
left: 0;
width: 370rpx;
}
</style> </style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB