|
@@ -34,23 +34,63 @@
|
|
|
class="audio-item"
|
|
|
v-for="(item,index) in audioList"
|
|
|
:key="item.voiceUrl"
|
|
|
+ @click="handleClickAudioItem(item)"
|
|
|
>
|
|
|
+ <image
|
|
|
+ class="icon"
|
|
|
+ src="../static/audio-doing.png"
|
|
|
+ mode="aspectFill"
|
|
|
+ v-if="activeAudioUrl==item.voiceUrl&&audioPlayStatus==true"
|
|
|
+ />
|
|
|
+ <image
|
|
|
+ class="icon"
|
|
|
+ src="../static/audio-pause-3.png"
|
|
|
+ mode="aspectFill"
|
|
|
+ v-else-if="activeAudioUrl==item.voiceUrl&&audioPlayStatus==false"
|
|
|
+ />
|
|
|
<image
|
|
|
class="icon"
|
|
|
- :src="(activeAudioUrl==item.voiceUrl&&item.playStatus)?'./static/audio-doing.png':'./static/audio-play.png'"
|
|
|
+ src="../static/audio-pause-2.png"
|
|
|
model="aspectFill"
|
|
|
- @click="handlePlayAudio(item)">
|
|
|
- </image>
|
|
|
- <view class="name">{{ item.voiceName }}</view>
|
|
|
- <view class="time">{{activeAudioUrl==item.voiceUrl?activeAudioTime:0|formarVoiceTime}} / {{ item.voicePlaySeconds|formarVoiceTime }}</view>
|
|
|
- <slider
|
|
|
- class="audio-slider"
|
|
|
- activeColor="#e3b377"
|
|
|
- :max="item.voicePlaySeconds"
|
|
|
- :value="activeAudioUrl==item.voiceUrl?activeAudioTime:0"
|
|
|
- @change="handleAudioSliderChange($event,item)"
|
|
|
- block-size="20"
|
|
|
+ v-else
|
|
|
/>
|
|
|
+ <view class="name" :style="{color:item.voiceUrl==activeAudioUrl?'#D5AD79':''}">{{ item.voiceName }}</view>
|
|
|
+ <view class="time">{{ item.voicePlaySeconds|formatVoiceTime }}</view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="box" v-if="activeAudioUrl">
|
|
|
+ <view class="flex top-slider">
|
|
|
+ <text>{{audioCurrentTime|formatVoiceTime}}</text>
|
|
|
+ <slider
|
|
|
+ class="audio-slider"
|
|
|
+ activeColor="#e3b377"
|
|
|
+ :max="activeAudioTime"
|
|
|
+ :value="audioCurrentTime"
|
|
|
+ @change="handleAudioSliderChange($event)"
|
|
|
+ block-size="20"
|
|
|
+ />
|
|
|
+ <text>{{activeAudioTime|formatVoiceTime}}</text>
|
|
|
+ </view>
|
|
|
+ <view class="flex btns">
|
|
|
+ <image
|
|
|
+ class="before"
|
|
|
+ :src="isFirstAudio?'../static/audio-before-grey.png':'../static/audio-before.png'"
|
|
|
+ mode="aspectFit"
|
|
|
+ @click="handleAudioBtn('before')"
|
|
|
+ />
|
|
|
+ <image
|
|
|
+ class="center"
|
|
|
+ :src="audioPlayStatus?'../static/audio-doing.png':'../static/audio-pause-3.png'"
|
|
|
+ mode="aspectFit"
|
|
|
+ @click="handleAudioBtn('center')"
|
|
|
+ />
|
|
|
+ <image
|
|
|
+ class="next"
|
|
|
+ :src="isLastAudio?'../static/audio-before-grey.png':'../static/audio-before.png'"
|
|
|
+ mode="aspectFit"
|
|
|
+ @click="handleAudioBtn('next')"
|
|
|
+ />
|
|
|
+ </view>
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
@@ -136,12 +176,17 @@ import {
|
|
|
import {baseApiUrl} from '@/utils/config.js'
|
|
|
export default {
|
|
|
name: "ActivityDetail",
|
|
|
- filters:{
|
|
|
- formarVoiceTime(e){
|
|
|
- let minus=parseInt(e/60)
|
|
|
- let sec=e%60
|
|
|
- return `${minus}:${sec>9?sec:'0'+sec}`
|
|
|
- }
|
|
|
+ computed: {
|
|
|
+ isFirstAudio(){
|
|
|
+ if(this.audioList.length>0){
|
|
|
+ return this.activeAudioUrl==this.audioList[0].voiceUrl
|
|
|
+ }
|
|
|
+ },
|
|
|
+ isLastAudio(){
|
|
|
+ if(this.audioList.length>0){
|
|
|
+ return this.activeAudioUrl==this.audioList[this.audioList.length-1].voiceUrl
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
@@ -151,7 +196,9 @@ export default {
|
|
|
audioList: [], //音频数据
|
|
|
|
|
|
activeAudioUrl:'',//正在播放的背景音频地址
|
|
|
- activeAudioTime:0,//
|
|
|
+ activeAudioTime:0,//选择的音频数据时长
|
|
|
+ audioCurrentTime:0,//音频正常播放的时间
|
|
|
+ audioPlayStatus:false,//音频是否正在播放
|
|
|
|
|
|
pupData: {
|
|
|
show: false,
|
|
@@ -159,6 +206,7 @@ export default {
|
|
|
type: "",
|
|
|
mobile: "",
|
|
|
},
|
|
|
+
|
|
|
};
|
|
|
},
|
|
|
onLoad(options) {
|
|
@@ -167,7 +215,22 @@ export default {
|
|
|
this.getAudios()
|
|
|
},
|
|
|
onUnload(){
|
|
|
- this.handleSaveAudioMsg()
|
|
|
+ // 存一次
|
|
|
+ // const audioPlayPaused=this.globalBgMusic.paused// true 当前没有音频在播放
|
|
|
+ // if(audioPlayPaused===false){
|
|
|
+ let obj={
|
|
|
+ activityId:this.id,//活动id
|
|
|
+ play:this.audioPlayStatus,//是否正在播放
|
|
|
+ list:this.audioList,//音频列表数据
|
|
|
+ show:false,//是否显示弹窗
|
|
|
+ title:'',//音频弹窗标题
|
|
|
+ audioCurrentTime:this.audioCurrentTime,//音频播放实时时间
|
|
|
+ audioTime:this.activeAudioTime,//当前音频时间
|
|
|
+ audioCurrentUrl:this.activeAudioUrl,//当前音频地址
|
|
|
+ }
|
|
|
+ uni.setStorageSync('audioMsg', JSON.stringify(obj))
|
|
|
+ // }
|
|
|
+
|
|
|
},
|
|
|
onShareAppMessage() {
|
|
|
let title=''
|
|
@@ -186,6 +249,138 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
+ // 点击音频项
|
|
|
+ handleClickAudioItem(item){
|
|
|
+ // 点击同一个音频
|
|
|
+ if(item.voiceUrl==this.activeAudioUrl){
|
|
|
+ if(this.audioPlayStatus){
|
|
|
+ this.globalBgMusic.pause()
|
|
|
+ }else{
|
|
|
+ this.globalBgMusic.play()
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ this.handlePlayAudio(item)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 播放音频
|
|
|
+ handlePlayAudio(e){
|
|
|
+ console.log(e);
|
|
|
+
|
|
|
+ this.globalBgMusic.title=e.voiceName
|
|
|
+ this.globalBgMusic.src=e.voiceUrl
|
|
|
+
|
|
|
+ this.globalBgMusic.onCanplay(()=>{
|
|
|
+ console.log('onCanplay');
|
|
|
+ this.globalBgMusic.play()
|
|
|
+ this.activeAudioUrl=e.voiceUrl
|
|
|
+ this.activeAudioTime=e.voicePlaySeconds
|
|
|
+ })
|
|
|
+
|
|
|
+ this.handleAudioFun()
|
|
|
+ },
|
|
|
+
|
|
|
+ // 音频事件
|
|
|
+ handleAudioFun(){
|
|
|
+ this.globalBgMusic.onPlay(()=>{
|
|
|
+ console.log('onplay');
|
|
|
+ this.audioPlayStatus=true
|
|
|
+ })
|
|
|
+ this.globalBgMusic.onPause(()=>{
|
|
|
+ console.log('onPause');
|
|
|
+ this.audioPlayStatus=false
|
|
|
+ })
|
|
|
+ this.globalBgMusic.onStop(()=>{
|
|
|
+ console.log('onStop');
|
|
|
+ this.audioPlayStatus=false
|
|
|
+ })
|
|
|
+ this.globalBgMusic.onEnded(()=>{
|
|
|
+ console.log('onEnded');
|
|
|
+ this.audioPlayStatus=false
|
|
|
+ this.handleAudioBtn('next','auto')
|
|
|
+ })
|
|
|
+ this.globalBgMusic.onError((e)=>{
|
|
|
+ console.log('onError',e);
|
|
|
+ uni.showToast({
|
|
|
+ title:"音频播放错误",
|
|
|
+ icon:'none'
|
|
|
+ })
|
|
|
+ })
|
|
|
+ this.globalBgMusic.onTimeUpdate(()=>{
|
|
|
+ if(this.globalBgMusic.src==this.activeAudioUrl){
|
|
|
+ this.audioCurrentTime=parseInt(this.globalBgMusic.currentTime)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+
|
|
|
+ // 点击播放按钮
|
|
|
+ handleAudioBtn(type,e){
|
|
|
+ if(type==='center'){
|
|
|
+ if(this.audioPlayStatus){
|
|
|
+ this.globalBgMusic.pause()
|
|
|
+ }else{
|
|
|
+ this.globalBgMusic.play()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(type==='before'){
|
|
|
+ if(!this.isFirstAudio){
|
|
|
+ this.audioList.forEach((_item,index)=>{
|
|
|
+ if(_item.voiceUrl==this.activeAudioUrl){
|
|
|
+ this.handlePlayAudio(this.audioList[index-1])
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(type==='next'){
|
|
|
+ if(!this.isLastAudio){
|
|
|
+ this.audioList.forEach((_item,index)=>{
|
|
|
+ if(_item.voiceUrl==this.activeAudioUrl){
|
|
|
+ this.handlePlayAudio(this.audioList[index+1])
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+ // 自动播放最后一个结束
|
|
|
+ if(e==='auto'){
|
|
|
+ this.activeAudioUrl=''
|
|
|
+ this.audioPlayStatus=false
|
|
|
+ this.activeAudioTime=0
|
|
|
+ this.audioCurrentTime=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ //音频进度条拖动
|
|
|
+ handleAudioSliderChange(e){
|
|
|
+ const value=e.detail.value
|
|
|
+ this.globalBgMusic.seek(value)
|
|
|
+ },
|
|
|
+
|
|
|
+ // 获取活动音频
|
|
|
+ async getAudios() {
|
|
|
+ const res = await apiActivityAudios({ activity_id: Number(this.id) });
|
|
|
+ if (res.code === 200&&res.data) {
|
|
|
+ this.audioList = res.data
|
|
|
+
|
|
|
+ const audioPlayPaused=this.globalBgMusic.paused// true 当前没有音频在播放
|
|
|
+ if(audioPlayPaused===false){// 当前有音频在播放
|
|
|
+ console.log('aa');
|
|
|
+ let obj=uni.getStorageSync('audioMsg')
|
|
|
+ if(obj){
|
|
|
+ this.activeAudioUrl=JSON.parse(obj).audioCurrentUrl
|
|
|
+ this.activeAudioTime=Number(JSON.parse(obj).audioTime)
|
|
|
+ this.audioCurrentTime=Number(this.globalBgMusic.currentTime)
|
|
|
+ this.audioPlayStatus=JSON.parse(obj).play
|
|
|
+ this.handleAudioFun()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
async getDetail() {
|
|
|
const res = await apiActivityDetail({ activity_id: Number(this.id) });
|
|
|
// 无权限
|
|
@@ -247,110 +442,6 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- // 获取活动音频
|
|
|
- async getAudios() {
|
|
|
- const res = await apiActivityAudios({ activity_id: Number(this.id) });
|
|
|
- if (res.code === 200&&res.data) {
|
|
|
- const audioPlayPaused=this.globalBgMusic.paused// true 当前没有音频在播放
|
|
|
- if(audioPlayPaused===false){// 当前有音频在播放
|
|
|
- this.activeAudioUrl=uni.getStorageSync('activityAudioUrl')
|
|
|
- }
|
|
|
-
|
|
|
- console.log('是否有音频在播放',audioPlayPaused===false);
|
|
|
-
|
|
|
- this.audioList = res.data.map(item=>{
|
|
|
- let obj={...item,playStatus:false}
|
|
|
- if(audioPlayPaused===false){
|
|
|
- if(item.voiceUrl==this.globalBgMusic.src){
|
|
|
- obj.playStatus=true
|
|
|
- }
|
|
|
- }
|
|
|
- return obj
|
|
|
- });
|
|
|
-
|
|
|
- if(audioPlayPaused===false){
|
|
|
- this.activeAudioTime=this.globalBgMusic.currentTime
|
|
|
- this.globalBgMusic.onTimeUpdate(()=>{
|
|
|
- this.activeAudioTime=parseInt(this.globalBgMusic.currentTime)
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- // 播放音频
|
|
|
- handlePlayAudio(e){
|
|
|
- if(this.globalBgMusic.src==e.voiceUrl&&e.playStatus){// 同一个音频 并且是播放状态 则暂停
|
|
|
- console.log('同一个音频 并且是播放状态 则暂停');
|
|
|
- console.log('音频实例',this.globalBgMusic.src);
|
|
|
- this.globalBgMusic.pause()
|
|
|
- }else if(this.globalBgMusic.src==e.voiceUrl&&!e.playStatus){//同一个音频 并且是暂停状态 则直接播放
|
|
|
- console.log('同一个音频 并且是暂停状态 则直接播放');
|
|
|
- console.log('音频实例',this.globalBgMusic.src);
|
|
|
- this.globalBgMusic.play()
|
|
|
- }else{
|
|
|
- this.globalBgMusic.title=e.voiceName
|
|
|
- this.globalBgMusic.src=e.voiceUrl
|
|
|
- this.activeAudioUrl=e.voiceUrl
|
|
|
- this.activeAudioTime=0
|
|
|
- }
|
|
|
-
|
|
|
- this.globalBgMusic.onCanplay(()=>{
|
|
|
- console.log('onCanplay');
|
|
|
- this.globalBgMusic.play()
|
|
|
- })
|
|
|
-
|
|
|
- this.globalBgMusic.onPlay(()=>{
|
|
|
- console.log('onplay');
|
|
|
- e.playStatus=true
|
|
|
- })
|
|
|
- this.globalBgMusic.onPause(()=>{
|
|
|
- console.log('onPause');
|
|
|
- e.playStatus=false
|
|
|
- })
|
|
|
- this.globalBgMusic.onStop(()=>{
|
|
|
- console.log('onStop');
|
|
|
- e.playStatus=false
|
|
|
- this.activeAudioTime=0
|
|
|
- })
|
|
|
- this.globalBgMusic.onEnded(()=>{
|
|
|
- console.log('onEnded');
|
|
|
- e.playStatus=false
|
|
|
- this.activeAudioTime=0
|
|
|
- })
|
|
|
- this.globalBgMusic.onError((e)=>{
|
|
|
- console.log('onError',e);
|
|
|
- })
|
|
|
- this.globalBgMusic.onTimeUpdate(()=>{
|
|
|
- if(this.globalBgMusic.src==e.voiceUrl){
|
|
|
- this.activeAudioTime=parseInt(this.globalBgMusic.currentTime)
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
-
|
|
|
- //音频进度条拖动
|
|
|
- handleAudioSliderChange(e,item){
|
|
|
- const value=e.detail.value
|
|
|
- item.currentPlayTime=value
|
|
|
- // 如果当前activeAudioUrl 不等于拖动的这个音频
|
|
|
- if(item.voiceUrl!=this.globalBgMusic.src){
|
|
|
- this.handlePlayAudio(item)
|
|
|
- }else{
|
|
|
- this.globalBgMusic.seek(value)
|
|
|
- this.globalBgMusic.play()
|
|
|
- }
|
|
|
-
|
|
|
- },
|
|
|
-
|
|
|
- // 存储音频播放的信息
|
|
|
- handleSaveAudioMsg(){
|
|
|
- // 当音频暂停(不是停止)时 主动调一次停止
|
|
|
- const audioPlayPaused=this.globalBgMusic.paused
|
|
|
- if(audioPlayPaused===true){
|
|
|
- this.globalBgMusic.stop()
|
|
|
- }
|
|
|
- uni.setStorageSync('activityAudioUrl',this.activeAudioUrl)
|
|
|
- },
|
|
|
-
|
|
|
// 点击信息项
|
|
|
handleClickInfoItem(e) {
|
|
|
if (e.type === "tel" && e.text) {
|
|
@@ -594,15 +685,15 @@ export default {
|
|
|
}
|
|
|
|
|
|
.audio-wrap {
|
|
|
- padding: 0 94rpx 0 34rpx;
|
|
|
+ padding: 0 34rpx;
|
|
|
.audio-item {
|
|
|
- padding-top: 36rpx;
|
|
|
- // border-bottom: 1px solid #E8DED2;
|
|
|
+ padding: 36rpx 0;
|
|
|
+ border-bottom: 1px solid #E8DED2;
|
|
|
position: relative;
|
|
|
.icon {
|
|
|
position: absolute;
|
|
|
top: 50rpx;
|
|
|
- right: 0;
|
|
|
+ right: 6rpx;
|
|
|
width: 48rpx;
|
|
|
height: 48rpx;
|
|
|
}
|
|
@@ -616,6 +707,44 @@ export default {
|
|
|
margin: 20rpx 0 20rpx 20rpx;
|
|
|
}
|
|
|
}
|
|
|
+ .box{
|
|
|
+ min-height: 100rpx;
|
|
|
+ margin-top: 60rpx;
|
|
|
+ margin-bottom: 70rpx;
|
|
|
+ padding: 30rpx 20rpx;
|
|
|
+ background: #FFFFFF;
|
|
|
+ border: 1px solid rgba(240, 234, 226, 0.3);
|
|
|
+ box-shadow: 0px 3px 12px rgba(154, 154, 154, 0.16);
|
|
|
+ border-radius: 16px;
|
|
|
+ .top-slider{
|
|
|
+ align-items: center;
|
|
|
+ text{
|
|
|
+ width: 110rpx;
|
|
|
+ font-size: 12px;
|
|
|
+ text-align: center;
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+ .audio-slider{
|
|
|
+ flex: 1;
|
|
|
+ margin: 0 20rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .btns{
|
|
|
+ justify-content: space-between;
|
|
|
+ width: 50%;
|
|
|
+ align-items: center;
|
|
|
+ margin-left: auto;
|
|
|
+ margin-right: auto;
|
|
|
+ margin-top: 25rpx;
|
|
|
+ image{
|
|
|
+ width: 58rpx;
|
|
|
+ height: 58rpx;
|
|
|
+ }
|
|
|
+ .next{
|
|
|
+ transform: rotate(180deg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.btn-wrap {
|