Bläddra i källkod

Merge branch '2025鹅状元dev' of https://gogs.mtavip.com/wangguoyu/uniProject into 2025鹅状元dev

tanxue 2 månader sedan
förälder
incheckning
c03bf45300
3 ändrade filer med 443 tillägg och 404 borttagningar
  1. 71 56
      pages/newEnglish/components/mainCard.vue
  2. 70 67
      pages/newEnglish/components/xuePage.vue
  3. 302 281
      pages/newEnglish/index.vue

+ 71 - 56
pages/newEnglish/components/mainCard.vue

@@ -1,65 +1,80 @@
 <template>
-    <swiper class="word-view-swiper-box" :indicator-dots="false" :autoplay="false" :circular="false">
-        <swiper-item>
-            <view class="swiper-item uni-bg-red">
-                <xuePage :active-word="activeWord" :active-words="activeWords" @goXiangjie="goXiangjie" @play-audio="handlePlayAudio"
-                         :pageData="pageData"></xuePage>
-            </view>
-        </swiper-item>
-        <swiper-item>
-            <view class="swiper-item uni-bg-red">
-                <pinPageVue :active-word="activeWord" :active-words="activeWords"
-                            @play-audio="handlePlayAudio"></pinPageVue>
-            </view>
-        </swiper-item>
-        <swiper-item>
-            <view class="swiper-item uni-bg-blue">
-                <readContent :active-word="activeWord" :pageData="pageData" @play-audio="handlePlayAudio"
-                             :active-words="activeWords"></readContent>
-            </view>
-        </swiper-item>
-        <swiper-item>
-            <view class="swiper-item uni-bg-blue">
-                <selectPageVue :active-word="activeWord" :active-words="activeWords"
-                               @play-audio="handlePlayAudio"></selectPageVue>
-            </view>
-        </swiper-item>
-        <swiper-item>
-            <view class="swiper-item uni-bg-blue">
-                <beiPageVue :active-word="activeWord" :pageData="pageData" :active-words="activeWords"
-                            @play-audio="handlePlayAudio"></beiPageVue>
-            </view>
-        </swiper-item>
-    </swiper>
+ <swiper class="word-view-swiper-box" :indicator-dots="false" :autoplay="false" :circular="false"
+  @change="handleSwiperChange" :disable-touch="isPlaying">
+  <swiper-item>
+   <view class="swiper-item uni-bg-red">
+    <xuePage :active-word="activeWord" :active-words="activeWords" @goXiangjie="goXiangjie"
+     @play-audio="handlePlayAudio" :pageData="pageData"></xuePage>
+   </view>
+  </swiper-item>
+  <swiper-item>
+   <view class="swiper-item uni-bg-red">
+    <pinPageVue :active-word="activeWord" :active-words="activeWords" @play-audio="handlePlayAudio">
+    </pinPageVue>
+   </view>
+  </swiper-item>
+  <swiper-item>
+   <view class="swiper-item uni-bg-blue">
+    <readContent :active-word="activeWord" :pageData="pageData" @play-audio="handlePlayAudio"
+     :active-words="activeWords"></readContent>
+   </view>
+  </swiper-item>
+  <swiper-item>
+   <view class="swiper-item uni-bg-blue">
+    <selectPageVue :active-word="activeWord" :active-words="activeWords" @play-audio="handlePlayAudio">
+    </selectPageVue>
+   </view>
+  </swiper-item>
+  <swiper-item>
+   <view class="swiper-item uni-bg-blue">
+    <beiPageVue :active-word="activeWord" :pageData="pageData" :active-words="activeWords"
+     @play-audio="handlePlayAudio"></beiPageVue>
+   </view>
+  </swiper-item>
+ </swiper>
 </template>
 
 <script setup>
-    import pinPageVue from './pinPage.vue';
-    import selectPageVue from './selectPage.vue';
-    import beiPageVue from './beiPage.vue';
-    import readContent from './readContent.vue';
-    import xuePage from './xuePage.vue';
+ import pinPageVue from './pinPage.vue';
+ import selectPageVue from './selectPage.vue';
+ import beiPageVue from './beiPage.vue';
+ import readContent from './readContent.vue';
+ import xuePage from './xuePage.vue';
+ import {
+  ref
+ } from 'vue';
+ const props = defineProps({
+  activeWord: {
+   type: Object,
+  },
+  pageData: {
+   type: Object,
+  },
+  activeWords: {
+   type: Array
+  },
+  isPlaying: Boolean // 新增 isPlaying prop
+ })
+ const emits = defineEmits(['play-audio', 'goXiangjie', 'swiper-change'])
 
-    const props = defineProps({
-        activeWord: {
-            type: Object,
-        },
-        pageData: {
-            type: Object,
-        },
-        activeWords: {
-            type: Array
-        },
-    })
-    const emits = defineEmits(['play-audio','goXiangjie'])
+ function handleSwiperChange(e) {
+  emits('swiper-change', e.detail.current)
+ }
 
-    function handlePlayAudio({url, code}) {
-        emits('play-audio', {url, code})
-    }  
-	 function goXiangjie() {
-        emits('goXiangjie')
-    }
+ function handlePlayAudio({
+  url,
+  code
+ }) {
+  emits('play-audio', {
+   url,
+   code
+  })
+ }
+
+ function goXiangjie() {
+  emits('goXiangjie')
+ }
 </script>
 
 <style lang="scss" scoped>
-</style>
+</style>

+ 70 - 67
pages/newEnglish/components/xuePage.vue

@@ -1,81 +1,84 @@
 <!-- 单词区 && 音标区:最多14位,超过换行  词根助记区:宽度不限,可以滚动-->
 <!-- 单音节最长:swimming 多音节最长:transportation -->
 <template>
-<view class="ezy-tab-border">
-  <selectTypesVue activeSelect="1"></selectTypesVue>
-  <view class="ezy-border-body">
-	<view class="words-xue-box">
-		<view class="words-xue-body">
-			<!-- 单词区 -->
-			<view class="word-circle-box">
-				<view class="word-link-box">
-					<text v-for="(item,index) in activeWord.chaifen" :key="index">{{item}}</text>
-				</view>
-			</view>
-			<view class="word-block-box">
-				<text v-for="(item,index) in activeWord.chaifen" :key="index">{{item}}</text>
-			</view>
-			<!-- 音标区 -->
-			<view class="yb-play-box xue-yb-play-box">
-				<yinbiaoTxtVue :yinbiao="activeWord.yinbiao"></yinbiaoTxtVue>
-				<!-- 音频播放 -->
-				<audioTwoVue :active-word="activeWord" @play-audio="handlePlay"></audioTwoVue>
-			</view>
-			<!-- 注释区 -->
-			<view class="pin-words-explain-box xue-words-explain-box">
-				<view class="words-explain-item" v-for="item in activeWord.jianyi" :key="item">{{item}}</view>
-			</view>
-			<!-- 详解触发 -->
-			<view @click="goXiangjie" class="details-btn">详解 ></view>
-			<!-- 音标拆分区 -->
-			<view v-show="data.isPindu" class="word-block-box yb-block-box">
-				<!-- pindu -->
-				<audioThreeVue v-for="(item,index) in activeWord.pindu" :key="index" :YItem="item"
-					@play-audio="handlePlay"></audioThreeVue>
-			</view>
-			<view  v-show="!data.isPindu" class="yj-block-box">
-				<!-- yinjie -->
-				<audioFourVue v-for="(item,index) in activeWord.yinjie" :key="index" :YItem="item"
-					@play-audio="handlePlay"></audioFourVue>
-			</view>
+	<view class="ezy-tab-border">
+		<selectTypesVue activeSelect="1"></selectTypesVue>
+		<view class="ezy-border-body">
+			<view class="words-xue-box">
+				<view class="words-xue-body">
+					<!-- 单词区 -->
+					<view class="word-circle-box">
+						<view class="word-link-box">
+							<text v-for="(item,index) in activeWord.chaifen" :key="index">{{item}}</text>
+						</view>
+					</view>
+					<view class="word-block-box">
+						<text v-for="(item,index) in activeWord.chaifen" :key="index">{{item}}</text>
+					</view>
+					<!-- 音标区 -->
+					<view class="yb-play-box xue-yb-play-box">
+						<yinbiaoTxtVue :yinbiao="activeWord.yinbiao"></yinbiaoTxtVue>
+						<!-- 音频播放 -->
+						<audioTwoVue :active-word="activeWord" @play-audio="handlePlay"></audioTwoVue>
+					</view>
+					<!-- 注释区 -->
+					<view class="pin-words-explain-box xue-words-explain-box">
+						<view class="words-explain-item" v-for="item in activeWord.jianyi" :key="item">{{item}}</view>
+					</view>
+					<!-- 详解触发 -->
+					<view @click="goXiangjie" class="details-btn">详解 ></view>
+					<!-- 音标拆分区 -->
+					<view v-show="data.isPindu" class="word-block-box yb-block-box">
+						<!-- pindu -->
+						<audioThreeVue v-for="(item,index) in activeWord.pindu" :key="index" :YItem="item"
+							@play-audio="handlePlay"></audioThreeVue>
+					</view>
+					<view v-show="!data.isPindu" class="yj-block-box">
+						<!-- yinjie -->
+						<audioFourVue v-for="(item,index) in activeWord.yinjie" :key="index" :YItem="item"
+							@play-audio="handlePlay"></audioFourVue>
+					</view>
 
-			<!-- 音标按钮 -->
-			<view class="xue-change-btn-box">
-				<view class="change-btn" :class="{active: !data.isPindu}" @click="handlePindu"><text>自然拼读</text></view>
-				<view class="change-btn" :class="{active: data.isPindu}" @click="handleYinjie"><text>音节拆分</text></view>
-			</view>
-			<!-- 词根+实用口语 -->
-			<view v-if="activeWord.cigenzhuji.length" class="details-content-box xue-details-content-box">
-				<text class="details-title">词根助记</text>
-				<scroll-view class="cg-item-list" scroll-x @touchmove.stop>
-					<view class="cg-item-box" v-for="(item,index) in activeWord.cigenzhuji" :key="index">
-						<view class="cg-item">
-							<view
-								:class="{isEven: index% 2 !== 0 && index!==activeWord.cigenzhuji.length-1,isOdd: index% 2 === 0 && index!==activeWord.cigenzhuji.length-1}">
-								{{item.en}}</view>
-							<view>{{item.zn}}</view>
+					<!-- 音标按钮 -->
+					<view class="xue-change-btn-box">
+						<view class="change-btn" :class="{active: !data.isPindu}" @click="handlePindu"><text>自然拼读</text>
+						</view>
+						<view class="change-btn" :class="{active: data.isPindu}" @click="handleYinjie"><text>音节拆分</text>
 						</view>
-						<view class="cg-symbol" v-if="index<activeWord.cigenzhuji.length-2">+</view>
-						<view class="cg-symbol" v-if="index == activeWord.cigenzhuji.length - 2">=</view>
 					</view>
-				</scroll-view>
-			</view>
+					<!-- 词根+实用口语 -->
+					<view v-if="activeWord.cigenzhuji.length" class="details-content-box xue-details-content-box">
+						<text class="details-title">词根助记</text>
+						<scroll-view class="cg-item-list" scroll-x @touchmove.stop>
+							<view class="cg-item-box" v-for="(item,index) in activeWord.cigenzhuji" :key="index">
+								<view class="cg-item">
+									<view
+										:class="{isEven: index% 2 !== 0 && index!==activeWord.cigenzhuji.length-1,isOdd: index% 2 === 0 && index!==activeWord.cigenzhuji.length-1}">
+										{{item.en}}
+									</view>
+									<view>{{item.zn}}</view>
+								</view>
+								<view class="cg-symbol" v-if="index<activeWord.cigenzhuji.length-2">+</view>
+								<view class="cg-symbol" v-if="index == activeWord.cigenzhuji.length - 2">=</view>
+							</view>
+						</scroll-view>
+					</view>
 
-			<!-- 实用语句 -->
-			<view class="details-content-box xue-details-content-box">
-				<text class="details-title">实用口语</text>
-				<view v-for="(item,index) in activeWord.kouyu" :key="index" class="syky-content">
-					<view class="details-en-content">
-						<rich-text :nodes="highlightWord(item.en)"></rich-text>
+					<!-- 实用语句 -->
+					<view class="details-content-box xue-details-content-box">
+						<text class="details-title">实用口语</text>
+						<view v-for="(item,index) in activeWord.kouyu" :key="index" class="syky-content">
+							<view class="details-en-content">
+								<rich-text :nodes="highlightWord(item.en)"></rich-text>
+							</view>
+							<view class="details-cn-content">{{item.zn}}</view>
+						</view>
 					</view>
-					<view class="details-cn-content">{{item.zn}}</view>
+
 				</view>
 			</view>
-
 		</view>
 	</view>
-  </view>
-</view>
 </template>
 
 <script setup>
@@ -97,7 +100,7 @@
 		useAudioCache
 	} from './useAudio.js';
 
-	const emits = defineEmits(['play-audio','goXiangjie'])
+	const emits = defineEmits(['play-audio', 'goXiangjie'])
 	const userCode = getUserIdentity();
 	const {
 		cacheAudio,

+ 302 - 281
pages/newEnglish/index.vue

@@ -1,313 +1,334 @@
 <template>
-	<view class="word-view-page" :style="{backgroundImage: 'url(' + courseBjFun() + ')'}">
-		<view class="icon-title-navBar-box">
-			<view @click="handleBack" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">学习</text>
-		</view>
-		<template v-for="item in data.wordList">
-			<mainCardVue :active-word="data.activeWord" :pageData="data" :active-words="activeWords"
-				@play-audio="handlePlayAudio" @goXiangjie="goXiangjie" v-if="item.id == data.activeId"
-				:key="item.id">
-			</mainCardVue>
-		</template>
-		<view class="word-view-bottom" v-if="data.activeWord">
-			<view class="collect-btn" v-if="userCode != 'Visitor'" @click="handleShouCang">
-				<icon :class="{active: data.collectFlag}"></icon>
-				<view>收藏</view>
-			</view>
-			<view class="bottom-btn-box">
-				<view class="word-view-btn" @click="prevWord" v-if="!isFirst&&isLearnRecord!=0">上一词</view>
-				<view class="word-view-btn" @click="nextWord" v-if="!isLast&&isLearnRecord!=0">下一词</view>
-				<view class="word-view-btn" v-if="isLast&&isLearnRecord!=0" @click="handleComplete">完成</view>
-			</view>
-		</view>
+ <view class="word-view-page" :style="{backgroundImage: 'url(' + courseBjFun() + ')'}">
+  <view class="icon-title-navBar-box">
+   <view @click="handleBack" class="nav-bar-icon"></view>
+   <text class="nav-bar-title">学习</text>
+  </view>
+  <template v-for="item in data.wordList">
+   <mainCardVue :active-word="data.activeWord" :pageData="data" :active-words="activeWords"
+    @play-audio="handlePlayAudio" @goXiangjie="goXiangjie" @swiper-change="handleSwiperChange"
+    :is-playing="isAudioPlaying" v-if="item.id == data.activeId" :key="item.id">
+   </mainCardVue>
+  </template>
+  <view class="word-view-bottom" v-if="data.activeWord">
+   <view class="collect-btn" v-if="userCode != 'Visitor'" @click="handleShouCang">
+    <icon :class="{active: data.collectFlag}"></icon>
+    <view>收藏</view>
+   </view>
+   <view class="bottom-btn-box">
+    <view class="word-view-btn" @click="prevWord" v-if="!isFirst&&isLearnRecord!=0">上一词</view>
+    <view class="word-view-btn" @click="nextWord" v-if="!isLast&&isLearnRecord!=0">下一词</view>
+    <view class="word-view-btn" v-if="isLast&&isLearnRecord!=0" @click="handleComplete">完成</view>
+   </view>
+  </view>
 
-		<audioRightWrongVue></audioRightWrongVue>
-	</view>
+  <audioRightWrongVue></audioRightWrongVue>
+ </view>
 </template>
 
 <script setup>
-	import mainCardVue from "./components/mainCard.vue";
-	import {
-		ref,
-		reactive,
-		computed,
-		nextTick
-	} from "vue";
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as httpApi from "@/api/word.js"
-	import {
-		getUserIdentity,
-	} from "@/utils/common.js"
-	import {
-		useAudioCache,
-		audioPlayer
-	} from "./components/useAudio.js"
-	import {
-		getWordCancel
-	} from "../../api/word";
-	import audioRightWrongVue from "./components/audioRightWrong.vue";
+ import mainCardVue from "./components/mainCard.vue";
+ import {
+  ref,
+  reactive,
+  computed,
+  nextTick
+ } from "vue";
+ import {
+  onLoad
+ } from "@dcloudio/uni-app";
+ import * as httpApi from "@/api/word.js"
+ import {
+  getUserIdentity,
+ } from "@/utils/common.js"
+ import {
+  useAudioCache,
+  audioPlayer
+ } from "./components/useAudio.js"
+ import {
+  getWordCancel
+ } from "../../api/word";
+ import audioRightWrongVue from "./components/audioRightWrong.vue";
 
-	const userCode = getUserIdentity();
+ const userCode = getUserIdentity();
 
-	const {
-		cacheAudio,
-		clearAudioCache
-	} = useAudioCache();
+ const {
+  cacheAudio,
+  clearAudioCache
+ } = useAudioCache();
 
-	const AudioP = new audioPlayer();
-	const isLearnRecord = ref(null)
-	const isLearnStatus = ref(null)
+ const AudioP = new audioPlayer();
+ const isLearnRecord = ref(null)
+ const isLearnStatus = ref(null)
+ const isAudioPlaying = ref(false) // 音频播放状态
+ // 监听音频播放事件
+ uni.$on('danci-audio-play', (code) => {
+  isAudioPlaying.value = true
+ })
 
-	function courseBjFun() {
-		return 'static/images/course/course-cjdc-bj.png'
-	}
+ uni.$on('danci-audio-ended', () => {
+  isAudioPlaying.value = false
+ })
 
-	function chunkArray(arr, chunkSize) {
-		const result = [];
-		for (let i = 0; i < arr.length; i += chunkSize) {
-			result.push(arr.slice(i, i + chunkSize));
-		}
-		return result;
-	}
+ function handleSwiperChange(index) {
+  if (isAudioPlaying.value) return; // 如果正在播放,不允许切换
 
-	const data = reactive({
-		jieId: null, // 节/单元ID
-		activeId: null, // 当前单词
-		wordList: [], // 单词列表
-		arrayList: [], // 整合数据
-		activeWord: null, // 单词详情数据
-		collectFlag: 0, // 收藏状态
-		subjectId: null, // 学科ID
-		levelId: null, // 等级
-		typeId: null, // 类型
-		tipFlag: null, // 提示
-		youkeZhangId: null, // 章ID
-		isLearnStatus: null, // 学习记录状态
-	})
+  // 无论切换到哪个页面,都播放单词的主发音(yinpin)
+  if (data.activeWord && data.activeWord.yinpin) {
+   handlePlayAudio({
+    url: data.activeWord.yinpin,
+    code: 'swiper-auto-play'
+   });
+  }
+ }
 
-	onLoad(({
-		jieId,
-		wordId,
-		subjectId,
-		levelId,
-		typeId,
-		tipFlag,
-		isLearnStatus,
-		youkeZhangId
-	}) => {
-		data.jieId = jieId;
-		isLearnRecord.value = jieId;
-		data.activeId = wordId;
-		data.isLearnStatus = isLearnStatus;
-		data.subjectId = subjectId;
-		data.levelId = levelId;
-		data.typeId = typeId;
-		data.tipFlag = tipFlag;
-		data.youkeZhangId = youkeZhangId;
-		// 获取单词列表数据
-		initWordInfo();
-		// 清理过期文件
-		clearAudioCache();
-	})
+ function courseBjFun() {
+  return 'static/images/course/course-cjdc-bj.png'
+ }
 
-	// 是否是最后一题
-	const isLast = computed(() => {
-		if (!data.wordList.length) {
-			return false
-		}
-		return data.activeId == data.wordList[data.wordList.length - 1].id;
-	})
-	const isFirst = computed(() => {
-		if (!data.wordList.length) {
-			return false
-		}
-		return data.activeId == data.wordList[0].id;
-	})
+ function chunkArray(arr, chunkSize) {
+  const result = [];
+  for (let i = 0; i < arr.length; i += chunkSize) {
+   result.push(arr.slice(i, i + chunkSize));
+  }
+  return result;
+ }
 
-	const activeWords = computed(() => {
-		if (!data.activeId) {
-			return null
-		}
-		return data.arrayList.find(item => item.some(cit => cit.id == data.activeId))
-	})
+ const data = reactive({
+  jieId: null, // 节/单元ID
+  activeId: null, // 当前单词
+  wordList: [], // 单词列表
+  arrayList: [], // 整合数据
+  activeWord: null, // 单词详情数据
+  collectFlag: 0, // 收藏状态
+  subjectId: null, // 学科ID
+  levelId: null, // 等级
+  typeId: null, // 类型
+  tipFlag: null, // 提示
+  youkeZhangId: null, // 章ID
+  isLearnStatus: null, // 学习记录状态
+ })
 
-	function nextWord() {
-		const index = data.wordList.findIndex(item => item.id == data.activeId);
-		if (index < data.wordList.length - 1) {
-			uni.redirectTo({
-				url: `/pages/newEnglish/index?jieId=${data.jieId}&wordId=${data.wordList[index + 1].id }`
-			})
-		}
-	}
+ onLoad(({
+  jieId,
+  wordId,
+  subjectId,
+  levelId,
+  typeId,
+  tipFlag,
+  isLearnStatus,
+  youkeZhangId
+ }) => {
+  data.jieId = jieId;
+  isLearnRecord.value = jieId;
+  data.activeId = wordId;
+  data.isLearnStatus = isLearnStatus;
+  data.subjectId = subjectId;
+  data.levelId = levelId;
+  data.typeId = typeId;
+  data.tipFlag = tipFlag;
+  data.youkeZhangId = youkeZhangId;
+  // 获取单词列表数据
+  initWordInfo();
+  // 清理过期文件
+  clearAudioCache();
+ })
 
-	function prevWord() {
-		const index = data.wordList.findIndex(item => item.id == data.activeId);
-		if (index > 0) {
-			uni.redirectTo({
-				url: `/pages/newEnglish/index?jieId=${data.jieId}&wordId=${data.wordList[index - 1].id }`
-			})
-		}
-	}
+ // 是否是最后一题
+ const isLast = computed(() => {
+  if (!data.wordList.length) {
+   return false
+  }
+  return data.activeId == data.wordList[data.wordList.length - 1].id;
+ })
+ const isFirst = computed(() => {
+  if (!data.wordList.length) {
+   return false
+  }
+  return data.activeId == data.wordList[0].id;
+ })
 
-	function handleBack() {
-		// 返回单词列表
-		if (userCode !== 'Visitor') {
-			if (data.jieId == 0) {
-				uni.redirectTo({
-					url: `/pages/my/learnRecord?jieId=${data.jieId}&isLearnStatus=${data.isLearnStatus}`
-				})
-			} else {
-				uni.redirectTo({
-					url: `/pages/wordList/wordList?jieId=${data.jieId}`
-				})
-			}
-		} else {
-			const youkePageData = JSON.stringify({
-				subjectId: data.subjectId,
-				levelId: data.levelId,
-				typeId: data.typeId,
-				tipFlag: data.tipFlag,
-				youkeZhangId: data.youkeZhangId,
-				jieId: data.jieId
-			})
-			uni.redirectTo({
-				url: `/pages/wordList/wordList?youkePageData=${youkePageData}`
-			})
-		}
-	}
+ const activeWords = computed(() => {
+  if (!data.activeId) {
+   return null
+  }
+  return data.arrayList.find(item => item.some(cit => cit.id == data.activeId))
+ })
 
-	function handleComplete() {
-		// 返回岛
-		if (userCode !== 'Visitor') {
-			uni.redirectTo({
-				url: `/pages/study/index`
-			})
-		} else {
-			uni.redirectTo({
-				url: `/pages/study/index?levelId=${data.levelId}&typeId=${data.typeId}&subjectId=${data.subjectId}&tipFlag=${data.tipFlag}&youkeZhangId=${data.youkeZhangId}&jieId=${data.jieId}`
-			})
-		}
-	}
+ function nextWord() {
+  const index = data.wordList.findIndex(item => item.id == data.activeId);
+  if (index < data.wordList.length - 1) {
+   uni.redirectTo({
+    url: `/pages/newEnglish/index?jieId=${data.jieId}&wordId=${data.wordList[index + 1].id }`
+   })
+  }
+ }
 
-	function handleShouCang() {
-		if (data.collectFlag == 1) {
-			httpApi.getWordCancel({
-				wordId: data.activeId
-			}).then(res => {
-				uni.showToast({
-					title: '操作成功'
-				})
-				data.collectFlag = 0;
-			})
-		} else {
-			httpApi.getWordShouCang({
-				wordId: data.activeId
-			}).then(res => {
-				uni.showToast({
-					title: '操作成功'
-				})
-				data.collectFlag = 1;
-			})
-		}
-	}
+ function prevWord() {
+  const index = data.wordList.findIndex(item => item.id == data.activeId);
+  if (index > 0) {
+   uni.redirectTo({
+    url: `/pages/newEnglish/index?jieId=${data.jieId}&wordId=${data.wordList[index - 1].id }`
+   })
+  }
+ }
 
-	function initWordInfo() {
+ function handleBack() {
+  // 返回单词列表
+  if (userCode !== 'Visitor') {
+   if (data.jieId == 0) {
+    uni.redirectTo({
+     url: `/pages/my/learnRecord?jieId=${data.jieId}&isLearnStatus=${data.isLearnStatus}`
+    })
+   } else {
+    uni.redirectTo({
+     url: `/pages/wordList/wordList?jieId=${data.jieId}`
+    })
+   }
+  } else {
+   const youkePageData = JSON.stringify({
+    subjectId: data.subjectId,
+    levelId: data.levelId,
+    typeId: data.typeId,
+    tipFlag: data.tipFlag,
+    youkeZhangId: data.youkeZhangId,
+    jieId: data.jieId
+   })
+   uni.redirectTo({
+    url: `/pages/wordList/wordList?youkePageData=${youkePageData}`
+   })
+  }
+ }
 
-		if (userCode !== 'Visitor') {
-			httpApi.getWordInfo({
-				jieId: data.jieId,
-				wordId: data.activeId
-			}).then(res => {
-				data.activeWord = res.data;
-				data.wordList = res.data.danciList; // 单词组
-				data.collectFlag = res.data.collectFlag; // 收藏状态
-				if (data.wordList.length) {
-					data.arrayList = chunkArray(data.wordList, 5); // 将1维单词数组转换为2维数组
-				}
-				// console.log('res.data',res.data)
-				handleCacheAudio()
-				//autoPlayAudio()
+ function handleComplete() {
+  // 返回岛
+  if (userCode !== 'Visitor') {
+   uni.redirectTo({
+    url: `/pages/study/index`
+   })
+  } else {
+   uni.redirectTo({
+    url: `/pages/study/index?levelId=${data.levelId}&typeId=${data.typeId}&subjectId=${data.subjectId}&tipFlag=${data.tipFlag}&youkeZhangId=${data.youkeZhangId}&jieId=${data.jieId}`
+   })
+  }
+ }
 
-			})
-		} else {
-			httpApi.getCommonWordInfo({
-				jieId: data.jieId,
-				wordId: data.activeId
-			}).then(res => {
-				data.activeWord = res.data;
-				data.wordList = res.data.danciList; // 单词组
-				data.collectFlag = res.data.collectFlag; // 收藏状态
-				if (data.wordList.length) {
-					data.arrayList = chunkArray(data.wordList, 5); // 将1维单词数组转换为2维数组
-				}
+ function handleShouCang() {
+  if (data.collectFlag == 1) {
+   httpApi.getWordCancel({
+    wordId: data.activeId
+   }).then(res => {
+    uni.showToast({
+     title: '操作成功'
+    })
+    data.collectFlag = 0;
+   })
+  } else {
+   httpApi.getWordShouCang({
+    wordId: data.activeId
+   }).then(res => {
+    uni.showToast({
+     title: '操作成功'
+    })
+    data.collectFlag = 1;
+   })
+  }
+ }
 
-				handleCacheAudio()
-					//autoPlayAudio()
-			})
-		}
-	}
-	// 新增自动播放功能
-	const autoPlayAudio = async () => {
-		// 等待数据加载完成
-		await nextTick();
+ function initWordInfo() {
 
-		// 检查是否有单词发音数据
-		if (data.activeWord && data.activeWord.yinpin) {
-			// 延迟500ms确保音频已缓存
-			setTimeout(() => {
-				handlePlayAudio({
-					url: data.activeWord.yinpin,
-					code: 'auto-play' // 特殊标记,区分自动播放
-				});
-			}, 500);
-		}
-	};
+  if (userCode !== 'Visitor') {
+   httpApi.getWordInfo({
+    jieId: data.jieId,
+    wordId: data.activeId
+   }).then(res => {
+    data.activeWord = res.data;
+    data.wordList = res.data.danciList; // 单词组
+    data.collectFlag = res.data.collectFlag; // 收藏状态
+    if (data.wordList.length) {
+     data.arrayList = chunkArray(data.wordList, 5); // 将1维单词数组转换为2维数组
+    }
+    // console.log('res.data',res.data)
+    handleCacheAudio()
+   // autoPlayAudio()
 
-	function goXiangjie() {
+   })
+  } else {
+   httpApi.getCommonWordInfo({
+    jieId: data.jieId,
+    wordId: data.activeId
+   }).then(res => {
+    data.activeWord = res.data;
+    data.wordList = res.data.danciList; // 单词组
+    data.collectFlag = res.data.collectFlag; // 收藏状态
+    if (data.wordList.length) {
+     data.arrayList = chunkArray(data.wordList, 5); // 将1维单词数组转换为2维数组
+    }
 
-		uni.redirectTo({
-			url: `/pages/newEnglish/components/xiangjie?levelId=${data.levelId}&typeId=${data.typeId}&subjectId=${data.subjectId}&tipFlag=${data.tipFlag}&wordId=${data.activeId}&youkeZhangId=${data.youkeZhangId}&jieId=${data.jieId}`
-		})
-	}
+    handleCacheAudio()
+  //  autoPlayAudio()
+   })
+  }
+ }
+ // 新增自动播放功能
+ const autoPlayAudio = async () => {
+  // 等待数据加载完成
+  await nextTick();
 
-	function handleCacheAudio() {
+  // 检查是否有单词发音数据
+  if (data.activeWord && data.activeWord.yinpin) {
+   // 延迟500ms确保音频已缓存
+   setTimeout(() => {
+    handlePlayAudio({
+     url: data.activeWord.yinpin,
+     code: 'auto-play' // 特殊标记,区分自动播放
+    });
+   }, 500);
+  }
+ };
 
-		const arr = []
-		// yinpin
-		arr.push(data.activeWord.yinpin);
-		// yinjie
-		data.activeWord.yinjie.forEach(item => {
-			arr.push(item.yinpin)
-		})
-		// pindu
-		data.activeWord.pindu.forEach(item => {
-			arr.push(item.yinpin)
-		})
-		// 缓存音频
-		arr.map(item => cacheAudio(item));
-		// console.log('arr',arr)
-	}
+ function goXiangjie() {
 
-	async function handlePlayAudio({
-		url,
-		code
-	}) {
-		console.log('播放', url)
-		console.log('播放', code)
-		const cachedPath = await cacheAudio(url);
-		if (cachedPath && cachedPath.includes('.mp3')) {
-			// console.log('地址:', cachedPath)
-			AudioP.play(cachedPath, code);
-		} else {
-			uni.showToast({
-				title: '音频加载失败',
-				icon: 'none'
-			});
-		}
-	}
+  uni.redirectTo({
+   url: `/pages/newEnglish/components/xiangjie?levelId=${data.levelId}&typeId=${data.typeId}&subjectId=${data.subjectId}&tipFlag=${data.tipFlag}&wordId=${data.activeId}&youkeZhangId=${data.youkeZhangId}&jieId=${data.jieId}`
+  })
+ }
+
+ function handleCacheAudio() {
+
+  const arr = []
+  // yinpin
+  arr.push(data.activeWord.yinpin);
+  // yinjie
+  data.activeWord.yinjie.forEach(item => {
+   arr.push(item.yinpin)
+  })
+  // pindu
+  data.activeWord.pindu.forEach(item => {
+   arr.push(item.yinpin)
+  })
+  // 缓存音频
+  arr.map(item => cacheAudio(item));
+  // console.log('arr',arr)
+ }
+
+ async function handlePlayAudio({
+  url,
+  code
+ }) {
+  console.log('播放', url)
+  console.log('播放', code)
+  const cachedPath = await cacheAudio(url);
+  if (cachedPath && cachedPath.includes('.mp3')) {
+   // console.log('地址:', cachedPath)
+   AudioP.play(cachedPath, code);
+  } else {
+   uni.showToast({
+    title: '音频加载失败',
+    icon: 'none'
+   });
+  }
+ }
 </script>
 
 <style>