feat: 添加射箭声音
This commit is contained in:
490
src/App.vue
490
src/App.vue
@@ -1,256 +1,292 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { watch } from "vue";
|
import {
|
||||||
import { onShow, onHide } from "@dcloudio/uni-app";
|
watch
|
||||||
import websocket from "@/websocket";
|
} from "vue";
|
||||||
import { getDeviceBatteryAPI } from "@/apis";
|
import {
|
||||||
import useStore from "@/store";
|
onShow,
|
||||||
import { storeToRefs } from "pinia";
|
onHide
|
||||||
const store = useStore();
|
} from "@dcloudio/uni-app";
|
||||||
const { user } = storeToRefs(store);
|
import websocket from "@/websocket";
|
||||||
const { updateUser, updateOnline } = store;
|
import {
|
||||||
|
getDeviceBatteryAPI
|
||||||
|
} from "@/apis";
|
||||||
|
import useStore from "@/store";
|
||||||
|
import {
|
||||||
|
storeToRefs
|
||||||
|
} from "pinia";
|
||||||
|
import audioManager from "./audioManager";
|
||||||
|
const store = useStore();
|
||||||
|
const {
|
||||||
|
user
|
||||||
|
} = storeToRefs(store);
|
||||||
|
const {
|
||||||
|
updateUser,
|
||||||
|
updateOnline
|
||||||
|
} = store;
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => user.value.id,
|
() => user.value.id,
|
||||||
(newVal) => {
|
(newVal) => {
|
||||||
const token = uni.getStorageSync(
|
const token = uni.getStorageSync(
|
||||||
`${uni.getAccountInfoSync().miniProgram.envVersion}_token`
|
`${uni.getAccountInfoSync().miniProgram.envVersion}_token`
|
||||||
);
|
);
|
||||||
if (newVal && token) {
|
if (newVal && token) {
|
||||||
websocket.createWebSocket(token, (content) => {
|
websocket.createWebSocket(token, onShootWsMsg);
|
||||||
uni.$emit("socket-inbox", content);
|
}
|
||||||
});
|
if (!newVal) {
|
||||||
}
|
websocket.closeWebSocket();
|
||||||
if (!newVal) {
|
}
|
||||||
websocket.closeWebSocket();
|
}, {
|
||||||
}
|
deep: false, // 如果 user 是一个对象或数组,建议开启
|
||||||
},
|
immediate: false, // 若想在初始化时立即执行一次回调,可开启。
|
||||||
{
|
}
|
||||||
deep: false, // 如果 user 是一个对象或数组,建议开启
|
);
|
||||||
immediate: false, // 若想在初始化时立即执行一次回调,可开启。
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
function emitUpdateUser(value) {
|
function emitUpdateUser(value) {
|
||||||
updateUser(value);
|
updateUser(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function emitUpdateOnline() {
|
async function emitUpdateOnline() {
|
||||||
const data = await getDeviceBatteryAPI();
|
const data = await getDeviceBatteryAPI();
|
||||||
updateOnline(data.online);
|
updateOnline(data.online);
|
||||||
}
|
}
|
||||||
|
|
||||||
onShow(() => {
|
function onDeviceShoot() {
|
||||||
uni.$on("update-user", emitUpdateUser);
|
audioManager.play("射箭声音")
|
||||||
uni.$on("update-online", emitUpdateOnline);
|
}
|
||||||
const token = uni.getStorageSync(
|
|
||||||
`${uni.getAccountInfoSync().miniProgram.envVersion}_token`
|
|
||||||
);
|
|
||||||
if (user.value.id && token) {
|
|
||||||
console.log("回到前台,重新连接 websocket");
|
|
||||||
websocket.createWebSocket(token, (content) => {
|
|
||||||
uni.$emit("socket-inbox", content);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
onHide(() => {
|
function onShootWsMsg(content) {
|
||||||
uni.$off("update-user", emitUpdateUser);
|
if(content.type === 'shoot-trigger'){
|
||||||
uni.$off("update-online", emitUpdateOnline);
|
onDeviceShoot()
|
||||||
websocket.closeWebSocket();
|
}
|
||||||
});
|
uni.$emit("socket-inbox", content);
|
||||||
|
}
|
||||||
|
|
||||||
|
onShow(() => {
|
||||||
|
uni.$on("update-user", emitUpdateUser);
|
||||||
|
uni.$on("update-online", emitUpdateOnline);
|
||||||
|
const token = uni.getStorageSync(
|
||||||
|
`${uni.getAccountInfoSync().miniProgram.envVersion}_token`
|
||||||
|
);
|
||||||
|
if (user.value.id && token) {
|
||||||
|
console.log("回到前台,重新连接 websocket");
|
||||||
|
websocket.createWebSocket(token, onShootWsMsg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onHide(() => {
|
||||||
|
uni.$off("update-user", emitUpdateUser);
|
||||||
|
uni.$off("update-online", emitUpdateOnline);
|
||||||
|
websocket.closeWebSocket();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
page {
|
page {
|
||||||
-webkit-touch-callout: none;
|
-webkit-touch-callout: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
border: none;
|
border: none;
|
||||||
background: none;
|
background: none;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
outline: none;
|
outline: none;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
view::-webkit-scrollbar {
|
view::-webkit-scrollbar {
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 0;
|
height: 0;
|
||||||
color: transparent;
|
color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
button::after {
|
button::after {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.guide-tips {
|
.guide-tips {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
}
|
}
|
||||||
.guide-tips > text:first-child {
|
|
||||||
color: #fed847;
|
|
||||||
}
|
|
||||||
.guide-tips > text:nth-child(2) {
|
|
||||||
font-size: 24rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fadeInOut {
|
.guide-tips>text:first-child {
|
||||||
0% {
|
color: #fed847;
|
||||||
transform: translateY(20px);
|
}
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
30% {
|
|
||||||
transform: translateY(0);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
80% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-in-out {
|
.guide-tips>text:nth-child(2) {
|
||||||
animation: fadeInOut 1.2s ease forwards;
|
font-size: 24rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes fadeOut {
|
@keyframes fadeInOut {
|
||||||
from {
|
0% {
|
||||||
transform: translateY(0);
|
transform: translateY(20px);
|
||||||
opacity: 1;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
to {
|
|
||||||
transform: translateY(20px);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-out {
|
30% {
|
||||||
animation: fadeOut 0.3s ease forwards;
|
transform: translateY(0);
|
||||||
}
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes scaleIn {
|
80% {
|
||||||
from {
|
opacity: 1;
|
||||||
transform: scale(0);
|
}
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: scale(1);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.scale-in {
|
100% {
|
||||||
animation: scaleIn 0.3s ease-out forwards;
|
opacity: 0;
|
||||||
transform-origin: center center;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes scaleOut {
|
.fade-in-out {
|
||||||
from {
|
animation: fadeInOut 1.2s ease forwards;
|
||||||
transform: scale(1);
|
}
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: scale(0);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.scale-out {
|
@keyframes fadeOut {
|
||||||
animation: scaleOut 0.3s ease-out forwards;
|
from {
|
||||||
transform-origin: center center;
|
transform: translateY(0);
|
||||||
}
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes rotate {
|
to {
|
||||||
from {
|
transform: translateY(20px);
|
||||||
transform: rotate(0deg);
|
opacity: 0;
|
||||||
}
|
}
|
||||||
to {
|
}
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes pumpIn {
|
.fade-out {
|
||||||
from {
|
animation: fadeOut 0.3s ease forwards;
|
||||||
transform: scale(2);
|
}
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.pump-in {
|
@keyframes scaleIn {
|
||||||
animation: pumpIn 0.3s ease-out forwards;
|
from {
|
||||||
transform-origin: center center;
|
transform: scale(0);
|
||||||
}
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.share-canvas {
|
to {
|
||||||
width: 300px;
|
transform: scale(1);
|
||||||
height: 530px;
|
opacity: 1;
|
||||||
position: absolute;
|
}
|
||||||
top: -1000px;
|
}
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.truncate {
|
.scale-in {
|
||||||
white-space: nowrap;
|
animation: scaleIn 0.3s ease-out forwards;
|
||||||
overflow: hidden;
|
transform-origin: center center;
|
||||||
text-overflow: ellipsis;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.modal {
|
@keyframes scaleOut {
|
||||||
height: 100%;
|
from {
|
||||||
display: flex;
|
transform: scale(1);
|
||||||
flex-direction: column;
|
opacity: 1;
|
||||||
align-items: center;
|
}
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.user-row {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 0 15px;
|
|
||||||
padding-top: 7px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.half-time-tip {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.half-time-tip > text:last-child {
|
|
||||||
margin-top: 20px;
|
|
||||||
color: #fff9;
|
|
||||||
}
|
|
||||||
.see-more {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin-top: 20rpx;
|
|
||||||
}
|
|
||||||
.see-more > text {
|
|
||||||
color: #39a8ff;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
.see-more > image {
|
|
||||||
width: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
to {
|
||||||
font-family: "DINCondensed";
|
transform: scale(0);
|
||||||
src: url("https://static.shelingxingqiu.com/font/DIN-Condensed-Bold-2.ttf")
|
opacity: 0;
|
||||||
format("truetype");
|
}
|
||||||
font-weight: 700;
|
}
|
||||||
font-style: normal;
|
|
||||||
font-display: swap;
|
.scale-out {
|
||||||
}
|
animation: scaleOut 0.3s ease-out forwards;
|
||||||
|
transform-origin: center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pumpIn {
|
||||||
|
from {
|
||||||
|
transform: scale(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pump-in {
|
||||||
|
animation: pumpIn 0.3s ease-out forwards;
|
||||||
|
transform-origin: center center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share-canvas {
|
||||||
|
width: 300px;
|
||||||
|
height: 530px;
|
||||||
|
position: absolute;
|
||||||
|
top: -1000px;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.truncate {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0 15px;
|
||||||
|
padding-top: 7px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.half-time-tip {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.half-time-tip>text:last-child {
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #fff9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.see-more {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.see-more>text {
|
||||||
|
color: #39a8ff;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.see-more>image {
|
||||||
|
width: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "DINCondensed";
|
||||||
|
src: url("https://static.shelingxingqiu.com/font/DIN-Condensed-Bold-2.ttf") format("truetype");
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -6,8 +6,8 @@ try {
|
|||||||
|
|
||||||
switch (envVersion) {
|
switch (envVersion) {
|
||||||
case "develop": // 开发版
|
case "develop": // 开发版
|
||||||
// BASE_URL = "http://192.168.1.30:8000/api/shoot";
|
BASE_URL = "http://localhost:8000/api/shoot";
|
||||||
BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot";
|
// BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot";
|
||||||
break;
|
break;
|
||||||
case "trial": // 体验版
|
case "trial": // 体验版
|
||||||
BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot";
|
BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot";
|
||||||
|
|||||||
@@ -40,25 +40,25 @@ export const audioFils = {
|
|||||||
未上靶:
|
未上靶:
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-11-12/de6n45o3tsm1v4unam.mp3",
|
"https://static.shelingxingqiu.com/attachment/2025-11-12/de6n45o3tsm1v4unam.mp3",
|
||||||
"1环":
|
"1环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin1aq7gxjih5l.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/1%E7%8E%AF.mp3",
|
||||||
"2环":
|
"2环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin64tdgx2s4at.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/2%E7%8E%AF.mp3",
|
||||||
"3环":
|
"3环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxinlmf87vt8z65.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/3%E7%8E%AF.mp3",
|
||||||
"4环":
|
"4环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxinniv97sx0q9u.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/4%E7%8E%AF.mp3",
|
||||||
"5环":
|
"5环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin7j01kknpb7k.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/5%E7%8E%AF.mp3",
|
||||||
"6环":
|
"6环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin4syy1015rtq.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/6%E7%8E%AF.mp3",
|
||||||
"7环":
|
"7环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin3iz3dvmjdai.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/7%E7%8E%AF.mp3",
|
||||||
"8环":
|
"8环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxinnjd42lhpfiw.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/8%E7%8E%AF.mp3",
|
||||||
"9环":
|
"9环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxin69nj1xh7yfz.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/9%E7%8E%AF.mp3",
|
||||||
"10环":
|
"10环":
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-09-17/dcutxinnvsx0tt7ksa.mp3",
|
"https://static.shelingxingqiu.com/shootaudio/10%E7%8E%AF.mp3",
|
||||||
X环: "https://static.shelingxingqiu.com/attachment/2026-02-09/dga8puwekpe2gmtbu4.mp3",
|
X环: "https://static.shelingxingqiu.com/attachment/2026-02-09/dga8puwekpe2gmtbu4.mp3",
|
||||||
向上调整:
|
向上调整:
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-11-12/de6ellf5pfvu3l8dhr.mp3",
|
"https://static.shelingxingqiu.com/attachment/2025-11-12/de6ellf5pfvu3l8dhr.mp3",
|
||||||
@@ -80,6 +80,10 @@ export const audioFils = {
|
|||||||
"https://static.shelingxingqiu.com/attachment/2025-11-13/de7kzzllq0futwynso.mp3",
|
"https://static.shelingxingqiu.com/attachment/2025-11-13/de7kzzllq0futwynso.mp3",
|
||||||
练习开始:
|
练习开始:
|
||||||
"https://static.shelingxingqiu.com/attachment/2025-11-14/de88w0lmmt43nnfmoi.mp3",
|
"https://static.shelingxingqiu.com/attachment/2025-11-14/de88w0lmmt43nnfmoi.mp3",
|
||||||
|
射箭声音:
|
||||||
|
"https://static.shelingxingqiu.com/shootaudio/%E6%9C%AA%E4%B8%8A%E9%9D%B6.mp3",
|
||||||
|
命中:
|
||||||
|
"https://static.shelingxingqiu.com/shootaudio/%E5%91%BD%E4%B8%AD.mp3"
|
||||||
};
|
};
|
||||||
|
|
||||||
// 版本控制日志函数
|
// 版本控制日志函数
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ function createWebSocket(token, onMessage) {
|
|||||||
|
|
||||||
switch (envVersion) {
|
switch (envVersion) {
|
||||||
case "develop": // 开发版
|
case "develop": // 开发版
|
||||||
// url = "ws://192.168.1.30:8000/socket";
|
url = "ws://localhost:8000/socket";
|
||||||
url = "wss://apitest.shelingxingqiu.com/socket";
|
// url = "wss://apitest.shelingxingqiu.com/socket";
|
||||||
break;
|
break;
|
||||||
case "trial": // 体验版
|
case "trial": // 体验版
|
||||||
url = "wss://apitest.shelingxingqiu.com/socket";
|
url = "wss://apitest.shelingxingqiu.com/socket";
|
||||||
|
|||||||
Reference in New Issue
Block a user