jwyu %!s(int64=2) %!d(string=hai) anos
pai
achega
b3479dc8f8

+ 1 - 0
components/audioBox/audioBox.vue

@@ -69,6 +69,7 @@ export default {
             return {
                 reportId:this.$store.state.audio.reportId,
                 voiceId:this.$store.state.audio.voiceId,
+                questionId:this.$store.state.audio.questionId
             }
         },
 

+ 26 - 0
mixin/questionMixin.js

@@ -382,5 +382,31 @@ export default {
                 }
             }
         },
+
+        //点击播放音频
+		handlePlayAudioByBg(item){
+			const audioItem=item.audio_list[0]
+			if(this.$store.state.audio.questionId==item.community_question_id){
+                if(this.globalBgMusic.paused){
+                    this.globalBgMusic.play()
+                }else{
+                    this.globalBgMusic.pause()
+                }
+            }else{
+                const list=[{url:audioItem.audio_url,time:audioItem.audio_play_seconds,title:item.question_content}]
+                this.$store.commit('audio/addAudio',{
+                    list:list,
+                    questionId:item.community_question_id
+                })
+                apiCountAudioClick({
+                    community_question_audio_id:audioItem.community_question_audio_id,
+                    source_agent:1
+                }).then((res)=>{
+                    if(res.code===200){
+                      console.log('音频id为'+audioItem.community_question_audio_id+'点击次数+1')  
+                    }
+                })
+            }
+		}
     }
 }

+ 8 - 8
pages-question/answerDetail.vue

@@ -319,6 +319,14 @@ export default {
       this.globalRecorder.stop()
     } 
   },
+  //转发分享
+	onShareAppMessage(){
+    const {community_question_id} = this.questionItem
+		return{
+			title:'问答详情',
+			path:`/pages-question/answerDetail?id=${community_question_id}`
+		}
+	},
   methods: {
     //初始化audio,onShow执行
     initAudio() {
@@ -759,14 +767,6 @@ export default {
           }
       }
     },
-    //转发分享
-		onShareAppMessage(){
-      const {community_question_id} = this.questionItem
-			return{
-				title:'问答详情',
-				path:`/pages-question/answerDetail?id=${community_question_id}`
-			}
-		}
   },
 };
 </script>

+ 24 - 3
pages-question/answerList.vue

@@ -32,8 +32,12 @@
               {{ item.question_content }}
             </view>
             <view class="item-answer" v-if="item.reply_status === 3">
-              <view class="answer" @click.stop="handleAudio(item)">
-                <template v-if="!item.loading">
+              <view class="answer" @click.stop="handlePlayAudioByBg(item)">
+                <!-- 改为背景音频播放 -->
+                  <image class="music-img" :src="item.community_question_id==curVoiceId&&!curAudioPaused?playImgSrc:pauseImgSrc" mode="widthFix"/>
+                  <text>{{ moment(item.answer.audioTime).format('mm:ss') }}</text>
+
+                <!-- <template v-if="!item.loading">
                   <image
                     class="music-img"
                     :src="item.answer.isplay ? playImgSrc : pauseImgSrc"
@@ -59,7 +63,7 @@
                     mode="aspectFill"
                   />
                   <text>{{ moment(item.answer.audioTime).format("mm:ss") }}</text>
-                </template>
+                </template> -->
               </view>
             </view>
           </view>
@@ -106,6 +110,9 @@
         </view>
       </view>
     </van-popup>
+
+    <!-- 音频悬浮 -->
+    <audioBox v-if="showAudioPop"/>
   </view>
 </template>
 <script>
@@ -113,6 +120,20 @@ import mixin from "../mixin/questionMixin";
 import { apiBarTotal ,apiSetRead} from "@/api/question.js";
 export default {
   mixins: [mixin],
+  computed:{
+		showAudioPop(){//是否显示音频弹窗
+      return this.$store.state.audio.show
+    },
+    showAudioBigPop(){
+      return this.$store.state.audio.showBig
+    },
+    curVoiceId(){//当前正在播放的音频id
+      return this.$store.state.audio.questionId
+    },
+    curAudioPaused(){//当前音频是否暂停状态
+      return this.$store.state.audio.paused
+    },
+	},
   data() {
     return {
       questionList: [],

+ 1 - 1
pages-voice/voiceDetail.vue

@@ -201,7 +201,7 @@ export default {
         //拖动音频播放进度条
         handleAudioSliderChange(e){
             const value=e.detail.value
-            innerAudioContext.seek(value)
+            this.globalBgMusic.seek(value)
         },
 
 

+ 75 - 15
pages/question/question.vue

@@ -35,15 +35,21 @@
 				<image :src="globalImgUrls.activityNoAuth" mode="widthFix"  style="width:100%;"/>
 				<view>暂无提问<text v-if="userInfo.is_inner!==1">,快试试提问功能吧</text></view>
 			</view>
-			<view class="question-list" :class="{'last':finished}">
-				<view class="question-item" v-for="item in questionList" :key="item.community_question_id">
+			<view class="question-list" :class="showAudioPop?showAudioBigPop?'list-bot3':'list-bot2':'list-bot1'">
+				<view class="question-item" @click="handleGoDetail(item)" v-for="item in questionList" :key="item.community_question_id">
 					<view class="question-info">
 						<view style="flex:1;" class="question-title">
 							<text class="item-label">{{item.variety_tag_name}}</text>
 							<!-- <text class="item-title"> -->{{ item.question_content }}<!-- </text> -->
 						</view>	
 						<view class="item-answer">
-							<view class="answer" @click="handleAudio(item)">
+							<!-- 改为背景音频播放 -->
+							<view class="answer" @click.stop="handlePlayAudioByBg(item)">
+								<image class="music-img" :src="item.community_question_id==curVoiceId&&!curAudioPaused?playImgSrc:pauseImgSrc" mode="widthFix"/>
+								<text>{{ moment(item.answer.audioTime).format('mm:ss') }}</text>
+							</view>
+							  
+							<!-- <view class="answer" @click.stop="handleAudio(item)">
 								<template v-if="!item.loading">
 									<image class="music-img" :src="item.answer.isplay?playImgSrc:pauseImgSrc" mode="widthFix"/>
 									<template v-if="item.answer.isplay || item.answer.ispause">
@@ -61,14 +67,14 @@
 									<image class="load-img" src="../../static/loading.png" mode="aspectFill" />
 									<text>{{ moment(item.answer.audioTime).format('mm:ss') }}</text>
 								</template>
-							</view>
+							</view> -->
 						</view>
 					</view>
 					<text class="item-time">提问时间:{{ item.create_time }}</text>
 				</view>
 			</view>
 			<template v-if="isUserResearcher">
-				<view class="btn-wrap">
+				<view class="btn-wrap" :class="showAudioPop?showAudioBigPop?'btn-bot3':'btn-bot2':'btn-bot1'">
 					<view class="btn topage-button" @click="toPage('question')" v-if="userInfo.status&&userAuth">
 						<image 
 							src="../../static/question/askquestion.png"
@@ -129,15 +135,24 @@
 				</view>
 			</view>
 		</van-popup>
+
+		<!-- 音频悬浮 -->
+        <view v-if="showPage">
+            <audioBox v-if="showAudioPop"/>
+        </view>
 	</view>
 </template>
 
 <script>
 import mixin from "../../mixin/questionMixin";
-import {apiOptionGroupList,apiBarTotal} from '@/api/question'
+import {apiOptionGroupList,apiBarTotal,apiCountAudioClick} from '@/api/question'
 import {apiGetTagTree} from '@/api/common'
+import audioBox from '@/components/audioBox/audioBox.vue'
 export default {
 	mixins: [mixin],
+	components:{
+        audioBox
+    },
 	data() {
 		return {
 			questionList: [],
@@ -157,6 +172,8 @@ export default {
 				//seal_name:'梁娜',
 				//seal_mobile:123456,
 			},//mock用户信息 */
+
+			showPage:false
 		}
 	},
 	watch:{
@@ -165,7 +182,18 @@ export default {
 		}
 	},
 	computed:{
-		
+		showAudioPop(){//是否显示音频弹窗
+            return this.$store.state.audio.show
+        },
+        showAudioBigPop(){
+            return this.$store.state.audio.showBig
+        },
+        curVoiceId(){//当前正在播放的音频id
+            return this.$store.state.audio.questionId
+        },
+        curAudioPaused(){//当前音频是否暂停状态
+            return this.$store.state.audio.paused
+        },
 	},
 	onLoad() {
 		/* this.getVistor()
@@ -176,7 +204,11 @@ export default {
 		this.getdistributeNum()
 		this.getOptionList()
 		this.getQuestionList(3)
+		this.showPage=true
 	},
+	onHide(){
+        this.showPage=false
+    },
 	onReachBottom() {
 		if(this.finished) return
 		this.page++
@@ -189,6 +221,13 @@ export default {
 			uni.stopPullDownRefresh()
 		}, 1500);
 	},
+	//转发分享
+	onShareAppMessage(){
+		return{
+			title:'问答社区',
+			path:'/pages/question/question'
+		}
+	},
 	methods: {
 		//获取研究员问答列表数量统计
 		getdistributeNum() {
@@ -248,13 +287,6 @@ export default {
 				uni.navigateTo({ url: '/pages-question/answerList' })
 			}
 		},
-		//转发分享
-		onShareAppMessage(){
-			return{
-				title:'问答社区',
-				path:'/pages/question/question'
-			}
-		},
 		refreshPage() {
 			this.page = 1
 			this.selectId = -1
@@ -262,6 +294,10 @@ export default {
 			this.finished = false
 			this.getQuestionList(3)
         },
+		//跳转详情
+		handleGoDetail(item){
+			uni.navigateTo({ url: `/pages-question/answerDetail?id=${item.community_question_id}` })
+		}
 	}
 }
 </script>
@@ -379,6 +415,15 @@ page {
 			padding-bottom: 260rpx;
 		}
 	}
+	.list-bot1{
+		padding-bottom: 200rpx;
+	}
+	.list-bot2{
+		padding-bottom: 340rpx;
+	}
+	.list-bot3{
+		padding-bottom: 440rpx;
+	}
 
 	.topage-btn {
 		position: fixed;
@@ -410,7 +455,8 @@ page {
 		margin-left: -30rpx;
 		display: flex;
 		justify-content: center;
-		bottom: 215rpx;
+		bottom: calc(120rpx + constant(safe-area-inset-bottom));
+		bottom: calc(120rpx + env(safe-area-inset-bottom));
 		.btn{
 			width:300rpx;
 			height:80rpx;
@@ -419,6 +465,20 @@ page {
 			}
 		}
 	}
+
+	.btn-bot1{
+		bottom: calc(120rpx + constant(safe-area-inset-bottom));
+		bottom: calc(120rpx + env(safe-area-inset-bottom));
+	}
+	.btn-bot2{
+		bottom: calc(260rpx + constant(safe-area-inset-bottom));
+		bottom: calc(260rpx + env(safe-area-inset-bottom));
+	}
+	.btn-bot3{
+		bottom: calc(355rpx + constant(safe-area-inset-bottom));
+		bottom: calc(355rpx + env(safe-area-inset-bottom));
+	}
+
 	.global-pup{
 		.content{
 			padding:90rpx 34rpx;

+ 1 - 1
pages/report/report.vue

@@ -20,7 +20,7 @@
 			:key="index" 
 			@click="linkPage(tab)"
 		>
-			<image :src="tab.icon" mode="aspectFill" class="card-ico"/>
+			<image :src="tab.icon+'?t='+new Date().getTime()" mode="aspectFill" class="card-ico"/>
 			<view class="title">{{tab.tab}}</view>
 		</view>
 	</view>

+ 25 - 24
pages/voice/voice.vue

@@ -12,7 +12,7 @@
             />
             <view>暂无数据</view>
         </view>
-        <view class="list-wrap" :style="{paddingBottom:pagePaddingBot}" v-else>
+        <view class="list-wrap" :class="showAudioPop?showAudioBigPop?'list-bot3':'list-bot2':'list-bot1'" v-else>
             <view class="item" v-for="item in list" :key="item.BroadcastId" @click="handleGoDetail(item)">
                 <view class="title">{{item.BroadcastName}}</view>
                 <view class="time">发布时间:{{item.CreateTime|formatTime}}</view>
@@ -115,26 +115,6 @@ export default {
         curAudioPaused(){//当前音频是否暂停状态
             return this.$store.state.audio.paused
         },
-
-        pagePaddingBot(){
-            let num=34
-            if(this.IsVoiceAdmin){
-                num=num+160
-            }else{
-                num=34
-            }
-            if(this.$store.state.audio.show){
-                if(this.$store.state.audio.showBig){
-                    num=num+260
-                }else{
-                    num=num+180
-                }
-            }else{
-                num=num+0
-            }
-
-            return num+'rpx'
-        }
     },
     data() {
         return {
@@ -157,8 +137,8 @@ export default {
             showPage:false,
         }
     },
-    onLoad(){
-        this.getVoiceList()
+    onLoad(options){
+        this.init(options)
         this.getOptionsList()
         this.addListenVoiceSuccess()
     },
@@ -227,6 +207,19 @@ export default {
             })
         },
 
+        async init(options){
+            if(options.scene){
+                const res=await apiGetSceneToParams({scene_key:options.scene})
+                if(res.code===200){
+                    const obj=JSON.parse(res.data)
+                    this.voiceId=obj.voiceId
+                }
+            }else{
+                this.voiceId=options.voiceId||0
+            }
+            this.getVoiceList()
+        },
+
         // 获取音频列表
         async getVoiceList(){
             const res=await apiVoiceList({
@@ -525,7 +518,15 @@ export default {
             }
         }
     }
-
+}
+.list-bot1{
+	padding-bottom: 200rpx;
+}
+.list-bot2{
+	padding-bottom: 340rpx;
+}
+.list-bot3{
+	padding-bottom: 440rpx;
 }
 .add-btn{
     position: fixed;

+ 3 - 0
store/modules/audio.js

@@ -8,6 +8,7 @@ const audioModules={
         index:0,//当前是播放第几个
         reportId:0,//当前是哪个报告的音频
         voiceId:0,//当前是哪个语音播报的音频
+        questionId:0,//当前是哪个问答的音频
         paused:true,//当前是否音频正在播放 true暂停状态
         curTime:0,//当前正在播放的音频播放的时间
     },
@@ -18,6 +19,7 @@ const audioModules={
             state.index=0
             state.reportId=e.reportId||0
             state.voiceId=e.voiceId||0
+            state.questionId=e.questionId||0
         },
         updateAudioIndex(state,e){
             state.index=e
@@ -36,6 +38,7 @@ const audioModules={
             state.index=0
             state.reportId=0
             state.voiceId=0
+            state.questionId=0
             state.paused=true
         },
         //显示弹窗