From 7840c1778d78fa1342e4524282322066081cfeef Mon Sep 17 00:00:00 2001
From: huliyong <2783385703@qq.com>
Date: Tue, 4 Nov 2025 15:14:01 +0800
Subject: [PATCH] =?UTF-8?q?feat(audio):=20=E5=AE=9E=E7=8E=B0=E9=9F=B3?=
=?UTF-8?q?=E9=A2=91=E5=BE=AA=E7=8E=AF=E6=A8=A1=E5=BC=8F=E5=88=87=E6=8D=A2?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增顺序/单句/单页三种循环模式
优化音频控制组件循环逻辑
添加字幕句子级别转换工具函数
---
config/index.js | 2 +-
manifest.json | 2 +-
subPages/home/AudioControls.vue | 39 ++++++++--
subPages/home/articleDetail.vue | 117 +++++++++++++++++++++++++++---
subPages/home/book.vue | 51 +++----------
subPages/home/components/CustomTabbar.vue | 4 +
subPages/home/示例.html | 11 +++
utils/audioUtils.js | 62 ++++++++++++++++
8 files changed, 231 insertions(+), 57 deletions(-)
create mode 100644 subPages/home/示例.html
diff --git a/config/index.js b/config/index.js
index f8f45d8..6735560 100644
--- a/config/index.js
+++ b/config/index.js
@@ -19,7 +19,7 @@ const config = {
// 网络全局配置
netConfig: {
development: {
- baseURL: 'http://127.0.0.1:8003/englishread-admin/appletApi',
+ baseURL: 'http://127.0.0.1:8002/englishread-admin/appletApi',
// baseURL: 'http://h5.xzaiyp.top/englishread-admin/appletApi',
},
testing: {
diff --git a/manifest.json b/manifest.json
index 9eed575..eaed83b 100644
--- a/manifest.json
+++ b/manifest.json
@@ -51,7 +51,7 @@
/* H5特有相关 */
"h5" : {
"devServer" : {
- "port" : 8002,
+ "port" : 8003,
"disableHostCheck" : true
}
},
diff --git a/subPages/home/AudioControls.vue b/subPages/home/AudioControls.vue
index c22d1be..e5df1a0 100644
--- a/subPages/home/AudioControls.vue
+++ b/subPages/home/AudioControls.vue
@@ -31,8 +31,8 @@
-
- 循环
+
+ {{ loopModeLabel }}
@@ -126,7 +126,7 @@ export default {
totalTime: 0,
sliderValue: 0, // 滑動條的值
isDragging: false, // 是否正在拖動滑動條
- isLoop: false,
+ loopMode: 'sequential',
playSpeed: 1.0,
speedOptions: [0.5, 0.8, 1.0, 1.25, 1.5, 2.0], // 根據uni-app文檔的官方支持值
playbackRateSupported: true, // 播放速度控制是否支持
@@ -208,6 +208,18 @@ export default {
}
}
return false;
+ },
+
+ // 播放模式文案
+ loopModeLabel() {
+ switch (this.loopMode) {
+ case 'sentence':
+ return '单句';
+ case 'page':
+ return '单页';
+ default:
+ return '顺序';
+ }
}
},
watch: {
@@ -1673,6 +1685,13 @@ export default {
return;
}
+ // 单句循环模式:重播当前句(如果是导语则跳到第一个非导语)
+ if (this.loopMode === 'sentence') {
+ this.playAudio();
+ this.isProcessingEnded = false;
+ return;
+ }
+
if (this.currentAudioIndex < this.currentPageAudios.length - 1) {
// 还有下一个音频,继续播放
let currentAudioData = this.currentPageAudios[this.currentAudioIndex];
@@ -1747,7 +1766,7 @@ export default {
handlePlaybackComplete() {
console.log('🎵 handlePlaybackComplete: 所有音频播放完毕');
- if (this.isLoop) {
+ if (this.loopMode === 'page') {
// 循环播放 - 跳过导语音频
console.log('🎵 handlePlaybackComplete: 循环播放,查找第一个非导语音频');
const firstNonLeadIndex = this.findFirstNonLeadAudio();
@@ -1865,7 +1884,15 @@ export default {
// },
toggleLoop() {
- this.isLoop = !this.isLoop;
+ const modes = ['sequential', 'sentence', 'page'];
+ const idx = modes.indexOf(this.loopMode);
+ this.loopMode = modes[(idx + 1) % modes.length];
+ this.$emit('loop-mode-change', this.loopMode);
+ uni.showToast({
+ title: `播放模式:${this.loopModeLabel}`,
+ icon: 'none',
+ duration: 800
+ });
},
toggleSpeed() {
@@ -2323,7 +2350,7 @@ export default {
this.preloadedPages = new Set();
// 5. 重置播放控制状态
- this.isLoop = false;
+ this.loopMode = 'sequential';
this.playSpeed = 1.0;
this.playbackRateSupported = true;
diff --git a/subPages/home/articleDetail.vue b/subPages/home/articleDetail.vue
index a8875a7..1fdea3d 100644
--- a/subPages/home/articleDetail.vue
+++ b/subPages/home/articleDetail.vue
@@ -19,7 +19,7 @@
-
+
@@ -35,11 +35,17 @@
:color="isPlaying ? '#ff6b6b' : '#4CAF50'">
+
+
+